三維空間中通常可以用旋轉矩陣、旋轉向量、歐拉角和四元數來描述旋轉
旋轉矩陣
先回顧下向量的內積和外積
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪a⋅b=aTb=∑3i=1aibi=|a||b|cos(a,b)a×b=⎡⎣⎢ia1b1ja2b2ka3b3⎤⎦⎥=⎡⎣⎢a2b3−a3b2a3b1−a1b3a1b2−a2b1⎤⎦⎥=⎡⎣⎢0a3−a2−a30a1a2−a10⎤⎦⎥b=a^b(1)
其中
a^=⎡⎣⎢0a3−a2−a30a1a2−a10⎤⎦⎥ 是取向量
a 的
反對角矩陣
外積只對三維向量存在定義,並且可以表示向量的旋轉:
假設兩個不平行向量a ,b ,可以用一個與a,b 所在平面垂直的向量描述a 到b 的旋轉(圖1)
圖1. w 與a×b 方向一致,相當於旋轉軸,模值等於角度
對空間中一個向量a ,假設有兩組單位正交基O1=(e1,e2,e3) 和O2=(e′1,e′2,e′3) ,向量在兩個座標系下座標爲[a1,a2,a3]T 和[a′1,a′2,a′3]T ,那麼有
[e1,e2,e3][a1,a2,a3]T=[e′1,e′2,e′3][a′1,a′2,a′3]T(1)
(1)式兩邊同左乘
[eT1,eT2,eT3]T ,有
⎡⎣⎢a1a2a3⎤⎦⎥=⎡⎣⎢⎢eT1e′1eT2e′1eT3e′1eT1e′2eT2e′2eT3e′2eT1e′3eT2e′3eT3e′3⎤⎦⎥⎥⎡⎣⎢a′1a′2a′3⎤⎦⎥=Ra′(2)
(2)式的R 稱爲旋轉矩陣,用來描述相機的旋轉
旋轉矩陣是行列式爲1的正交矩陣,反之,行列式爲1的正交矩陣也是一個旋轉矩陣
SO(n)={R∈Rn×n|RRT=I,det(R)=1}
其中
SO(n) 是特殊正交羣,特別的
SO(3) 就是三維空間的旋轉
旋轉矩陣的劣勢
- 旋轉矩陣有9個量,但一次旋轉只有3個自由度。因此這種表達方式是冗餘的
- 旋轉矩陣有自身約束:必須是正交矩陣,且行列式爲1,優化算法比較難應用
旋轉向量
旋轉向量用一個三維向量來描述旋轉:其方向與旋轉軸一致,長度等於旋轉角
回顧向量外積,圖1的w 就是a 到b 的旋轉向量
旋轉向量與旋轉矩陣轉換
假設旋轉軸爲n ,角度爲θ ,使用羅德里格斯公式可以轉換到旋轉矩陣
R=cosθI+(1−cosθ)nnT+sinθn^(3)
同樣可以得到由旋轉矩陣到旋轉向量的公式
{θ=arccos(tr(R)−12)n=R特徵值爲1的特徵向量(4)
此外,旋轉矩陣實際就是SO(3) 的李羣,旋轉向量就是對應的李代數so(3) ,兩者通過指數映射相聯繫(與羅德里格斯等價)
R=exp(ϕ^)(5)
其中
ϕ^ 就是對旋轉向量
ϕ 取反對稱矩陣
歐拉角
歐拉角是一種最直觀的旋轉描述方式,也是一個3維向量,分別代表繞某個軸的旋轉角度
- 相同的角度,旋轉次序的不同,旋轉結果不一樣。一般常見的是rpy角(旋轉順序是ZYX)
- 使用歐拉角一個最大的缺點是萬向鎖問題:俯仰角爲±90 度時,第一次旋轉和第三次旋轉將使用同一個軸,使得系統丟失了一個自由度
- 因此歐拉角不適於插值和迭代,往往只用於人機交互中
四元數
旋轉矩陣用9個量描述3自由度的旋轉,具有冗餘性
歐拉角和旋轉向量用3個量描述3自由度的旋轉,是緊湊的,但具有奇異性
四元數用4個量描述3自由度的旋轉,緊湊又沒有奇異性
一個四元數q 擁有1個實部和3個虛部
q=q0+q1i+q2j+q3k(6)
滿足
⎧⎩⎨⎪⎪⎪⎪i2+j2+k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j(7)
旋轉向量與四元數的轉換
對於一個旋轉向量:繞單位向量n=[n+x,ny,nz]T 做了θ 度的旋轉,那麼其四元數爲
q=[cosθ2,nxsinθ2,nysinθ2,nzsinθ2]T(8)
同樣,也可以由四元數求得旋轉向量
⎧⎩⎨θ=2arccosq0[nx,ny,nz]T=[q1,q2,q3]Tsinθ2(9)
旋轉矩陣與四元數的轉換
設四元數q=q0+q1i+q2j+q3k(6) ,對應的旋轉矩陣爲
R=⎡⎣⎢⎢1−2q22−2q232q1q2−2q0q32q1q3+2q0q22q1q2+2q0q31−2q21−2q232q2q3−2q0q12q1q3−2q0q22q2q3+2q0q11−2q21−2q22⎤⎦⎥⎥(10)
反之也可以由
R 推得四元數
q
q0=tr(R)+1−−−−−−−−√2,q1=R23−R324q0,q2=R31−R134q0,q3=R12−R214q0(11)
用四元數表示旋轉
對於一個空間三維點p=[x,y,z] ,指定一個繞n 做θ 角的旋轉,旋轉後的點爲p′
1)首先將三維點用一個虛四元數來描述
p=[0,x,y,z]=[0,v]
2)用四元數
q 來表達旋轉
q=[cosθ2,nsinθ2]
3)旋轉後的點爲
p′=qpq−1