从数学角度理解欧拉旋转中的万向节死锁
歐拉旋轉
姿態角pitch/roll/yaw
? 姿態角是飛行器的機體坐標系與地面坐標系的夾角,也叫歐拉角。其中,
pitch是俯仰角,yaw是偏航角,roll是滾轉角。
? 歐拉角最直觀、最容易理解、存儲空間少,但歐拉角存在萬向節死鎖現象、插值速度不均勻等缺點,而且不可以在計算機中直接運算。
設xyz-軸為參考系的參考軸,也成為固定軸,XYZ-軸稱為動軸,xy-平面和XY-平面的相交為交點線,用字母N表示。則章動角θ=β是z軸與Z軸的夾角,進動角ψ=α是x軸與交點線的夾角,自轉角j=γ是交點線與X軸的夾角。上述旋轉方式采用zxz的順規方式旋轉得到,即:
1. 繞z軸旋轉α,使x軸與N軸重合,N軸是旋轉前后兩個坐標系x-y平面的交線 2. 繞x軸(也就是N軸)旋轉β,使z軸與旋轉后的z軸重合 3. 繞z軸旋轉γ,使坐標系與旋轉后的完全重合歐拉角的旋轉方式總共有12種:
- 非對稱型歐拉角: XYZ,XZY,YXZ,YZX,ZXY,ZYX
- 對稱型歐拉角: XYX,XZX,YXY,YZY,ZXZ,ZYZ
每一種旋轉方式得到的結果并不一樣,比如先繞X軸旋轉45°再分別繞Y軸和Z軸旋轉45°與先繞Y軸再繞X軸和Z軸旋轉得到的結果是不一致的,由此可見旋轉順序的重要性。
在數學公式表達中,需要用矩陣相乘來表示旋轉,乘以矩陣的順序不同意味著旋轉方式的不同,其結果也是不一樣的。以二維旋轉為例:
? 設x點的坐標為(x0,y0),旋轉后的坐標為(x1,y1),旋轉角度為θ,則以矩陣表示為
[x1y1]=[cosθ?sinθsinθcosθ][x0y0]\left[ \begin{matrix} x1 \\ y1 \end{matrix} \right] =\left[ \begin{matrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \end{matrix} \right] [x1y1?]=[cosθsinθ??sinθcosθ?][x0y0?]
? 在三維旋轉中,可以分解為先繞x軸旋轉,再繞y軸旋轉,之后繞z軸旋轉,則通過矩陣可表示為
[x1y1z1]=[cosα?sinα0sinαcosα0001][cosβ0?sinβ010sinβ0cosβ][1000cosθ?sinθ0sinθcosθ][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ???x1y1z1????=???cosαsinα0??sinαcosα0?001???????cosβ0sinβ?010??sinβ0cosβ???????100?0cosθsinθ?0?sinθcosθ???????x0y0z0????
? 通過上述矩陣可以看出,用[x0 y0 z0]代表一個向量的前提是定義了相應的坐標系,即X軸、Y軸和Z軸已經確定,不會因為旋轉的發生而導致整個坐標軸發生形變。對于旋轉矩陣ZYX,其順序是先基于X軸旋轉再進行Y軸和Z軸的旋轉。
? 以萬向節死鎖演示視頻的截圖為例進行說明:藍圈表示繞x軸旋轉,紅圈表示繞y軸旋轉,綠圈表示繞z軸旋轉,由于綠圈的旋轉會導致紅圈和藍圈的方向變化,紅圈的旋轉會導致藍圈的方向變化,所以可以看到,要滿足矩陣公式,即坐標軸的方向不發生改變,則其旋轉的順序必須是先轉動藍圈,再轉動紅圈,最后轉動綠圈。即該模型的旋轉順序(即順規)是藍紅綠(XYZ)。
? 如果換個旋轉順序——先轉綠圈45°再轉紅圈45°最后轉藍圈45°,這和先轉動藍圈45°再轉動紅圈45°最后轉動綠圈45°的結果是一樣的嗎?答案是肯定的,只要保證轉動角度一致,最后產生的效果都是一樣的。那為什么要規定轉動的順序呢?因為此處大家已經陷入了轉動順序的陷阱了。為什么會有這個矛盾,其實是陷入了歐拉旋轉中重要的一個概念的誤解,這就是順規。
順規
首先討論順規存在的必要性,順規從數學意義上來講就是對矩陣順序的規定,具體討論如下:
[x1y1z1]=[cosα?sinα0sinαcosα0001][cosβ0?sinβ010sinβ0cosβ][1000cosθ?sinθ0sinθcosθ][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ???x1y1z1????=???cosαsinα0??sinαcosα0?001???????cosβ0sinβ?010??sinβ0cosβ???????100?0cosθsinθ?0?sinθcosθ???????x0y0z0????
[x1y1z1]=[cosβ0?sinβ010sinβ0cosβ][cosα?sinα0sinαcosα0001][1000cosθ?sinθ0sinθcosθ][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{matrix} \right] \left[ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ???x1y1z1????=???cosβ0sinβ?010??sinβ0cosβ???????cosαsinα0??sinαcosα0?001???????100?0cosθsinθ?0?sinθcosθ???????x0y0z0????
? 可以看到,矩陣的順序不一樣會導致最終的旋轉結果不一致,不妨以一支筆為向量比劃一下,假設向量為[1,0,0],則向量先繞y軸旋轉90°到z軸,再繞x軸旋轉30°,和先繞x軸旋轉30°再繞y軸旋轉90°,其結果是不一樣的。如果空間思維能力差的可以參考歐拉角的旋轉順序能改變嗎?中的幾個gif動圖。
? 從數學角度上分析,確實旋轉的順序相當重要,但為什么上圖中會有旋轉順序不一致結果卻一樣呢?這就跳回到我們前邊要注意的細節,首先旋轉過程中,我們必須保證第二次旋轉軸不會因為第一個的旋轉而發生偏轉(第三次旋轉同理)。即,第一次繞x軸旋轉后,y軸和z軸的方向是沒有發生任何變化的,這是對矩陣最直觀的理解。
? 從演示視頻和模型來看,如果我們先轉動紅圈,其實藍圈的軸心已經發生了偏轉,即我們不能認為紅圈先動就先乘以第二個矩陣。換言之,在數學上,哪個矩陣先乘在該模型中不等于哪個圈先轉動,而必須遵循一個準則——先轉動的圈不能影響還沒轉動的圈的軸心方向。所以實際上,該模型的順規其實是已經確定了,即xyz順序。那如何理解先轉動紅圈對應的數學模型呢?
? 重新聲明一點,通過矩陣運算可以得到,右邊的矩陣運算后是對左邊的矩陣不產生影響的,而左邊的矩陣運算是會對右邊的矩陣有一定的影響作用。我們可以通過空間想象得知,由于左邊的矩陣會導致右邊的矩陣原定旋轉方向產生一定的偏轉,相當于代入我們已知β的值,實際上就已經產生了對前一個矩陣旋轉軸和整個向量的偏轉,即紅圈對藍圈產生了影響,藍圈也發生偏轉了!
萬向節死鎖
? 萬向節死鎖是歐拉旋轉中順規存在導致的必然缺陷,其本質就是歐拉旋轉過程中出現了維度丟失的情況。無論是哪種順規的歐拉旋轉,總是會存在這種情況。比如zxz,但x旋轉180°時,前后兩次圍繞z軸的旋轉只產生了一個維度上的旋轉,此時zxz的旋轉只能產生兩個維度的轉動,即滾轉角和俯仰角,偏轉角丟失了。
? 萬向節死鎖的關鍵原因在于順規的存在——由于有了繞軸轉動的順序問題,導致對于繞順序為第二的軸轉動90°會導致其他兩個軸上的運動方向重合,從而導致了原本三維的旋轉運動少了一個維度,進而導致在某種特定的情況下不能按照預期的路線進行繞軸運動,具體過程可參考萬向節死鎖演示視頻。詳細的解釋可參考【Unity編程】Unity中的歐拉旋轉和【Unity編程】歐拉角與萬向節死鎖(圖文版)。其解釋僅供參考,我們還可以通過萬向節死鎖模擬程序Unity動手實踐演示。
? Unity中的順規是zxy,即繞z軸的轉動不影響x和y軸,繞x軸的轉動不影響y軸但影響z軸,繞y軸的轉動直接影響x和z軸,所以當先對x軸產生一個90°的旋轉時,y軸和z軸都產生了同樣的翻滾角效果,無法產生偏轉角(x軸產生的是俯仰角的變化)。
? 萬向節死鎖的模型演示已經在上述視頻和其他文章中描述的比較清晰,以下我們只從數學角度上理解。
[x1y1z1]=[cosα?sinα0sinαcosα0001][cosβ0?sinβ010sinβ0cosβ][1000cosθ?sinθ0sinθcosθ][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} cos\alpha & -sin\alpha & 0 \\ sin\alpha & cos\alpha & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ???x1y1z1????=???cosαsinα0??sinαcosα0?001???????cosβ0sinβ?010??sinβ0cosβ???????100?0cosθsinθ?0?sinθcosθ???????x0y0z0????
=[cosαcosβ?sinαcosθ?cosαsinβsinθsinαsinθ?cosαsinβcosθsinαcosβcosαcosθ?sinαsinβsinθ?cosαsinθ?sinαsinβcosθsinβcosβsinθcosβcosθ][x0y0z0]= \left[ \begin{matrix} cos\alpha cos\beta & -sin\alpha cos\theta-cos\alpha sin\beta sin\theta & sin\alpha sin\theta-cos\alpha sin\beta cos\theta \\ sin\alpha cos\beta & cos\alpha cos\theta-sin\alpha sin\beta sin\theta & -cos\alpha sin\theta-sin\alpha sin\beta cos\theta \\ sin\beta & cos\beta sin\theta & cos\beta cos\theta \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] =???cosαcosβsinαcosβsinβ??sinαcosθ?cosαsinβsinθcosαcosθ?sinαsinβsinθcosβsinθ?sinαsinθ?cosαsinβcosθ?cosαsinθ?sinαsinβcosθcosβcosθ???????x0y0z0????
當β=pi/2時,sinβ=1,cosβ=0,故
[x1y1z1]=[0?sin(θ+α)?cos(θ+α)0cos(θ+α)?sin(θ+α)100][x0y0z0]\left[ \begin{matrix} x1 \\ y1 \\ z1 \end{matrix} \right]= \left[ \begin{matrix} 0 & -sin(\theta+\alpha) & -cos(\theta+\alpha) \\ 0 & cos(\theta+\alpha) & -sin(\theta+\alpha) \\ 1 & 0 & 0 \end{matrix} \right] \left[ \begin{matrix} x0 \\ y0 \\ z0 \end{matrix} \right] ???x1y1z1????=???001??sin(θ+α)cos(θ+α)0??cos(θ+α)?sin(θ+α)0???????x0y0z0????
? 此時可以看到θ和α的變化都產生了相同的效果,即產生的都是繞z軸的旋轉(正常情況下α和θ對應的矩陣是正交的),而原本θ角產生的旋轉維度丟失了,不能產生偏轉角。實際上對于不同的向量,會有不同的鎖定效果,如當[x0 y0 z0]=[1 0 0]時,不能產生偏轉角,當[x0 y0 z0]=[0 0 1]時,不能產生滾轉角等。歸結為:萬向節死鎖產生的是在某個特殊狀態下某種特定運動不能發生,如無法發生偏轉,無法發生翻滾或者無法發生俯仰,或者無法發生上述運動的某個結合運動,具體取決于向量的初始狀態。
? 丟失旋轉維度產生的最大問題在視頻中也有詳細的演示,即向量不能朝某一個特定的方向進行最短路徑旋轉,而需要繞弧線產生一定的旋轉,為什么會這樣?直觀上看就是因為丟失了一個維度導致在這個維度上呈現出鎖死的狀態,需要先解除這個特殊狀態才能轉到我們需要的姿態角上。
? 以下從微分學的角度來分析為什么在這個狀態下不能產生特定維度的旋轉。
? 我們以[x0 y0 z0]=[1 0 0]為例,首先我們將x、y、z看成是自變量為α、β和θ的函數。即
x=x0?cosβcosα+y0?(?sinαcosθ?cosαsinβsinθ)+z0?(sinαsinθ?cosαsinβcosθ)y=x0?sinαcosβ+y0?(cosαcosθ?sinαsinβsinθ)+z0?(?cosαsinθ?sinαsinβcosθ)z=x0?(sinβ)+y0?cosβsinθ+z0?cosβcosθx=x_0*cos\beta cos\alpha + y_0*(-sin\alpha cos\theta-cos\alpha sin\beta sin\theta) + z_0*(sin\alpha sin\theta-cos\alpha sin\beta cos\theta) \\ y=x_0*sin\alpha cos\beta +y_0*(cos\alpha cos\theta-sin\alpha sin\beta sin\theta)+z_0*(-cos\alpha sin\theta-sin\alpha sin\beta cos\theta) \\ z=x_0*(sin\beta)+y_0*cos\beta sin\theta+z_0*cos\beta cos\theta x=x0??cosβcosα+y0??(?sinαcosθ?cosαsinβsinθ)+z0??(sinαsinθ?cosαsinβcosθ)y=x0??sinαcosβ+y0??(cosαcosθ?sinαsinβsinθ)+z0??(?cosαsinθ?sinαsinβcosθ)z=x0??(sinβ)+y0??cosβsinθ+z0??cosβcosθ
分別求出x、y和z在α=0、β=pi/2和θ=0時的偏導數,得到
?x?α=y0,?x?β=?x0,?x?θ=y0?y?α=z0,?y?β=0,?y?θ=z0?z?α=0,?z?β=?z0,?z?θ=0\frac{\partial x}{\partial \alpha} = y_0, \frac{\partial x}{\partial \beta} = -x_0, \frac{\partial x}{\partial \theta} = y_0\\ \frac{\partial y}{\partial \alpha} = z_0, \frac{\partial y}{\partial \beta} = 0, \frac{\partial y}{\partial \theta} = z_0\\ \frac{\partial z}{\partial \alpha} = 0, \frac{\partial z}{\partial \beta} = -z_0, \frac{\partial z}{\partial \theta} = 0 ?α?x?=y0?,?β?x?=?x0?,?θ?x?=y0??α?y?=z0?,?β?y?=0,?θ?y?=z0??α?z?=0,?β?z?=?z0?,?θ?z?=0
即
dx=?x?αdα+?x?βdβ+?x?θdθ=y0(dα?dθ)?x0dβdy=?y?αdα+?y?βdβ+?y?θdθ=zo(dθ?dα)dz=?z?αdα+?z?βdβ+?z?θdθ=?z0dβdx = \frac{\partial x}{\partial \alpha}d\alpha+\frac{\partial x}{\partial \beta}d\beta+\frac{\partial x}{\partial \theta}d\theta=y_0(d\alpha-d\theta)-x_0d\beta \\ dy = \frac{\partial y}{\partial \alpha}d\alpha+\frac{\partial y}{\partial \beta}d\beta+\frac{\partial y}{\partial \theta}d\theta=z_o(d\theta-d\alpha) \\ dz = \frac{\partial z}{\partial \alpha}d\alpha+\frac{\partial z}{\partial \beta}d\beta+\frac{\partial z}{\partial \theta}d\theta=-z_0d\beta \\ dx=?α?x?dα+?β?x?dβ+?θ?x?dθ=y0?(dα?dθ)?x0?dβdy=?α?y?dα+?β?y?dβ+?θ?y?dθ=zo?(dθ?dα)dz=?α?z?dα+?β?z?dβ+?θ?z?dθ=?z0?dβ
則可以得到,當z0≠0時,
?z0?dx+y0?dy+x0?dz=0-z_0*dx+y_0*dy+x_0*dz=0 ?z0??dx+y0??dy+x0??dz=0
此時,向量的變化是沿著與旋轉后的向量垂直的平面變化的。
當z0=0時,
dx=y0(dα?dθ)?x0dβ≠0,dy=0,dz=0dx=y_0(d\alpha-d\theta)-x_0d\beta≠0,dy=0,dz=0 dx=y0?(dα?dθ)?x0?dβ?=0,dy=0,dz=0
可以看到對于[1 0 0]
dx=?x0dβ,dy=0,dz=0dx=-x_0d\beta,dy=0,dz=0 dx=?x0?dβ,dy=0,dz=0
? 只能沿x軸方向發生變化,此變化是由β角的轉動產生的**(α和θ產生的是滾轉角,xyz坐標系無法體現出滾轉角的變化)**,而dy和dz的變化始終為0,則可以看出,沿著Y軸與Z軸所在平面的偏轉是不能實現的,這與視頻中的死鎖現象是一致的。
對于[0 0 1]
?dx=0-dx=0 ?dx=0
? 得到x=z0=1,即可以沿著x=1的平面進行任意角度的偏移,只要控制好α、β和θ的旋轉度即可,但實際上,[0 0 1]丟失了滾轉角,只是滾轉角無法從xyz坐標系上表示出來罷了。
? 總而言之,歐拉旋轉由于其固有缺陷總是會出現萬向節死鎖的情況,即丟失某一個特定維度的變化,這個維度可以是純翻滾或者純偏航等,也可以是某個角度的翻滾和某個角度的偏航的特定結合,具體取決于向量的初始狀態,實際上用向量表示歐拉旋轉并不合適,因為向量不存在滾轉角,但向量可以表示出偏航和俯仰兩種變化,故可以輕易通過向量推出俯仰或偏航鎖定的情況。現實中應將向量想象為視頻中的飛機,簡化為帶滾轉角的向量。
總結
以上是生活随笔為你收集整理的从数学角度理解欧拉旋转中的万向节死锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聚美优品店庆nbsp;从天堂到地狱
- 下一篇: 智能楼宇系统详解