2

我的 iOS 应用中有 Core Motion 管理器:

motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0 / 60.0;
if ([motionManager isDeviceMotionAvailable]) {
    [motionManager startDeviceMotionUpdates];
}

在更新方法中(我使用的是 cocos3d,但没关系)我有这个:

-(void) updateBeforeTransform:(CC3NodeUpdatingVisitor *)visitor
{
    if (motionManager.deviceMotionActive)
    {
        CMDeviceMotion *deviceMotion = motionManager.deviceMotion;
        CMAttitude *attitude = deviceMotion.attitude;

        NSLog(@"%f, %f, %f", attitude.yaw, attitude.pitch, attitude.roll);

    }
}

我把设备放在桌子上,开始观察偏航、俯仰和横滚值,偏航一直在变化!它在几分钟内改变了大约 10 度,这在我的应用程序中是绝对不允许的。这种变化的原因是什么,我该如何避免呢?我开始认为它的发生是因为地球自转,但速度太快了:)

提前致谢!

4

2 回答 2

3

让我在黑暗中试一试。在 iOS 5 中,磁力计数据是 Core Motion 传感器融合算法的一部分。对于像游戏这样的许多应用程序来说,由于能耗增加以及可能需要校准指南针,迫使用户进行类似 8 的动作,因此不需要或更好的是危险的。

因此,我推测只有在使用 CMMotionManager 的startDeviceMotionUpdatesUsingReferenceFrame而不是startDeviceMotionUpdates明确说明时,才在传感器融合中考虑罗盘数据。尝试CMAttitudeReferenceFrameXMagneticNorthZVertical并检查漂移效果是否降低。

于 2012-07-26T14:02:10.700 回答
3

你正在经历的是一种叫做漂移的东西,你对此无能为力。

基本上,陀螺仪非常擅长测量旋转速率,但它不能测量瞬时方向。因此,为了计算设备的当前方向,传感器算法必须将传感速率整合到位置中。然而,随着位置的计算,随着时间的推移,小错误会逐渐累积,并且计算出的方向可能会发生漂移,即使设备大部分时间都保持静止。

如果设备碰巧有一个可以测量瞬时方向的传感器,例如磁力计,那么传感器融合算法可以通过比较/组合传感器输入来纠正漂移,因此 Apple 的参考框架选项:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical。

But Apple's implementation isn't perfect, that's why you see the massive jumps back and forth to correct build up of error when CMAttitudeReferenceFrameXArbitraryCorrectedZVertical is enabled. A better algorithm might be one that at least smooths out the error correction over time.

于 2013-11-12T16:52:54.600 回答