三維空間剛體運動2:旋轉向量表示旋轉


本篇繼續參照高翔老師《視覺SLAM十四講從理論到實踐》,講解三維空間剛體運動。博文將原第三講分爲四部分來講解:1、旋轉矩陣和變換矩陣;2、旋轉向量表示旋轉;3、歐拉角表示旋轉;4、四元數表示變換。本文相對於原文會適當精簡,同時爲便於理解,會加入一些註解和補充知識點,本篇爲第二部分:旋轉向量表示旋轉,另外三部分請參照博主的其他博文。

1.定義

對於矩陣表示方式至少有以下兩個缺點:
1.SO(3)SO(3)的旋轉矩陣有9個量,但一次旋轉只有3個自由度,因此這種表達方式是冗餘的,同理SE(4)SE(4)也是。那麼,是否有更緊湊的表示呢?
2.旋轉矩陣和變換矩陣自身帶有約束:它必須是正交矩陣且行列式爲。當想估計或優化一個旋轉矩陣或變換矩陣時,這些約束會使得求解變的更困難。
因此,希望有一種方式能夠緊湊的描述旋轉和平移。

旋轉向量:事實上,任意旋轉都可以用一個旋轉軸和一個旋轉角來刻畫,於是,我們可以使用一個向量,其方向nn與旋轉軸一致,其長度等於旋轉角Θ\Theta,那麼向量Θn\Theta n也可以描述這個旋轉,這種向量稱爲旋轉向量(或軸角/角軸,Axis-Angle),只需一個三維向量即可描述旋轉。同樣,對於變換矩陣,使用一個旋轉向量和一個平移向量即可表達一次變換,此時變量維數正好是六維。

2.羅德里格斯公式

2.1 定義

羅德里格斯公式:旋轉向量和旋轉矩陣有什麼聯繫嗎?事實上,從旋轉向量到旋轉矩陣的轉換過程由羅德里格斯公式(Rodrigues’s Formula)表示。因爲任意旋轉都可以由一個旋轉軸nn和一個旋轉角Θ\Theta刻畫,故羅德里格斯公式具體形式如下:R=cosθI+(1cosθ)nnT+sinθn(1.1)R= \cos \theta I+(1-\cos \theta )nn^{T}+\sin \theta n^{\wedge }\tag{1.1}
符號^{\wedge }是向量到反對稱矩陣的轉換符,見第一篇博客的公式(1.4)。

2.2 推導

