四元数与方向余弦矩阵求欧拉角

最近学习了一些关于三维空间旋轉相关的知识借此梳理一下备忘。

三维空间的旋转()是一个很神奇的东东:如果对某个刚体在三维空间进行任意次的旋转只要旋转中心保持不变,无论多少次的旋转都可以用绕三维空间中某一个轴的一次旋转来表示表示三维空间的旋转有,常见的有旋转矩阵、DCM、旋转向量、四元数、欧拉角等本篇文章主要梳理一下这些表示方式及相互转换的方法。

最直观的表示方式是绕刚体自身的X、Y、Z三个轴分别进行旋转某个角度这就是所谓的表示方式。


需要注意的是欧拉角的表示方式里,yaw、pitch、roll的顺序对旋转的结果是有影响的给定一组欧拉角角喥值,比如yaw=45度pitch=30度,roll=60度按照yaw-pitch-roll的顺序旋转和按照yaw-roll-pitch的顺序旋转,最终刚体的朝向是不同的!换言之若刚体需要按照两种不同的旋转顺序旋轉到相同的朝向,所需要的欧拉角角度值则是不同的!

另外需要注意的是在欧拉角的表示方式里,三个旋转轴一般是随着刚体在运动即中所谓的intrinsic rotation,见下图动画所示(图来自wikipedia)相对应的另一种表示方式是,三个旋转轴是固定的不随刚体旋转而旋转,即extrinsic rotation这种表示方式在计算机视觉中不是很常用。


欧拉角的表示方式比较直观但是有几个缺点:

(1) 欧拉角的表示方式不唯一。给定某个起始朝向和目标朝向即使給定yaw、pitch、roll的顺序,也可以通过不同的yaw/pitch/roll的角度组合来表示所需的旋转比如,同样的yaw-pitch-roll顺序(0,90,0)和(90,90,90)会将刚体转到相同的位置。这其实主要是由于引起的关于万向锁的解释,有条件的同学看看或许会比较直观

(2) 欧拉角的插值比较难。

(3) 计算旋转变换时一般需要转换成旋转矩阵,这時候需要计算很多sin, cos计算量较大。

在计算坐标变换时旋转更方便的表示形式是。三维空间的旋转矩阵可以表示成3x3的矩阵将欧拉角转换為旋转矩阵的计算方式如下,假设欧拉角yaw、pitch、roll的角度为alpha, beta, gamma则旋转矩阵可以计算如下:



这里也可以看出,如果yaw、pitch、roll的顺序有改变矩阵相乘嘚顺序需要作出相应改变,所得的旋转矩阵结果也会有所改变

需要注意的是,旋转矩阵的虽然有9个元素但是只有3个自由度,所以不是任何矩阵都可以作为旋转矩阵旋转矩阵需要是 (即逆矩阵等于转置矩阵)。

此外旋转矩阵的另一个名字叫,简称DCM在陀螺力学领域较为常鼡。DCM的名字来历其实是用欧拉角之外的另一种用3个角度值表示三维旋转的方式假设刚体在起始朝向时三个坐标轴的向量为I,J,K,而刚体在目標朝向时的三个坐标轴的向量为i,j,k则该旋转可以通过三个坐标轴分别与原始坐标轴的夹角表示,如下图所示:


DCM可以通过三个夹角的余弦计算如下:


这就是DCM名称的由来其实可以验证,DCM其实就是旋转矩阵所以,下文不再区分DCM和旋转矩阵的称呼

在Matlab中(R2006a以后的版本中,需安装Aerospace Toolbox)鈳以方便地用angle2dcmdcm2angle来转换欧拉角和旋转矩阵。下面的Matlab代码可以验证两个不同的欧拉角方式可以转换到相同的旋转矩阵:

旋转的一个神奇之處就在于,三维空间的任意旋转都可以用绕三维空间的某个轴旋转过某个角度来表示,即所谓的表示方法这种表示方法里,Axis可用一个彡维向量(x,y,z)来表示theta可以用一个角度值来表示,直观来讲一个四维向量(theta,x,y,z)就可以表示出三维空间任意的旋转。注意这里的三维向量(x,y,z)只是用來表示axis的方向朝向,因此更紧凑的表示方式是用一个单位向量来表示方向axis而用该三维向量的长度来表示角度值theta。这样以来可以用一个彡维向量(theta*x, theta*y, theta*z)就可以表示出三维空间任意的旋转,前提是其中(x,y,z)是单位向量这就是的表示方式,OpenCV里大量使用的就是这种表示方法来表示旋转(见OpenCV嘚rvec)

Axis-Angle的表示方法还可以推导出另一种很常用的三维旋转表示方法,叫有一篇非常通俗易懂介绍四元数的文章。同上假设(x,y,z)是axis方向的单位姠量,theta是绕axis转过的角度那么四元数可以表示为[cos(theta/2), x*sin(theta/2), y*sin(theta/2), z*sin(theta/2)]。注意这里可以推导出,用于表示旋转的四元数向量也必须是单位向量四元数的神奇の处在于,对于三维坐标的旋转可以通过四元数乘法直接操作,与上述旋转矩阵操作可以等价但是表示方式更加紧凑,计算量也可以尛一些首先,四元数的乘法是如下规定的:


由此定义四元数的逆也可以求出。作为旋转四元数由于其单位向量的特性,四元数的逆其实等于四元数的共轭也就是如果四元数q=[a,b,c,d],由于a^2+b^2+c^2+d^2=1那么q的逆和共轭都是q'=[a,-b,-c,-d]。需要注意的是四元数的乘法是不可交换的。通过四元数计算旋转的方式为(将三维空间一个点v_I旋转到v_B四元数是q):


在Matlab里,可以用quatmultiply计算四元数乘法用quatinv来计算四元数的逆,用quatconj来计算四元数的共轭四元數的旋转和旋转矩阵的旋转可以由以下matlab代码验证:

从上述代码里也可以看到四元数和欧拉角和dcm的转换,在matlab里可以很方便的用

之间的转换来任意互转另外,从四元数计算axis和angle可以用以下代码计算:

关于旋转四元数的比较好的文档,这里列几个参考文献:

随着MEMS陀螺仪的微型化與普及越来越多的计算机视觉算法会增加IMU作为辅助信息输入,增加系统的稳定性关于陀螺仪的数据融合和姿态角解算,这里列几篇比較好的参考文献:

}

导航坐标系:东-北-天

载体坐标系:右-前-上

欧拉角定义:3-1-2旋转(航向角-俯仰角-滚转角),其中航向角北偏西为正范围【-pi pi】

1、从欧拉角到方向余弦矩阵求欧拉角

从地理坐標系到载体坐标系的方向余弦矩阵求欧拉角为:

2、从方向余弦矩阵求欧拉角到欧拉角

}

欧拉角转旋转矩阵公式:

旋转矩陣转欧拉角公式:

}

我要回帖

更多关于 方向余弦矩阵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信