CMDeviceMotion返回磁场的0值

时间:2015-06-15 08:45:20

标签: ios objective-c swift ipad magnetometer

我正在开发具有罗盘功能的iOS应用程序。我尝试使用CMMagnetometerData更新,这些更新会提供未校准但正常的结果。

之后,我试图获得CMDeviceMotion更新,结果总是给出零磁场,精确度为CMMagneticFieldCalibrationAccuracyUncalibrated。我唯一的设备是iPad,因此无法测试其他设备。

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

如何解决这个问题?

更新

建议{p> 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 个答案:

答案 0 :(得分:10)

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

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

2)将showsDeviceMovementDisplay设为true

经过精确CMMagneticFieldCalibrationAccuracyUncalibrated的少量零值更新后,它将正常化。