四元數研究


接着上一篇博客四元數研究:www.cnblogs.com/liuzhenbo/p/10749458.html

  為了規避Ambiguity的問題,我們給出另一種表述方向的方法: 軸角表示(Axis-Angle-Representation)。跟歐拉角不同的是,我們這次不再采取多次旋轉的方式來找到目標方向,而是找到 一根旋轉軸,只通過繞這根軸 旋轉一次就可以得到目標方向。這樣就不會產生Ambiguity了嗎?是的,證明方法很簡單,首先以目標矩陣原點為一角,三軸為三邊建立一個立方體,這個立方體中通過原點的對角線就是我們要找的旋轉軸,顯然,這個 旋轉軸是唯一的,而我們知道, 繞一個旋轉軸旋轉不同角度,對應的方向也是不同的(角度范圍(角度范圍  \left(-\pi, \pi\right] ),由此可見,空間中任一位置的軸角表示是唯一的,不存在Ambiguity的問題。旋轉軸我們可以通過向量  \left[\begin{matrix}x\\y\\z\end{matrix}\right] 來表示,旋轉角度我們可以通過一個度數  \theta 來表示,至此我們可以通過軸角表示  (axis, angle) = \left(\left[\begin{matrix}x\\y\\z\end{matrix}\right],\theta\right) 來描述方向。


 

 
一般來說,軸角表示方向時,會出現4個參數,其中3個用於表示旋轉軸,1個用於表示旋轉角大小。而如果我們規定了表示旋轉軸的向量為單位向量 e ,考慮到 \sqrt{x^2+y^2+z^2}=1 ,我們就可以用兩個參數表示出旋轉軸,總共 只需要三個參數,跟歐拉角一樣多。旋轉向量我們可以用 \bm{\theta} = \theta e 表示,其中 e 是單位向量。順便提一句,這里的旋轉軸我們稱為 歐拉軸(Euler axis),這里的旋轉向量我們稱為 歐拉向量(Euler vector)。是的,全是這個人自己在玩兒。

  現在我們可以說說四元數了。我們引入四元數是為了 更方便地計算軸角表示的方向變換。四元數是什么?四元數是復數,更具體地說四元數是存在三個虛部的復數。 q = w + ix + jy +kz ,其中i,j,k是虛數單位,滿足 i^2=j^2=k^2 = -1 ,且 i\cdot j=kj \cdot i=-k 。為了讓大家更直觀地明白用四元數運算的優點,我們簡單回顧一下高中學的復數運算。

加法

q_1+q_2 = (w_1 + w_2) + i(x_1+x_2) + j(y_1 + y_2) + k(z_1 + z_2) = [(w_1 + w_2), (v_1 + v_2)]

乘法

q_1\cdot q_2 = (w_1w_2-x_1x_2-y_1y_2-z_1z_2)+\\i(w_1x_2+x_1w_2+y_1z_2-z_1y_2)+\\j(w_1y_2-x_1z_2+y_1w_2+z_1x_2)+\\k(w_1z_2+x_1y_2-y_1x_2+z_1w_2)

將四元數用於計算軸角表示運算時,我們通常寫成向量形式(vector representation) q = [w,\vec{v}] = \left[w,\left(\begin{matrix}x\\y\\z\end{matrix}\right)\right],為了表達清晰和計算方便,我們將w,x,y,z的取值定位 w^2+x^2+y^2+z^2 = 1 ,並稱之為單位四元數,在方向計算時單位四元數中w,x,y,z分飾的角色我們后面會解釋。此時,復數乘法可表示為向量形式

q_1\cdot q_2 = [w_1, \vec{v_1}]\cdot[w_2, \vec{v_2}] = [w_1w_2-v_1v_2,v_1\times v_2 + w_1\cdot v_2+w_2\cdot v_1]

要注意這里出現的向量叉乘沒有交換率。

同時,我們也可以將乘法寫成矩陣形式,以用於和歐拉角計算作比較:

q_1q_2 = \left[\begin{matrix} w_1&-x_1 & -y_1 & -z_1\\ x_1 & w_1 & -z_1 & y_1\\ y_1 & z_1 & w_1 & -x_1\\ z_1 & -y_1 & x_1 & w_1 \end{matrix}\right]\left[\begin{matrix} w_2\\x_2\\y_2\\z_2 \end{matrix}\right]

觀察此式,我們發現兩個四元數相乘,需要存儲8個單位數據,也就是說,每個參與運算的四元數只要存儲4個單位數據 (w,x,y,z)即可。

此外我們還需要幾個特殊量和性質:

  • 四元數的模: \|q \| = \sqrt{w^2+x^2+y^2+z^2}
  • 四元數共軛: q^*=(w+ix+jy+kz)^*=w-ix-jy-kz
  • 共軛的向量形式: q^* = ([w, \vec{v}])^* = [w,-\vec{v}]
  • 四元數倒數: q\cdot q^{-1} = q^{-1}\cdot q = 1
  • 共軛與倒數的關系: q^{-1} = \frac{q^*}{w^2+x^2+y^2+z^2} 可見對於單位四元數 q^* = q^{-1}
  • 共軛與倒數的性質: (q_aq_b)^{-1} = q_b^{-1}q_a^{-1}(q_aq_b)^* = q_b^*q_a^*
  • 四元數運算同時滿足結合律和分配律:

(q_1+q_2)+q_3 = q_1+(q_2+q_3)

(q_1q_2)q_3 = q_1(q_2q_3)

(q_1+q_2)q_3 = q_1q_3+q_2q_3

q_1(q_2+q_3) = q_1q_2+q_1q_3



了解了上面的計算法則,我們就可以利用四元數來計算方向變換過程了。還記得我們之前說過計算時四元數我們用向量形式表示,且保證它是單位四元數嗎?其實四元數的向量形式我們還可以進一步改寫為極形式(polar representation)

q = \|q\|[cos\theta, \vec{n}\cdot sin\theta]

其中 \|q\| 代表了四元數的模,單位四元數模為1,而 \theta 是四元數表示的旋轉過程的半角大小,也就是說(2\theta) 就是旋轉角大小n 則是表示旋轉軸方向的單位向量。用這種表示方法,四元數即可表示任意軸角表達的方向變換。方向變換的計算方法我們這里給出結論,大家可以自己通過計算來驗證一下,如有興趣也可以推導一下過程:

先將原向量坐標表示為四元數 p=[0,\vec{v}] ,將旋轉角度及旋轉軸表示為單位四元數 q ,旋轉后的向量坐標可通過 r = q\cdot p\cdot q^*r = q \cdot p\cdot q^{-1} 計算得出。

至此,四元數算是正式引入完了,下面我們來看看為什么我們要引入四元數。

 

先說結論,四元數的引用是為了減少計算量和計算時存儲占用的空間

但是,如果你足夠細心,一定可以發現兩個四元數相乘的過程其實是一個4×4矩陣與一個4×1矩陣相乘的過程,而四元數計算一次變換需要兩次這個過程,其中包括24次加法運算和32次乘法運算,反觀歐拉角的矩陣變換只要進行一次3×3矩陣和3×1矩陣的乘法運算,其中包括6次加法運算和9次乘法運算,運算量明顯是四元數更大一些。如果你再細心一些可以發現,四元數運算時雖然有個4×4矩陣參與運算,但是矩陣中的每一項都是已經存儲過的單位數據,而參與歐拉角運算的3×3矩陣則要通過另外已存儲的單位數據進行的16次乘法運算,4次加法運算以及4次符號改變運算來求出,不過即使加上這些運算過程,矩陣運算也只要25次乘法運算,10次加法運算以及4次符號改變運算,運算量上來說,歐拉角的矩陣運算依然比四元數運算要有優勢

但事實上,我們一般遇到的運動學問題很少會有只做一次方向轉換的情況出現,對於復雜的系統和機器人來說,我們往往會面對數量龐大的轉變方向過程。這種情況下四元數的優勢就體現出來了,我們考慮多次變換的四元數運算:

R = R_1R_2...R_{n-1}R_n=q_n(q_{n-1}...(q_2(q_1\cdot p\cdot q_1^*)q_2^*)...q_{n-1}^*)q_n^*

我們利用結合律來看:

R = R_1R_2...R_{n-1}R_n=(q_nq_{n-1}...q_2q_1) p( q_1^*q_2^*...q_{n-1}^*q_n^*)

考慮到四元數共軛有性質: (q_aq_b)^* = q_b^*q_a^* ,我們可以把原式改寫為

R = R_1R_2...R_{n-1}R_n=(q_nq_{n-1}...q_2q_1) p(q_nq_{n-1}...q_2q_1)^*

可以發現,原向量 p 左右兩側括號里的運算結果是一對共軛四元數,也就是說可以利用3次易號運算代替n次四元數相乘運算,大大減少了計算量。反觀歐拉角的矩陣計算,雖然一次旋轉時,僅僅是3×3矩陣和3×1矩陣的乘法運算,但是對於多次運算來說, M_nM_{n-1}...M_2M_1 的運算卻是多個3×3矩陣相乘,與四元數 q_nq_{n-1}...q_2q_1 的每組4×4矩陣與4×1矩陣的相乘相比運算量要大上不少,加上3×3矩陣中多數元素都是需要通過單位數據再次運算才能得到的,更是增加了運算量的需求。總體看來,在復雜的多次變換情況下,四元數比矩陣運算所需要的運算量更小

另外,我們之前提到過,每一個3×3的矩陣至少需要存儲6個單位數據才可以記錄,而每個四元數僅需要4個單位數據即可(其實考慮到四元數是單位四元數,在保證w已知的前提下,x,y,z缺少任意一個都是可以通過運算推導出四元數的,也就是說可能只要占用三個數據的存儲空間,前提是對x,y,z的定義域要有限制),在大量變換的運算中,四元數的應用可以節約非常多的存儲空間

 

擁有以上兩個優點,加上規避了Ambiguity的問題,我們在表示方向和方向變換時會經常使用四元數的運算。不過四元數也是有缺點的,在復雜運動中,方向旋轉和位移往往是同時發生的,在運用歐拉角矩陣運算時,我們考慮平移運算只要改寫矩陣為4×4 homogeneous matrix \left[ \begin{matrix} \left[ \begin{matrix} &&\\&R&\\&& \end{matrix}\right]\begin{matrix} x\\y\\z \end{matrix}\\ \begin{matrix} 0&0&0&1 \end{matrix} \end{matrix} \right] 即可,而四元數則必須重新寫為 Rot(\vec{n}, \theta) 的形式以找到homogeneous matrix,非常麻煩。

Rot(\vec{n},\theta)=\left[\begin{matrix} n_x^2+(1-n_x^2)c & n_xn_y(1-c)-n_zs & n_xn_z(1-c)+n_ys & 0\\ n_xn_y(1-c)+n_zs & n_y^2+(1-n_y^2)c & n_yn_z(1-c)-n_xs & 0\\ n_xn_z(1-c)-n_ys & n_yn_z(1-c)+n_xs & n_z^2+(1-n_z^2)c & 0\\ 0 & 0 & 0 & 1 \end{matrix}\right] ,其中 c = cos\theta, s = sin\theta

 

 

 
 
參考文獻:
https://www.zhihu.com/question/47736315/answer/236808639

www.qiujiawei.com/understanding-quaternions/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM