Я экспериментировал с компасом и гироскопом на iPhone 4 и хотел бы получить помощь в решении возникшей у меня проблемы. Я хочу компенсировать медлительность компаса, используя данные с гироскопа.
Используя CMMotionManager
и его объект CMDeviceMotion
(motionManager.deviceMotion
), я получаю объект CMAttitude
. Поправьте меня, если я ошибаюсь (пожалуйста), но вот что я сделал из свойства yaw
объекта CMAttitude
(мне не нужны 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
?
Большое Вам спасибо. Я с нетерпением жду ваших ответов!