问题描述
我正在开发具有罗盘功能的iOS应用程序。我曾尝试使用 CMMagnetometerData
更新,这些更新会产生未校准但正常的结果。
I am developing iOS app with compass functionality. I have tried to use CMMagnetometerData
updates which give uncalibrated, but normal results.
之后我试图获得 CMDeviceMotion
更新,结果总是给出零磁场 CMMagneticFieldCalibrationAccuracyUncalibrated
准确性。我唯一的设备是iPad,因此无法测试其他设备。
After that I tried to get CMDeviceMotion
updates which turned out to give always zero magnetic field with CMMagneticFieldCalibrationAccuracyUncalibrated
accuracy. The only device I have is an iPad, so can't test on others.
由于传感器未校准,但可能是场为零,但我找不到任何方法进行校准。
May be field is zero because sensor is not calibrated, but I could not find any way to perform calibration.
如何解决这个问题?
更新:
使用 startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
,但它对我不起作用。
Here is suggested to use startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
, however it didn't work for me.
建议将 showsDeviceMovementDisplay
设置为 true
。然而它也没有用,校准窗口就不会弹出。
Here is suggested to set showsDeviceMovementDisplay
to true
. However it didn't work either, calibration windows is just not popping up.
最后,已解决。根据我的观察:
Finally, SOLVED. According to my observations:
1)使用 startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
with referenceFrame
不等于 allZeros
或 XArbitraryZVertical
。
1) Use startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
with referenceFrame
NOT equal to allZeros
or XArbitraryZVertical
.
2)将 showsDeviceMovementDisplay
设置为 true
。
经过几次零值更新,精确度 CMMagneticFieldCalibrationAccuracyUncalibrated
它会正常化。
After few zero-value updates with accuracy CMMagneticFieldCalibrationAccuracyUncalibrated
it will normalise.
代码:
...
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)")
}
}
推荐答案
最后,根据我自己的观察:
Finally, according to my own observations:
1)使用 startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
with referenceFrame
不等于 allZeros
或 XArbitraryZVertical
。
1) Use startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
with referenceFrame
NOT equal to allZeros
or XArbitraryZVertical
.
2)设置 showsDeviceMovementDisplay
到 true
。
经过几次零值更新,准确度 CMMagneticFieldCalibrationAccuracyUncalibrated
它会正常化。
After few zero-value updates with accuracy CMMagneticFieldCalibrationAccuracyUncalibrated
it will normalise.
这篇关于CMDeviceMotion返回磁场的0值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!