Подтвердить что ты не робот

Компенсация отставания компаса с гироскопом на iPhone 4

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

  • Init
  • Считать гравитацию XYZ → Xg Yg Zg
  • Убедитесь, что Xg < 0.25 Если TRUE пытается Yg, то Zg//Примечание 1 = 1g = 9,82 m/s ^ 2
  • Прочитайте компас и гироскоп
  • Настройте и откалибруйте гироскоп с помощью компаса и выполните калибровку на основе той оси, которую я использую в пункте 3.
  • Если 5 секунд - это пропуск, то перекалибруйте, прочитайте компас
  • Если разница с показанием гироскопа составляет > 5 градусов, перескакивайте гироскоп.
  • Если разница с показаниями гироскопа равна < 5-градусная калибровка гироскопа с использованием значения компаса

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

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

Ответ 3

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

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

Ответ 4

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