我正在开发具有罗盘功能的iOS应用。我尝试使用CMMagnetometerData
更新,该更新会给出未校准的但正常的结果。
之后,我尝试获取CMDeviceMotion
更新,结果是始终以CMMagneticFieldCalibrationAccuracyUncalibrated
精度提供始终为零的磁场。我唯一的设备是iPad,因此无法在其他设备上进行测试。
字段可能为零,因为未校准传感器,但是我找不到任何执行校准的方法。
如何解决?
更新:
建议Here使用startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
,但是它对我不起作用。
建议使用Here将showsDeviceMovementDisplay
设置为true
。但是,它也不起作用,只是没有弹出校准窗口。
最后,解决了。根据我的观察:
1)将startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
与referenceFrame
不等于allZeros
或XArbitraryZVertical
一起使用。
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
不等于allZeros
或XArbitraryZVertical
一起使用。
2)将showsDeviceMovementDisplay
设置为true
。
在以CMMagneticFieldCalibrationAccuracyUncalibrated
精度进行几次零值更新后,它将归一化。