1. 程式人生 > >羅德里格斯旋轉公式(Rodrigues' rotation formula)推導

羅德里格斯旋轉公式(Rodrigues' rotation formula)推導

  本文綜合了幾個相關的維基百科,加了點自己的理解,從比較基礎的向量投影和叉積講起,推匯出羅德里格斯旋轉公式。公式比較繁雜,如有錯誤,歡迎評論區指出。

  對於向量的三維旋轉問題,給定旋轉軸和旋轉角度,用羅德里格斯(Rodrigues)旋轉公式可以得出旋轉後的向量。另外,羅德里格斯旋轉公式可以用旋轉矩陣表示,即將三維旋轉的軸-角(axis-angle)表示轉變為旋轉矩陣表示。

向量投影(Vector projection)

  向量a在非零向量b上的向量投影指的是a在平行於向量b的直線上的正交投影。結果是一個平行於b的向量,定義為\(\mathbf{a}_1=a_1\hat{\mathbf{b}}\),其中,\(a_1\)是一個標量,稱為a在b上的標量投影,\(\hat{\mathbf{b}}\)是與b同向的單位向量。\(a_1=\left\Vert\mathbf{a}\right\Vert\cos\theta=\mathbf{a}\cdot \hat{\mathbf{b}}=\mathbf{a}\cdot\frac{\mathbf{b}}{\left\Vert\mathbf{b}\right\Vert}\),其中\(\cdot\)表示點積,\(\left\Vert\mathbf{a}\right\Vert\)表示a的長度,\(\theta\)表示a和b的夾角。標量投影有正負,正負號與夾角\(\theta\)有關。

  有了向量投影\(\textbf{a}_1\),向量a可以表示為\(\mathbf{a}=\mathbf{a}_1+\mathbf{a}_2\),其中\(\mathbf{a}_2\)稱為a from b的vector rejection(沒找到比較官方的翻譯),也即a向正交於b的超平面的正交投影,\(\mathbf{a}_2=\mathbf{a}-\mathbf{a}_1=\mathbf{a}-(\left\Vert\mathbf{a}\right\Vert\cos\theta)\hat{\mathbf{b}}\)。下圖比較清晰地表示出\(\mathbf{a}\)、\(\mathbf{a}_1\)、\(\mathbf{a}_2\)的關係。




圖1 Projection of a on b(a1), rejection of a from b(a2)

  當\(90^{\circ}<\theta\le180^{\circ}\)時,向量投影示意圖如圖2所示:




圖2 大於90°時的向量投影示意圖,此時a1b的方向相反

記號

  向量a在b上的向量投影用加粗的\(\mathbf{a}_1\)表示,標量投影用不加粗的\(a_1\)。有時向量投影和vector rejection分別用\(\mathbf{a}_{\parallel\mathbf{b}}\)和\(\mathbf{a}_{\perp\mathbf{b}}\)表示。

用a和b表示

  當\(\theta\)未知時,可通過a和b計算得出,\(\cos\theta = \frac{\mathbf{a}\cdot\mathbf{b}}{\left\Vert\mathbf{a}\right\Vert\left\Vert\mathbf{b}\right\Vert}\),從而標量投影、向量投影和vector rejection可以分別表示如下:

  • 標量投影:


    \begin{equation}
    a_1=\left\Vert\mathbf{a}\right\Vert\cos\theta=\left\Vert\mathbf{a}\right\Vert\frac{\mathbf{a}\cdot\mathbf{b}}{\left\Vert\mathbf{a}\right\Vert\left\Vert\mathbf{b}\right\Vert}=\frac{\mathbf{a}\cdot\mathbf{b}}{\left\Vert\mathbf{b}\right\Vert}
    \end{equation}

  • 向量投影:


    \begin{equation}
    \mathbf{a}_1=a_1\hat{\mathbf{b}}=\frac{\mathbf{a}\cdot\mathbf{b}}{\left\Vert\mathbf{b}\right\Vert}\frac{\mathbf{b}}{\left\Vert\mathbf{b}\right\Vert}=\left(\mathbf{a}\cdot\hat{\mathbf{b}}\right)\hat{\mathbf{b}}=\frac{\mathbf{a}\cdot\mathbf{b}}{\mathbf{b}\cdot\mathbf{b}}\mathbf{b}
    \end{equation}

  • vector rejection:


    \begin{equation}
    \mathbf{a}_2=\mathbf{a}-\mathbf{a}_1=\mathbf{a}-\frac{\mathbf{a}\cdot\mathbf{b}}{\mathbf{b}\cdot\mathbf{b}}\mathbf{b}
    \end{equation}

叉積

定義

  叉積(又稱向量積)是三維空間(\(\mathbb{R}^3\))向量的二元操作,用符號\(\times\)表示,給定兩個線性獨立的向量a和b,叉積\(\mathbf{a}\times\mathbf{b}\)的結果是一個向量,這個向量與a、b都正交,也就是正交於a、b所在的平面。為什麼要強調線性獨立呢,因為非線性獨立的兩個向量(同向或反向)的叉積為\(\mathbf{0}\)。

  叉積定義為:


\begin{equation}
\mathbf{a}\times\mathbf{b}=\left\Vert\mathbf{a}\right\Vert\left\Vert\mathbf{b}\right\Vert\sin(\theta)\mathbf{n}
\end{equation}


其中,\(\theta\)表示a、b的夾角,\(0^\circ\le\theta\le180^\circ\),\(\mathbf{n}\)正交於a、b所在的平面,方向通常由右手法則確定,如下圖所示: 



圖3 通過右手法則確定叉積方向

性質

  右手法則決定了叉積不符合交換律,而符合反交換律,即\(\mathbf{a}\times\mathbf{b}=-\mathbf{b}\times\mathbf{a}\),如圖4所示:

圖4 反交換律

  由公式也可以看出當a、b的不線性獨立時,即夾角為\(0^\circ\)或\(180^\circ\)時,叉積為零向量\(\mathbf{0}\)。叉積隨夾角\(\theta\)的變化如圖5所示。

圖5 叉積隨夾角變化示意圖

  另外,叉積符合分配律,即\(\mathbf{a}\times(\mathbf{b}+\mathbf{c})=\mathbf{a}\times\mathbf{b}+\mathbf{a}\times\mathbf{c}\)。如圖6所示,左圖向量b和c都被分解為vector projection和vector rejection兩部分,右圖則解釋了分配律成立的原因,看圖時要注意圖中的平行四邊形和正方形都表示了相等的關係。

圖6 叉積分配律示意圖

座標表示

  考慮右手法則定義的標準三維座標系,三個座標軸\(\mathbf{i}\)、\(\mathbf{j}\)、\(\mathbf{{k}}\)如圖7所示,並滿足以下等式關係:
\[ \mathbf{i}\times\mathbf{j}=\mathbf{k}\\ \mathbf{j}\times\mathbf{k}=\mathbf{i}\\ \mathbf{k}\times\mathbf{i}=\mathbf{j} \]
同樣,由叉積的反交換律可得下面三個等式關係:
\[ \mathbf{j}\times\mathbf{i}=-\mathbf{k}\\ \mathbf{k}\times\mathbf{j}=-\mathbf{i}\\ \mathbf{i}\times\mathbf{k}=-\mathbf{j} \]
由平行向量的叉積為零向量可得:\(\mathbf{i}\times\mathbf{i}=\mathbf{j}\times\mathbf{j}=\mathbf{k}\times\mathbf{k}=\mathbf{0}\)。
  由圖7也可得,任意一個三維向量都可以表示為三個基向量的線性組合,例如:
\[ \mathbf{a}=a_1\mathbf{i}+a_2\mathbf{j}+a_3\mathbf{k}\\ \mathbf{b}=b_1\mathbf{i}+b_2\mathbf{j}+b_2\mathbf{k} \]

圖7 三維座標系基向量與向量a的表示

  進而,可以用座標表示叉積運算如下:

\begin{equation} \begin{split} \mathbf{a}\times\mathbf{b}&=(a_1\mathbf{i}+a_2\mathbf{j}+a_3\mathbf{k})\times(b_1\mathbf{i}+b_2\mathbf{j}+b_2\mathbf{k})\\ &=(a_2b_3-a_3b_2)\mathbf{i}+(a_3b_1-a_1b_3)\mathbf{j}+(a_1b_2-a_2b_1)\mathbf{k}\\ &=\left|\begin{array}{cccc} i & j & k \\ a_1 & a_2 & a_3\\ b_1 & b_2 & b_3 \end{array}\right| \end{split} \end{equation}

上式中,將括號展開分別進行叉積推匯出第二個等號,而第三個等號則可通過行列式計算得出。
  進一步,可將叉積表示為矩陣與向量相乘的形式,由於\(\mathbf{a}\times\mathbf{b}=(a_2b_3-a_3b_2, a_3b_1-a_1b_3,a_1b_2-a_2b_1)\),則叉積可表示為:

\begin{equation} \begin{split} \mathbf{a}\times\mathbf{b}=\left[\mathbf{a}\right]_\times\mathbf{b}=\left[\begin{array}{cccc} 0 & -a_3 & a_2\\ a_3 & 0 & -a_1\\ -a_2 & a_1 & 0 \end{array} \right]\left[ \begin{array}{cc} b_1\\b_2\\b_3 \end{array}\right]=\left[\mathbf{b}\right]^T_\times\mathbf{a}=\left[\begin{array}{cccc} 0 & b_3 & -b_2\\ -b_3 & 0 & b_1\\ b_2 & -b_1 & 0 \end{array} \right]\left[ \begin{array}{cc} a_1\\a_2\\a_3 \end{array}\right] \end{split} \end{equation}

其中,\(\left[\mathbf{a}\right]_\times\)(slam14講書上記為\(\mathbf{a}^\wedge\))表示由向量\(\mathbf{a}\)得到的反對稱矩陣,定義為:

\begin{equation} \begin{split} \left[\mathbf{a}\right]_\times=\left[\begin{array}{cccc} 0 & -a_3 & a_2\\ a_3 & 0 & -a_1\\ -a_2 & a_1 & 0 \end{array} \right] \end{split} \end{equation}

通過該反對稱矩陣的定義可以將叉積表示為矩陣與向量的乘法。

羅德里格斯旋轉公式

  考慮\(\mathbf{v}\in\mathbb{R}^3\)的三維旋轉問題,旋轉軸\(\mathbf{k}\)是單位向量,旋轉角為\(\theta\),按照右手法則(即逆時針)旋轉。則可通過羅德里格斯旋轉公式得出旋轉後的向量\(\mathbf{v}_{rot}\)為:

\begin{equation} \mathbf{v}_{rot}=\cos\theta\mathbf{v}+(1-\cos\theta)(\mathbf{k}\cdot\mathbf{v})\mathbf{k}+\sin\theta\mathbf{k}\times\mathbf{v} \end{equation}

推導過程

  由上文中向量投影部分的知識我們知道,一個向量\(\mathbf{v}\)可以分解為平行於\(\mathbf{k}\)的分量\(\mathbf{v}_\parallel\)和正交於\(\mathbf{k}\)的分量\(\mathbf{v}_{\perp}\):

\begin{equation} \mathbf{v}=\mathbf{v}_{\parallel}+\mathbf{v}_\perp \end{equation}

圖8 向量的分解圖示

如圖8所示,因為\(\mathbf{k}\)為單位向量,由向量投影部分知識可得

\begin{equation} \mathbf{v}_\parallel=(\mathbf{v}\cdot\mathbf{k})\mathbf{k} \end{equation}

\begin{equation} \mathbf{v}_\perp=\mathbf{v}-\mathbf{v}_\parallel=\mathbf{v}-(\mathbf{k}\cdot\mathbf{v})\mathbf{k}=-\mathbf{k}\times(\mathbf{k}\times\mathbf{v}) \end{equation}

關於上式最後一個等號的推導如下:

  回顧叉積的知識,\(\mathbf{k}\times\mathbf{v}=\mathbf{k}\times(\mathbf{v}_{\parallel}+\mathbf{v}_\perp)=\mathbf{0}+\mathbf{k}\times\mathbf{v}_\perp=\mathbf{k}\times\mathbf{v}_\perp\),\(\mathbf{k}\times\mathbf{v}\)可以看做將\(\mathbf{v}_\perp\)以\(\mathbf{k}\)為旋轉軸逆時針旋轉了\(90^\circ\)。正如圖9所示,\(\mathbf{v}\)分解為\(\mathbf{v}_\parallel\)和\(\mathbf{v}_\perp\),用右手法則不難確定出\(\mathbf{k}\times\mathbf{v}\)的方向,進而不難發現,\(\mathbf{k}\times(\mathbf{k}\times\mathbf{v})\)可以看做將\(\mathbf{v}_\perp\)以\(\mathbf{k}\)為旋轉軸逆時針旋轉了\(180^\circ\),圖9中的(橢)圓正反映了\(\mathbf{k}\times(\mathbf{k}\times\mathbf{v})\)、\(\mathbf{k}\times\mathbf{v}\)、\(\mathbf{v}_\perp\)三者“大小相等”的關係。最終,可知\(\mathbf{v}_\perp=-\mathbf{k}\times(\mathbf{k}\times\mathbf{v})\)。
  




圖9 羅德里格斯旋轉公式幾何圖示

  從圖8還可以看出,v的平行分量\(\mathbf{v}_\parallel\)不會因為旋轉而改變,旋轉後的向量\(\mathbf{v}_{rot}\)的平行分量依然等於\(\mathbf{v}_\parallel\),即\(\mathbf{v}_{\parallel rot}=\mathbf{v}_\parallel\)。
  而v的正交分量\(\mathbf{v}_\perp\)在旋轉過程中大小不變,方向會發生變化,即

\begin{equation} \begin{split} &|\mathbf{v}_{\perp rot}|=|\mathbf{v}_\perp|\\ &\mathbf{v}_{\perp rot}=\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v}_\perp=\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v} \end{split} \end{equation}

