位姿變換與李羣、李代數

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

一、位姿變換

1、旋轉矩陣與變換矩陣

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

R = [ r 1 r 2 r 3 ] = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ]

平移向量:

t = [ t 1 t 2 t 3 ] T

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

T = [ R t 0 T 1 ] = [ r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 0 0 0 1 ]

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

{ r 1 T r 2 = r 1 T r 3 = r 2 T r 3 = 0 r 1 = r 2 = r 3 = d e t ( R ) = 1

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

T 1 = [ R 1 R 1 t 0 T 1 ] = [ R T R T t 0 T 1 ]

假設我們由座標系A經過變換矩陣 T B A T = [ R t 0 T 1 ] 得到了座標系B,那麼座標系B下的點 P B P 可在座標系A中表示爲:

P A P = T B A T P B P = [ R t 0 T 1 ] [ P B P 1 ] = R P B P + t

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

P B P = T A B T P A P = T B A T 1 P A P = [ R T R T t 0 T 1 ] [ P A P 1 ] = R T P A P R T t = R T ( P A P t )

2、歐拉角與旋轉矩陣

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

這裏寫圖片描述

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

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

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

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

x = ρ c o s ( θ + γ ) = ρ ( c o s θ c o s γ s i n θ s i n γ ) = x c o s γ y s i n γ y = ρ s i n ( θ + γ ) = ρ ( c o s θ s i n γ + s i n θ c o s γ ) = x s i n γ + y c o s γ

寫成矩陣的形式:

[ x y z ] = [ c o s γ s i n γ 0 s i n γ c o s γ 0 0 0 1 ] [ x y z ] = R Z ( γ ) [ x y z ]

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

{ Roll: R X ( α ) = rotx ( α ) = [ 1 0 0 0 c o s α s i n α 0 s i n α c o s α ] Pitch: R Y ( β ) = roty ( β ) = [ c o s β 0 s i n β 0 1 0 s i n β 0 c o s β ] Yaw: R Z ( γ ) = rotz ( γ ) = [ c o s γ s i n γ 0 s i n γ c o s γ 0 0 0 1 ]

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

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

  • O 1 O 2

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

    T 2 1 T = transl(10,0,0)*trotz(pi/2) = [ 1 0 0 10 0 1 0 0 0 0 1 0 0 0 0 1 ] [ 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 ] = [ 0 1 0 10 1 0 0 0 0 0 1 0 0 0 0 1 ]

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

    T 2 1 T = transl(10,0,0)*trotz(pi/2) = [ 1 0 0 10 0 1 0 0 0 0 1 0 0 0 0 1 ] [ 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 ] = [ 0 1 0 10 1 0 0 0 0 0 1 0 0 0 0 1 ] = T 2 1 T

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

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

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

    T 2 1 T = trotz(pi/2)*transl(0,-10,0) = [ 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 ] [ 1 0 0 0 0 1 0 10 0 0 1 0 0 0 0 1 ] = [ 0 1 0 10 1 0 0 0 0 0 1 0 0 0 0 1 ] = T 2 1 T

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

  • O 2 O 1

    相對變換

    T 1 2 T = transl(0,10,0)*trotz(-pi/2) = [ 1 0 0 0 0 1 0 10 0 0 1 0 0 0 0 1 ] [ 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 ] = trotz(-pi/2)*transl(-10,0,0) = [ 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 ] [ 1 0 0 10 0 1 0 0 0 0 1 0 0 0 0 1 ] = [ 0 1 0 0 1 0 0 10 0 0 1 0 0 0 0 1 ]

    絕對變換

    T 1 2 T = transl(0,10,0)*trotz(-pi/2) = [ 1 0 0 0 0 1 0 10 0 0 1 0 0 0 0 1 ] [ 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 ] = [ 0 1 0 0 1 0 0 10 0 0 1 0 0 0 0 1 ] = T 1 2 T

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

    T 2 1 T T 1 2 T = [ 0 1 0 10 1 0 0 0 0 0 1 0 0 0 0 1 ] [ 0 1 0 0 1 0 0 10 0 0 1 0 0 0 0 1 ] = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] = I

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

    P 2 P = T 1 2 T P 1 P = [ 0 1 0 0 1 0 0 10 0 0 1 0 0 0 0 1 ] [ 5 4 3 1 ] = [ 4 5 3 1 ]

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

  • O 2 O 3

    T 3 2 T = transl(8,0,6)*troty(pi) = troty(pi)*transl(-8,0,-6) = [ 1 0 0 8 0 1 0 0 0 0 1 6 0 0 0 1 ] T 2 3 T = transl(8,0,6)*troty(pi) = troty(pi)*transl(-8,0,-6) = [ 1 0 0 8 0 1 0 0 0 0 1 6 0 0 0 1 ] T 3 2 T T 2 3 T = [ 1 0 0 8 0 1 0 0 0 0 1 6 0 0 0 1 ] 2 = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] = I P 3 P = T 2 3 T P 2 P = [ 1 0 0 8 0 1 0 0 0 0 1 6 0 0 0 1 ] [ 4 5 3 1 ] = [ 4 5 3 1 ]

  • O 1 O 3

    T 3 1 T = transl(10,8,6)*trotz(pi/2)*troty(pi) = trotz(-pi/2)*trotx(pi)*transl(-8,-10,-6) = T 2 1 T T 3 2 T = [ 0 1 0 10 1 0 0 8 0 0 1 6 0 0 0 1 ] P 3 P = T 1 3 T P 1 P = T 3 1 T 1 P 1 P = [ 0 1 0 8 1 0 0 10 0 0 1 6 0 0 0 1 ] [ 5 4 3 1 ] = [ 4 5 3 1 ]

3、旋轉向量與旋轉矩陣

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

  • 旋轉向量到旋轉矩陣

    (羅德里格斯公式) R = I + s i n θ n + ( 1 c o s θ ) n 2 = c o s θ I + s i n θ n + ( 1 c o s θ ) n n T

    這裏的 n n = [ n x n y n z ] T 所對應的反對稱矩陣:

    n = [ 0 n z n y n z 0 n x n y n x 0 ]

    n 2 = n

相關文章
相關標籤/搜索