CMDeviceMotion returns 0 磁场值

CMDeviceMotion returns 0 values for magnetic field

我正在开发 iOS 具有罗盘功能的应用程序。我尝试使用 CMMagnetometerData 更新,它给出了未经校准但正常的结果。

之后,我尝试获取 CMDeviceMotion 更新,结果总是以 CMMagneticFieldCalibrationAccuracyUncalibrated 的精度提供零磁场。我唯一的设备是 iPad,因此无法在其他设备上进行测试。

可能是字段为零,因为传感器未校准,但我找不到任何方法来执行校准。

如何解决?

更新:

Here 建议使用 startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:,但它对我不起作用。

Here建议设置showsDeviceMovementDisplaytrue。但是它也没有用,校准 windows 只是没有弹出。

终于,解决了。根据我的观察:

1) 使用 startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:referenceFrame 不等于 allZerosXArbitraryZVertical.

2) 将 showsDeviceMovementDisplay 设置为 true.

经过几次准确的零值更新后 CMMagneticFieldCalibrationAccuracyUncalibrated 它将归一化。

代码:

...
motionManager.deviceMotionUpdateInterval = 0.05
motionManager.showsDeviceMovementDisplay = true 
motionManager.startDeviceMotionUpdatesUsingReferenceFrame(CMAttitudeReferenceFrame.XArbitraryCorrectedZVertical, toQueue: NSOperationQueue.mainQueue(), withHandler:handleUpdate)
...
private func handleUpdate(data: CMDeviceMotion!, error: NSError!) {
    if data != nil {
        let field = data.magneticField.field
        println("\(field.x), \(field.y), \(field.z)")
    }
}

最后,根据我自己的观察:

1) 使用 startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:referenceFrame 不等于 allZerosXArbitraryZVertical.

2) 将 showsDeviceMovementDisplay 设置为 true.

经过几次准确的零值更新后 CMMagneticFieldCalibrationAccuracyUncalibrated 它将归一化。