Я экспериментировал с компасом и гироскопом на iPhone 4 и хотел бы помочь с проблемой, которую у меня есть. Я хочу компенсировать медленность компаса, используя данные из гироскопа.
Используя CMMotionManager и его объект CMDeviceMotion (motionManager.deviceMotion), я получаю объект CMAttitude. Исправьте меня, если я ошибаюсь (пожалуйста), но вот что я вывел из свойства CMAttitude object yaw (мне не нужны pitch и roll для моих целей):
-
yawнаходится в диапазоне от0доPI, когда телефон направлен вниз (как показано на рисункеdeviceMotion.gravity.z) и качается против часовой стрелки, а0--PIпри повороте по часовой стрелке - когда устройство указывает вверх,
yawнаходится в диапазоне от-PIдо0иPIдо0, соответственно - и из данных компаса (я использую
locationManager.heading.magneticHeading), я вижу, что компас дает значения от0до360, при этом значение увеличивается при повороте по часовой стрелке
Хорошо, поэтому, используя всю эту информацию вместе, я могу получить значение, которое я вызываю horizontal, который, независимо от того, указывает ли устройство вверх или вниз, будет давать значения от 0 до 360 и увеличивайте время, когда устройство поворачивается по часовой стрелке (хотя у меня все еще есть проблемы, когда deviceManager.gravity.z находится вокруг 0 - значение yaw выходит из этого значения gravity.z).
Мне кажется, что я могу "синхронизировать" значения horizontal и magneticHeading, используя вычисляемое значение horizontal, которое отображается на magneticHeading, и "синхронизирует" значение horizontal с magneticHeading когда я чувствую, что компас "догнал".
Итак, мои вопросы:
- Я на правильном пути с этим?
- Я правильно использую данные гироскопа от
CMDeviceMotion, и предположения, перечисленные выше, верны? - Почему
yawможет возникнуть, когдаgravity.zнаходится вокруг0?
Большое спасибо. Я с нетерпением жду ваших ответов!