MPU-6050 — гироскоп — акселерометр

Содержание

Трехосевой гироскоп с трехосевым акселерометром MPU-6050 очень доступен по цене, чем и приобрел себе популярность. Этот датчик применяется для определения положения в пространстве, в системах стабилизации положения, стабилизации прямолинейного движения и движения по заданной кривой. Например, в балансирных роботах, в игровых приставках, применяется в робототехнике, для измерения углов наклона, скорости вращения, в авиамоделизме его применяют в автопилотах. Датчик может применяться для измерения перегрузок и тому подобное.

Схема подключения

MPU-6050-i2c

Для Raspberry Pi (OS: Raspbian) примеры скриптов можно скачать и развернуть так:

Калибровка

На самом деле присутствуют и другие погрешности. Например, трехосевые датчики должны располагаться взаимно перпендикулярно. Но при производстве трудно добиться абсолютной точности, поэтому этот угол также имеет определенные допуски и влияет на погрешность. Кроме того показания датчиков с трех осей могут иметь разную пропорциональность. В данном случае наибольшая погрешность из-за смещения относительно нуля.

MPU-6050-offset1MPU-6050-offset2MPU-6050-offset3 В примере я предусмотрел процедуру калибровки. Скрипт калибровки: mpu6050_calibr.py. Калибровка выполняется в два этапа. Сначала датчик должен быть неподвижен. Подразумевается, что угловые скорости равны нулю. Калибруется гироскоп. Затем калибруется акселерометр. Нужно его не спеша поворачивать во всех направлениях. Эта процедура занимает около минуты. После чего функция калибровки выдает вычисленные значения, которые нужно прописать в скрипте. На этом калибровка закончена. После калибровки погрешность значительно снизится. См. Скрипт: mpu6050_get_raw.py. В этом скрипте в следующих строках указываются калибровочные данные:

Гироскоп

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

С помощью электронного гироскопа можно определить положение системы следующим образом. При включении принять начальное положение за нулевую позицию. Затем опрашивать гироскоп с заданным интервалом, зная интервал и скорость вращения, вычислять смещение и добавлять к текущему положению. При этом мы предполагаем, что между двумя опросами датчика система поворачивалась с постоянной скоростью. Такой подход ведет к неизбежному накоплению ошибки. Что видно на примере. Смотри работу скрипта: mpu5060_gyro.py или скрипта, графически отображающего положение гироскопа pyplay_gyro.py.

Акселерометр

Когда мы поворачиваем датчик в пространстве, показания акселерометра на каждой из трех осей будет изменяться в зависимости от положения. Так, с помощью трехосевого акселерометра под воздействием силы тяжести можно определить положение системы. См. работу скрипта mpu6050_accel_no_filter.py.

Мы видим, что значения достаточно зашумлены. Попробуем их фильтровать. Я применил очень упрощенный фильтр Калмана. См. работу скрипта mpu6050_accel_kf.py. Показания стали более стабильными, однако в нашем случае фильтр малополезен. Если датчик потрясти, мы увидим, что показания углов изменяются и иногда очень сильно, хотя мы его не поворачиваем, а перемещаем с ускорением вдоль осей. Это логично, поскольку на акселерометр теперь кроме силы тяжести действует дополнительная сила, и результирующий вектор изменяет направление. Наглядно это видно на примере скрипта pyplay_accel.py (в этом скрипте фильтрация не используется). Здесь простая фильтрация только частично улучшает ситуацию. В решении этой проблемы нам поможет гироскоп. Именно он может нам сказать, что система-то не вращалась, и поэтому мы можем эти колебания отфильтровать.

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

MPU-6050-filter

См. работу скрипта mpu6050_final.py или скрипта pyplay_final.py, который графически изображает процесс работы MPU-6050

MotionApps

Кто использует Arduino, тоже без труда найдут в интернете аналогичные примеры.

В особенности работы MotionApps я не вникал. Думаю, это тема для отдельной статьи. Меня больше интересовала собственная реализация на Python.


Источник: blog.avislab.com