本篇繼續參照高翔老師《視覺SLAM十四講從理論到實踐》,講解三維空間剛體運動。博文將原第三講分爲四部分來講解:1、旋轉矩陣和變換矩陣;2、旋轉向量與羅德里格斯公式;3、歐拉角表示旋轉;4、四元數表示變換。本文相對於原文會適當精簡,同時爲便於理解,會加入一些註解和補充知識點,本篇爲第二部分:旋轉向量表示旋轉,另外三部分請參照博主的其他博文。
1.定義
對於矩陣表示方式至少有以下兩個缺點:
1.SO(3)的旋轉矩陣有9個量,但一次旋轉只有3個自由度,因此這種表達方式是冗餘的,同理SE(4)也是。那麼,是否有更緊湊的表示呢?
2.旋轉矩陣和變換矩陣自身帶有約束:它必須是正交矩陣且行列式爲。當想估計或優化一個旋轉矩陣或變換矩陣時,這些約束會使得求解變的更困難。
因此,希望有一種方式能夠緊湊的描述旋轉和平移。
旋轉向量:事實上,任意旋轉都可以用一個旋轉軸和一個旋轉角來刻畫,於是,我們可以使用一個向量u(爲方便表達,上下文統一採用符號u表示單位向量,其他符號n,k等也是可以的),其方向與旋轉軸一致,其長度等於旋轉角θ,那麼向量θu也可以描述這個旋轉,這種向量稱爲旋轉向量(或軸角/角軸,Axis-Angle),只需一個三維向量即可描述旋轉。
在三維空間中定義一個方向只需要用到兩個量就可以了(與任意兩個座標軸之間的夾角,比如地球的經緯度就可以確定方向),因此第三個量可以用來定義長度,表示旋轉角度。同樣,對於變換矩陣,使用一個旋轉向量和一個平移向量即可表達一次變換,此時變量維數正好是六維。
2.羅德里格斯公式
2.1 定義
羅德里格斯公式:旋轉向量和旋轉矩陣有什麼聯繫嗎?事實上,從旋轉向量到旋轉矩陣的轉換過程由羅德里格斯公式(Rodrigues’s Formula)表示。因爲任意旋轉都可以由一個旋轉軸u和一個旋轉角θ刻畫,故羅德里格斯公式具體形式如下:R=cosθI+(1−cosθ)uuT+sinθu∧(2.1)符號∧是向量到反對稱矩陣的轉換符,見第一篇博客的公式(1.4)。公式還可以寫爲:R=I+(1−cosθ)U2+sinθU.(2.2)其中U代表向量u轉換的反對稱矩陣。
2.2 推導
首先,理解下圖。定義u是旋轉軸的單位向量,v爲旋轉向量,w爲u×v方向上的單位向量。圖中v繞u旋轉角度θ得到vrot。將v分解爲平行於旋轉軸u以及正交於u的兩個分量:v∥和v⊥。將vrot分解爲平行於旋轉軸u以及正交於u的兩個分量:vrot∣∣和vrot⊥。向量a和b分別是vrot在w和v⊥方向上的分量。
圖2.1:旋轉向量3D圖(數學繪圖軟件推薦geogebra)
所謂推導旋轉方程,實則求出一個旋轉矩陣,使得Vrot=Rv,所以我們要做的就是找出vrot與v,並用矩陣來表示。
此公式有2種形式,故而也有2種推導方法,兩者推導方法的不同主要在v⊥的表示上。具體推導過程如下。
2.2.1 推導一
推導一推導過程如下:
- v:對v進行向量分解:v=v⊥+v∣∣,根據向量減法可得:v⊥=v−v∣∣(2.3)對vrot∣∣進行向量分解vrot=vrot∣∣+vrot⊥(2.4)下邊分別推導vrot∣∣和vrot⊥。
- vrot∣∣:由於旋轉過程平行向量的不變性可得vrot∣∣=v∣∣,v∣∣其實就是v在u上的正交投影(Orthogonal Projection),根據正交投影公式:v∣∣=proju(v)=u⋅uu⋅vu=∣∣u∣∣2u⋅vu=(u⋅v)u(2.5)其中u⋅u=∣∣u∣∣2,∣∣u∣∣=1,點積(v⋅u)爲標量,所以再乘向量u得到一個矢量。
- vrot⊥:下面畫出vrot⊥的俯視圖:
圖2.2:旋轉向量俯視圖
我們需要處理正交於u的v⊥,因爲這兩個向量是正交的,這個旋轉可以看做是平面內的一個旋轉,因爲旋轉不改變v⊥的長度,所以路徑是一個圓。現在,3D的旋轉被轉化爲了2D平面上的旋轉。由於在這個平面上只有一個向量v⊥,用它來表示一個旋轉是不夠的,我們還需要構造一個同時正交於u 和v⊥的向量w,這個可以通過叉乘來獲得: w=u×v⊥(2.6)注意叉乘的順序,因爲我們使用的是右手座標系統,按照右手定則你可以發現這 個新的向量w指向v⊥逆時針旋轉(π/2)後的方向,並且和v⊥一樣也處於正交於u 的平面內。因爲∥u∥ = 1,我們可以發現:∣∣w∣∣=∣∣u×v⊥∣∣=∣∣u∣∣⋅∣∣v⊥∣∣⋅sin(2π)=∣∣v⊥∣∣(2.7)也就是說,w和v⊥的模長是相同的,所以,w也位於圓上。有了這個新的向量w, 就相當於在平面內有了兩個座標軸。我們現在可以把vrot∣∣投影到w和v⊥上,將其分解爲向量a和b,使用一些三角知識可以得到:vrot⊥=a+b=sinθw+cosθv⊥=sinθ(u×v⊥)+cosθv⊥(2.8)因爲叉乘遵守分配律,且u平行於v∣∣,故:u×v⊥=u×(v−v∣∣)=u×v−u×v∣∣=u×v(2.9)另外,向量a和b還有另外一種證法,稍顯繁瑣,有興趣的同學請參見後兩小節。
- 綜上可得:
vrot=vrot⊥+vrot∣∣=a+b+v∣∣=sinθu×v⊥+cosθv⊥+(u⋅v)u=sinθu×v+cosθ(v−v∣∣)+(v⋅u)u=sinθu×v+cosθ(v−(v⋅u)u)+(v⋅u)u=cosθv+(1−cosθ)(v⋅u)u+sinθu×v(2.10)
- 顯然:到此步,我們還無法將其用矩陣來表示,所以需要對(v⋅u)u 和 u×v 進行矩陣轉換,由點積的交換律和結合律得:(v⋅u)u=u⋅(v⋅u)=u⋅(uTv)=u⋅uTv(2.11)其中的向量都是列向量,點積展開規則爲:x⋅y=[x,y]=xTy。
對於u×v可用叉乘矩陣來化簡爲Uv:u×v=⎣⎡(u×v)x(u×v)y(u×v)z⎦⎤=⎣⎡uyvz−uzvyuzvx−uxvzuxvy−uyvx⎦⎤=⎣⎡0uzuy−uz0uxuy−ux0⎦⎤⎣⎡vxvyvz⎦⎤=Uv(2.12)其中U=⎣⎡0uzuy−uz0uxuy−ux0⎦⎤(2.13)
- 將(v⋅u)u 和 u×v 轉換的矩陣代入式(2.10)得:vrot=cosθv+(1−cosθ)(v⋅u)u+sinθu×v=cosθv+(1−cosθ)uuTv+sinθKv=(cosθI+(1−cosθ)uuT+sinθU)v(2.14)故旋轉矩陣R=cosθI+(1−cosθ)uuT+sinθU.(2.15)其中I爲單位矩陣。
2.2.2 推導二
與推導一相比,推導二的不同主要在於用叉乘去表示一些數據。用叉乘來表示v⊥:v⊥=−u×(u×v)(2.16)聯立推導一中各式得:
vrot=vrot⊥+vrot∣∣=a+b+v∣∣=sinθu×v+cosθv⊥+v−v⊥=sinθu×v−cosθu×(u×v)+v+u×(u×v)=v+(1−cosθ)u×(u×v)+sinθu×v=v+(1−cosθ)U2v+sinθUv(叉乘矩陣表示)=(I+(1−cosθ)U2+sinθU)v=Rv(2.17)
從而得出第二種表達式R=I+(1−cosθ)U2+sinθU.(2.18)顯然,第二種表達式更爲簡便,在計算的過程中涉及的參數更少,所以這也是在進行旋轉操作時常用的公式。
2.2.3 推導向量a和b
此處單獨推導羅德里格斯公式的向量a和b,僅做參考,也可以忽略不看。a和b是由vrot⊥正交分解得到的矢量,既有大小又有方向,所以在求解時,我們要對其大小和方向分別求解。
a大小
設θ1=π−θ,θ2是向量v和u的夾角,u爲單位向量,則對於a的大小∣a∣有:
∣a∣=sinθ1∣vrot⊥∣=sinθ1∣v⊥∣=sin(π−θ)∣v⊥∣=sinθ∣v⊥∣=sinθsinθ2∣v∣=sinθsinθ2∣v∣∣u∣(2.19)由三角公式∣a×b∣=sinθ∣a∣∣b∣知:sinθ2∣v∣∣u∣=∣u×v∣,所以:
∣a∣=sinθ∣u×v∣(2.20)
a方向
由叉乘方向可得a的單位方向向量爲:u×v/∣u×v∣(2.21)
綜上可得:
a=(u×v/∣u×v∣)∣a∣=(u×v/∣u×v∣)sinθ∣u×v∣=sinθu×v(2.22)
b大小
由圖得,θ1爲b和vrot⊥的夾角,則:
∣b∣=cosθ1∣vrot⊥∣=cos(π−θ)∣v⊥∣=−cosθ∣v⊥∣(2.23)
b方向
由於b的方向與v⊥方向相反,可得b的單位方向向量爲:−v⊥/∣v⊥∣(2.24)
綜上可得:
b=(−v⊥/∣v⊥∣)∣b∣=cosθv⊥(2.25)
至此,羅德里格斯公式的證明全部結束。此外,如果讀者希望獲得關於Oxyz座標系的旋轉變換關係,可以參考這篇博客:圖形變換之旋轉變換公式推導。
羅德里格斯公式反應的是旋轉向量到旋轉矩陣的轉換關係,如果已知旋轉矩陣R,如果推導旋轉向量v呢?下邊給出旋轉矩陣到旋轉向量的反向轉換關係。
3.旋轉矩陣到向量
這裏計算從一個旋轉矩陣到旋轉向量的轉換。對於旋轉角θ,取旋轉矩陣R兩邊的跡,有:tr(R)=cosθtr(I)+(1−cosθ)tr(uuT)+sinθtr(u∧)=3cosθ+(1−cosθ)=1+2cosθ.(3.1)因此:θ=arccos2tr(R)−1.(3.2)關於轉軸u,旋轉軸上的向量在旋轉後不發生改變,說明:Ru=u.(3.3)因此,轉軸u是矩陣R特徵值1對應的特徵向量。求解此方程,再歸一化,就得到了旋轉軸u。由v=θu得到旋轉向量v。
至此,推導結束。實踐部分代碼放到第三部分一起演示。
參考:
1.《視覺SLAM十四講:從理論到實踐》,高翔、張濤等著,中國工信出版社
2. 羅德里格斯公式推導
3. 四元數與三維旋轉