【自动驾驶】24.欧拉角、旋转向量、四元数、万向锁
原文鏈接:https://blog.csdn.net/shenxiaolu1984/article/details/50639298
原文鏈接:https://blog.csdn.net/lql0716/article/details/72597719
三維空間剛體旋轉(zhuǎn)有兩種方式:
- (1) 任何一個(gè)旋轉(zhuǎn)可以表示為依次繞著三個(gè)旋轉(zhuǎn)軸旋三個(gè)角度的組合。這三個(gè)角度稱為歐拉角。
- (2) 三維空間的任意旋轉(zhuǎn),都可以用繞三維空間的某個(gè)軸旋轉(zhuǎn)過(guò)某個(gè)角度來(lái)表示。
繞坐標(biāo)軸的多次旋轉(zhuǎn)可以等效為繞某一軸旋轉(zhuǎn)一定角度,我感覺(jué)這就是四元數(shù)最直觀的幾何意義了。不管是RPY還是歐拉角,都可以利用四元數(shù)來(lái)代替表達(dá)。可以參考下面這篇博文:
https://www.cnblogs.com/21207-iHome/p/6894128.html
1.歐拉角的物理意義:
任何一個(gè)旋轉(zhuǎn)可以表示為依次繞著三個(gè)旋轉(zhuǎn)軸旋三個(gè)角度的組合。這三個(gè)角度稱為歐拉角。
三個(gè)軸可以指固定的世界坐標(biāo)系軸,也可以指被旋轉(zhuǎn)的物體坐標(biāo)系的軸。三個(gè)旋轉(zhuǎn)軸次序不同,會(huì)導(dǎo)致結(jié)果不同。
本文中提到的歐拉角指:繞著世界坐標(biāo)系的x,y,z軸,依次旋轉(zhuǎn)的結(jié)果。其取值范圍如下:
歐拉角→旋轉(zhuǎn)矩陣
單獨(dú)繞一個(gè)軸旋轉(zhuǎn)θ角度的旋轉(zhuǎn)矩陣為:
如果依次繞x軸、y軸、z軸旋轉(zhuǎn),該變換的旋轉(zhuǎn)矩陣為:
2.四元數(shù)的物理意義:
旋轉(zhuǎn)向量
三維空間的任意旋轉(zhuǎn),都可以用繞三維空間的某個(gè)軸旋轉(zhuǎn)過(guò)某個(gè)角度來(lái)表示,即所謂的Axis-Angle(軸角)表示方法。軸角,就是繞一個(gè)軸旋轉(zhuǎn)某個(gè)角度,來(lái)表示一個(gè)旋轉(zhuǎn)。
這種表示方法里,Axis(軸)可用一個(gè)三維向量(x,y,z)來(lái)表示,θ可以用一個(gè)角度值來(lái)表示。
直觀來(lái)講,一個(gè)四維向量(θ,x,y,z)就可以表示出三維空間任意的旋轉(zhuǎn)。注意,這里的三維向量(x,y,z)只是用來(lái)表示axis(軸)的方向朝向,因此更緊湊的表示方式是用一個(gè)單位向量來(lái)表示方向axis(軸),而用該三維向量的長(zhǎng)度來(lái)表示角度值θ。
這樣以來(lái),可以用一個(gè)三維向量(θ?x,θ?y,θ?z)就可以表示出三維空間任意的旋轉(zhuǎn),前提是其中(x,y,z)是單位向量,即 x2+y2+z2=1\color{red}x^2 + y^2 + z^2 = 1x2+y2+z2=1。這就是旋轉(zhuǎn)向量(Rotation Vector)的表示方式,OpenCV里大量使用的就是這種表示方法來(lái)表示旋轉(zhuǎn)(見(jiàn)OpenCV相機(jī)標(biāo)定部分的rvec)。
四元數(shù)
前面的旋轉(zhuǎn)向量中的單位向量(x,y,z)旋轉(zhuǎn)θ角度后的四元數(shù):
對(duì)于三維坐標(biāo)的旋轉(zhuǎn),可以通過(guò)四元數(shù)乘法直接操作,與旋轉(zhuǎn)矩陣操作可以等價(jià),但是表示方式更加緊湊,計(jì)算量也可以小一些。
需要注意,單位向量(x,y,z)指的是這個(gè)向量長(zhǎng)度為1,即x2+y2+z2=1\color{red}x^2 + y^2 + z^2 = 1x2+y2+z2=1,這個(gè)向量是表示的這個(gè)軸的位置,表述某個(gè)向量時(shí),一般會(huì)把這個(gè)向量用單位向量表示,下面的(w1,w2,w3)就是單位向量(x,y,z),寫(xiě)法不一致而已。
四元數(shù)的模是四元數(shù)到原點(diǎn)的距離。如果某個(gè)四元數(shù)(q0, q1, q2, q3)的模長(zhǎng)為1,即滿足 q02+q12+q22+q32=1\sqrt {q_0^2 + q_1^2 + q_2^2 + q_3^2}=1q02?+q12?+q22?+q32??=1。但并不是說(shuō)所有四元數(shù)的模都為1。只有表示旋轉(zhuǎn)的四元數(shù)的模才為1,所以上面旋轉(zhuǎn)向量的模才為1。不要混淆了。
注意,上面的w1,w2,w3不是i,j,k, 不要搞混了。[w1,w2,w3]是通過(guò)原點(diǎn)的某個(gè)軸上的單位長(zhǎng)度(長(zhǎng)度為1)的點(diǎn),即w12+w22+w32=1w_1^2+ w_2^2 + w_3^2 =1w12?+w22?+w32?=1。
[w1,w2,w3]是個(gè)三維坐標(biāo)點(diǎn),設(shè)為點(diǎn)P,則OP就是這個(gè)旋轉(zhuǎn)軸,w1,w2,w3分別為距離坐標(biāo)系原點(diǎn)O的三個(gè)方向的距離。
歐拉角的缺點(diǎn):
- 1、 歐拉角的表示方式不唯一。給定某個(gè)起始朝向和目標(biāo)朝向,即使給定yaw、pitch、roll的順序,也可以通過(guò)不同的yaw/pitch/roll的角度組合來(lái)表示所需的旋轉(zhuǎn)。這其實(shí)主要是由于萬(wàn)向鎖(Gimbal Lock)引起的;
- 2、歐拉角的插值比較難;
- 3、計(jì)算旋轉(zhuǎn)變換時(shí),一般需要轉(zhuǎn)換成旋轉(zhuǎn)矩陣,這時(shí)候需要計(jì)算很多sin, cos,計(jì)算量較大;
對(duì)于三維坐標(biāo)的旋轉(zhuǎn),可以通過(guò)四元數(shù)乘法直接操作,與旋轉(zhuǎn)矩陣操作可以等價(jià),但是表示方式更加緊湊,計(jì)算量也可以小一些。
萬(wàn)向鎖
請(qǐng)參考原文:https://zhuanlan.zhihu.com/p/74040465
為了更好的理解這個(gè)現(xiàn)象,我們?cè)儆米约旱氖謾C(jī)做一個(gè)試驗(yàn):
- 把手機(jī)屏幕朝上,手機(jī)的長(zhǎng)邊為X軸,短邊為Y軸,Z軸垂直屏幕向下。
- 你先繞Z軸旋轉(zhuǎn)一下手機(jī),假設(shè)旋轉(zhuǎn)30度;
- 然后再把手機(jī)繞Y軸旋轉(zhuǎn)90度,也就是把手機(jī)短邊接觸桌面,長(zhǎng)邊豎立起來(lái);
- 這時(shí)候你再繞手機(jī)的長(zhǎng)邊(X軸)旋轉(zhuǎn),你會(huì)發(fā)現(xiàn)手機(jī)的短邊一直定在桌面上不可能脫離桌面,這就是萬(wàn)向鎖現(xiàn)象。
下面這個(gè)說(shuō)法,是從方向自由度來(lái)說(shuō)明的:
需要注意的是XYZ軸的定義動(dòng)態(tài)跟從手機(jī)的方向,例如Z軸永遠(yuǎn)是手機(jī)屏幕所示方向。
按Z->Y->X的順序來(lái)旋轉(zhuǎn)手機(jī),不過(guò)規(guī)定Y旋轉(zhuǎn)的角度為90°。
這樣做的時(shí)候你會(huì)發(fā)現(xiàn)無(wú)論你怎樣選擇Z和X的旋轉(zhuǎn)角度,手機(jī)的短邊都無(wú)法離開(kāi)桌面。這意味著什么呢?這意味著雖然你看似有X、Z旋轉(zhuǎn)的2向自由度,但是當(dāng)Y被定為90的時(shí)候,這個(gè)系統(tǒng)實(shí)際上只有一向自由度,因?yàn)槿魏蝺上蜃杂啥鹊男D(zhuǎn)一定可以使任一直線離開(kāi)任一平面,而我們繞Z軸和x軸隨便轉(zhuǎn)卻并不能將手機(jī)的短邊移開(kāi)桌面。
下面這個(gè)說(shuō)法,是從繞X、Z軸分別旋轉(zhuǎn)不同角度卻能達(dá)到同樣效果來(lái)說(shuō)明:
首先旋轉(zhuǎn)順序就是Z-Y-X,繞完Y軸旋轉(zhuǎn)后,只能繞X軸旋轉(zhuǎn)了,不能再繞Z軸旋轉(zhuǎn)了;
舉例:
- 轉(zhuǎn)法1:你先繞Z正方向旋轉(zhuǎn)30°,再繞Y正方向旋轉(zhuǎn)90°,最后繞X軸旋轉(zhuǎn)30°,見(jiàn)下圖左;
- 轉(zhuǎn)法2:你先繞Z正方向旋轉(zhuǎn)20°,再繞Y正方向旋轉(zhuǎn)90°,最后繞X軸旋轉(zhuǎn)40°,見(jiàn)下圖右;
實(shí)線是最開(kāi)始沒(méi)旋轉(zhuǎn)的,虛線矩形是繞Z軸旋轉(zhuǎn)后的,繞y軸旋轉(zhuǎn)后的由于是豎直方向的,所以沒(méi)畫(huà)出來(lái),箭頭指向的那個(gè)虛線是繞X軸旋轉(zhuǎn)的角度。下面兩幅圖最終都達(dá)到了同樣的效果,角度都為60°。
你會(huì)發(fā)現(xiàn)兩種轉(zhuǎn)法的結(jié)果是一樣的,所以說(shuō)先繞Z旋轉(zhuǎn)的度數(shù)和最后繞X的旋轉(zhuǎn)度數(shù),沒(méi)啥區(qū)別了。最終的結(jié)果就是,你繞X軸旋轉(zhuǎn)的角度,也可以通過(guò)旋轉(zhuǎn)Z軸來(lái)達(dá)到同樣;或者,你繞Z軸旋轉(zhuǎn)的角度,也可以通過(guò)旋轉(zhuǎn)X軸來(lái)達(dá)到同樣效果。
數(shù)學(xué)解釋:
一般情況下都是繞X軸旋轉(zhuǎn)的是pitch俯仰角,繞Y軸旋轉(zhuǎn)的是yaw偏航角,繞Z軸旋轉(zhuǎn)的是roll翻滾角。
最后,再讓我們用數(shù)據(jù)公式來(lái)解釋一下萬(wàn)向鎖現(xiàn)象產(chǎn)生的原因,我們來(lái)回顧一下旋轉(zhuǎn)矩陣:
這說(shuō)明你改變?chǔ)蘸挺椎闹刀际且粋€(gè)效果,而矩陣的第一行和最后一列始終是保持不變,這說(shuō)明無(wú)論你怎么改變?chǔ)蘸挺?#xff0c;你的旋轉(zhuǎn)軸一直是Z軸不變,要想改變?chǔ)蘸挺子胁煌男Ч?#xff0c;你只能是去改變?chǔ)鹊闹?#xff0c;以上就是用數(shù)學(xué)方法來(lái)解釋為什么俯仰角在±90°時(shí)歐拉角出現(xiàn)萬(wàn)向鎖的過(guò)程。
總結(jié)
以上是生活随笔為你收集整理的【自动驾驶】24.欧拉角、旋转向量、四元数、万向锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【自动驾驶】23.相机成像究竟是成在像平
- 下一篇: 【自动驾驶】26.【很清晰】旋转矩阵,欧