Разработвам приложение за 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)")
}
}