Правильно ли работает калибровка магнитометра Apple iPhone?

В настоящее время я разрабатываю приложение для 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 не приводят к кругу!

Plot

Есть ли у кого есть объяснение? Или кто-нибудь знает, как появляется CMCalibratedMagneticField? Является ли магнитометр откалиброван в смысле ссылка сверху при выполнении "восьмиобразного" движения устройства или что такое движение хорошее для?

Btw. почему "восьмиугольное" движение, а не переворачивание устройства вокруг него на три оси, что позволило бы калибровать, как описано в ссылке выше

Я был бы очень рад за любые разъяснения с этой проблемой... Спасибо!

Ответ 1

Проблема с магнитометром в iOS 7, имеет погрешность + -7º. Попробуйте использовать бета-версию 7.1.

ИЗМЕНИТЬ

Магнитометр с нулевым дрейфом со временем, но довольно неточный для резких изменений положения. С другой стороны, акселерометр и гироскоп быстро корректируют внезапные изменения, но, будучи инерционными датчиками, они теряют точность в течение определенного периода времени.

Поэтому, когда CMCalibratedMagneticField пытается компенсировать ваше вращательное движение, он использует данные с гироскопа и акселерометра. Это происходит, когда ошибка акселерометра и гироскопа + -7º ползет и выбрасывает ваш круг с дорожки. Проверьте и статью в википедии для получения дополнительной информации.

Что касается восьмой цифры: Оба делают то же самое, они ориентируют "Север" вашего устройства в каждом направлении в надежде на отмену магнитных помех. Перевертывание устройства по всем трем осям будет работать лучше, но выполнить его труднее и не так легко понять.

Надеюсь, что это поможет.