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