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