CMDeviceMotion为磁场返回0值
我正在开发具有指南针function的iOS应用程序。 我试图使用CMMagnetometerData
更新,它给出未经校准,但正常的结果。
之后,我试图获得CMDeviceMotion
更新,结果表明CMMagneticFieldCalibrationAccuracyUncalibrated
精度始终为零磁场。 我唯一的设备是iPad,所以不能在别人身上testing。
由于传感器没有被校准,可能是场是零,但我找不到任何方法来执行校准。
如何解决这个问题?
更新:
这里build议使用startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
但它不适合我。
build议将showsDeviceMovementDisplay
设置为true
。 然而,它也没有工作,校准窗口只是没有popup。
最后, 解决 。 根据我的观察:
1)使用startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
with referenceFrame
不等于allZeros
或XArbitraryZVertical
。
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:
with referenceFrame
不等于allZeros
或XArbitraryZVertical
。
2)将showsDeviceMovementDisplay
设置为true
。
经过精确的CMMagneticFieldCalibrationAccuracyUncalibrated
准确的零值更新后,它将正常化。