位姿變換與李羣、李代數

  本博客是在學習高翔《視覺SLAM十四講》過程中對位姿變換與李羣李代數相關知識點做的總結,不涉及公式的證明與推導。

一、位姿變換

1、旋轉矩陣與變換矩陣

旋轉矩陣是描述剛體旋轉最常見的一種形式,而變換矩陣通常是指旋轉矩陣與平移向量組成的齊次變換矩陣。對於三維空間的位姿變換,有旋轉矩陣

R=[r1r2r3]=[r11r12r13r21r22r23r31r32r33]

平移向量:

t=[t1t2t3]T

則旋轉矩陣R 與平移向量t 組成的齊次變換矩陣爲:

T=[Rt0T1]=[r11r12r13t1r21r22r23t2r31r32r33t30001]

旋轉矩陣R 是一種單位正交陣,它具有單位正交陣所有的性質:

{r1Tr2=r1Tr3=r2Tr3=0r1=r2=r3=det(R)=1

重要的是,旋轉矩陣的逆等於旋轉矩陣的轉置,即R1=RT ,從而有RR1=RRT=I 。齊次變換矩陣T 的逆爲:

T1=[R1R1t0T1]=[RTRTt0T1]

假設我們由座標系A經過變換矩陣TBAT=[Rt0T1] 得到了座標系B,那麼座標系B下的點PBP 可在座標系A中表示爲:

PAP=TBATPBP=[Rt0T1][PBP1]=RPBP+t

同樣,座標系A下的點PAP 可在座標系B中表示爲:

PBP=TABTPAP=TBAT1PAP=[RTRTt0T1][PAP1]=RTPAPRTt=RT(PAPt)

2、歐拉角與旋轉矩陣

歐拉角是描述剛體旋轉最直觀的一種形式,它往往只用於可視化的人機交互,而無法直接參與運算。

這裏寫圖片描述

對於三維空間座標系,我們通常這樣規定:

{繞 X 軸旋轉的角度稱爲橫滾角,Roll繞 Y 軸旋轉的角度稱爲俯仰角,Pitch繞 Z 軸旋轉的角度稱爲偏航角,Yaw

所有的旋轉,沿着旋轉軸方向順時針旋轉的角度爲正,逆時針旋轉的角度爲負。對於平移,沿着該軸正方向平移的距離爲正,負方向平移的距離爲負。

設剛體繞着Z 軸旋轉γ 角度,那麼剛體上所有點的z 座標值不變,xy 的座標值分別變爲:

x=ρcos(θ+γ)=ρ(cosθcosγsinθsinγ)=xcosγysinγy=ρsin(θ+γ)=ρ(cosθsinγ+sinθcosγ)=xsinγ+ycosγ

寫成矩陣的形式:

[xyz]=[cosγsinγ0sinγcosγ0001][xyz]=RZ(γ)[xyz]

從而,我們總結出歐拉角與旋轉矩陣的關係:

{Roll:RX(α)=rotx(α)=[1000cosαsinα0sinαcosα]Pitch:RY(β)=roty(β)=[cosβ0sinβ010sinβ0cosβ]Yaw:RZ(γ)=rotz(γ)=[cosγsinγ0sinγcosγ0001]

有了歐拉角與旋轉矩陣之間的轉換關係,下面舉一個簡單的例子驗證一下:

如上圖所示,有位於立方體頂點上的三個座標系O1O2O3 ,以及位於立方體中心的點P ,立方體的邊長分別爲6、8、10。下面先進行三個座標系之間的變換:

  • O1O2

    相對變換O1 先沿着座標軸O1X1 的正方向平移10個單位到達O2 ,然後繞着當前位置的O1Z1 軸順時針旋轉90°,此時新得到的O1O2 座標系完全重合,即完成了O1O2 的座標系變換。以上過程可以在MATLAB中用變換矩陣表述爲:

    T21T=transl(10,0,0)*trotz(pi/2)=[10010010000100001][0100100000100001]=[01010100000100001]

    絕對變換O1 先繞着座標軸O1Z1 順時針旋轉90°,然後沿着原來O1X1 軸的正方向平移10個單位到達O2 ,此時新得到的O1O2 座標系完全重合,即完成了O1O2 的座標系變換。以上過程可以在MATLAB中用變換矩陣表述爲:

    T21T=transl(10,0,0)*trotz(pi/2)=[10010010000100001][0100100000100001]=[01010100000100001]=T21T

    你可能會問,兩次不同的操作爲什麼表達式是一樣的?原因是這裏牽涉到相對變換與絕對變換的區別

    {相對變換:每一步都以新得的座標系爲參考,每一步得到的變換矩陣依次右乘;絕對變換:始終以最初的座標系爲參考,通常是先旋轉再平移,每一步得到的變換矩陣依次左乘;相對變換與絕對變換不可同時使用!

    當然,O1O2 的相對變換還可以有很多種操作順序,比如:

    T21T=trotz(pi/2)*transl(0,-10,0)=[0100100000100001][10000101000100001]=[01010100000100001]=T21T

    等等,這裏不再一一列舉。

  • O2O1

    相對變換

    T12T=transl(0,10,0)*trotz(-pi/2)=[10000101000100001][0100100000100001]=trotz(-pi/2)*transl(-10,0,0)=[0100100000100001][10010010000100001]=[01001001000100001]

    絕對變換

    T12T=transl(0,10,0)*trotz(-pi/2)=[10000101000100001][0100100000100001]=[01001001000100001]=T12T

    相信這些表達式的意義都很容易理解,接下來驗證一下T21TT12T 是不是互逆:

    T21TT12T=[01010100000100001][01001001000100001]=[1000010000100001]=I

    顯然,O1O2O2O1 互爲逆變換,T21TT12T 互逆。其實,由O1O2 的變換矩陣就是對座標系O2 在座標系O1 中位姿的一種描述,即T21T 描述了O2O1 中的位置和姿態。同理,T12T 描述了O1O2 中的位置和姿態。那麼,我們已經知道了點PO1 座標系下的座標爲P1P=(5,4,3)T ,座標系O1 在座標系O2 下的位姿爲T12T ,順理成章地,我們就可以求得點PO2 座標系下的座標爲:

    P2P=T12TP1P=[01001001000100001][5431]=[4531]

    很顯然,結果跟事實是一致的。

  • O2O3

    T32T=transl(8,0,6)*troty(pi)=troty(pi)*transl(-8,0,-6)=[1008010000160001]T23T=transl(8,0,6)*troty(pi)=troty(pi)*transl(-8,0,-6)=[1008010000160001]T32TT23T=[1008010000160001]2=[1000010000100001]=IP3P=T23TP2P=[1008010000160001][4531]=[4531]
  • O1O3

    T31T=transl(10,8,6)*trotz(pi/2)*troty(pi)=trotz(-pi/2)*trotx(pi)*transl(-8,-10,-6)=T21TT32T=[01010100800160001]P3P=T13TP1P=T31T1P1P=[01081001000160001][5431]=[4531]

3、旋轉向量與旋轉矩陣

旋轉向量(或稱軸角,Axis-Angle),是一種定義在R3 上的三維向量(對於三維空間的旋轉來說),它可以描述剛體在三維空間中繞任意旋轉軸發生的旋轉。旋轉向量的方向代表旋轉軸的方向,它的模代表旋轉的角度。對於一個旋轉軸爲nn=1 ),轉角爲θ 的旋轉向量θnθ 單位爲弧度),它與旋轉矩陣R 的關係爲:

  • 旋轉向量到旋轉矩陣

    (羅德里格斯公式)R=I+sinθn+(1cosθ)n2=cosθI+sinθn+(1cosθ)nnT

    這裏的nn=[nxnynz]T 所對應的反對稱矩陣:

    n=[0nznynz0nxnynx0]

    n2=nn=nnTIn3=n

  • 旋轉矩陣到旋轉向量

    {θ=arccos(tr(R)12)Rn=n

    其中,tr(R) 表示旋轉矩陣R 的跡。旋轉軸n 其實就是矩陣R 特徵值1所對應的特徵向量。

4、四元數與旋轉向量

不得不指出的是,旋轉矩陣具有冗餘性,而歐拉角和旋轉向量都具有奇異性,只有四元數(Quaternions)可以完美地描述一個剛體在三維空間的旋轉。

通常,我們用單位四元數q=qw+qxi+qyj+qzk 表示三維空間中任意一個旋轉,寫成向量的形式:

q=[qwqxqyqz]Tq=[qxqyqzqw]T

單位四元數q 與旋轉向量θn 的關係

(四元數到旋轉向量)θn=θ[nxnynz]T=2arccosqw[qxsinθ2qysinθ2qzsinθ2]T

(旋轉向量到四元數)qw=cosθ2qx=nxsinθ2qy=nysinθ2qz=nzsinθ2

單位四元數q 與旋轉矩陣R 的關係

(四元數到旋轉矩陣)R=[r11r12r13r21r22r23r31r32r33]=[12(qy2+qz2)2(qxqyqwqz)2(qxqz+qwqy)2(qxqy+qwqz)12(qx2+qz2)2(qyqzqwqx)2(qxqzqwqy)2(qyqz+qwqx)12(qx2+qy2)]

(旋轉矩陣到四元數)qw=tr(R)+12qx=r23r324qwqy=r31r134qwqz=r12r214qw

二、李羣與李代數

1、什麼是李羣

羣(Group)是一種集合加上一種運算的代數結構,李羣(Lie Group)是指具有連續(光滑)性質的羣。三維空間中的旋轉矩陣RSO(3) 和變換矩陣TSE(3) 都屬於李羣,它們也都有各自的名字:SO(n) 稱爲特殊正交羣(Special Orthogonal Group,或稱旋轉矩陣羣),SE(n) 稱爲特殊歐式羣(Special Euclidean Group,或稱歐式變換羣),這裏的n 不限制爲3。

SO(3)={RR3×3|RRT=I,det(R)=1}SE(3)={T=[Rt0T1]R4×4|RSO(3),tR3}

重要的是,李羣中的旋轉矩陣羣與歐式變換羣對加法是不封閉的,只對乘法封閉,即:

R1+R2SO(3),T1+T2SE(3)R1R2SO(3),T1T2SE(3)

所以,剛體之間的位姿變換都是用乘法而不是用加法。

2、什麼是李代數

簡單地說,李代數(Lie Algebra)就是李羣的導數,它描述了李羣的局部性質,是定義在李羣正切空間(Tangent Space)上的一組向量。旋轉矩陣羣SO(3) 與歐式變換羣SE(3) 對應的李代數分別爲:

so(3)={ϕR3,Φ=ϕR3×3}se(3)={ξ=[ρϕ]R6,ρR3,ϕso(3),Ξ=ξ=[ϕρ0T1]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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章