Я экспериментировал с компасом и гироскопом на 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
?
Большое спасибо. Я с нетерпением жду ваших ответов!