随着偏航不断变化的核心运动

时间:2012-07-26 08:42:04

标签: ios core-motion

我的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度,并且绝对不允许在我的应用程序中。这种变化的原因是什么,我该如何避免呢?我开始认为它发生的原因是地球自转,但速度太快了:)

提前致谢!

2 个答案:

答案 0 :(得分:3)

让我在黑暗中试一试。 iOS 5磁力计数据是Core Motion传感器融合算法的一部分。对于像游戏这样的许多应用来说,没有必要或者更好是危险的,因为能量消耗增加,并且可能需要校准指南针,迫使用户像运动那样做。

所以我推测只有在使用CMMotionManager的startDeviceMotionUpdatesUsingReferenceFrame代替startDeviceMotionUpdates明确说明的情况下才会考虑罗盘数据。试试CMAttitudeReferenceFrameXMagneticNorthZVertical并检查漂移效果是否会降低。

答案 1 :(得分:3)

你所经历的是一种被称为漂移的东西,你无法做很多事情。

基本上,陀螺仪非常擅长测量转速,但不能测量瞬时方向。因此,为了计算设备的当前方向,传感器算法必须将感测的速率整合到位置中。然而,随着位置的计算,随着时间的推移会产生小的误差,并且计算的方向可能会漂移,即使设备大部分仍处于静止状态。

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

但Apple的实现并不完美,这就是为什么当CMAttitudeReferenceFrameXArbitraryCorrectedZVertical被启用时,你会看到大量的跳转来纠正错误的累积。一个更好的算法可能是至少能够随着时间的推移平滑纠错的算法。