本博客是在學習高翔《視覺SLAM十四講》過程中對位姿變換與李羣李代數相關知識點做的總結,不涉及公式的證明與推導。
一、位姿變換
1、旋轉矩陣與變換矩陣
旋轉矩陣是描述剛體旋轉最常見的一種形式,而變換矩陣通常是指旋轉矩陣與平移向量組成的齊次變換矩陣。對於三維空間的位姿變換,有旋轉矩陣:
R=[r1r2r3]=⎡⎣⎢r11r21r31r12r22r32r13r23r33⎤⎦⎥
平移向量:
t=[t1t2t3]T
則旋轉矩陣R 與平移向量t 組成的齊次變換矩陣爲:
T=[R0Tt1]=⎡⎣⎢⎢⎢⎢r11r21r310r12r22r320r13r23r330t1t2t31⎤⎦⎥⎥⎥⎥
旋轉矩陣R 是一種單位正交陣,它具有單位正交陣所有的性質:
{r1T⋅r2=r1T⋅r3=r2T⋅r3=0∥r1∥=∥r2∥=∥r3∥=det(R)=1
重要的是,旋轉矩陣的逆等於旋轉矩陣的轉置,即R−1=RT ,從而有RR−1=RRT=I 。齊次變換矩陣T 的逆爲:
T−1=[R−10T−R−1t1]=[RT0T−RTt1]
假設我們由座標系A經過變換矩陣TABT=[R0Tt1] 得到了座標系B,那麼座標系B下的點PBP 可在座標系A中表示爲:
PAP=TABTPBP=[R0Tt1][PBP1]=RPBP+t
同樣,座標系A下的點PAP 可在座標系B中表示爲:
PBP=TBATPAP=TABT−1PAP=[RT0T−RTt1][PAP1]=RTPAP−RTt=RT(PAP−t)
2、歐拉角與旋轉矩陣
歐拉角是描述剛體旋轉最直觀的一種形式,它往往只用於可視化的人機交互,而無法直接參與運算。
對於三維空間座標系,我們通常這樣規定:
⎧⎩⎨繞 X 軸旋轉的角度稱爲橫滾角,Roll繞 Y 軸旋轉的角度稱爲俯仰角,Pitch繞 Z 軸旋轉的角度稱爲偏航角,Yaw
所有的旋轉,沿着旋轉軸方向順時針旋轉的角度爲正,逆時針旋轉的角度爲負。對於平移,沿着該軸正方向平移的距離爲正,負方向平移的距離爲負。
設剛體繞着Z 軸旋轉γ 角度,那麼剛體上所有點的z 座標值不變,x 與y 的座標值分別變爲:
x′=ρcos(θ+γ)=ρ(cosθ⋅cosγ−sinθ⋅sinγ)=x⋅cosγ−y⋅sinγy′=ρsin(θ+γ)=ρ(cosθ⋅sinγ+sinθ⋅cosγ)=x⋅sinγ+y⋅cosγ
寫成矩陣的形式:
⎡⎣⎢x′y′z′⎤⎦⎥=⎡⎣⎢cosγsinγ0−sinγcosγ0001⎤⎦⎥⎡⎣⎢xyz⎤⎦⎥=RZ(γ)⎡⎣⎢xyz⎤⎦⎥
從而,我們總結出歐拉角與旋轉矩陣的關係:
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪Roll:RX(α)=rotx(α)=⎡⎣⎢1000cosαsinα0−sinαcosα⎤⎦⎥Pitch:RY(β)=roty(β)=⎡⎣⎢cosβ0−sinβ010sinβ0cosβ⎤⎦⎥Yaw:RZ(γ)=rotz(γ)=⎡⎣⎢cosγsinγ0−sinγcosγ0001⎤⎦⎥
有了歐拉角與旋轉矩陣之間的轉換關係,下面舉一個簡單的例子驗證一下:
如上圖所示,有位於立方體頂點上的三個座標系O1 、O2 、O3 ,以及位於立方體中心的點P ,立方體的邊長分別爲6、8、10。下面先進行三個座標系之間的變換:
O1→O2 :
相對變換:O1 先沿着座標軸O1X1 的正方向平移10個單位到達O2 ,然後繞着當前位置的O1Z1 軸順時針旋轉90°,此時新得到的O1 與O2 座標系完全重合,即完成了O1 到O2 的座標系變換。以上過程可以在MATLAB中用變換矩陣表述爲:
T12T=transl(10,0,0)*trotz(pi/2)=⎡⎣⎢⎢⎢10000100001010001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0100−100000100001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0100−1000001010001⎤⎦⎥⎥⎥
絕對變換:O1 先繞着座標軸O1Z1 順時針旋轉90°,然後沿着原來O1X1 軸的正方向平移10個單位到達O2 ,此時新得到的O1 與O2 座標系完全重合,即完成了O1 到O2 的座標系變換。以上過程可以在MATLAB中用變換矩陣表述爲:
T12T′=transl(10,0,0)*trotz(pi/2)=⎡⎣⎢⎢⎢10000100001010001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0100−100000100001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0100−1000001010001⎤⎦⎥⎥⎥=T12T
你可能會問,兩次不同的操作爲什麼表達式是一樣的?原因是這裏牽涉到相對變換與絕對變換的區別:
⎧⎩⎨相對變換:每一步都以新得的坐標系爲參考,每一步得到的變換矩陣依次右乘;絕對變換:始終以最初的坐標系爲參考,通常是先旋轉再平移,每一步得到的變換矩陣依次左乘;相對變換與絕對變換不可同時使用!
當然,O1→O2 的相對變換還可以有很多種操作順序,比如:
T12T′′=trotz(pi/2)*transl(0,-10,0)=⎡⎣⎢⎢⎢0100−100000100001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢1000010000100−1001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0100−1000001010001⎤⎦⎥⎥⎥=T12T
等等,這裏不再一一列舉。
O2→O1 :
相對變換:
T21T=transl(0,10,0)*trotz(-pi/2)=⎡⎣⎢⎢⎢10000100001001001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0−100100000100001⎤⎦⎥⎥⎥=trotz(-pi/2)*transl(-10,0,0)=⎡⎣⎢⎢⎢0−100100000100001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢100001000010−10001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0−1001000001001001⎤⎦⎥⎥⎥
絕對變換:
T21T′=transl(0,10,0)*trotz(-pi/2)=⎡⎣⎢⎢⎢10000100001001001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0−100100000100001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢0−1001000001001001⎤⎦⎥⎥⎥=T21T
相信這些表達式的意義都很容易理解,接下來驗證一下T12T 與T21T 是不是互逆:
T12TT21T=⎡⎣⎢⎢⎢0100−1000001010001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0−1001000001001001⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢1000010000100001⎤⎦⎥⎥⎥=I
顯然,O1→O2 與O2→O1 互爲逆變換,T12T 與T21T 互逆。其實,由O1 到O2 的變換矩陣就是對座標系O2 在座標系O1 中位姿的一種描述,即T12T 描述了O2 在O1 中的位置和姿態。同理,T21T 描述了O1 在O2 中的位置和姿態。那麼,我們已經知道了點P 在O1 座標系下的座標爲P1P=(5,4,3)T ,座標系O1 在座標系O2 下的位姿爲T21T ,順理成章地,我們就可以求得點P 在O2 座標系下的座標爲:
P2P=T21TP1P=⎡⎣⎢⎢⎢0−1001000001001001⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢5431⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢4531⎤⎦⎥⎥⎥
很顯然,結果跟事實是一致的。
O2↔O3 :
T23T=transl(8,0,6)*troty(pi)=troty(pi)*transl(-8,0,-6)=⎡⎣⎢⎢⎢−1000010000−108061⎤⎦⎥⎥⎥T32T=transl(8,0,6)*troty(pi)=troty(pi)*transl(-8,0,-6)=⎡⎣⎢⎢⎢−1000010000−108061⎤⎦⎥⎥⎥T23TT32T=⎡⎣⎢⎢⎢−1000010000−108061⎤⎦⎥⎥⎥2=⎡⎣⎢⎢⎢1000010000100001⎤⎦⎥⎥⎥=IP3P=T32TP2P=⎡⎣⎢⎢⎢−1000010000−108061⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢4531⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢4531⎤⎦⎥⎥⎥
O1→O3 :
T13T=transl(10,8,6)*trotz(pi/2)*troty(pi)=trotz(-pi/2)*trotx(pi)*transl(-8,-10,-6)=T12TT23T=⎡⎣⎢⎢⎢0−100−100000−1010861⎤⎦⎥⎥⎥P3P=T31TP1P=T13T−1P1P=⎡⎣⎢⎢⎢0−100−100000−1081061⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢5431⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢4531⎤⎦⎥⎥⎥
3、旋轉向量與旋轉矩陣
旋轉向量(或稱軸角,Axis-Angle),是一種定義在R3 上的三維向量(對於三維空間的旋轉來說),它可以描述剛體在三維空間中繞任意旋轉軸發生的旋轉。旋轉向量的方向代表旋轉軸的方向,它的模代表旋轉的角度。對於一個旋轉軸爲n (∥n∥=1 ),轉角爲θ 的旋轉向量θn (θ 單位爲弧度),它與旋轉矩陣R 的關係爲:
旋轉向量到旋轉矩陣
R=I+sinθn∧+(1−cosθ)n∧2=cosθI+sinθn∧+(1−cosθ)nnT(羅德裏格斯公式)
這裏的n∧ 爲n=[nxnynz]T 所對應的反對稱矩陣:
n∧=⎡⎣⎢0nz−ny−nz0nxny−nx0⎤⎦⎥
且n∧2=n∧n∧=nnT−I ,n∧3=−n∧
旋轉矩陣到旋轉向量
⎧⎩⎨⎪⎪θ=arccos(tr(R)−12)Rn=n
其中,tr(R) 表示旋轉矩陣R 的跡。旋轉軸n 其實就是矩陣R 特徵值1所對應的特徵向量。
4、四元數與旋轉向量
不得不指出的是,旋轉矩陣具有冗餘性,而歐拉角和旋轉向量都具有奇異性,只有四元數(Quaternions)可以完美地描述一個剛體在三維空間的旋轉。
通常,我們用單位四元數q=qw+qxi+qyj+qzk 表示三維空間中任意一個旋轉,寫成向量的形式:
q=[qwqxqyqz]T或q=[qxqyqzqw]T
單位四元數q 與旋轉向量θn 的關係:
θn=θ[nxnynz]T=2arccosqw[qxsinθ2qysinθ2qzsinθ2]T(四元數到旋轉向量)
qw=cosθ2,qx=nxsinθ2,qy=nysinθ2,qz=nzsinθ2(旋轉向量到四元數)
單位四元數q 與旋轉矩陣R 的關係:
R=⎡⎣⎢r11r21r31r12r22r32r13r23r33⎤⎦⎥=⎡⎣⎢1−2(q2y+q2z)2(qxqy+qwqz)2(qxqz−qwqy)2(qxqy−qwqz)1−2(q2x+q2z)2(qyqz+qwqx)2(qxqz+qwqy)2(qyqz−qwqx)1−2(q2x+q2y)⎤⎦⎥(四元數到旋轉矩陣)
qw=tr(R)+1−−−−−−−−√2,qx=r23−r324qw,qy=r31−r134qw,qz=r12−r214qw(旋轉矩陣到四元數)
二、李羣與李代數
1、什麼是李羣
羣(Group)是一種集合加上一種運算的代數結構,李羣(Lie Group)是指具有連續(光滑)性質的羣。三維空間中的旋轉矩陣R∈SO(3) 和變換矩陣T∈SE(3) 都屬於李羣,它們也都有各自的名字:SO(n) 稱爲特殊正交羣(Special Orthogonal Group,或稱旋轉矩陣羣),SE(n) 稱爲特殊歐式羣(Special Euclidean Group,或稱歐式變換羣),這裏的n 不限制爲3。
SO(3)={R∈R3×3|RRT=I,det(R)=1}SE(3)={T=[R0Tt1]∈R4×4|R∈SO(3),t∈R3}
重要的是,李羣中的旋轉矩陣羣與歐式變換羣對加法是不封閉的,只對乘法封閉,即:
R1+R2∉SO(3),T1+T2∉SE(3)R1R2∈SO(3),T1T2∈SE(3)
所以,剛體之間的位姿變換都是用乘法而不是用加法。
2、什麼是李代數
簡單地說,李代數(Lie Algebra)就是李羣的導數,它描述了李羣的局部性質,是定義在李羣正切空間(Tangent Space)上的一組向量。旋轉矩陣羣SO(3) 與歐式變換羣SE(3) 對應的李代數分別爲:
so(3)={ϕ∈R3,Φ=ϕ∧∈R3×3}se(3)={ξ=[ρϕ]∈R6,ρ∈R3,ϕ∈so(3),Ξ=ξ∧=[ϕ∧0Tρ1]∈R4×4}
這裏,ϕ=θn 其實就是定義在R3 上的旋轉向量,Φ=ϕ∧ 是其所對應的反對稱矩陣。
3、李羣與李代數之間的轉換
SO(3)⇔so(3)⎧⎩⎨⎪⎪⎪⎪SO(3)−→−−−−對數映射so(3):ϕ=ln(R)∨so(3)−→−−−−指數映射SO(3):R=exp(ϕ∧)=eΦ
SE(3)⇔se(3)⎧⎩⎨⎪⎪⎪⎪SE(3)−→−−−−對數映射se(3):ξ=ln(T)∨se(3)−→−−−−指數映射SE(3):T=exp(ξ∧)=eΞ
參考文獻
[1] https://blog.csdn.net/csxiaoshui/article/details/65437633
[2] 高翔, 張濤. 視覺SLAM 十四講[M]. 電子工業出版社, 2017.
[3] https://blog.csdn.net/tms_li/article/details/78599748?locationNum=4&fps=1