接着上一篇博客四元數研究:www.cnblogs.com/liuzhenbo/p/10749458.html
![\left(-\pi, \pi\right]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNsZWZ0JTI4LSU1Q3BpJTJDKyU1Q3BpJTVDcmlnaHQlNUQ=.png)
![\left[\begin{matrix}x\\y\\z\end{matrix}\right]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNsZWZ0JTVCJTVDYmVnaW4lN0JtYXRyaXglN0R4JTVDJTVDeSU1QyU1Q3olNUNlbmQlN0JtYXRyaXglN0QlNUNyaWdodCU1RA==.png)

![(axis, angle) = \left(\left[\begin{matrix}x\\y\\z\end{matrix}\right],\theta\right)](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lMjhheGlzJTJDK2FuZ2xlJTI5KyUzRCslNUNsZWZ0JTI4JTVDbGVmdCU1QiU1Q2JlZ2luJTdCbWF0cml4JTdEeCU1QyU1Q3klNUMlNUN6JTVDZW5kJTdCbWF0cml4JTdEJTVDcmlnaHQlNUQlMkMlNUN0aGV0YSU1Q3JpZ2h0JTI5.png)









加法:
乘法:
將四元數用於計算軸角表示運算時,我們通常寫成向量形式(vector representation) ,為了表達清晰和計算方便,我們將w,x,y,z的取值定位
,並稱之為單位四元數,在方向計算時單位四元數中w,x,y,z分飾的角色我們后面會解釋。此時,復數乘法可表示為向量形式:
要注意這里出現的向量叉乘沒有交換率。
同時,我們也可以將乘法寫成矩陣形式,以用於和歐拉角計算作比較:
觀察此式,我們發現兩個四元數相乘,需要存儲8個單位數據,也就是說,每個參與運算的四元數只要存儲4個單位數據 即可。
此外我們還需要幾個特殊量和性質:
- 四元數的模:
- 四元數共軛:
- 共軛的向量形式:
- 四元數倒數:
- 共軛與倒數的關系:
可見對於單位四元數
- 共軛與倒數的性質:
,
- 四元數運算同時滿足結合律和分配律:
了解了上面的計算法則,我們就可以利用四元數來計算方向變換過程了。還記得我們之前說過計算時四元數我們用向量形式表示,且保證它是單位四元數嗎?其實四元數的向量形式我們還可以進一步改寫為極形式(polar representation)
,
其中 代表了四元數的模,單位四元數模為1,而
是四元數表示的旋轉過程的半角大小,也就是說
就是旋轉角大小,
則是表示旋轉軸方向的單位向量。用這種表示方法,四元數即可表示任意軸角表達的方向變換。方向變換的計算方法我們這里給出結論,大家可以自己通過計算來驗證一下,如有興趣也可以推導一下過程:
先將原向量坐標表示為四元數 ,將旋轉角度及旋轉軸表示為單位四元數
,旋轉后的向量坐標可通過
或
計算得出。

至此,四元數算是正式引入完了,下面我們來看看為什么我們要引入四元數。
先說結論,四元數的引用是為了減少計算量和計算時存儲占用的空間。
但是,如果你足夠細心,一定可以發現兩個四元數相乘的過程其實是一個4×4矩陣與一個4×1矩陣相乘的過程,而四元數計算一次變換需要兩次這個過程,其中包括24次加法運算和32次乘法運算,反觀歐拉角的矩陣變換只要進行一次3×3矩陣和3×1矩陣的乘法運算,其中包括6次加法運算和9次乘法運算,運算量明顯是四元數更大一些。如果你再細心一些可以發現,四元數運算時雖然有個4×4矩陣參與運算,但是矩陣中的每一項都是已經存儲過的單位數據,而參與歐拉角運算的3×3矩陣則要通過另外已存儲的單位數據進行的16次乘法運算,4次加法運算以及4次符號改變運算來求出,不過即使加上這些運算過程,矩陣運算也只要25次乘法運算,10次加法運算以及4次符號改變運算,運算量上來說,歐拉角的矩陣運算依然比四元數運算要有優勢。
但事實上,我們一般遇到的運動學問題很少會有只做一次方向轉換的情況出現,對於復雜的系統和機器人來說,我們往往會面對數量龐大的轉變方向過程。這種情況下四元數的優勢就體現出來了,我們考慮多次變換的四元數運算:
,
我們利用結合律來看:
,
考慮到四元數共軛有性質: ,我們可以把原式改寫為
,
可以發現,原向量 左右兩側括號里的運算結果是一對共軛四元數,也就是說可以利用3次易號運算代替n次四元數相乘運算,大大減少了計算量。反觀歐拉角的矩陣計算,雖然一次旋轉時,僅僅是3×3矩陣和3×1矩陣的乘法運算,但是對於多次運算來說,
的運算卻是多個3×3矩陣相乘,與四元數
的每組4×4矩陣與4×1矩陣的相乘相比運算量要大上不少,加上3×3矩陣中多數元素都是需要通過單位數據再次運算才能得到的,更是增加了運算量的需求。總體看來,在復雜的多次變換情況下,四元數比矩陣運算所需要的運算量更小。
另外,我們之前提到過,每一個3×3的矩陣至少需要存儲6個單位數據才可以記錄,而每個四元數僅需要4個單位數據即可(其實考慮到四元數是單位四元數,在保證w已知的前提下,x,y,z缺少任意一個都是可以通過運算推導出四元數的,也就是說可能只要占用三個數據的存儲空間,前提是對x,y,z的定義域要有限制),在大量變換的運算中,四元數的應用可以節約非常多的存儲空間。
擁有以上兩個優點,加上規避了Ambiguity的問題,我們在表示方向和方向變換時會經常使用四元數的運算。不過四元數也是有缺點的,在復雜運動中,方向旋轉和位移往往是同時發生的,在運用歐拉角矩陣運算時,我們考慮平移運算只要改寫矩陣為4×4 homogeneous matrix 即可,而四元數則必須重新寫為
的形式以找到homogeneous matrix,非常麻煩。
,其中
https://www.zhihu.com/question/47736315/answer/236808639