Что такое IMU? Пока не дошел до умных книжек, возьму из вики

advertisement
Первичное испытание IMU
Цель написания отчета: зафиксировать на бумаге и в голове результаты исследования IMU. Показать
результаты ребятам, с которыми я делаю робота. В дальнейшем, возможно, переделать статью для
опубликования в интернете.
Что такое IMU? Пока не дошел до умных книжек, возьму из вики: «An inertial measurement unit, or
IMU, is an electronic device that measures and reports on a craft's velocity, orientation, and gravitational forces» Ну,
я бы сказал velocity, orientation, position, но точно не знаю.
Попал мне в руки наш IMU: MinIMU-9 v2 Gyro, Accelerometer, and Compass (L3GD20 and LSM303DLHC
Carrier). Сайт производителя: http://www.pololu.com/catalog/product/1268 . Ну и горе от ума, пока всю не
испытаю не успокоюсь.
Хороший тон – начинать с постановки задачи.
Постановка задачи
Цель:
Исследовать возможность получить от IMU на роботе то, что мы хотим:
1) Определить поддел ли нас соперник скребочком, или нет;
2) Если возможно, определить движемся мы вперед или назад (то есть толкают нас или мы кого-то
толкаем);
3) Если возможно, создать инерциальную навигационную систему (ИНС), и в процессе битвы
определять свое местоположение.
Вторая и третья цель очень близкие. Потому что, как достичь второй цели без построения ИНС мне в
голову пока не пришло.
Задачи:
1) Записать показания Акселерометра в горизонтальном положении, и при наклоне на 5 градусов.
Посмотреть уровень шумов. Посмотреть, не пересекаются ли показания в 2х положениях
(разделимы ли положения).
2) Проинтегрировать показания гироскопа и акселерометра с целью посмотреть уход. Для простоты
измерения проводить в неподвижном положении. Зная уход, будем знать, как долго теоретически
можно работать по ИНС. Почему теоретически? Потому что ещё алгоритм надо написать, а это,
оказывается, очень непросто.
3) Подумать как можно отфильтровать шум;
4) Посмотреть графики от акселя и гиро при ускорениях.
(шатать IMU, руками).
5) Посмотреть показания компаса и подумать, как можно их
применить.
Акселерометр
Отлично, акселерометр. Он входит в чип LSM303DLHC фирмы STM. Имеет три оси и измеряет
ускорения по ним.
То есть если его просто положить на стол, то ускорения нет, и он будет выдавать ноль? Нет, он будет
выдавать g. Все осложняется ещё вот чем:

Очевидно, что g нужно вычитать. В неподвижном положении установить IMU идеально
горизонтально невозможно, то есть будут проекции g на все оси. Когда же мы будем интегрировать
показания в движении, проекция g на оси будет меняться из-за поворота устройства.
 у датчика есть «Linear acceleration Zero-g level offset accuracy». То есть при нулевом ускорении он будет
выдавать не ноль, а константу, которую для каждой оси нужно замерить и потом вычетать.
В неподвижном положении обе проблемы решаются просто: берем первые 50 измерений, находим
среднее арифметическое и вычитаем его из всех показаний.
К делу: я использовал готовый примерчик LSM303DLHC для Ардуино. Частота выборок: 10Гц. Формат
такой:
A X: 64 Y: 20 Z: 1024 M X: 169 Y: -1008 Z: -256
Подключил к ардуине, поставил все на стол и записал выходной поток в файл. Провел ряд
экспериментов: горизонтальное положение, 5 градусов и запись при шатании прибора руками. Дальше
работал в матлабе с файлами.
% Горизонтальное положение
% Считываем данные в массив
fid = fopen('MCcapture.txt');
C = textscan(fid, '%s %s %f %s %f %s %f %s %s %f %s %f %s %f');
fclose(fid);
A = horzcat(C{3}, C{5}, C{7});
%приводим к м/с^2
A = A * 9.80665 / 1000;
%выводим графики
plot(A);
Шум, он и в Африке шум
Построим гистограммы для X, Y, Z
%гистограммы
histfit(A(:,1));
histfit(A(:,2));
histfit(A(:,3));
%СКО и матожидание
SKOX = std(A)
MX = mean(A)
SKOX = 0.0503 0.0603 0.0978
MX = -0.4461 0.1926 10.0865
Выведем для одной оси график с СКО, Мат ожиданием и макс и минимальными значениями
hold on
x = 1:1:size(A,1);
plot(x,A(:,3), 'r');
plot(x,MX(:,3), 'b');
plot(x,MX(:,3) + 3*SKOX(:,3), 'g');
plot(x,MX(:,3) - 3*SKOX(:,3), 'g');
plot(x,nanmax(A(:,3)), 'm');
plot(x,nanmin(A(:,3)), 'm');
hold off
Выведем для одной оси график с СКО, Мат ожиданием и макс и минимальными значениями
Ну что ж, давайте сделаем то же самое теперь для наклоненного IMU. Наклонял я относительно оси Y. То есть
ускорение по X должно было увеличиться, а по Z уменьшиться. Смотрим:
Что X увеличилось видим. Наcчет Z пока непонятно.
SKOX = 0.0601 0.0557 0.0849
MX =
0.5097 0.1587 10.0543
А вот на финальный график я решил вынести показания по оси Х, в горизонтальном случае и под наклоном.
Показания по остальным осям неразделимы.
Вывод: определить наклон в 5градусов с помощью этого акселерометра можно
На график при шатании прибора рукой просто посмотрим. Наводить статистику и интегрировать не вижу
смысла.
Ну хорошо. Давайте попробуем поинтегрировать. Для выставки в 0 используем первые 50 показаний. Далее
интегрируем.
AX = A(:,2);
%делаем выставку по первым 50ти измерениям
meanAX = mean(AX(1:50));
for i=50:size(AX,1)
IAX(i) = trapz(AX(50:i)- meanAX);
end
%шаг интегрирования был 100мс
IAX = IAX / 10;
for i=50:size(IAX,2)
IIAX(i) = trapz(IAX(50:i));
end
IIAX = IIAX / 10;
plot(IIAX);
Результатом двойного интегрирования будет перемещение. Построены графики перемещения (напомню,
IMU стоял неподвижно на столе) по осям X,Y,Z.
Посмотрим величину ухода координат через 10с после старта и через 60
IIAX(150)
IIAX(650)
IIAY(150)
IIAY(650)
IIAZ(150)
IIAZ(650)
-0.1764 10.1214
0.2544 8.9145
0.1553 -10.4140
Через 10с это 15-30 см, а через 60с это метры.
Вывод: если точности 30см достаточно, эту ИНС можно использовать в течение первых 10с без фильтра, но не
более того.
Download