上述第2個等式通過圖9可以得出,將圓看做\(xOy\)座標系平面,\(\mathbf{v}_\perp\)所在的直線看做\(x\)軸,\(\mathbf{k}\times\mathbf{v}\)所在的直線看做\(y\)軸,結合三角函式,很容易用\(\mathbf{v}_\perp\)和\(\mathbf{k}\times\mathbf{v}\)表示出\(\mathbf{v}_\perp\)。

  到這已經得出羅德里格斯公式了:

\begin{equation} \begin{split} \mathbf{v}_{rot}&=\mathbf{v}_{\parallel rot}+\mathbf{v}_{\perp rot}\\ &=\mathbf{v}_\parallel+\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v}\\ &=\mathbf{v}_\parallel+\cos\theta(\mathbf{v}-\mathbf{v}_\parallel)+\sin\theta\mathbf{k}\times\mathbf{v}\\ &=\cos\theta\mathbf{v}+(1-\cos\theta)\mathbf{v}_\parallel+\sin\theta\mathbf{k}\times\mathbf{v}\\ &=\cos\theta\mathbf{v}+(1-\cos\theta)(\mathbf{k}\cdot\mathbf{v})\mathbf{k}+\sin\theta\mathbf{k}\times\mathbf{v} \end{split} \end{equation}

