使用CoreMotion错误的罗盘标题值

时间:2012-02-06 13:22:29

标签: iphone augmented-reality compass-geolocation core-motion

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

几秒钟后,罗盘变得狂野,角度四处跳跃。 大多数情况下,它从两个方向的起始位置漂浮在10-20度左右。应该有一个奇怪的结果。 经过30-60秒后,南北两次互换或向东和向西展开。

在WWDC 2011上,一个会议讨论了他们如何用另一个传感器计算每个传感器来弥补这个问题。 在CoreMotion的配置中是否有任何错过我有这个精确标题结果的大量问题?

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

感谢您的阅读。

1 个答案:

答案 0 :(得分:4)

使用CoreMotion 通过 CoreLocation将为您提供所需的信息。

默认情况下,手机将执行校准图8,以禁用此功能,覆盖locationManagerShouldDisplayHeadingCalibration:,如下所示:

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

如果您正在致电startUpdateHeading,问题中的代码就不清楚了。如果没有,请执行以下操作:

if( [CLLocationManager locationServicesEnabled] && [CLLocationManager headingAvailable]) {
    [myLocationManager startUpdatingLocation];
    [myLocationManager startUpdatingHeading];
}

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

另请注意,如果手机处于横向模式,您需要将标题调整适当的度数(+/- 90),因为标题始终位于纵向参考帧中。 / p>