【问题标题】:Drifting yaw angle after moving fast快速移动后偏航角漂移
【发布时间】:2012-11-16 18:52:07
【问题描述】:

在我当前的项目中,我遇到了关于 Core Motion 的 CMAttitude 提供的四元数的问题。我将 iPhone 5 (iOS 6.0.1) 放在了一个明确的起始位置。然后我开始像在快节奏游戏中一样快速移动设备。当我在 10-30 秒后返回起始位置时,报告的偏航角与起始位置相差 10-20 度(大部分时间 ≈11°)。

我使用旧的(遗憾的是不再可用)Core Motion Teapot 样本来验证效果。记录的欧拉角直接从 CMAttitude 读取:

        NSLog(@"pitch: %f, roll: %f, yaw: %f",  attitude.pitch * 180 / M_PI, attitude.roll * 180 / M_PI, attitude.yaw * 180 / M_PI);

我在不同工厂在不同时间生产的两种不同的 iPhone 5 设备上发现了这一点。但真正奇怪的是,我的 运行 iOS 5.1.1 的 iPhone 4 运行正常。在我看来,这是一个 iOS 错误,我已经提交了错误报告,但另一方面,我很难想象没有人偶然发现它。我怀疑这可能与重新设计的 Core Motion API 有关。从版本 5 开始,磁力计(罗盘)也被考虑用于传感器融合。控制台显示来自位置的偏差估计被提供给 CoreMotion:

locationd[41] <Notice>: GYTT inserted: bias,-0.196419,1.749323,-1.828088,variance,0.002644,0.004651,0.002527,temperature,31.554688

我的问题:使用 Device Motion 时是否有机会阻止磁力计读数?我尝试停用定位服务,但它不影响 Core Motion。如果不可能,有什么替代/解决方法,基于加速度计的重力估计?

PS:因为我们正在处理基于四元数的模型,所以这与 Gimbal Lock相关

编辑: 在进行更多测量之后,似乎很明显只有偏航受到影响。无论起始位置如何,偏航都在漂移时,俯仰和横滚显示偏差在公差范围内 (CMDeviceMotion.gravity 看起来也很干净。

编辑(2): 我可以使用附加到最近 XCode 版本的 MotionGraphs 示例重现该问题。偏航图可重现地偏离原点。

【问题讨论】:

  • 赞成,一个有趣的问题!是的,我对磁力计也有不好的体验:它滞后(导致偏差!)并且像地狱一样嘈杂。我还注意到陀螺仪很容易饱和,尤其是。以快速的动作。有没有办法排除嫌疑人的饱和度?
  • @Ali 我不知道方法。但另一方面,我的带有 iOS 5.1.1 的 iPhone 4 与之前安装的 iOS 4.3 也一样好用。在黑暗中开枪,但我认为 iOS 6 是罪魁祸首。
  • 希望有人知道答案,抱歉帮不上忙:(
  • 现在是 2015 年 9 月,我的 iPhone 5(2014 年购买)和 iOS 8.1 仍然存在这个问题。我的猜测是传感器融合算法没有正确过滤陀螺仪,或者陀螺仪本身不如其他 iPhone。你的错误报告怎么了?
  • 在提交错误后 2 个月,他们回答了 “如果设备在移动,我们无法进行陀螺仪偏差估计。如果设备的偏差校准关闭,那么当设备处于移动状态时,它的航向会漂移运动”。我认为这与传感器融合算法的磁力计部分有关,因为这是校准偏航角的唯一方法。

标签: iphone ios6 gyroscope core-motion


【解决方案1】:

不是最终的解决方案,但至少是我自己的问题的解决方法(我将其保留为未回答以邀请您)。事实证明,至少DeviceMotion.gravity 不受该错误的影响。所以我决定重新设计这个非常简单的运动检测部分,并使用arcsin (gravity.x/||gravity||) 在倾斜设备时将主要玩家角色移动到一边。

这绝对是第二好的解决方案,因为它破坏了四元数中包含的完整旋转状态的信息。出于战略考虑,我决定这样做:

  1. 我认为大多数开发人员使用重力矢量而不是CMAttitude.quaternion 进行倾斜运动检测,因为大多数人对四元数数学并不感兴趣 ;-) 因此,任何与重力矢量相关的未来错误都可能在 beta 阶段得到修复因为用户数量较多。
  2. 如果它是软件错误并且与硬件问题无关,我的假设是,如果错误会尽快修复,那么仍然有许多设备可能由于某种原因而无法更新。因此,潜在的未来客户遇到麻烦的风险很小,但 > 0。因此,次优的解决方案有时可能是最好的。

【讨论】:

    【解决方案2】:

    我在自己的代码中做了类似的事情,发现了相同的 z 轴旋转漂移(偏航)。我应用了平衡过滤器。在每个运动管理器时间间隔,我抓取当前四元数(z 分量),然后在计算后将其保存为 oldZ,以用于下一组计算。我的过滤器只是平衡了新的 z 值和它之前的 z 值,防止它移动得太快。根据您的硬件和程序中的精确容差,您可以通过这种方式很好地管理漂移。您会看到陀螺仪略有漂移,但随着过滤器的继续作用,陀螺仪开始被纠正。我的过滤器看起来像这样,可以防止超过 0.5 度的“杂散”:

    filtZ = 0.65 * oldZ + 0.35 * z;

    0.65 和 0.35 的值是通过实验确定的,我建议您在有时间的时候使用它们。输出仍将按 0-1 缩放,然后可以按照您一直在做的相同方式使用(或者如果您必须始终保留所有 4 个维度,则重新引入四元数)。

    【讨论】:

      猜你喜欢
      • 2022-12-07
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      相关资源
      最近更新 更多