Компенсация отставания компаса с помощью гироскопа на iPhone 4 - PullRequest
30 голосов
/ 18 ноября 2010

Я экспериментировал с компасом и гироскопом на 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 до * 1037. * и увеличивается, когда устройство поворачивается по часовой стрелке (хотя у меня все еще возникают проблемы, когда deviceManager.gravity.z составляет около 0 - значение yaw выходит из этого значения gravity.z).

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

Итак, мои вопросы:

  • Я на правильном пути с этим?
  • Правильно ли я использую гироскопические данные из CMDeviceMotion и правильные предположения, перечисленные выше?
  • Почему yaw может волноваться, когда gravity.z около 0?

Большое спасибо. Я с нетерпением жду ваших ответов!

Ответы [ 4 ]

21 голосов
/ 13 декабря 2010

Просто пытаюсь ответить ... поправьте меня, если я не прав ..

1. Да, вы на правильном пути

2. Гравитация в КМ уже «изолирована» от гравитации пользователя (значение гравитации, вызванное ускорением пользователя), поэтому в документации Apple CM есть две гравитации, «гравитация» и «пользовательское ускорение». // Примечание: не полностью изолированы //

3. если у вас есть сила тяжести 0, это означает, что ось вращения ядра перпендикулярна гравитации. gravity.z - экран iPhone, поэтому он составляет -9,82 м / с2, если вы положите его на рабочий стол с экраном в вертикальном положении, на самом деле трудно получить 0 или максимальное значение силы тяжести из-за шума датчика (это нормально, все датчики имеют Шум, особенно дешевый датчик).

что я делаю в своих приложениях, так это то, что я переключу свою ось отсчета на другую ось (в вашем случае это может быть x или y) для определенных пределов, как стратегия зависит от цели или от какой стороны вы ориентируетесь.

Другое дело, гироскоп быстрый, но не стабильный, вам необходимо повторно откалибровать значение в течение нескольких интервалов. В моем случае каждые 5 секунд. Я экспериментировал с гироскопом для вычисления угла между двумя плоскостями, я пробовал с точно линейкой 90 градусов, и она будет давать ошибку примерно на 0,5 градуса каждую секунду, пытаясь продолжать увеличиваться, но это мое, может быть, у других есть лучший способ избежать ошибка.

ниже мои шаги "

  1. Init
  2. Считать гравитацию XYZ -> Xg Yg Zg
  3. Проверьте, если Xg <0,25. Если TRUE, попробуйте Yg, тогда Zg // Примечание 1 = 1g = 9,82 м / с ^ 2 </li>
  4. Чтение компаса и гироскопа
  5. Сконфигурируйте и откалибруйте гироскоп с помощью компаса и рассчитайте, исходя из того, какую ось я использую в точке 3.
  6. Если прошло 5 секунд, затем выполнить повторную калибровку, прочитайте компас
  7. Если разница с показаниями гироскопа составляет> 5 градусов, пропустите калибровку гироскопа.
  8. Если разница с показаниями гироскопа составляет <5 градусов, откалибруйте гироскоп с использованием значения компаса </li>

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

Вот и все ... Надеюсь, это поможет вам ... И извините за мой английский ..

10 голосов
/ 19 сентября 2011

Вот пример приложения для iPhone, где компас компенсируется гироскопом.Код и проект можно посмотреть здесь: http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

0 голосов
/ 12 декабря 2010

Ответ на вопрос 1: Да, вопрос 2: вы на правильном пути, но вы можете использовать имя переменной, которое не является «горизонтальным», на вопрос 3 отвечает hotpaw2, а также рыскание в вертолете или вертолете в районе нуля высота предупредит пилота тревогой. Существует временная задержка, потому что часть программного обеспечения является локальной, в то время как есть другие факторы, которые могут замедлять его, включая доступ к датчику для обнаружения магнитных волн, положения и направления устройства, подготовки графического вывода для отображения компаса, вычислений и вывода данные от гироскопа и датчиков через относительно медленный интерфейс с использованием ручного устройства общего назначения, не предназначенного специально для типа задачи, которая ему задается.

0 голосов
/ 08 декабря 2010

Направление вектора оси рыскания не определено, когда в невесомости (или в свободном падении, или достаточно близко).

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

...