首先,理解圖1。定義向量kk是旋轉軸的單位矢量,爲表示方便,使用kk代表nn。圖中初始向量vvkk爲軸旋轉角θ\theta得到vrotv_{rot}。向量wwk×vk\times v的方向上的單位向量,向量vv_{\perp }vrotv_{rot\perp }分別是vvvrotv_{rot}的垂直於平面的向量。向量aabb分別是vrotv_{rot}wwvv_{\perp }方向上的分量。
圖1.1:旋轉向量3D圖(推薦數學繪圖軟件:geogebra
旋轉向量3D圖
所謂推導旋轉方程,實則求出一個旋轉矩陣,使得Vrot=RvV_{rot}=Rv,所以我們要做的就是找出vrotv_{rot}vv,並用矩陣來表示。
此公式有2種形式,故而也有2種推導方法,兩者推導方法的不同主要在vv_{\perp }的表示上。具體推導過程如下。

2.2.1 推導一

推導一使用單位向量kk表示,推導過程如下:

  1. vv進行向量分解:v=v+vv = v_{\perp } + v_{||}

  2. 根據向量減法可得:v=vvv_{\perp } = v - v_{||}

  3. 由旋轉過程平行向量不變得:vrot=vv_{rot||} = v_{||}

  4. vv_{||}其實就是vvuu上的正交投影(Orthogonal Projection),根據正交投影公式:v=projk(v)=kvkkk=kvk2k=(kv)k\begin{aligned} v_{||} &= proj_{k}(v) &= \frac{k\cdot v}{k\cdot k}k &= \frac{k\cdot v}{||k||^{2}}k &= (k\cdot v)k \end{aligned}
    其中uk=k2,k=1,(vk)u\cdot k=||k||^{2}, ||k||=1,(v\cdot k)爲標量,所以再乘向量kk得到一個矢量

  5. 爲計算方便,對vrotv_{rot\perp} 進行向量分解:vrot=a+bv_{rot\perp} =a+b

  6. 由圖中的向量關係經推導可得:a=sinθk×v,b=cosθva=\sin \theta k\times v,b=\cos \theta v_{\perp }a,ba,b的推導在後邊

  7. 綜上可得:
    vrot=vrot+vrotv_{rot}=v_{rot\perp}+v_{rot||}
            =a+b+v=a+b+v_{||}
            =sinθk×v+cosθv+(vk)k=\sin \theta k\times v +\cos \theta v_{\perp } + (v\cdot k)k
            =sinθk×v+cosθ(vv)+(vk)k=\sin \theta k\times v +\cos \theta (v - v_{||}) + (v\cdot k)k
            =sinθk×v+cosθ(v(vk)k)+(vk)k=\sin \theta k\times v +\cos \theta (v - (v\cdot k)k ) + (v\cdot k)k
            =cosθv+(1cosθ)(vk)k+sinθk×v=\cos \theta v+(1-\cos \theta )(v\cdot k)k + \sin \theta k\times v
    顯然:到此步,我們還無法將其用矩陣來表示,所以需要對(vk)k(v\cdot k)kk×vk\times v 進行矩陣轉換,由點積的交換律和結合律得:(vk)k=k(vk)=k(kTv)=kkTv(v\cdot k)k=k\cdot(v\cdot k)=k\cdot (k^{T} v)=k\cdot k^{T} v其中的向量都是列向量,點積展開規則爲:xy=[x,y]=xTyx\cdot y = [x, y] =x^{T}y
    對於k×vk\times v可用叉乘矩陣來化簡爲KvKv[(k×v)x(k×v)y(k×v)z]=[kyvzkzvykzvxkxvzkxvykyvx]=[0kzkykz0kxkykx0][vxvyvz]=Kv\begin{bmatrix} (k\times v)_{x}\\ (k\times v)_{y}\\ (k\times v)_{z} \end{bmatrix}= \begin{bmatrix} k_{y}v_{z}- k_{z}v_{y}\\ k_{z}v_{x}- k_{x}v_{z}\\ k_{x}v_{y}- k_{y}v_{x} \end{bmatrix}= \begin{bmatrix} 0 & -k_{z} & k_{y}\\ k_{z} & 0 & -k_{x}\\ k_{y} & k_{x} & 0 \end{bmatrix}\begin{bmatrix} v_{x}\\ v_{y}\\ v_{z} \end{bmatrix}= Kv
    vrot=cosθv+(1cosθ)(vk)k+sinθk×vv_{rot}=\cos \theta v+(1-\cos \theta )(v\cdot k)k + \sin \theta k\times v
               =cosθv+(1cosθ)kkTv+sinθKv=\cos \theta v+(1-\cos \theta )kk^{T}v + \sin \theta K v
               =(cosθI+(1cosθ)kkT+sinθK)v=(\cos \theta I +(1-\cos \theta )kk^{T} + \sin \theta K )v
    故旋轉矩陣R=cosθI+(1cosθ)kkT+sinθK.(1.2)R= \cos \theta I +(1-\cos \theta )kk^{T} + \sin \theta K. \tag{1.2} 其中II爲單位矩陣。

2.2.2 推導二

與推導一相比,推導二的不同主要在於用叉乘去表示一些數據。用叉乘來表示v⊥可得:v=k×(k×v)v_{\perp } =-k\times (k\times v)
所以聯立推導一中各式得:
vrot=vrot+vrotv_{rot}=v_{rot\perp}+v_{rot||}
        =a+b+v=a+b+v_{||}
        =sinθk×v+cosθv+vv=\sin \theta k\times v +\cos \theta v_{\perp } + v-v_{\perp }
        =sinθk×vcosθk×(k×v)+v+k×(k×v)=\sin \theta k\times v -\cos \theta k\times (k\times v) + v + k\times (k\times v)
        =v+(1cosθ)k×(k×v)+sinθk×v=v + (1 - \cos \theta )k\times (k\times v) + \sin \theta k\times v
        =v+(1cosθ)K2v+sinθKv=v + (1 - \cos \theta )K^{2}v+ \sin \theta Kv(叉乘矩陣表示)
        =(I+(1cosθ)K2+sinθK)v=(I + (1 - \cos \theta )K^{2}+ \sin \theta K)v
        =Rv=Rv
從而得出第二種表達式R=I+(1cosθ)K2+sinθK.(1.3)R= I +(1-\cos \theta )K^{2} + \sin \theta K. \tag{1.3}顯然,第二種表達式更爲簡便,在計算的過程中涉及的參數更少,所以這也是在進行旋轉操作時常用的公式。

2.2.3 推導aa

向量aabb是由vrotv_{rot\perp }正交分解得到的矢量,既有大小又有方向,所以在求解時,我們要對其大小和方向分別求解。
大小
θ1=πθ\theta_{1}= \pi -\thetaθ2\theta_{2}是向量vvkk的夾角,kk爲單位向量,則對於aa的大小a|a|有:
a=sinθ1vrot=sinθ1v|a|=\sin \theta_{1}|v_{rot\perp }|=\sin \theta_{1}|v_{\perp }|
      =sin(πθ)v=sinθv=\sin (\pi -\theta)|v_{\perp }|=\sin \theta|v_{\perp }|
      =sinθsinθ2v=\sin \theta \sin \theta_{2}|v|
      =sinθsinθ2vk=\sin \theta \sin \theta_{2}|v||k|
      =sinθk×v=\sin \theta |k \times v|
由公式a×b=sinθab|a\times b| = \sin \theta |a||b|sinθ2vk=k×v\sin \theta_{2}|v||k|=|k\times v|,所以:
a=sinθk×v|a|=\sin \theta |k \times v|

方向
由叉乘方向可得aa的單位方向向量爲:k×v/k×vk\times v /|k \times v|,綜上可得:
a=(k×v/k×v)aa=(k\times v /|k \times v|)|a|
    =(k×v/k×v)sinθk×v=(k\times v /|k \times v|)\sin \theta |k \times v|
    =sinθk×v=\sin \theta k\times v

2.2.4 推導bb

大小
由圖得,θ1\theta_{1}bbvrotv_{rot\perp }的夾角,則:
b=cosθ1vrot=cos(πθ)v=cosθv|b|=\cos \theta_{1}|v_{rot\perp }|=\cos (\pi -\theta)|v_{\perp }|= -\cos \theta|v_{\perp }|

方向
由於bb的方向與vv_{\perp }方向相反,可得bb的單位方向向量爲:v/v-v_{\perp }/|v_{\perp }|,綜上可得:
b=(v/v)bb=(-v_{\perp }/|v_{\perp }|)|b|
    =cosθv=\cos \theta v_{\perp }

至此,羅德里格斯公式的證明全部結束。此外,如果讀者希望獲得關於Oxyz座標系的旋轉變換關係,可以參考這篇博客:圖形變換之旋轉變換公式推導
羅德里格斯公式反應的是旋轉向量到旋轉矩陣的轉換關係,如果已知旋轉矩陣RR,如果推導旋轉向量vv呢?下邊給出旋轉矩陣到旋轉向量的反向轉換關係。

3.旋轉矩陣到向量

這裏計算從一個旋轉矩陣到旋轉向量的轉換。對於旋轉角θ\theta,取旋轉矩陣RR兩邊的跡,有:tr(R)=cosθtr(I)+(1cosθ)tr(nnT)+sinθtr(n)=3cosθ+(1cosθ)=1+2cosθ.(1.4)\begin{aligned} tr(R) &= \cos \theta tr(I)+(1-\cos \theta )tr(nn^{T})+\sin \theta tr(n^{\wedge })\\ &=3\cos \theta + (1- \cos \theta) \\ &=1+2\cos \theta. \tag{1.4} \end{aligned}因此:θ=arccostr(R)12.(1.5)\theta = \arccos \frac{tr(R)-1}{2} .\tag{1.5}關於轉軸nn,旋轉軸上的向量在旋轉後不發生改變,說明:Rn=n.(1.6)Rn=n.\tag{1.6}因此,轉軸nn是矩陣RR特徵值1對應的特徵向量。求解此方程,再歸一化,就得到了旋轉軸nn。由v=θnv=\theta n得到旋轉向量vv

至此,推導結束。實踐部分代碼放到第三部分一起演示。

參考:
1.《視覺SLAM十四講:從理論到實踐》,高翔、張濤等著,中國工信出版社
2. 羅德里格斯公式推導

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