我正在使用CoreMotion来获取ccompass标题,并且我注意到指南针标题存在一些问题。

首先,我初始化了CoreMotion。
我有一个CMMotionManager对象locationManager,它是CMMotionManager的实例。

// initialize CoreMotion
motionManager = [CMMotionManager new];
[motionManager setDeviceMotionUpdateInterval:1.0/30.0];
[motionManager setShowsDeviceMovementDisplay:YES];
[self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical];

位置数据每1/30.0秒更新一次。

出于调试目的,我有一个UILabel,它向我显示在每个更新间隔上更新的当前指南针方向。
在应用程序启动时,我始终必须执行神奇的8校准指南针。

校准指南针后,向北和向南的航向正确了将近2-5秒钟。

几秒钟后,指南针突然变了,角度也开始跳来跳去。
通常,它从两个方向的起始位置大约 float 10-20度。想要产生一个奇怪的结果。
在30-60秒后,南方和北方不时地互换或向东方和西方展示。

在WWDC 2011上,一场 session 讨论了如何计算每个传感器与另一个传感器以弥补这一问题。
我在CoreMotion的配置方面有什么想念的地方?

我现在在建筑物内外使用3台设备(2台iPhone 4s和iPhone 4)测试了指南针。我去过田野,小城市和大城市。它一直在发生。
在我的测试中,Apple的示例指南针应用程序几乎准确,准确率达到90%。不幸的是,它不是由Apple开源的。

感谢您的阅读。

最佳答案

通过CoreLocation使用CoreMotion将为您提供所需的东西。

默认情况下,听筒将执行校准图8,要禁用此校准,请覆盖locationManagerShouldDisplayHeadingCalibration:,如下所示:

- (BOOL)locationManagerShouldDisplayHeadingCalibration: (CLLocationManager *)manager {
    return NO;
}

从您的问题代码中不清楚您是否正在调用startUpdateHeading。如果不是,请执行以下操作:
if( [CLLocationManager locationServicesEnabled] && [CLLocationManager headingAvailable]) {
    [myLocationManager startUpdatingLocation];
    [myLocationManager startUpdatingHeading];
}

如果不打开标题过滤器,您可能会得到疯狂的结果,我建议您这样做。之后,只需在调用didUpdateHeading时在位置管理器委托(delegate)中获得标题更改即可。

还要注意,如果听筒处于横向模式,则由于航向始终位于纵向引用系中,因此您需要将航向调整适当的度数(+/- 90)。

关于iphone - CoreMotion指南针航向值错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9160716/

10-10 21:07