四元数研究
接著上一篇博客四元數(shù)研究:www.cnblogs.com/liuzhenbo/p/10749458.html
為了規(guī)避Ambiguity的問題,我們給出另一種表述方向的方法:軸角表示(Axis-Angle-Representation)。跟歐拉角不同的是,我們這次不再采取多次旋轉(zhuǎn)的方式來找到目標(biāo)方向,而是找到一根旋轉(zhuǎn)軸,只通過繞這根軸旋轉(zhuǎn)一次就可以得到目標(biāo)方向。這樣就不會產(chǎn)生Ambiguity了嗎?是的,證明方法很簡單,首先以目標(biāo)矩陣原點為一角,三軸為三邊建立一個立方體,這個立方體中通過原點的對角線就是我們要找的旋轉(zhuǎn)軸,顯然,這個旋轉(zhuǎn)軸是唯一的,而我們知道,繞一個旋轉(zhuǎn)軸旋轉(zhuǎn)不同角度,對應(yīng)的方向也是不同的(角度范圍(角度范圍??),由此可見,空間中任一位置的軸角表示是唯一的,不存在Ambiguity的問題。旋轉(zhuǎn)軸我們可以通過向量??來表示,旋轉(zhuǎn)角度我們可以通過一個度數(shù)??來表示,至此我們可以通過軸角表示??來描述方向。?
一般來說,軸角表示方向時,會出現(xiàn)4個參數(shù),其中3個用于表示旋轉(zhuǎn)軸,1個用于表示旋轉(zhuǎn)角大小。而如果我們規(guī)定了表示旋轉(zhuǎn)軸的向量為單位向量 ,考慮到 ,我們就可以用兩個參數(shù)表示出旋轉(zhuǎn)軸,總共只需要三個參數(shù),跟歐拉角一樣多。旋轉(zhuǎn)向量我們可以用 表示,其中 是單位向量。順便提一句,這里的旋轉(zhuǎn)軸我們稱為歐拉軸(Euler axis),這里的旋轉(zhuǎn)向量我們稱為歐拉向量(Euler vector)。是的,全是這個人自己在玩兒。現(xiàn)在我們可以說說四元數(shù)了。我們引入四元數(shù)是為了更方便地計算軸角表示的方向變換。四元數(shù)是什么?四元數(shù)是復(fù)數(shù),更具體地說四元數(shù)是存在三個虛部的復(fù)數(shù)。 ,其中i,j,k是虛數(shù)單位,滿足 ,且 , 。為了讓大家更直觀地明白用四元數(shù)運算的優(yōu)點,我們簡單回顧一下高中學(xué)的復(fù)數(shù)運算。
加法:
乘法:
將四元數(shù)用于計算軸角表示運算時,我們通常寫成向量形式(vector representation) ,為了表達清晰和計算方便,我們將w,x,y,z的取值定位 ,并稱之為單位四元數(shù),在方向計算時單位四元數(shù)中w,x,y,z分飾的角色我們后面會解釋。此時,復(fù)數(shù)乘法可表示為向量形式:
要注意這里出現(xiàn)的向量叉乘沒有交換率。
同時,我們也可以將乘法寫成矩陣形式,以用于和歐拉角計算作比較:
觀察此式,我們發(fā)現(xiàn)兩個四元數(shù)相乘,需要存儲8個單位數(shù)據(jù),也就是說,每個參與運算的四元數(shù)只要存儲4個單位數(shù)據(jù) 即可。
此外我們還需要幾個特殊量和性質(zhì):
- 四元數(shù)的模:
- 四元數(shù)共軛:
- 共軛的向量形式:
- 四元數(shù)倒數(shù):
- 共軛與倒數(shù)的關(guān)系: 可見對于單位四元數(shù)
- 共軛與倒數(shù)的性質(zhì): ,
- 四元數(shù)運算同時滿足結(jié)合律和分配律:
了解了上面的計算法則,我們就可以利用四元數(shù)來計算方向變換過程了。還記得我們之前說過計算時四元數(shù)我們用向量形式表示,且保證它是單位四元數(shù)嗎?其實四元數(shù)的向量形式我們還可以進一步改寫為極形式(polar representation)
,
其中 代表了四元數(shù)的模,單位四元數(shù)模為1,而 是四元數(shù)表示的旋轉(zhuǎn)過程的半角大小,也就是說 就是旋轉(zhuǎn)角大小, 則是表示旋轉(zhuǎn)軸方向的單位向量。用這種表示方法,四元數(shù)即可表示任意軸角表達的方向變換。方向變換的計算方法我們這里給出結(jié)論,大家可以自己通過計算來驗證一下,如有興趣也可以推導(dǎo)一下過程:
先將原向量坐標(biāo)表示為四元數(shù) ,將旋轉(zhuǎn)角度及旋轉(zhuǎn)軸表示為單位四元數(shù) ,旋轉(zhuǎn)后的向量坐標(biāo)可通過 或 計算得出。
至此,四元數(shù)算是正式引入完了,下面我們來看看為什么我們要引入四元數(shù)。
?
先說結(jié)論,四元數(shù)的引用是為了減少計算量和計算時存儲占用的空間。
但是,如果你足夠細心,一定可以發(fā)現(xiàn)兩個四元數(shù)相乘的過程其實是一個4×4矩陣與一個4×1矩陣相乘的過程,而四元數(shù)計算一次變換需要兩次這個過程,其中包括24次加法運算和32次乘法運算,反觀歐拉角的矩陣變換只要進行一次3×3矩陣和3×1矩陣的乘法運算,其中包括6次加法運算和9次乘法運算,運算量明顯是四元數(shù)更大一些。如果你再細心一些可以發(fā)現(xiàn),四元數(shù)運算時雖然有個4×4矩陣參與運算,但是矩陣中的每一項都是已經(jīng)存儲過的單位數(shù)據(jù),而參與歐拉角運算的3×3矩陣則要通過另外已存儲的單位數(shù)據(jù)進行的16次乘法運算,4次加法運算以及4次符號改變運算來求出,不過即使加上這些運算過程,矩陣運算也只要25次乘法運算,10次加法運算以及4次符號改變運算,運算量上來說,歐拉角的矩陣運算依然比四元數(shù)運算要有優(yōu)勢。
但事實上,我們一般遇到的運動學(xué)問題很少會有只做一次方向轉(zhuǎn)換的情況出現(xiàn),對于復(fù)雜的系統(tǒng)和機器人來說,我們往往會面對數(shù)量龐大的轉(zhuǎn)變方向過程。這種情況下四元數(shù)的優(yōu)勢就體現(xiàn)出來了,我們考慮多次變換的四元數(shù)運算:
,
我們利用結(jié)合律來看:
,
考慮到四元數(shù)共軛有性質(zhì): ,我們可以把原式改寫為
,
可以發(fā)現(xiàn),原向量 左右兩側(cè)括號里的運算結(jié)果是一對共軛四元數(shù),也就是說可以利用3次易號運算代替n次四元數(shù)相乘運算,大大減少了計算量。反觀歐拉角的矩陣計算,雖然一次旋轉(zhuǎn)時,僅僅是3×3矩陣和3×1矩陣的乘法運算,但是對于多次運算來說, 的運算卻是多個3×3矩陣相乘,與四元數(shù) 的每組4×4矩陣與4×1矩陣的相乘相比運算量要大上不少,加上3×3矩陣中多數(shù)元素都是需要通過單位數(shù)據(jù)再次運算才能得到的,更是增加了運算量的需求。總體看來,在復(fù)雜的多次變換情況下,四元數(shù)比矩陣運算所需要的運算量更小。
另外,我們之前提到過,每一個3×3的矩陣至少需要存儲6個單位數(shù)據(jù)才可以記錄,而每個四元數(shù)僅需要4個單位數(shù)據(jù)即可(其實考慮到四元數(shù)是單位四元數(shù),在保證w已知的前提下,x,y,z缺少任意一個都是可以通過運算推導(dǎo)出四元數(shù)的,也就是說可能只要占用三個數(shù)據(jù)的存儲空間,前提是對x,y,z的定義域要有限制),在大量變換的運算中,四元數(shù)的應(yīng)用可以節(jié)約非常多的存儲空間。
?
擁有以上兩個優(yōu)點,加上規(guī)避了Ambiguity的問題,我們在表示方向和方向變換時會經(jīng)常使用四元數(shù)的運算。不過四元數(shù)也是有缺點的,在復(fù)雜運動中,方向旋轉(zhuǎn)和位移往往是同時發(fā)生的,在運用歐拉角矩陣運算時,我們考慮平移運算只要改寫矩陣為4×4 homogeneous matrix 即可,而四元數(shù)則必須重新寫為 的形式以找到homogeneous matrix,非常麻煩。
,其中
?
?
參考文獻:https://www.zhihu.com/question/47736315/answer/236808639
www.qiujiawei.com/understanding-quaternions/
轉(zhuǎn)載于:https://www.cnblogs.com/liuzhenbo/p/10759049.html
總結(jié)
- 上一篇: ACM-最短路之中的一个个人的旅行——h
- 下一篇: OO_Unit2_多线程电梯