Компенсация задержки компаса с помощью гироскопа на iPhone 4

Я экспериментировал с компасом и гироскопом на 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?

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


person donkim    schedule 18.11.2010    source источник


Ответы (4)


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

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

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

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

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

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

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

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

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

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

person FerryHtw    schedule 13.12.2010
comment
для шага инициализации обязательно предложите пользователю остановиться на некоторое время. пропустите шаг 7, если ваши приложения не будут сталкиваться со сталью или электричеством, в моем случае мне это нужно, потому что оно используется на заводе с высоковольтным оборудованием и стальным трубопроводом. - person FerryHtw; 13.12.2010

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

person Ellen S    schedule 19.09.2011

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

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

person hotpaw2    schedule 08.12.2010

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

person Developer    schedule 12.12.2010