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