另一種描述方位的常用方法是歐拉角,這項技術以著名的數學家Leonhard Euler(1707 -
1783)的名字命名,他證明了角位移序列等價于單個角位移。
什么是歐拉角
歐拉角的基本思想是將角位移分解為繞三個互相垂直軸的三個旋轉組成的序列。這聽起來很復雜,其實它是非常直觀的(事實上,易于使用正是它的主要優點之一)。之所以有"角位移"的說法正是因為歐拉角能用來描述任意旋轉。
歐拉角將方位分解為繞三個互相垂直軸的旋轉,那么是哪三個軸?按什么順序?其實,任意三個軸和任意順序都可以,但最有意義的是使用笛卡爾坐標系并按一定順序所組成的旋轉序列。最常用的約定是所謂的"heading
- pitch - bank"約定。在這個系統中,一個方位被定義為一個heading角,一個pitch角,一個bank角。它的基本思想是讓物體開始于"標準"方位
--- 就是物體坐標軸和慣性坐標軸對齊。在標準方位上,讓物體作heading、pitch、bank旋轉,最后物體到達我們想要描述的方位。
如圖10.4所示,此時物體坐標系和慣性坐標系重合,heading為繞y軸的旋轉量,向右旋轉為正(如果從上面看,旋轉正方向就是順時針方向)。

經過heading旋轉后,pitch為繞x軸的旋轉量,注意是物體坐標系的x軸,不是原慣性坐標系的x軸。依然遵守左手法則,向下旋轉為正,如圖10.5所示:

最后,經過了heading和pitch,bank為繞z軸的旋轉量。再次提醒,是物體坐標系的z軸,不是原慣性坐標系的z軸。依據左手法則,從原點向+z看,逆時針方向為正。如圖10.6所示:

