本博客是在學習高翔《視覺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