三維坐標的旋轉有以下幾種常見的表示形式:旋轉向量,旋轉矩陣,歐拉角,四元數,下面對這四種表示形式及其之間的轉換進行介紹
旋轉向量
通常為3x1的列向量,向量方向即為旋轉軸,向量的模表示繞軸逆時針旋轉的角度,如旋轉向量v=[a,b,c],那么旋轉角度theta=sqrt(a2+b2+c2),旋轉軸z=[a/theta, b/theta, c/theta]
旋轉矩陣
旋轉矩陣用3x3的矩陣表示,旋轉矩陣是正交矩陣,且行列式是單位1
det(R)=1
旋轉向量與旋轉矩陣可以通過羅德里格斯(Rodrigues)變換進行轉換。opencv實現Rodrigues變換的函數是:
int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 );
生成旋轉矩陣的一種簡單方式是把它作為三個基本旋轉的序列復合,如下面要介紹的歐拉角的復合。
歐拉角
歐拉角度的基本思想是將旋轉分解為繞三個互相垂直軸的三個旋轉組成的序列。使用歐拉角,就要指明坐標系系統以及旋轉順序。最常用的約定,即所謂“roll-pitch-yaw”系統。偏航角——Yaw,俯仰角——Pitch,翻滾角——Rool
下面討論歐拉角與旋轉矩陣之間的轉換,繞x,y,或z軸旋轉θ的矩陣為:
要計算最終的旋轉,只需按一定的順序將Rx(θ),Ry(θ),Rz(θ)做矩陣乘法,所以順序不同,最終的旋轉矩陣結果也不同。如果規定了坐標系以及旋轉順序,那么旋轉矩陣是惟一的。
歐拉角表示的旋轉會造成萬向節鎖(Gimbal Lock)的現象。所謂萬向節鎖簡單的說是指(經過繞某個軸的旋轉后)物體的兩個旋轉軸指向同一個方向,從而失去一維自由度,接下來無論如何也旋轉不出某種狀態。由於萬向節鎖的存在,歐拉旋轉無法實現球面平滑插值。
四元數
一個四元數可以表示為q = w + xi + yj + zk,i、j、k是一種特殊的虛數單位(類比虛數表示中的i,j),並有以下運算規則:i0=j0=k0=1,i2=j2=k2=-1, |q|2=w2+x2+y2+z2=1,四元數的其他性質不在一一敘述。
四元數指明了旋轉的角度和旋轉軸,如旋轉軸的方向余弦為(cosβx,cosβy,cosβz),旋轉角為α,則對應的四元數q=[q0,q1,q2,q3],其中
四元數與旋轉矩陣之間的轉換關系(注意利用模為1的性質有一下兩種表示方法)
或
,
旋轉矩陣轉換為四元數:
mij表示旋轉矩陣中第i行k列的元素
四元數轉換為歐拉角:
首先定義
Roll – : rotation about the X-axis
Pitch – : rotation about the Y-axis
Yaw – : rotation about the Z-axis
則對應的轉換為
如果已知歐拉角求四元數,可以先將歐拉角轉化為旋轉矩陣,再由旋轉矩陣求四元數
原創文章,轉載請注明出處