MPU-6050 - угловой дрейф

Настройка

  • Windows 7 Корпоративная
  • MPU-6050: прорыв GY-521
  • Arduino Nano (китайский) с драйвером CH340 FTDI
  • IDE для Arduino 1.6.12
  • Библиотека для гироскопа

Проблема

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


Актуальные вопросы

  • Это распространенная проблема?
  • Почему это происходит?
  • Каков наилучший способ решить эту проблему?

Примечание

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

Пожалуйста, не рекомендуйте другие гироскопы.

, 👍4

Обсуждение

Смежный вопрос: В чем разница между акселерометром, гироскопом и датчиком магнитометра?, @gre_gor

Дрейф/вращение вокруг оси Z?, @Gerben

@Gerben, на самом деле все оси, это огромная проблема :(, @Dat Ha

Вы можете использовать акселерометр для компенсации. Как и на Земле, прямо вниз всегда действует ускорение в 1g (т.е. гравитация). Я обнаружил, что данные, которые вы получаете от MPU, достаточно стабильны. Только вращение по оси Z может немного дрейфовать., @Gerben

@ Гербен, на ракете ты можешь позволить себе только минимальное количество ошибок ..... Не хочу, чтобы ракета летела туда, куда не должна., @Dat Ha

Я использовал библиотеку Arduino MPU6050, реализованную tockn, и у меня были большие проблемы с дрейфом. Я понял, что это было вызвано задержкой, которую я вставил в цикл. Я полагаю, что реализация использует какую-то интеграцию, чтобы иметь значения, а задержка вызывает неправильную работу., @giuseppe


2 ответа


Лучший ответ:

9

Это распространенная проблема?

Да, это так. Дрейф — распространенная проблема.

Почему это происходит?

Дрейф возникает, как правило, из-за того, что для вычисления углов производится интегрирование. Ошибки и шумы, присутствующие в исходной переменной до интегрирования (в данном случае угловая скорость), будут «суммироваться» с течением времени. Для простоты предположим, что ваш гироскоп идеален, бесшумен, но имеет небольшое смещение и позволяет учитывать только вращение по одной оси, что означает:

Ang_Velocity(x) = Real_Ang_Velocity(x) + offset_x

в этом случае датчик, стоящий на месте, должен выводить только:

Ang_Velocity(x) = 0 + offset_x

теперь использование интеграла по времени приводит к результату:

Angle(x) = int[Ang_velocity(x)] = offset_x * t

Например, обратите внимание, что при использовании простого смещения 0,01 по оси x датчик выдает угол в 1 рад через 100 секунд, и фактически датчик вообще не двигался.

В качестве примера я знаю следующие источники ошибок:

  • смещение: уже говорили
  • коэффициент масштабирования: отношение между входом и выходом
  • Линейность коэффициента масштабирования: иногда коэффициент масштабирования на низких скоростях не совпадает с увеличением скорости.
  • температура: (не уверен на 100%!) изменяет чувствительность оси. Большинство цифровых датчиков уже имеют встроенный датчик температуры. Если автоматическая компенсация не используется, в техническом описании, вероятно, будет информация, которая поможет вам компенсировать это. Если ваше приложение не выдерживает больших перепадов температуры, имеет смысл дать датчику достичь внутренней термической стабильности, а затем выполнить простую калибровку.
  • Случайное блуждание. Это, пожалуй, труднее всего обработать. В целом предполагается, что шум представляет собой нормальное распределение с нулевым средним и определенной дисперсией (белый шум). Если бы это было правдой, интеграл по времени по мере увеличения времени стремился бы к нулю (поскольку среднее значение равно нулю). Однако обычно шум распределяется в спектре неравномерно , из-за чего интеграл не стремится к нулю (броуновский шум).

как это решить?

Первые два способа просты при использовании калибровки. Вы должны выполнить серию тестов при различных скоростях вращения для определения нелинейности, смещения (при нулевой скорости) и коэффициентов масштабирования для каждой оси. Тогда ваше сенсорное уравнение модуля должно учитывать эти факты. Обычно в технических описаниях датчиков описывается используемое уравнение. Взгляните на IMU_Zero в указанном вами репозитории.

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

Что касается случайного блуждания. Наиболее распространенным способом учета поправок является использование акселерометра (а в некоторых случаях и магнитометра) и применение алгоритма объединения датчиков, обычно обозначаемого как AHRS. Вот некоторые примеры:

  • Себастьян Магдвик — алгоритмы IMU и AHRS с открытым исходным кодом
  • Расширенный фильтр Калмана
  • Фильтры матрицы направления косинуса
  • Дополнительные фильтры

Если вы действительно хотите смоделировать шум датчика, чтобы улучшить результат, вам, вероятно, следует искать дисперсию Аллана, но вам потребуется много основ стохастических процессов и статистической теории

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

Если вам просто нужна реализация, просто поищите в Google AHRS arduino. На Github много примеров, используемых другими датчиками, которые легко адаптировать. Например и это

Дополнительная информация об ошибках IMU

,

1

Изменение рысканья (поворот плоскости xy вокруг оси z) не является дрейфом или ошибкой, которую необходимо обнулить. Я поставил свой MPU-6050 на кухонный стол и собирал выходные данные оси в течение шести с половиной часов. Значения тангажа и крена были стабильными на протяжении всего периода. Однако значения рыскания постоянно изменяются с чрезвычайно линейной скоростью 0,25 градуса в минуту. Это 15 градусов в час. Планета, на которой вы находитесь, вращается с такой скоростью. Это не совпадение.

,

Переверните его и повторите эксперимент. Если вы правы, вы должны увидеть такое же изменение в другом направлении. Вы также должны измерить другую ось гироскопа - поскольку ваш эксперимент не на одном из полюсов Земли, вы должны увидеть вращение и на другой оси. Не путайте это с шагом и ролью, определенными по акселерометрам и, таким образом, связанными с гравитацией., @Chris Stratton