記住,當我們說旋轉的順序是heading-pitch-bank時,是指從慣性坐標系到物體坐標系。如果從物體坐標系變換到慣性坐標系,旋轉的順序就是相反的。"heading-pitch-bank"也叫作"roll-pitch-yaw",roll類似于bank,yaw類似于heading(事實上,yaw并不嚴格等于heading)。注意,在roll-pitch-yaw系統中,角度的命名順序與從物體坐標系到慣性坐標系的旋轉順序一致的。
關于歐拉角的其他約定
heading-pitch-bank系統不是唯一的歐拉角系統。繞任意三個互相垂直軸的任意旋轉都能定義一個方位,所以多種選擇導致了歐拉角約定的多樣性:
(1)heading-pitch-bank系統有多個名稱。當然,不同的名字并不代表不同的約定,這其實并不重要。一組常用的術語是roll-pitch-yaw,其中的roll等價于bank,yaw基本上等價于heading。注意,它的順序和heading-pitch-bank的順序相反,這只是語義上的。它定義了向量從物體坐標系變換到慣性坐標系的旋轉順序。(事實上,yaw和heading還是有技術上的差別,yaw是繞物體坐標系y軸的旋轉,heading是繞慣性坐標系y軸的旋轉。因為這里的旋轉是在物體坐標系y軸和慣性坐標系y軸重合時進行的,所以這個區別并不重要。)
(2)任意三個軸都能作為旋轉軸,不一定必須是笛卡爾軸,但使用笛卡爾軸最有意義。
(3)決定每個旋轉的正方向時不一定必須遵守左手或右手法則。例如,完全可以定義pitch的正方向是向上的,并且這種定義方法非常常見。
(4)也是最重要的,旋轉可以以不同的順序進行。順序并不重要,任何系統都能用來定義一個方位,但heading-pitch-bank順序最為實用。heading度量繞豎直軸的旋轉,它之所以有意義主要是因為我們所在的環境經常有某種形式的"地面"。一般來講繞慣性坐標系的x或z軸的旋轉沒有什么意義。heading-pitch-bank順序下的另外兩個角的意義是:pitch度量水平方向的傾角,bank度量的是繞z軸的旋轉量。
歐拉角的優點
歐拉角僅使用三個數來表達方位,并且這三個數都是角度。這兩個特點使歐拉角具有其他形式所沒有的優點:
(1)歐拉角對我們來說很容易使用。它比矩陣和四元數簡單得多,這可能是因為歐拉角中的數都是角度,符合人們思考方位的方式。如果我們選擇了與所要處理的情況最符合的約定,那么就能直接描述出最重要的角度,例如,用heading-pitch-bank系統就能直接地描述出偏差角度。便于使用是其最大的優點,當需要顯示方位或用鍵盤輸入方位時,歐拉角是唯一的選擇。
(2)最簡潔的表達方式。歐拉角用三個數來表達方位。在3D中,表達方位不能少于三個數,如果要考慮內存的因素,歐拉角是最合適的描述方位的方法。
(3)任意三個數都是合法的。取任意三個數,它們都能構成合法的歐拉角,而且可以把它看成一個對方位的描述。從另一方面說,沒有"不合法"的歐拉角。當然數值可能不對,但至少它們是合法的。可矩陣和四元數就不一定是這樣了。
歐拉角的缺點
用歐拉角表達方位時的缺點主要有:
(1)給定方位的表達方式不唯一。
(2)兩個角度間求插值非常困難。
讓我們仔細討論這些問題。第一個問題是對于一個給定方位,存在多個歐拉角可以描述它。這稱作別名問題,有時候會引起麻煩。因為這個原因,連一些基本的問題(如"兩組歐拉角代表的角位移相同嗎?")都很難回答。
第一種,在將一個角度加上360度的倍數時,我們就會遇到形式最簡單的別名問題。顯然,加上360度并不會改變方位,盡管它的數值改變了。
第二種,更加麻煩的別名問題是由三個角度不互相獨立而導致的。例如,pitch135度等價于heading180度,pitch45度,然后bank180度。為了保證任意方位都只有獨一無二的表示,必須限制角度的范圍。一種常用的技術是將heading和bank限制在+180度到-180度之間,pitch限制在+90度到-90度之間。這就建立了歐拉角的一個"限制范圍"。對于任意方位,僅存在一個限制歐拉角能代表這個方位(事實上,還有一個違反唯一性的現象需要處理。)
歐拉角最著名的別名問題是這樣的:先heading45度再pitch90度,這與先pitch90度再bank45度是等價的。事實上,一旦選擇+(-)90度為pitch角,就被限制在只能繞豎直軸旋轉。這種現象,角度為+(-)90度的第二次旋轉使得第一次和第三次旋轉的旋轉軸相同,稱作萬向鎖。為了消除限制歐拉角的這種別名現象,規定萬向鎖情況下由heading完成繞豎直軸的全部旋轉。換句話說,在限制歐拉角中,如果pitch為+(-)90度,則bank為0。
如果是為了描述方位,特別是在使用了限制歐拉角的情況下,別名是不會造成太大的問題的。現在來看兩個方位A和B間求插值的問題,也就是說,給定參數t,0
≤ t ≤ 1,計算臨時方位C,當t從0變化到1時,C也平滑地從A變化到B。
這個問題的簡單解法是分別對三個角度作標準線性插值,公式如下:

但這里面有很多問題。
第一,如果沒有使用限制歐拉角,將得到很大的角度差。例如,方位A的heading為720度,方位B的heading為45度,720
= 360 x 2,也就是0度。所以heading值只相差45度,但簡單的插值會在錯誤的方向上繞將近兩周。如圖10.7所示:

解決問題的方法是使用限制歐拉角,然而,即使是限制歐拉角也不能完全解決問題。插值的第二個問題是由旋轉角度的周期性引起的。設A的heading為-170度,B的heading為170度。這些值在heading的限制范圍內,都在-180度到180度之間。這兩個值只相差20度,但插值操作又一次發生了錯誤,旋轉是沿 "長弧"繞了340度而不是更短的20度,如圖10.8所示:

解決這類問題的方法是將插值的"差"角度折到-180度到180度之間,以找到最短弧。

即使使用了這兩個角度限制,歐拉角插值仍然可能碰到萬向鎖的問題,它在大多數情況下會產生抖動、路徑錯誤等現象,物體會突然飄起來像是"掛"在某個地方。根本問題是插值過程中角速度不是恒定的。
歐拉角插值的前兩個問題雖然煩人,但并不是不可克服的。限制歐拉角和將角度差限制在一定范圍內提供了簡單的解決方法。而對于萬向鎖,非常不幸,它非常令人討厭,是一個底層的問題。你可能會考慮重新規劃旋轉,發明一種不會遭遇這些問題的系統。不幸的是,這不可能。這是一個用3個數表達3D方位的方法與生俱來的問題。我們可以改變問題,但不能消滅它們。任何使用三個數來表達3D方位的系統,若能保證空間的唯一性,就都會遇到這些問題,如萬向鎖。