我的iOS应用程序中有核心运动管理器:
motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0 / 60.0;
if ([motionManager isDeviceMotionAvailable]) {
[motionManager startDeviceMotionUpdates];
}在update方法中(我使用的是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度,这在我的应用程序中绝对是不可接受的。这种改变的原因是什么?我如何避免它?我开始认为这是因为地球自转,但速度太快了:)
提前感谢!
发布于 2012-07-26 22:02:11
让我在黑暗中试一试。对于iOS 5,磁力仪数据是核心运动传感器融合算法的一部分。对于许多应用程序,如游戏,没有必要或更好的是危险的,因为增加的能源消耗和可能需要校准指南针,迫使用户这样做像运动。
因此,我推测,只有在使用CMMotionManager的startDeviceMotionUpdatesUsingReferenceFrame而不是startDeviceMotionUpdates明确声明的情况下,罗盘数据才会被考虑在传感器融合中。试试CMAttitudeReferenceFrameXMagneticNorthZVertical,看看漂移效果有没有降低。
发布于 2013-11-13 00:52:55
你正在经历的是一种叫做漂移的东西,你对它无能为力。
基本上,陀螺仪在测量转速方面很好,但不能测量瞬时方向。因此,为了计算设备的当前方向,传感器算法必须将感测速率整合到位置中。然而,随着位置的计算,随着时间的推移,小的误差会积累起来,计算出的方向可能会漂移,即使设备基本上保持静止。
如果设备恰好有一个可以测量瞬时方向的传感器,例如磁力计,那么传感器融合算法可以通过比较/组合传感器输入来纠正漂移,因此苹果的参考系选项: CMAttitudeReferenceFrameXArbitraryCorrectedZVertical.
但苹果的实现并不完美,这就是为什么当启用时,你会看到大量的来回跳跃来纠正累积的错误。更好的算法可能是至少随着时间的推移平滑纠错的算法。
https://stackoverflow.com/questions/11665510
复制相似问题