基于四元数方向C ++将3d euler角度旋转到坐标系

时间:2014-04-28 23:59:32

标签: c++ 3d rotation euler-angles

我有一个XYZ的坐标系,我用欧拉角旋转,从X开始,然后是Y,然后是Z.我需要将这个旋转转换为它的等效XYZ旋转,但相对于另一个坐标系统,由四元数方向指定。不幸的是,我被困住了。

Coordinate Axes

1 个答案:

答案 0 :(得分:0)

没有简单的方法可以做到这一点,因为欧拉角只是在与旋转矩阵的乘积兼容的无穷小版本中。

在给定条件下最简单的方法是将现有角度转换为旋转的四元数,将两个四元数相乘,并从乘积中提取新的欧拉角。


一个有用的链接,收集许多(如果不是全部)轴旋转到四元数和反向变换:http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/index.htm


用a,b,c表示围绕X,Y,Z轴旋转的半角,用(ca,sa)等表示相应的余弦 - 正弦对。然后围绕X轴以角度2a旋转对应于四元数

ca+sa*i

其中i,j,k是x,y,z方向上的基本四元数。旋转Rz(2c)* Ry(2b)* Rx(2a)对应于四元数

r=(cc+sc*k)*(cb+sb*j)*(ca+sa*i)

如果q是另一个单位四元数,那么对应于q的旋转的旋转基础是qiq',qiq',qkq',其中q'是q的共轭。目的是在这个新的基础上用轴旋转表示r。如果新的半角是u,v,w,则必须解决

r=(cw+sw*qkq')*(cv+sv*qjq')*(cu+su*qiq')

对于这些半角,由于qq'= 1 = q'q到

,这简化了
q'rq=(cw+sw*k)*(cv+sv*j)*(cu+su*i)

现在您可以再次使用网站上的公式。