Первичное испытание 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с без фильтра, но не более того.