Ios CMDeviceMotion为磁场返回0值
我正在开发具有指南针功能的iOS应用程序。我曾尝试使用Ios CMDeviceMotion为磁场返回0值,ios,objective-c,swift,ipad,magnetometer,Ios,Objective C,Swift,Ipad,Magnetometer,我正在开发具有指南针功能的iOS应用程序。我曾尝试使用CMMagnetometerData更新,这些更新会给出未经校准但正常的结果 之后,我尝试获得CMDeviceMotion更新,结果显示,该更新始终提供零磁场,且cmMagneticFieldCalibration准确度未校准。我唯一的设备是iPad,所以不能在其他设备上测试 可能是因为传感器未校准,所以字段为零,但我找不到任何执行校准的方法 如何解决这个问题 更新: ... motionManager.deviceMotionUpdateI
CMMagnetometerData
更新,这些更新会给出未经校准但正常的结果
之后,我尝试获得CMDeviceMotion
更新,结果显示,该更新始终提供零磁场,且cmMagneticFieldCalibration准确度未校准。我唯一的设备是iPad,所以不能在其他设备上测试
可能是因为传感器未校准,所以字段为零,但我找不到任何执行校准的方法
如何解决这个问题
更新:
...
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)")
}
}
建议使用startDeviceMotionUpdatesSusingReferenceFrame:toQueue:withHandler:
,但它对我不起作用
建议将showsDeviceMovementDisplay
设置为true
。然而,它也没有工作,校准窗口只是没有弹出
最后,解决了。根据我的观察:
1) 使用startDeviceMotionUpdatesSusingReferenceFrame:toQueue:withHandler:
和referenceFrame
不等于allzero
或XArbitraryZVertical
2) 将showsDeviceMovementDisplay
设置为true
使用精度CMMagneticFieldCalibration AccuracYunCalibrated
进行少量零值更新后,它将正常化
代码:
...
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) 使用startDeviceMotionUpdatesSusingReferenceFrame:toQueue:withHandler:
和referenceFrame
不等于allzero
或XArbitraryZVertical
2) 将showsDeviceMovementDisplay
设置为true
经过几次精度为CMMagneticFieldCalibration准确度未校准的零值更新后,它将正常化。请分享您的代码,以回答您自己的问题。真的帮了我的忙!