5

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

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

起始位置 15秒后同一个地方

        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 开始,磁力计(罗盘)也被考虑用于传感器融合。控制台显示来自 location 的偏差估计被提供给 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无关

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

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

4

2 回答 2

4

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

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

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

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

filtZ = 0.65 * oldZ + 0.35 * z;

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

于 2013-01-30T18:37:13.987 回答