В настоящее время я разрабатываю приложение для iPhone (на iPhone 5, iOS 7, Xcode 5), которое требует очень точного определения текущего отношения. "Отношение" CMDeviceMotion не отвечает этим требованиям, потому что алгоритм слияния датчиков Apple, похоже, слишком сильно полагается на гироскоп, который довольно быстро уходит (по моему опыту). Вот почему я решил прочитать данные с открытым сенсором, а позже я хочу объединить его в алгоритме слияния датчиков.
При запросе данных магнитометра возможны две возможности:
-
через CMMagnetometerData в CMMotionManager
-
через CMCalibratedMagneticField в CMDeviceMotion, о котором Apple говорит
CMCalibratedMagneticField, возвращенный этим свойством, дает вам полное магнитное поле в окрестностях устройств без смещения устройства. В отличие от свойства магнитного поля класса CMMagnetometer, эти значения отражают магнитное поле Земли плюс окружающие поля, минус смещение устройства.
В принципе (2.) именно то, что я хочу.
Существует очень простой тест, если данные магнитометра калибруются должным образом. Для простоты можно ограничиться двумя измерениями. Когда устройство лежит на нем, комбинация B_x ^ 2 + B_y ^ 2 должна быть постоянной, независимо от направления, на которое указывает устройство. Он должен равняться горизонтальной составляющей магнитного поля Земли (если не считать других полей вблизи устройства). Таким образом, при выполнении поворота на 360 градусов устройства, которое лежит на нем назад, измеренные данные B_y над B_x должны отображать круг. Подробнее см. здесь.
Теперь точка: данные CMCalibratedMagneticField не приводят к кругу!
Есть ли у кого есть объяснение? Или кто-нибудь знает, как появляется CMCalibratedMagneticField? Является ли магнитометр откалиброван в смысле ссылка сверху при выполнении "восьмиобразного" движения устройства или что такое движение хорошее для?
Btw. почему "восьмиугольное" движение, а не переворачивание устройства вокруг него на три оси, что позволило бы калибровать, как описано в ссылке выше
Я был бы очень рад за любые разъяснения с этой проблемой... Спасибо!