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

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

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

如何解决?

更新:

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

建议使用HereshowsDeviceMovementDisplay设置为true。但是,它也不起作用,只是没有弹出校准窗口。

最后,解决了。根据我的观察:

1)将startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:referenceFrame不等于allZerosXArbitraryZVertical一起使用。

2)将showsDeviceMovementDisplay设置为true

在以CMMagneticFieldCalibrationAccuracyUncalibrated精度进行几次零值更新后,它将归一化。

CODE:

...
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精度进行几次零值更新后,它将归一化。

09-10 04:23