我正在使用Invensense 9D(Accel + Gyro + Compass)开发可穿戴设备,该设备使用运行卡尔曼滤波器的嵌入式数字运动处理器计算实时定位的四元数。可悲的是 - DMP代码不是Invensense允许最终用户访问的东西。
我们应用程序中产生的四元数受到一些漂移的影响。但是我们能够通过在短时间范围内消除欧拉角度之间的差异来解决这个问题。但是欧拉角显然不太理想,因为它们存在固有的问题(万向节锁定等)。
我努力的地方是计算两个四元数之间的差异 - 这应该是'是Diff = q2 * conj(q1)
- 然后计算从Pitch
到Roll
所需的q1
和q2
更改。这就是我大脑冻结的地方。
感谢任何建议/指示。
更新:
我确实需要向用户显示角度差异 - 包括俯仰和滚动 - 以便他们能够理解两个方向之间的方向差异。
FS.Roll<< - atan2((2.0 *(FS.Quat.Q0 * FS.Quat.Q1 + FS.Quat.Q2 * FS.Quat.Q3)),(1.0 - 2.0 *(FS .Quat.Q1 ^ 2 + FS.Quat.Q2 ^ 2)))* M_PI;
FS.Pitch<< - asin((2.0 *(FS.Quat.Q0 * FS.Quat.Q2-FS.Quat.Q3 * FS.Quat.Q1)))* M_PI;
MP.Roll<< - atan2((2.0 *(MP.Quat.Q0 * MP.Quat.Q1 + MP.Quat.Q2 * MP.Quat.Q3)),(1.0 - 2.0 *(MP .Quat.Q1 ^ 2 + MP.Quat.Q2 ^ 2)))* M_PI;
MP.Pitch<< - asin((2.0 *(MP.Quat.Q0 * MP.Quat.Q2-MP.Quat.Q3 * MP.Quat.Q1)))* M_PI;
如果我采用FS.Pitch和MP.Pitch之间的差异以及相应的FS.Roll和MP.Roll - 我完全得到了我之后的信息。
但是我想减少嵌入式Cortex-M0 MCU上的反向触发计算 - 以及避免每次转换的万向节锁定 - 所以理想情况下我想要获得Quaternion&# 39;差分'在两者之间并将其分解为相对的Pitch and Roll组件。
当我尝试你的建议时 - 它会产生与欧拉数学不同的结果。 据我所知,从四元数到欧拉角有不同旋转序列的数。我已经尝试了十几个,没有一个产生与从单个四元数中取出欧拉角度差异相同的答案。
感觉我错过了一些明显的东西 - 但我只是没有看到它。
谢谢!
答案 0 :(得分:0)
对于两个四元数方向 p 和 q ,将 p 带入 q 框架的四元数为< strong> r = p * ⊗ q 。
然后当你乘以: p ⊗ r ,四元数是关联的,所以:
p ⊗ r = p ⊗( p * ⊗ q ) =( p ⊗ p * )⊗ 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系统非常接近或固定在任何黑色金属上,请在没有它们的情况下进行尝试。如果你在户外试试,清除黑色金属,如果它不起作用我会感到惊讶。
一旦有了四元数,就不需要转换为欧拉角,除非是出于显示目的。如果你详细说明你正在用欧拉角做什么,我可能会提供更多帮助。