CMDeviceMotion возвращает 0 значений для магнитного поля
Я занимаюсь разработкой приложения для 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)")
}
}