剛體在三維空間的旋轉-幾種表達方式
三維空間的旋轉(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的視訊或許會比較直觀。
萬向鎖問題可參考:
https://blog.csdn.net/qq_23270939/article/details/78600069
(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表示法這部分內容暫時不再介紹。
參考資料:
相關文章
- 三維空間的旋轉
- 三維空間中物體兩次旋轉之間的連續旋轉矩陣計算矩陣
- 三維空間座標系變換-旋轉矩陣矩陣
- 【CV】三維空間的旋轉問題(Rotation in 3D space)3D
- 沉浸式空間場景的使用有哪幾種方式?
- 《Cris Tales》的奧祕:巧妙的時空維度表達方式
- 三維座標系旋轉——旋轉矩陣到旋轉角之間的換算矩陣
- 空間旋轉矩陣怎麼表示矩陣
- offline tablespace 的幾種方式 (轉)
- 程式間的幾種通訊方式
- 三維空間變換中旋轉矩陣左乘與右乘的區別矩陣
- Pbootcms將日期時間轉換成"剛剛、幾分鐘、幾小時前"的形式boot
- Java虛擬機器的記憶體空間有幾種Java虛擬機記憶體
- Java虛擬機器的記憶體空間有幾種!Java虛擬機記憶體
- 達夢(DM)資料庫的表空間建立和遷移維護資料庫
- 表空間OFFLINE的3種選項。
- C#委託的幾種表現方式C#
- 大角度非迭代的空間座標旋轉C#實現C#
- 16、表空間 建立表空間
- 幾種常見的Vue元件間的傳參方式Vue元件
- Dostoevsky: 一種更好的平衡 LSM 空間和效能的方式
- 多維陣列轉一維陣列(降維的多種方式)陣列
- 【XTTS】Oracle傳輸表空間xtts增量方式TTSOracle
- 單像空間後方交會計算旋轉矩陣矩陣
- [轉帖]達夢資料庫-統計資料表資料量及空間表大小資料庫
- 表空間利用率及表空間的補充
- c# 多執行緒的幾種方式 【轉載】C#執行緒
- Flutter工具:Dart中幾種常用的Json轉Object方式FlutterDartJSONObject
- 淺談mysql中各種表空間(tablespaces)的概念MySql
- 聊聊Oracle表空間Offline的三種引數(上)Oracle
- 聊聊Oracle表空間Offline的三種引數(中)Oracle
- 聊聊Oracle表空間Offline的三種引數(下)Oracle
- KingbaseES的表空間
- 達夢資料庫表空間等空間大小查詢方法總結資料庫
- win8 C盤空間不足的幾種解決方法
- Unity反射的幾種方式Unity反射
- css引入的幾種方式CSS
- 時間有幾種格式、相互之間如何轉換?