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)")
    }
}

person Tzoiker    schedule 15.06.2015    source источник
comment
поделитесь кодом пожалуйста   -  person 9to5ios    schedule 15.06.2015


Ответы (1)


Наконец, по моим собственным наблюдениям:

1) Используйте startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:с referenceFrame НЕ равным allZeros или XArbitraryZVertical.

2) Установите showsDeviceMovementDisplay на true.

После нескольких обновлений нулевого значения с точностью CMMagneticFieldCalibrationAccuracyUncalibrated оно нормализуется.

person Tzoiker    schedule 15.06.2015
comment
Спасибо за ответ на свой вопрос. Очень помог мне в моей ситуации! - person rambossa; 10.08.2015