WP8 Motion API 也有类似的问题。延迟不是唯一的问题。似乎 Motion API 对各种罗盘(或磁力计)误差也非常敏感。更糟糕的是,这些不仅仅影响偏航。运动类 AHRS 算法似乎将俯仰和滚动与偏航耦合。结果,当指南针延迟或以其他方式变得疯狂时,俯仰和滚动也是如此。
我怀疑你可以不用陀螺仪。理论上,您只能从加速度计获得欧拉角(偏航角、俯仰角和滚动角),但前提是手机静止不动。最轻微的运动会导致线性/向心加速度,这会破坏您的方向计算。我想说,任何用手机等手持设备来做到这一点的尝试都注定要失败。此外,Motion API 本身除了加速度计之外还需要指南针和陀螺仪硬件。
无论如何,一切都不会丢失。我一起摆脱了 Motion 类,并按照 Sebastian Madgwick 的 IMU 算法实现了“我自己的”IMU。此处带有 C 代码的 IMU / AHRS 报告:
http://www.x-io.co.uk/res/doc/madgwick_internal_report.pdf
C源代码可以在这里找到:
http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/
有了适当的 beta 增益,Madgwick 的 IMU 就像在 Windows Phone 上的魅力一样。IMU 不提供偏航,只提供俯仰和滚动。它只使用陀螺仪和加速度计硬件。如果您也需要偏航,您可以实现上述两个来源中包含的完整 AHRS 算法。那当然也需要指南针。
Madgwick 算法不包括欧拉角计算(只是描述地球和传感器框架之间旋转的四元数),但您会从 Madgwick 的报告中找到方程式。
我没有完整的 AHRS(或 MARG,正如 Madgwick 所说)的经验。然而,该算法将罗盘偏航与俯仰和横滚计算分离,因此即使存在磁干扰,人们也可以期望获得合理的俯仰/横滚读数。
请注意,坐标系不同。在 WP 中,X=pitch 轴,Y=roll 轴,Z=yaw 轴。在上述算法中,Y=pitch,X=roll 和 Z=yaw。因此,您需要交换 X 和 Y 以及反转 Z 加速度的方向。您还需要反转陀螺仪速率(并交换 X 和 Y 速率)。
希望这可以帮助 :)