Я разрабатываю приложение для iOS с функциями компаса. Я пытался использовать CMMagnetometerData
обновления, которые дают некалиброванные, но нормальные результаты.
После этого я попытался получить CMDeviceMotion
обновления, которые всегда выдавали нулевое магнитное поле с точностью CMMagneticFieldCalibrationAccuracyUncalibrated
. Единственное устройство, которое у меня есть, это iPad, поэтому я не могу проверить на других.
Возможно, поле равно нулю, потому что датчик не откалиброван, но я не нашел способа выполнить калибровку.
Как это исправить?
ОБНОВЛЕНИЕ:
Здесь предлагается использовать startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:
, однако у меня это не сработало.
Здесь предлагается установить showsDeviceMovementDisplay
на true
. Однако это тоже не сработало, окна калибровки просто не появляются.
Наконец, РЕШЕНО. По моим наблюдениям:
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)")
}
}