сайт для палких паяльників

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

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

Для подключения к контроллеру или микрокомпьютеру, у датчика имеется шина I2C.

MPU-6050-i2c

Документация по датчику скачать здесь: MPU-6000 and MPU-6050 Product Specification Revision 3.2
Описание регистров здесь: MPU-6000 and MPU-6050 Register Map and Descriptions Revision 4.0

Скачать примеры на Python

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

git clone https://github.com/avislab/sensorstest.git

Калибровка

Если считать данные с датчика можно заметить некоторую погрешность. Например, при абсолютном покое датчика показания гироскопа будут отличаться от нуля.
А показания акселерометра по модулю могут превышать 1. См. работу скрипта mpu6050_get_raw_no_calibr.py. Дело в том, что каждый экземпляр датчика требует калибровки. У некоторых цифровых датчиков можно встретить корректировочные коэффициенты, которые для каждого экземпляра прошивают в память датчика на этапе производства. К сожалению, в этом датчике такого нет, и мы сами должны позаботиться о калибровке. Показания датчиков имеют некоторое смещение относительно нуля, что и вносит погрешность в измерения. Нам нужно учесть это смещение для каждой оси гироскопа и каждой оси акселерометра и вносить корректировку при расчетах.

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

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


mpu.gyro_offs = {'x': -178, 'y': 259, 'z': -104}
mpu.accel_offs =  {'y': -354, 'x': 389, 'z': -1482}

Гироскоп

Гироскоп измеряет угловые скорости по трем осям с разными пределами измерений: 250, 500, 1000, и 2000 градусов в секунду. Пределы измерения могут быть выставлены в соответствии с Вашими задачами. Не стоит устанавливать без необходимости максимальные пределы, если у вас достаточно медленная система. Правильно выбранные пределы повысят точность измерений.

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

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

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

Для определения положения системы можно использовать трехосевой акселерометр. Акселерометр также имеет настраиваемые пределы измерений ±2g, ±4g, ±8g і ±16g. Эти пределы устанавливаются в зависимости от динамичности Вашей системы. Напомню, что на любое тело действует сила притяжения. В состоянии покоя g=1. В состоянии свободного падения, когда тело движется к земле с ускорением 9,81 м/с2 – g=0. При разных ускорениях g будет разным. Чем выше ускорение, тем больше g. Поэтому если у Вас достаточно медленная, задемпфированная система, которая физически не способна быстро ускоряться, не стоит устанавливать максимальные пределы измерений. Правильно выбранный диапазон измерений упростит в будущем фильтрацию показаний датчика.

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

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

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

Использование отдельно акселерометра или отдельно гироскопа не даст желаемого результата, только их совместное использование с применением фильтрации с учетом показаний двух датчиков дает приемлемый результат. В примере реализован один из способов комплементарного фильтра. Он достаточно прост и работает следующим образом.
За первоначальное положение принимается положение, вычисленное на основании данных акселерометра. Затем с заданным интервалом вычисляются положение на основе данных гироскопа и положение на основе данных акселерометра. Затем вычисленные показания сводятся в общий финальный результат. При этом акселерометр корректирует “дрейф” гироскопа, а гироскоп сглаживает скачки акселерометра при вибрациях и ускорениях. Математически это представляется следующей формулой.

MPU-6050-filter

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

MotionApps

Если Вам не хочется усложнять себе жизнь с реализацией собственного фильтра, или вычислительных мощностей не достаточно для его работы, можно пойти другим путем. Применительно к этому датчику существует понятие MotionApps. Это некий бинарный код, который записывается в память датчика. Код записывается в энергозависимую память, поэтому его нужно записывать каждый раз после подачи питания. Это занимает около секунды. Код собирает и фильтрует показания со всех осей акселерометра и гироскопа. Данные складываются в буфер FIFO. Собственно, Вам остается дождаться готовности данных и считать буфер со всеми показаниями. Пример на Питоне, который я нашел на GiHub: https://github.com/cTn-dev/PyComms/tree/master/MPU6050

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

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

Визуализация

Для наглядности я привел несколько простых примеров для графического отображения положения системы. В этих примерах используется pygame. Запуск этих скриптов рекомендуется выполнять из графической оболочки.

MPU-6050-x

Успехов.

Смотри также:
Translate
Архіви

© 2011-2017 Андрій Корягін, Кременчук - Київ, Україна