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