矩陣形式

  在叉積部分提到過叉積可以表示為矩陣乘向量的形式,類似地,羅德里格斯旋轉公式可以表示為旋轉矩陣乘以向量的形式,\(\mathbf{v}_{rot}=\mathbf{R}\mathbf{v}\),其中\(\mathbf{R}\)是旋轉矩陣。在slam14講\(^{[4]}\)中的表示如下:
\begin{equation}
\mathbf{R}=\cos\theta\mathbf{I}+(1-\cos\theta)\mathbf{k}\mathbf{k}^T+\sin\theta\mathbf{k}^\wedge
\end{equation}
其中,\(\mathbf{I}\)表示單位矩陣,\(\mathbf{k}\)表示旋轉向量(書中用\(\mathbf{n}\)表示旋轉向量),\(\mathbf{k}^\wedge\)表示由\(\mathbf{k}\)得到的反對稱矩陣。從式(13)不難看出上式,另外,結合式(13)還可以得到下面這個式子:

\begin{equation} \begin{split} \mathbf{v}_{rot}&=\mathbf{v}_{\parallel rot}+\mathbf{v}_{\perp rot}\\ &=\mathbf{v}_\parallel+\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v}\\ &=\mathbf{v}-\mathbf{v}_\perp+\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v}\\ &=\mathbf{v}+(\sin\theta)\mathbf{k}\times\mathbf{v}+(1-\cos\theta)\mathbf{k}\times\mathbf{k}\times\mathbf{v} \end{split} \end{equation}

從而,得出這個維基百科上的矩陣表示:

\begin{equation} \begin{split} \mathbf{v}_{rot}=\mathbf{R}\mathbf{v}=\mathbf{v}+(\sin\theta)\mathbf{K}\mathbf{v}+(1-\cos\theta)\mathbf{K}^2\mathbf{v} \end{split} \end{equation}

其中,\(\mathbf{R}=\mathbf{I}+(\sin\theta)\mathbf{K}+(1-\cos\theta)\mathbf{K}^2\),\(\mathbf{K}\)表示由旋轉向量\(\mathbf{k}\)生成的反對稱矩陣。

參考:

[1] Rodrigues' rotation formula
[2] Cross product
[3] Vector projection
[4] 視覺SLAM十四講:從理論到實