1. 程式人生 > >剛體在三維空間的旋轉-幾種表達方式

剛體在三維空間的旋轉-幾種表達方式

三維空間的旋轉(3D Rotation)是一個很神奇的東東:如果對某個剛體在三維空間進行任意次的旋轉,只要旋轉中心保持不變,無論多少次的旋轉都可以用繞三維空間中某一個軸的一次旋轉來表示。表示三維空間的旋轉有多種互相等價的方式,常見的有尤拉角、旋轉矩陣(DCM-方向餘弦陣)、旋轉向量、四元數等。本篇文章主要梳理一下這些表示方式及相互轉換的方法。

1. 尤拉角(Euler Angle)

最直觀的表示方式是繞剛體自身的X、Y、Z三個軸分別進行旋轉某個角度,這就是所謂的尤拉角(Euler Angle)表示方式 

需要注意的是,尤拉角的表示方式裡,yaw、pitch、roll的順序對旋轉的結果是有影響的。給定一組尤拉角角度值,比如yaw=45度,pitch=30度,roll=60度,按照yaw-pitch-roll的順序旋轉和按照yaw-roll-pitch的順序旋轉,最終剛體的朝向是不同的

!換言之,若剛體需要按照兩種不同的旋轉順序旋轉到相同的朝向,所需要的尤拉角角度值則是不同的!

                                                               

尤拉角的表示方式比較直觀,但是有幾個缺點:

(1) 尤拉角的表示方式不唯一。給定某個起始朝向和目標朝向,即使給定yaw、pitch、roll的順序,也可以通過不同的yaw/pitch/roll的角度組合來表示所需的旋轉。比如,同樣的yaw-pitch-roll順序,(0,90,0)和(90,90,90)會將剛體轉到相同的位置。這其實主要是由於萬向鎖(Gimbal Lock)引起的,關於萬向鎖的解釋,有條件的同學看看Youtube的視訊或許會比較直觀。

(2) 計算旋轉變換時,一般需要轉換成旋轉矩陣,這時候需要計算很多sin, cos,計算量較大。

2. 旋轉矩陣(Rotation Matrix)和方向餘弦矩陣(Direction Cosine Matrix) 

在計算座標變換時,旋轉更方便的表示形式是旋轉矩陣(Rotation Matrix)。三維空間的旋轉矩陣可以表示成3x3的矩陣,將尤拉角轉換為旋轉矩陣的計算方式如下,假設尤拉角yaw、pitch、roll的角度為alpha, beta, gamma,則旋轉矩陣可以計算如下:

                           

                  

這裡也可以看出,如果yaw、pitch、roll的順序有改變,矩陣相乘的順序需要作出相應改變,所得的旋轉矩陣結果也會有所改變。 需要注意的是,旋轉矩陣的雖然有9個元素,但是隻有3個自由度,所以不是任何矩陣都可以作為旋轉矩陣,旋轉矩陣需要是正交矩陣 (即逆矩陣等於轉置矩陣)。

此外,旋轉矩陣的另一個名字叫方向餘弦矩陣(Direction Cosine Matrix),簡稱DCM,在陀螺力學領域較為常用。DCM的名字來歷其實是用尤拉角之外的另一種用3個角度值表示三維旋轉的方式,假設剛體在起始朝向時三個座標軸的向量為I,J,K,而剛體在目標朝向時的三個座標軸的向量為i,j,k,則該旋轉可以通過三個座標軸分別與原始座標軸的夾角表示,如下圖所示: 

                                                               

DCM可以通過三個夾角的餘弦計算如下:

                             

這就是DCM名稱的由來。其實可以驗證,DCM其實就是旋轉矩陣,所以,下文不再區分DCM和旋轉矩陣的稱呼 。

在Matlab中(R2006a以後的版本中,需安裝Aerospace Toolbox),可以方便地用angle2dcm和dcm2angle來轉換尤拉角和旋轉矩陣。下面的Matlab程式碼可以驗證,兩個不同的尤拉角方式可以轉換到相同的旋轉矩陣:

                                            

3. 旋轉向量(Rotation Vector)

旋轉的一個神奇之處就在於,三維空間的任意旋轉,都可以用繞三維空間的某個軸旋轉過某個角度來表示,即所謂的Axis-Angle表示方法。這種表示方法裡,Axis可用一個三維向量(x,y,z)來表示,theta可以用一個角度值來表示,直觀來講,一個四維向量(theta,x,y,z)就可以表示出三維空間任意的旋轉。注意,這裡的三維向量(x,y,z)只是用來表示axis的方向朝向,因此更緊湊的表示方式是用一個單位向量來表示方向axis,而用該三維向量的長度來表示角度值theta。這樣以來,可以用一個三維向量(theta*x, theta*y, theta*z)就可以表示出三維空間任意的旋轉,前提是其中(x,y,z)是單位向量。這就是旋轉向量(Rotation Vector)的表示方式,OpenCV裡大量使用的就是這種表示方法來表示旋轉(見OpenCV相機標定部分的rvec)。

4. 四元數

另一種很常用的三維旋轉表示方法,叫四元數(Quaternion),它也屬於axis-angle表示法這部分內容暫時不再介紹。

摘自: