描述坐标系{B}相对于参考坐标系{A}的姿态有两种方式。第一种是绕固定(参考)坐标轴旋转:假设开始两个坐标系重合,先将{B}绕{A}的X轴旋转γγ,而后绕{A}的Y轴旋转ββ,最后绕{A}的Z轴旋转αα,就能旋转到当前姿态。能够称其为X-Y-Z fixed angles或RPY角(Roll, Pitch, Yaw)。html
Roll:横滚windows
Pitch: 俯仰ide
Yaw: 偏航(航向)函数
因为是绕固定坐标系旋转,则旋转矩阵为(cαcα is shorthand for cosαcosα, sαsα is shorthand for sinαsinα,and so on.)ui
另外一种姿态描述方式是绕自身坐标轴旋转:假设开始两个坐标系重合,先将{B}绕自身的Z轴旋转αα,而后绕Y轴旋转ββ,最后绕X轴旋转γγ,就能旋转到当前姿态。称其为Z-Y-X欧拉角,因为是绕自身坐标轴进行旋转,则旋转矩阵为:atom
能够发现这两种描述方式获得的旋转矩阵是同样的,即绕固定坐标轴X-Y-Z旋转(γ,β,α)(γ,β,α)和绕自身坐标轴Z-Y-X旋转(α,β,γ)(α,β,γ)的最终结果同样,只是描述的方法有差异而已。In gerenal: three rotations taken about fixed axes yield the same final orientation as the same three rotations taken in opposite order about the axes of the moving frame.url
绕坐标轴的屡次旋转能够等效为绕某一转轴旋转必定的角度。假设等效旋转轴方向向量为K⃗=[kx,ky,kz]TK→=[kx,ky,kz]T,等效旋转角为θθ,则四元数q=(x,y,z,w)q=(x,y,z,w),其中:idea
且有x2+y2+z2+w2=1x2+y2+z2+w2=1spa
即四元数存储了旋转轴和旋转角的信息,它能方便的描述刚体绕任意轴的旋转。3d
四元数转换为旋转矩阵:
已知旋转矩阵为:
则对应的四元数为:
定义两个四元数:
四元数加法:
四元数乘法:
四元数的乘法的意义相似于矩阵的乘法,能够表示旋转的合成。当有屡次旋转操做时,使用四元数能够得到更高的计算效率。
计算结果为:Quaternion[-12, 4, 14, 2]
θ = ATan(y / x)求出的θ取值范围是[-PI/2, PI/2];
θ = ATan2(y, x)求出的θ取值范围是[-PI, PI]。
当 (x, y) 在第一象限, 0 < θ < PI/2
当 (x, y) 在第二象限 PI/2 < θ≤PI
当 (x, y) 在第三象限, -PI < θ < -PI/2
当 (x, y) 在第四象限, -PI/2 < θ < 0
上面的代码存在一个问题,即奇异性没有考虑。下面看一种特殊的状况(参考Maths - Conversion Quaternion to Euler):假设一架飞机绕Y轴旋转了90°(俯仰角pitch=90),机头垂直向上,此时如何计算航向角和横滚角?
这时会发生自由度丢失的状况,即Yaw和Roll会变为一个自由度。此时再使用上面的公式根据四元数计算欧拉角会出现问题:
arcsin(2(q0q2−q1q3))arcsin(2(q0q2−q1q3))的定义域为[−1,1][−1,1],所以(q0q2−q1q3)∈[−0.5,0.5](q0q2−q1q3)∈[−0.5,0.5],当q0q2−q1q3=0.5q0q2−q1q3=0.5时(在程序中浮点数不能直接进行等于判断,要使用合理的阈值),俯仰角ββ为90°,将其带入正向公式计算出四元数(q0,q1,q2,q3)(q0,q1,q2,q3),而后能够发现逆向公式中atan2函数中的参数所有为0,即出现了0000的状况!没法计算。
β=π/2β=π/2时,sinβ2=cosβ2=0.707sinβ2=cosβ2=0.707,将其带入公式中有
则xw=zy=tanα−γ2xw=zy=tanα−γ2,因而有
一般令α=0α=0,这时γ=−2⋅atan2(x,w)γ=−2⋅atan2(x,w)。能够进行验证:当四元数为(w,x,y,z)=(0.653,-0.271,0.653,0.271)时,根据这些规则计算出来的ZYX欧拉角为α=0°,β=90°,γ=45°
当俯仰角为-90°,即机头竖直向下时的状况也与之相似,能够推导出奇异姿态时的计算公式。比较完整的四元数转欧拉角(Z-Y-X order)的代码以下:
在DirectXMath Library中有许多与刚体姿态变换相关的函数能够直接调用:
下面的代码中坐标系绕X轴旋转90°(注意这里不是按照右手定则的方向,而是沿着坐标轴向原点看过去以顺时针方式旋转,所以与传统的右手定则恰好方向相反),来进行变换:
结果以下图所示:
参考:
DirectXMath Library Quaternion Functions
Convert quaternion to euler rotations
Conversion between quaternions and Euler angles
Maths - Conversion Quaternion to Euler
Coordinate Transformations in Robotics—MATLAB
Introduction to Robotics - Mechanics and Control. Chapter 2 Spatial descriptions and transformations