我正在使用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/