四元數旋轉公式推導
任務
之前在瞭解關於slam的知識時,見到過四元數,但沒有理解。近日在學習偏微分方程時,發現一個系列視訊3Blue1Brown:深入淺出、直觀明瞭地分享數學之美。
獲益良多,又繼續觀看了感興趣的視訊,其中有四元數。隨著資料的逐漸增多,我也對四元數慢慢形成認知,在此做整理。
主要資料出自https://krasjet.github.io/quaternion/quaternion.pdf
核心
四元數(quaternion)的表示:
q
=
a
+
b
i
+
c
j
+
d
k
q=a+b\boldsymbol{i}+c\boldsymbol{j}+d\boldsymbol{k}
q=a+bi+cj+dk
與複數相類,可以表示為:
q
=
[
a
,
u
]
(
u
=
[
x
y
z
]
,
a
,
x
,
y
,
z
∈
R
)
q=[ a,\boldsymbol{u}] (\boldsymbol{u}= \begin{bmatrix} x\\ y\\ z\\ \end{bmatrix}, a,x,y,z\in \mathbb{R})
q=[a,u](u=⎣⎡xyz⎦⎤,a,x,y,z∈R)
將
u
\boldsymbol{u}
u 視為三維空間,而
a
a
a 處於和
u
\boldsymbol{u}
u 垂直的第四維度。則對於三維的我們,看到的四元數的視覺化表達只能是切片的結果。
疑問
四元數的應用有剛體的旋轉,而演示最直觀的也是對其做體現,便從中入手。
在觀看視訊時,已經理解了四元數乘法的運算規則:
i
i
=
j
j
=
k
k
=
−
1
i
j
=
−
j
i
=
k
j
k
=
−
k
j
=
i
k
i
=
−
i
k
=
j
\boldsymbol{ii=jj=kk=-1}\\ \boldsymbol{ij=-ji=k}\\ \boldsymbol{jk=-kj=i}\\ \boldsymbol{ki=-ik=j}\\
ii=jj=kk=−1ij=−ji=kjk=−kj=iki=−ik=j
自身相乘和虛數的運算一致,不同元素的相乘與向量的叉乘(product)一致,符合右手定則(同樣不符合交換律)
舉個簡單的例子,對於某點
p
0
=
1
+
j
p_{0}=1+\boldsymbol{j}
p0=1+j,也就是
p
0
=
[
1
,
u
]
(
u
=
[
0
1
0
]
p_{0}=[ 1,\boldsymbol{u}] (\boldsymbol{u}= \begin{bmatrix} 0\\ 1\\ 0\\ \end{bmatrix}
p0=[1,u](u=⎣⎡010⎦⎤,
若 左乘
q
0
=
i
q_{0}=\boldsymbol{i}
q0=i,同理,它的四元數表達可以為
q
0
=
[
0
,
u
]
(
u
=
[
1
0
0
]
)
q_{0}=[ 0,\boldsymbol{u}] (\boldsymbol{u}= \begin{bmatrix} 1\\ 0\\ 0\\ \end{bmatrix})
q0=[0,u](u=⎣⎡100⎦⎤),
結果
p
0
′
=
q
0
p
0
=
i
+
k
p_{0}'=q_{0}p_{0}=\boldsymbol{i}+\boldsymbol{k}
p0′=q0p0=i+k
從這個例子我們很難看出旋轉的規律,這也正是我們面對的問題,如何表示某個確定的旋轉?
在網頁連結的互動平臺https://eater.net親自感受時,觀察到座標實際旋轉恰為給定旋轉角的二倍,十分想理解其中緣由。
從三維旋轉說起
將三維空間中的旋轉表示的方法採用軸角式(Axis-Angle),即某個向量
v
\boldsymbol{v}
v 圍繞軸
u
\boldsymbol{u}
u 旋轉角度大小為
θ
\theta
θ後到達
v
′
\boldsymbol{v'}
v′,如圖所示(原圖來源:https://krasjet.github.io/quaternion/quaternion.pdf)
將向量
v
\boldsymbol{v}
v 分解為垂直於
u
\boldsymbol{u}
u 的
v
⊥
\boldsymbol{v_{\perp}}
v⊥ 和平行於
u
\boldsymbol{u}
u 的
v
∥
\boldsymbol{v_{\parallel}}
v∥
由圖易知:
v
∥
′
=
v
∥
\boldsymbol{v_{\parallel}'}=\boldsymbol{v_{\parallel}}
v∥′=v∥
故只需計算
v
⊥
′
\boldsymbol{v_{\perp}'}
v⊥′即可得
v
′
=
v
⊥
′
+
v
∥
(
1
)
\boldsymbol{v'}=\boldsymbol{v_{\perp}'}+\boldsymbol{v_{\parallel}}\qquad(1)
v′=v⊥′+v∥(1)
將上圖垂直軸
u
\boldsymbol{u}
u 的平面投影如下圖:
可知表示式:
v
⊥
′
=
v
⊥
c
o
s
θ
+
w
s
i
n
θ
(
2
)
\boldsymbol{v_{\perp}'}=\boldsymbol{v_{\perp}}cos\theta+\boldsymbol{w}sin\theta \qquad(2)
v⊥′=v⊥cosθ+wsinθ(2)
這裡
∣
∣
w
∣
∣
=
∣
∣
v
⊥
∣
∣
||\boldsymbol{w}||= ||\boldsymbol{v_{\perp}}||
∣∣w∣∣=∣∣v⊥∣∣ 且 與
v
⊥
\boldsymbol{v_{\perp}}
v⊥ 及
u
\boldsymbol{u}
u 垂直,則可通過
v
⊥
\boldsymbol{v_{\perp}}
v⊥ 及
u
\boldsymbol{u}
u 叉乘獲得:
w
=
v
⊥
×
u
∣
∣
u
∣
∣
\boldsymbol{w}= \boldsymbol{v_{\perp}} \times \frac{ \boldsymbol{u}}{ ||\boldsymbol{u}||}
w=v⊥×∣∣u∣∣u
由旋轉軸大小不重要,則令其模長為1:
∣
∣
u
∣
∣
=
1
||\boldsymbol{u}||=1
∣∣u∣∣=1 則有:
w
=
v
⊥
×
u
(
3
)
\boldsymbol{w}= \boldsymbol{v_{\perp}} \times \boldsymbol{u}\qquad(3)
w=v⊥×u(3)
此時,也可得出
v
⊥
\boldsymbol{v_{\perp}}
v⊥ 和
v
∥
\boldsymbol{v_{\parallel}}
v∥ 的表示式:
v ∥ = v ⋅ u ( 4 ) \boldsymbol{v_{\parallel}} = \boldsymbol{v} \cdot \boldsymbol{u}\qquad(4) v∥=v⋅u(4)
v
⊥
=
v
−
v
⋅
u
(
5
)
\boldsymbol{v_{\perp}} = \boldsymbol{v} - \boldsymbol{v} \cdot \boldsymbol{u}\qquad(5)
v⊥=v−v⋅u(5)
聯立式
(
1
)
(
2
)
(
3
)
(
4
)
(
5
)
(1)(2)(3)(4)(5)
(1)(2)(3)(4)(5)可得:
v
′
=
v
c
o
s
θ
+
(
1
−
c
o
s
θ
)
(
v
⋅
u
)
⋅
u
+
v
×
u
s
i
n
θ
(
5
)
\boldsymbol{v'} = \boldsymbol{v}cos\theta +(1-cos\theta)( \boldsymbol{v} \cdot \boldsymbol{u})\cdot \boldsymbol{u} +\boldsymbol{v} \times\boldsymbol{u}sin\theta\qquad(5)
v′=vcosθ+(1−cosθ)(v⋅u)⋅u+v×usinθ(5)
這個式子直觀的將變數和旋轉結果展示出來,符合我們的思維,這個式子是我們稍後四元數旋轉的基礎。
四元數旋轉!
一個奇妙的運算
兩個一般的四元數
q
1
=
a
+
b
i
+
c
j
+
d
k
q_{1}=a+b\boldsymbol{i}+c\boldsymbol{j}+d\boldsymbol{k}
q1=a+bi+cj+dk 與
q
2
=
e
+
f
i
+
g
j
+
h
k
q_{2}=e+f\boldsymbol{i}+g\boldsymbol{j}+h\boldsymbol{k}
q2=e+fi+gj+hk相乘,運用之前提到的乘法運算規則,整理結果如下:
換一種表示方法,更清楚規律為何:
q
1
=
[
a
,
v
]
(
v
=
[
b
c
d
]
)
q_{1}=[ a,\boldsymbol{v}] (\boldsymbol{v}= \begin{bmatrix} b\\ c\\ d\\ \end{bmatrix})
q1=[a,v](v=⎣⎡bcd⎦⎤)
q
2
=
[
e
,
u
]
(
u
=
[
f
g
h
]
)
q_{2}=[ e,\boldsymbol{u}] (\boldsymbol{u}= \begin{bmatrix} f\\ g\\ h\\ \end{bmatrix})
q2=[e,u](u=⎣⎡fgh⎦⎤)
本質源於四元數乘法運算的性質,我們得到如下表示式:
q 1 q 2 = [ a e − v u , e v + a u + v × u ] ( v = [ b c d ] , u = [ f g h ] ) ( 6 ) q_{1}q_{2}=[ ae-\boldsymbol{v}\boldsymbol{u},e\boldsymbol{v}+a\boldsymbol{u}+\boldsymbol{v}\times\boldsymbol{u}] (\boldsymbol{v}= \begin{bmatrix} b\\ c\\ d\\ \end{bmatrix}, \boldsymbol{u}= \begin{bmatrix} f\\ g\\ h\\ \end{bmatrix})\qquad(6) q1q2=[ae−vu,ev+au+v×u](v=⎣⎡bcd⎦⎤,u=⎣⎡fgh⎦⎤)(6)
三維 → \rightarrow →四維
從三維推廣到四維,首先簡化問題,把需要旋轉的四元數
v
v
v 取
v
=
[
0
,
v
]
v=[0,\boldsymbol{v}]
v=[0,v] ,則對應有:
v
⊥
=
[
0
,
v
⊥
]
v
∥
=
[
0
,
v
∥
]
u
=
[
0
,
u
]
v_{\perp}=[0,\boldsymbol{v_{\perp}}]\qquad v_{\parallel}=[0,\boldsymbol{v_{\parallel}}]\qquad u=[0,\boldsymbol{u}]
v⊥=[0,v⊥]v∥=[0,v∥]u=[0,u]
v
⊥
′
=
[
0
,
v
⊥
′
]
v
∥
′
=
[
0
,
v
∥
′
]
v
′
=
[
0
,
v
′
]
v_{\perp}'=[0,\boldsymbol{v_{\perp}'}]\qquad v_{\parallel}'=[0,\boldsymbol{v_{\parallel}'}]\qquad v'=[0,\boldsymbol{v'}]
v⊥′=[0,v⊥′]v∥′=[0,v∥′]v′=[0,v′]
將其代入式 ( 2 ) (2) (2)可得:
v
⊥
′
=
v
⊥
c
o
s
θ
+
w
s
i
n
θ
(
7
)
{v_{\perp}'}={v_{\perp}}cos\theta+{w}sin\theta \qquad(7)
v⊥′=v⊥cosθ+wsinθ(7)
w
=
[
0
,
w
]
(
w
=
u
×
v
⊥
)
w=[0,\boldsymbol{w}] (\boldsymbol{w}=\boldsymbol{u}\times\boldsymbol{v_{\perp}})
w=[0,w](w=u×v⊥)
而根據式
(
6
)
(6)
(6)計算四元數
u
u
u與
v
⊥
v_{\perp}
v⊥相乘恰有:
u
v
⊥
=
[
−
u
⋅
v
⊥
,
u
×
v
⊥
]
uv_{\perp}=[-\boldsymbol{u}\cdot\boldsymbol{v_{\perp}},\boldsymbol{u}\times\boldsymbol{v_{\perp}}]
uv⊥=[−u⋅v⊥,u×v⊥]
由
v
\boldsymbol{v}
v 與
u
\boldsymbol{u}
u 在同一平面,故
v
⊥
\boldsymbol{v_{\perp}}
v⊥ 垂直於此平面,即
v
⊥
⋅
u
=
0
\boldsymbol{v_{\perp}}\cdot\boldsymbol{u}=0
v⊥⋅u=0
原式化為:
u
v
⊥
=
[
0
,
u
×
v
⊥
]
=
[
0
,
w
]
uv_{\perp}=[0,\boldsymbol{u}\times\boldsymbol{v_{\perp}}]=[0,\boldsymbol{w} ]
uv⊥=[0,u×v⊥]=[0,w]
即:
u
v
⊥
=
w
(
8
)
uv_{\perp}=w \qquad(8)
uv⊥=w(8)
聯立式
(
7
)
(
8
)
(7)(8)
(7)(8)得:
v ⊥ ′ = v ⊥ c o s θ + u v ⊥ s i n θ {v_{\perp}'}={v_{\perp}}cos\theta+{uv_{\perp}}sin\theta v⊥′=v⊥cosθ+uv⊥sinθ
由分配律,化為:
v
⊥
′
=
(
c
o
s
θ
+
u
s
i
n
θ
)
v
⊥
(
9
)
{v_{\perp}'}=(cos\theta+{u}sin\theta) v_{\perp}\qquad(9)
v⊥′=(cosθ+usinθ)v⊥(9)
取 q = c o s θ + u s i n θ = [ c o s θ , u s i n θ ] q=cos\theta+{u}sin\theta=[cos\theta,\boldsymbol{u}sin\theta] q=cosθ+usinθ=[cosθ,usinθ]
式
(
9
)
(9)
(9)表示為:
v
⊥
′
=
q
v
⊥
(
9
)
{v_{\perp}'}=q v_{\perp}\qquad(9)
v⊥′=qv⊥(9)
由式
(
1
)
(1)
(1)推知:
v
′
=
v
⊥
′
+
v
∥
(
10
)
{v'}={v_{\perp}'}+{v_{\parallel}}\qquad(10)
v′=v⊥′+v∥(10)
聯立
(
9
)
(
10
)
(9)(10)
(9)(10)得:
v
′
=
q
v
⊥
+
v
∥
(
10
)
{v'}=q v_{\perp}+{v_{\parallel}}\qquad(10)
v′=qv⊥+v∥(10)
二倍角度來源
根據四元數乘法性質,推得:
若 q = [ c o s θ , u s i n θ ] q=[cos\theta,\boldsymbol{u}sin\theta] q=[cosθ,usinθ],則有
q 2 = q q = [ c o s 2 θ , u s i n 2 θ ] q^2=qq=[cos2\theta,\boldsymbol{u}sin2\theta] q2=qq=[cos2θ,usin2θ]
取
q
=
p
2
q=p^2
q=p2
將式
(
10
)
(10)
(10)化為:
v ′ = p p v ⊥ + p p − 1 v ∥ ( 11 ) {v'}=pp v_{\perp}+pp^-{1}{v_{\parallel}}\qquad(11) v′=ppv⊥+pp−1v∥(11)
與線性代數中的性質相似,這裡 ∣ ∣ p ∣ ∣ = 1 ||p||=1 ∣∣p∣∣=1,有:
p − 1 = p ∗ ( 12 ) p^{-1}=p*\qquad(12) p−1=p∗(12)
式 ( 11 ) (11) (11)化為:
v ′ = p p v ⊥ + p p ∗ v ∥ ( 13 ) {v'}=pp v_{\perp}+pp^{*}{v_{\parallel}}\qquad(13) v′=ppv⊥+pp∗v∥(13)
通過式
(
6
)
(6)
(6),我們可得兩個結論:
q
1
q
2
=
[
a
e
−
v
u
,
e
v
+
a
u
+
v
×
u
]
(
6
)
q_{1}q_{2}=[ ae-\boldsymbol{v}\boldsymbol{u},e\boldsymbol{v}+a\boldsymbol{u}+\boldsymbol{v}\times\boldsymbol{u}] \qquad(6)
q1q2=[ae−vu,ev+au+v×u](6)
- 對於 v ∥ = [ 0 , v ∥ ] v_{\parallel}=[0,\boldsymbol{v_{\parallel}}] v∥=[0,v∥], q = [ α , β u ] q=[\alpha,\beta \boldsymbol{u}] q=[α,βu],其中 v ∥ ∥ q v_{\parallel}\parallel q v∥∥q,則有:
q v ∥ = v ∥ q ( 14 ) qv_{\parallel}=v_{\parallel}q\qquad(14) qv∥=v∥q(14)- 對於 v ⊥ = [ 0 , v ∥ ] v_{\perp}=[0,\boldsymbol{v_{\parallel}}] v⊥=[0,v∥], q = [ α , β u ] q=[\alpha,\beta \boldsymbol{u}] q=[α,βu],其中 v ⊥ ⊥ q v_{\perp}\perp q v⊥⊥q,則有:
q v ⊥ = v ⊥ q ∗ ( 15 ) qv_{\perp}=v_{\perp}q* \qquad(15) qv⊥=v⊥q∗(15)
聯立式
(
13
)
(
14
)
(
15
)
(13)(14)(15)
(13)(14)(15)得:
v
′
=
p
v
⊥
p
∗
+
p
v
∥
p
∗
{v'}=p v_{\perp}p*+p{v_{\parallel}}p^{*}
v′=pv⊥p∗+pv∥p∗
由式
(
12
)
(12)
(12):
v
′
=
p
v
⊥
p
−
1
+
p
v
∥
p
−
1
{v'}=p v_{\perp}p^{-1}+p{v_{\parallel}}p^{-1}
v′=pv⊥p−1+pv∥p−1
整理得:
v
′
=
p
(
v
⊥
+
v
∥
)
p
−
1
{v'}=p( v_{\perp}+{v_{\parallel}})p^{-1}
v′=p(v⊥+v∥)p−1
最終即為:
v
′
=
p
v
p
−
1
{v'}=pvp^{-1}
v′=pvp−1
正是互動網頁所顯示的表示式!
相關文章
- 四元數的旋轉公式推導公式
- 旋轉矩陣推導矩陣
- 三維旋轉矩陣推導矩陣
- 二維旋轉矩陣推導矩陣
- 3D旋轉矩陣的推導3D矩陣
- 在遊戲製作中渲染公式推導(轉)遊戲公式
- Lucene打分公式的推導公式
- 矩陣變換:沿任意軸旋轉及其推導矩陣
- 二項式定理公式推導公式
- LOAM原始碼分析附公式推導原始碼公式
- 三角函式公式推導函式公式
- FlashAttention逐代解析與公式推導公式
- 矩陣求導公式【轉】矩陣求導公式
- Diffusion系列 - DDIM 公式推導 + 程式碼 -(三)公式
- 高斯公式對高斯定理的推導公式
- 三維旋轉:旋轉矩陣,尤拉角,四元數矩陣
- 擴充套件歐幾里得演算法公式快速推導套件演算法公式
- 三維旋轉矩陣的推導過程(以右手座標系為例)矩陣
- 核化線性降維中部分公式的推導公式
- 線性迴歸模型公式推導完整簡潔版模型公式
- 剛體在三維空間的旋轉(關於旋轉矩陣、DCM、旋轉向量、四元數、尤拉角)矩陣
- 總結:生成函式(斐波那契通項公式推導)函式公式
- 統一場理論公式推導和筆記——part5公式筆記
- 統一場理論公式推導和筆記——part6公式筆記
- 三維空間 旋轉矩陣 四元數 尤拉角 相互轉換 組合旋轉矩陣
- 旋轉變換(一)旋轉矩陣矩陣
- 使用xml來顯示數學公式 (轉)XML公式
- 挑選方案問題(牛客競賽 思維題+推導公式)公式
- 概率的公理化定義和資訊量定義公式推導公式
- 高等數學:曲線曲率推導
- 【HDU - 1792】A New Change Problem(推公式、互質數的最大不能表示數)公式
- 數學公式公式
- 旋轉字串字串
- 旋轉相簿
- 提高SAR ADC精度的外圍電路RC元件取值公式推導元件公式
- Python推導式(列表推導式、元組推導式、字典推導式和集合推導式)Python
- Markdown 公式指導手冊公式
- 將圖片旋轉(這裡不是旋轉imageView)View