【问题标题】:Difference between the two quaternions -- Euler Components两个四元数的区别——欧拉分量
【发布时间】:2015-02-01 03:26:46
【问题描述】:

我正在使用 Invensense 9D (Accel+Gyro+Compass) 开发可穿戴设备,该设备使用运行卡尔曼滤波器的嵌入式数字运动处理器计算四元数以进行实时定位。遗憾的是,Invensense 不允许最终用户访问 DMP 代码。

在我们的应用程序中生成的四元数会出现一些偏差。但是我们已经能够通过在短时间内获取欧拉角之间的差异来解决这个问题。但欧拉角显然不太理想,因为它们存在固有问题(万向节锁定等)。

我正在努力计算两个四元数之间的差异——“应该”是Diff = q2 * conj(q1)——然后计算从q1q2 所需的PitchRoll 变化。这就是我的大脑冻结的地方。

感谢任何建议/指针。

更新:

我确实需要向用户显示角度差异(俯仰和滚动),以便他们了解两个方向之间的方向差异。

FS.Roll FS.Pitch

MP.Roll MP.Pitch

如果我计算 FS.Pitch 和 MP.Pitch 以及相应的 FS.Roll 和 MP.Roll 之间的差异——我得到的正是我所追求的。

但我想减少嵌入式 Cortex-M0 MCU 上的逆触发计算——以及避免每次转换的 Gimbal Lock——所以理想情况下我想获得两者之间的四元数“差异”并将其分解为相对的 Pitch 和 Roll 分量。

当我尝试您的建议时,它产生的结果与欧拉数学不同。 我知道从四元数到欧拉角有 number 个不同的旋转序列。我已经尝试了十几个,但没有一个得到与从单个四元数中获取欧拉角的差异相同的答案。

感觉好像我遗漏了一些明显的东西——但我只是没有看到它。

谢谢!

【问题讨论】:

    标签: quaternions euler-angles


    【解决方案1】:

    对于两个四元数方向 pq,将 p 带入 q 框架的四元数是 r = p*q.

    那么当你乘法时: pr,四元数是关联的,所以:

    pr = p ⊗ (p*q) = (pp*) ⊗ q = q.

    要获得 r 的欧拉角,您应该使用库。如果有帮助,这是我的 Python 代码:

    def quat2eulerXYZ(q):
      r = atan2(2*q[0][0]*q[1][0] - 2*q[2][0]*q[3][0], q[0][0]**2 - q[1][0]**2 - q[2][0]**2 + q[3][0]**2)
      p = asin(2*q[0][0]*q[2][0] + 2*q[1][0]*q[3][0])
      y = atan2(2*q[0][0]*q[3][0] - 2*q[1][0]*q[2][0], q[0][0]**2 + q[1][0]**2 - q[2][0]**2 - q[3][0]**2)
      return (r, p, y)
    

    如果您的AHRS 系统出现漂移,则可能是磁力计受到干扰,可以通过校准软/硬铁干扰来解决。如果您的 AHRS 系统靠近或固定在任何黑色金属上,请尝试不使用它们。如果你在户外尝试这个,没有黑色金属,如果它不起作用,我会感到惊讶。

    一旦有了四元数,就不需要转换为欧拉角,除非它是为了显示目的。如果你详细说明你在用欧拉角做什么,我可能会提供更多帮助。

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 2012-06-21
      • 2019-10-27
      • 1970-01-01
      • 2013-06-22
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      相关资源
      最近更新 更多