本篇繼續參照高翔老師《視覺SLAM十四講從理論到實踐》,講解三維空間剛體運動。博文將原第三講分爲四部分來講解:1、旋轉矩陣和變換矩陣;2、旋轉向量表示旋轉;3、歐拉角表示旋轉;4、四元數表示變換。本文相對於原文會適當精簡,同時爲便於理解,會加入一些註解和補充知識點,本篇爲第二部分:旋轉向量表示旋轉,另外三部分請參照博主的其他博文。
1.定義
對於矩陣表示方式至少有以下兩個缺點:
1.SO(3)的旋轉矩陣有9個量,但一次旋轉只有3個自由度,因此這種表達方式是冗餘的,同理SE(4)也是。那麼,是否有更緊湊的表示呢?
2.旋轉矩陣和變換矩陣自身帶有約束:它必須是正交矩陣且行列式爲。當想估計或優化一個旋轉矩陣或變換矩陣時,這些約束會使得求解變的更困難。
因此,希望有一種方式能夠緊湊的描述旋轉和平移。
旋轉向量:事實上,任意旋轉都可以用一個旋轉軸和一個旋轉角來刻畫,於是,我們可以使用一個向量,其方向n與旋轉軸一致,其長度等於旋轉角Θ,那麼向量Θn也可以描述這個旋轉,這種向量稱爲旋轉向量(或軸角/角軸,Axis-Angle),只需一個三維向量即可描述旋轉。同樣,對於變換矩陣,使用一個旋轉向量和一個平移向量即可表達一次變換,此時變量維數正好是六維。
2.羅德里格斯公式
2.1 定義
羅德里格斯公式:旋轉向量和旋轉矩陣有什麼聯繫嗎?事實上,從旋轉向量到旋轉矩陣的轉換過程由羅德里格斯公式(Rodrigues’s Formula)表示。因爲任意旋轉都可以由一個旋轉軸n和一個旋轉角Θ刻畫,故羅德里格斯公式具體形式如下:R=cosθI+(1−cosθ)nnT+sinθn∧(1.1)
符號∧是向量到反對稱矩陣的轉換符,見第一篇博客的公式(1.4)。
2.2 推導
首先,理解圖1。定義向量k是旋轉軸的單位矢量,爲表示方便,使用k代表n。圖中初始向量v以k爲軸旋轉角θ得到vrot。向量w爲k×v的方向上的單位向量,向量v⊥和vrot⊥分別是v和vrot的垂直於平面的向量。向量a和b分別是vrot在w和v⊥方向上的分量。
圖1.1:旋轉向量3D圖(推薦數學繪圖軟件:geogebra)
所謂推導旋轉方程,實則求出一個旋轉矩陣,使得Vrot=Rv,所以我們要做的就是找出vrot與v,並用矩陣來表示。
此公式有2種形式,故而也有2種推導方法,兩者推導方法的不同主要在v⊥的表示上。具體推導過程如下。
2.2.1 推導一
推導一使用單位向量k表示,推導過程如下:
-
對v進行向量分解:v=v⊥+v∣∣
-
根據向量減法可得:v⊥=v−v∣∣
-
由旋轉過程平行向量不變得:vrot∣∣=v∣∣
-
v∣∣其實就是v在u上的正交投影(Orthogonal Projection),根據正交投影公式:v∣∣=projk(v)=k⋅kk⋅vk=∣∣k∣∣2k⋅vk=(k⋅v)k
其中u⋅k=∣∣k∣∣2,∣∣k∣∣=1,(v⋅k)爲標量,所以再乘向量k得到一個矢量
-
爲計算方便,對vrot⊥ 進行向量分解:vrot⊥=a+b
-
由圖中的向量關係經推導可得:a=sinθk×v,b=cosθv⊥,a,b的推導在後邊
-
綜上可得:
vrot=vrot⊥+vrot∣∣
=a+b+v∣∣
=sinθk×v+cosθv⊥+(v⋅k)k
=sinθk×v+cosθ(v−v∣∣)+(v⋅k)k
=sinθk×v+cosθ(v−(v⋅k)k)+(v⋅k)k
=cosθv+(1−cosθ)(v⋅k)k+sinθk×v
顯然:到此步,我們還無法將其用矩陣來表示,所以需要對(v⋅k)k 和 k×v 進行矩陣轉換,由點積的交換律和結合律得:(v⋅k)k=k⋅(v⋅k)=k⋅(kTv)=k⋅kTv其中的向量都是列向量,點積展開規則爲:x⋅y=[x,y]=xTy。
對於k×v可用叉乘矩陣來化簡爲Kv:⎣⎡(k×v)x(k×v)y(k×v)z⎦⎤=⎣⎡kyvz−kzvykzvx−kxvzkxvy−kyvx⎦⎤=⎣⎡0kzky−kz0kxky−kx0⎦⎤⎣⎡vxvyvz⎦⎤=Kv
故vrot=cosθv+(1−cosθ)(v⋅k)k+sinθk×v
=cosθv+(1−cosθ)kkTv+sinθKv
=(cosθI+(1−cosθ)kkT+sinθK)v
故旋轉矩陣R=cosθI+(1−cosθ)kkT+sinθK.(1.2)其中I爲單位矩陣。
2.2.2 推導二
與推導一相比,推導二的不同主要在於用叉乘去表示一些數據。用叉乘來表示v⊥可得:v⊥=−k×(k×v)。
所以聯立推導一中各式得:
vrot=vrot⊥+vrot∣∣
=a+b+v∣∣
=sinθk×v+cosθv⊥+v−v⊥
=sinθk×v−cosθk×(k×v)+v+k×(k×v)
=v+(1−cosθ)k×(k×v)+sinθk×v
=v+(1−cosθ)K2v+sinθKv(叉乘矩陣表示)
=(I+(1−cosθ)K2+sinθK)v
=Rv
從而得出第二種表達式R=I+(1−cosθ)K2+sinθK.(1.3)顯然,第二種表達式更爲簡便,在計算的過程中涉及的參數更少,所以這也是在進行旋轉操作時常用的公式。
2.2.3 推導a
向量a和b是由vrot⊥正交分解得到的矢量,既有大小又有方向,所以在求解時,我們要對其大小和方向分別求解。
大小
設θ1=π−θ,θ2是向量v和k的夾角,k爲單位向量,則對於a的大小∣a∣有:
∣a∣=sinθ1∣vrot⊥∣=sinθ1∣v⊥∣
=sin(π−θ)∣v⊥∣=sinθ∣v⊥∣
=sinθsinθ2∣v∣
=sinθsinθ2∣v∣∣k∣
=sinθ∣k×v∣
由公式∣a×b∣=sinθ∣a∣∣b∣知sinθ2∣v∣∣k∣=∣k×v∣,所以:
∣a∣=sinθ∣k×v∣
方向
由叉乘方向可得a的單位方向向量爲:k×v/∣k×v∣,綜上可得:
a=(k×v/∣k×v∣)∣a∣
=(k×v/∣k×v∣)sinθ∣k×v∣
=sinθk×v
2.2.4 推導b
大小
由圖得,θ1爲b和vrot⊥的夾角,則:
∣b∣=cosθ1∣vrot⊥∣=cos(π−θ)∣v⊥∣=−cosθ∣v⊥∣
方向
由於b的方向與v⊥方向相反,可得b的單位方向向量爲:−v⊥/∣v⊥∣,綜上可得:
b=(−v⊥/∣v⊥∣)∣b∣
=cosθv⊥
至此,羅德里格斯公式的證明全部結束。此外,如果讀者希望獲得關於Oxyz座標系的旋轉變換關係,可以參考這篇博客:圖形變換之旋轉變換公式推導。
羅德里格斯公式反應的是旋轉向量到旋轉矩陣的轉換關係,如果已知旋轉矩陣R,如果推導旋轉向量v呢?下邊給出旋轉矩陣到旋轉向量的反向轉換關係。
3.旋轉矩陣到向量
這裏計算從一個旋轉矩陣到旋轉向量的轉換。對於旋轉角θ,取旋轉矩陣R兩邊的跡,有:tr(R)=cosθtr(I)+(1−cosθ)tr(nnT)+sinθtr(n∧)=3cosθ+(1−cosθ)=1+2cosθ.(1.4)因此:θ=arccos2tr(R)−1.(1.5)關於轉軸n,旋轉軸上的向量在旋轉後不發生改變,說明:Rn=n.(1.6)因此,轉軸n是矩陣R特徵值1對應的特徵向量。求解此方程,再歸一化,就得到了旋轉軸n。由v=θn得到旋轉向量v。
至此,推導結束。實踐部分代碼放到第三部分一起演示。
參考:
1.《視覺SLAM十四講:從理論到實踐》,高翔、張濤等著,中國工信出版社
2. 羅德里格斯公式推導