描述座標系{B}相對於參考座標系{A}的姿態有兩種方式。第一種是繞固定(參考)座標軸旋轉:假設開始兩個座標系重合,先將{B}繞{A}的X軸旋轉γγ,而後繞{A}的Y軸旋轉ββ,最後繞{A}的Z軸旋轉αα,就能旋轉到當前姿態。能夠稱其爲X-Y-Z fixed angles或RPY角(Roll, Pitch, Yaw)。html
Roll:橫滾windows
Pitch: 俯仰ide
Yaw: 偏航(航向)函數
因爲是繞固定座標系旋轉,則旋轉矩陣爲(cαcα is shorthand for cosαcosα, sαsα is shorthand for sinαsinα,and so on.)ui
另外一種姿態描述方式是繞自身座標軸旋轉:假設開始兩個座標系重合,先將{B}繞自身的Z軸旋轉αα,而後繞Y軸旋轉ββ,最後繞X軸旋轉γγ,就能旋轉到當前姿態。稱其爲Z-Y-X歐拉角,因爲是繞自身座標軸進行旋轉,則旋轉矩陣爲:atom
能夠發現這兩種描述方式獲得的旋轉矩陣是同樣的,即繞固定座標軸X-Y-Z旋轉(γ,β,α)(γ,β,α)和繞自身座標軸Z-Y-X旋轉(α,β,γ)(α,β,γ)的最終結果同樣,只是描述的方法有差異而已。In gerenal: three rotations taken about fixed axes yield the same final orientation as the same three rotations taken in opposite order about the axes of the moving frame.url
繞座標軸的屢次旋轉能夠等效爲繞某一轉軸旋轉必定的角度。假設等效旋轉軸方向向量爲K⃗=[kx,ky,kz]TK→=[kx,ky,kz]T,等效旋轉角爲θθ,則四元數q=(x,y,z,w)q=(x,y,z,w),其中:idea
且有x2+y2+z2+w2=1x2+y2+z2+w2=1spa
即四元數存儲了旋轉軸和旋轉角的信息,它能方便的描述剛體繞任意軸的旋轉。3d
四元數轉換爲旋轉矩陣:
已知旋轉矩陣爲:
則對應的四元數爲:
定義兩個四元數:
四元數加法:
四元數乘法:
四元數的乘法的意義相似於矩陣的乘法,能夠表示旋轉的合成。當有屢次旋轉操做時,使用四元數能夠得到更高的計算效率。
計算結果爲:Quaternion[-12, 4, 14, 2]
θ = ATan(y / x)求出的θ取值範圍是[-PI/2, PI/2];
θ = ATan2(y, x)求出的θ取值範圍是[-PI, PI]。
當 (x, y) 在第一象限, 0 < θ < PI/2
當 (x, y) 在第二象限 PI/2 < θ≤PI
當 (x, y) 在第三象限, -PI < θ < -PI/2
當 (x, y) 在第四象限, -PI/2 < θ < 0
上面的代碼存在一個問題,即奇異性沒有考慮。下面看一種特殊的狀況(參考Maths - Conversion Quaternion to Euler):假設一架飛機繞Y軸旋轉了90°(俯仰角pitch=90),機頭垂直向上,此時如何計算航向角和橫滾角?
這時會發生自由度丟失的狀況,即Yaw和Roll會變爲一個自由度。此時再使用上面的公式根據四元數計算歐拉角會出現問題:
arcsin(2(q0q2−q1q3))arcsin(2(q0q2−q1q3))的定義域爲[−1,1][−1,1],所以(q0q2−q1q3)∈[−0.5,0.5](q0q2−q1q3)∈[−0.5,0.5],當q0q2−q1q3=0.5q0q2−q1q3=0.5時(在程序中浮點數不能直接進行等於判斷,要使用合理的閾值),俯仰角ββ爲90°,將其帶入正向公式計算出四元數(q0,q1,q2,q3)(q0,q1,q2,q3),而後能夠發現逆向公式中atan2函數中的參數所有爲0,即出現了0000的狀況!沒法計算。
β=π/2β=π/2時,sinβ2=cosβ2=0.707sinβ2=cosβ2=0.707,將其帶入公式中有
則xw=zy=tanα−γ2xw=zy=tanα−γ2,因而有
一般令α=0α=0,這時γ=−2⋅atan2(x,w)γ=−2⋅atan2(x,w)。能夠進行驗證:當四元數爲(w,x,y,z)=(0.653,-0.271,0.653,0.271)時,根據這些規則計算出來的ZYX歐拉角爲α=0°,β=90°,γ=45°
當俯仰角爲-90°,即機頭豎直向下時的狀況也與之相似,能夠推導出奇異姿態時的計算公式。比較完整的四元數轉歐拉角(Z-Y-X order)的代碼以下:
在DirectXMath Library中有許多與剛體姿態變換相關的函數能夠直接調用:
下面的代碼中座標系繞X軸旋轉90°(注意這裏不是按照右手定則的方向,而是沿着座標軸向原點看過去以順時針方式旋轉,所以與傳統的右手定則恰好方向相反),來進行變換:
結果以下圖所示:
參考:
DirectXMath Library Quaternion Functions
Convert quaternion to euler rotations
Conversion between quaternions and Euler angles
Maths - Conversion Quaternion to Euler
Coordinate Transformations in Robotics—MATLAB
Introduction to Robotics - Mechanics and Control. Chapter 2 Spatial descriptions and transformations