在我目前的项目中,我遇到了关于 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 开始,磁力计(罗盘)也被考虑用于传感器融合。控制台显示来自 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 示例重现问题。偏航图可重复地偏离原点。