2010-11-18 8 views
30

Я экспериментировал с компасом и гироскопом на 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 досоответственно
  • и от данных компаса (я использую 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?

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

ответ

21

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

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

2.gravity в СМ уже «изолированы» от пользователя тяжести (значение силы тяжести, вызванные ускорением пользователя) вот почему существует две силы тяжести, «тяжести» и «userAcceleration» его на яблоне 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 затем Зг // Примечание 1 = 1 г = 9,82 м/с^2
  4. прочитать компас и гироскоп
  5. Настройка и калибровки с помощью гироскопа компас и calulate на основе какой оси я использовать в пункте 3.
  6. Если 5 секунд проходит, то перекалибруйте, прочитайте компас
  7. Если разница в показаниях гироскопа составляет> 5 градусов, откажитесь от гироскопа.
  8. Если разница с чтением гироскоп < 5 градусов калибровки гироскопа, используя значение компаса

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

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

+0

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

0

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^