【问题标题】:Rotate 3d euler angles to a coordinate system based on Quaternion orientation C++将 3d 欧拉角旋转到基于四元数方向 C++ 的坐标系
【发布时间】:2014-06-14 17:10:15
【问题描述】:

我有一个 XYZ 坐标系,我按欧拉角旋转,从 X 开始,然后是 Y,然后是 Z。我需要将此旋转转换为等效的 XYZ 旋转,但相对于另一个坐标系,如指定通过四元数方向。不幸的是,我被卡住了。

【问题讨论】:

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


    【解决方案1】:

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

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


    一个有用的链接,收集了许多(如果不是全部)轴旋转到四元数和反向变换: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)
    

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

    【讨论】:

    • 嘿,是的,这对我很有挑战,我已经卡了一段时间了。不幸的是,该链接似乎没有帮助,似乎缺少后半部分?那是欧拉到四元数,但是你如何从产生的乘法四元数到欧拉 X 然后 Y 然后 Z 相对于四元数方向的角度?
    • 也许顶部的图表太混乱了:euclideanspace.com/maths/geometry/rotations/conversions/…。另请查看右侧的相关主题。
    • 或使用search facility
    • 我不相信纯四元数到欧拉会起作用吗?因为我的欧拉需要在原始四元数周围是相对的。似乎需要与普通公式不同。
    • 添加了关于如何避免使用旋转矩阵的评论。
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    相关资源
    最近更新 更多