我在 WP8 Motion API 上也遇到了类似的问题。延迟并不是唯一的问题。看来 Motion API 对各种指南针(或磁力计)错误也非常敏感。更糟糕的是,这些不仅仅影响偏航。运动类 AHRS 算法似乎将俯仰和横滚与偏航耦合起来。因此,当指南针延迟或变得疯狂时,俯仰和横滚也会发生变化。
我怀疑你是否可以没有陀螺仪。理论上,您可以仅从加速度计获得欧拉角(偏航角、俯仰角和滚动角),但前提是手机静止不动。最轻微的移动会导致线性/向心加速度,从而破坏您的方向计算。我想说,任何使用手机等手持设备来做到这一点的尝试都注定会失败。此外,除了加速度计之外,Motion API 本身还需要指南针和陀螺仪硬件。
无论如何,一切都还没有失去。我完全摆脱了 Motion 类,并按照 Sebastian Madgwick 的 IMU 算法实现了“我自己的”IMU。 IMU / AHRS 报告及 C 代码如下:
http://www.x-io.co.uk/res/doc/madgwick_internal_report.pdf 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/ 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=俯仰轴,Y=横滚轴,Z=偏航轴。在上述算法中,Y=俯仰,X=横滚,Z=偏航。因此,您需要交换 X 和 Y 以及反转 Z 加速度的方向。您还需要反转陀螺仪速率(并交换 X 和 Y 速率)。
希望这可以帮助 :)