Обсуждаем цифровые устройства...
Ответить

Работа с MPU9250

Сб окт 08, 2016 12:49:32

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

1) Выбор датчиков для применения. Здесь есть варианты использования модулей, где напаяно несколько датчиков в одном корпусе http://www.gearbest.com/sensors/pp_244849.html , а можно использовать датчик, у которого все это в одном корпусе, например, MPU9250 http://www.gearbest.com/sensors/pp_244846.html?wid=21 (именно этот датчик я приобрел и пытаюсь использовать), однако, для измерения высоты все-равно нужен дополнительно еще один датчик – BMP180 или bmp280 http://www.gearbest.com/sensors/pp_340012.html .
Изображение

2) Получение данных из датчика. Здесь сложности должны возникать мало у кого. Подключаем датчик к микроконтроллеру и пишем код для работы с ним (по i2c или spi в зависимости от выбранного).


3) Обработка данных. Для того чтобы подобную систему датчиков успешно использовать, необходимо обработать «сырые» данные, полученные от датчиков. Акселерометр измеряет ускорение, действующее на датчик, с помощью чего мы можем получить проекцию тела относительно земли – отклонение (вращение) по оси X и отклонение (вращение) по оси Y. Вращение по оси Z по данным акселерометра получить не удастся. Вращение по любой из осей координат можно получить при помощи гироскопа. Этот датчик измеряет угловую скорость, то есть скорость поворота вокруг оси. Показания этого датчика сильно зависят от обработки получаемых данных датчика – чем больше скорость опроса, тем более точные результаты. Каждый опрос датчика даст нам мгновенные значения угловой скорости, но между опросами угловая скорость может быть неравномерна, что не даст нам полностью достоверных данных, кроме этого необходимо знать точное время между опросами датчика для интегрирования данных по углу поворота, а раз мы многократно интегрируем данные, которые содержат ошибки, то и они будут накапливаться, что приведет к «уплыванию» показаний. Для фиксации вращения по оси Z хорошо подходит магнитометр – датчик, измеряющий магнитное поле. Как известно, земля имеет свое магнитное поле, а магнитометр как раз в роли компаса может определять направление на север. Но магнитометр также чувствителен и к другим магнитным полям, создаваемым металлическими предметами, различной электронной техникой, радиоаппаратурой и так далее, поэтому применение магнитометра часто проблематично в городских условиях. Кроме этого, измерение магнитометром можно проводить достоверно только в положении ровно перпендикулярном оси к земле. Таким образом, каждый датчик по отдельности не даст полного набора данных, по которым можно определить ориентацию тела в пространстве, но если данные от каждого датчика использовать вместе, то можно добиться очень неплохих результатов.

4) Далее вопросы, возникающие в процессе как это сделать (собственно цель создания темы). От простого к сложному. Если мы получаем данные с акселерометра и, предположим, они нас устраивают своей стабильностью. Далее минимум нам нужно получить вращение по оси Z. Используем магнитометр и компенсируем отклонение оси от перпендикулярного земле положения по данным акселерометра.

Алгоритм компенсации наклона магнитомтера:
Изображение
Изображение


Обработка данных производится в радианах, а перевод в градусы только в самом конце. Мои результаты использования этого алгоритма: компенсация почти не работает, даже при минимальных отклонениях показания магнитометра остаются недостоверными при наклонах датчика.
Почему? Вроде как метод обоснован и должен хотя бы минимально работать.
Для получения положения датчиков в пространстве можно воспользоваться методом Маджвика, называемый фильтром Маджвика. Метод не прост, используем код, близкий к авторскому https://github.com/kriswiner/MPU-9250/tree/master/STM32F401.


Результат снова недостоверный – кажется, что показания стали еще хуже. Углы плавают. Что здесь не так?

Re: Работа с MPU9250

Сб окт 08, 2016 13:06:22

Судя по фотке, мне как раз такой же комплект модулей едет.
В сети есть несколько открытых конструкций с разными вариантами сенсоров. Есть на Ардуне, есть на STM. Из них можно взять именно обработку результатов. Я планирую за основу взять Oculus Rift DK1 - он выполнен как раз на STM32f103, хоть и на других сенсорах. Потом посмотрю на DK2 (STM32f303) - может там обработка данных улучшена, но пока хочу просто запустить систему.

Re: Работа с MPU9250

Сб окт 08, 2016 13:29:51

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

Serj_K, а есть ссылки на эти проекты с кодом?
PS нашел на гитхабе - в Oculus Rift только магнитометр используется получается?

Re: Работа с MPU9250

Сб окт 08, 2016 18:22:31

didim писал(а):Serj_K, а есть ссылки на эти проекты с кодом?
PS нашел на гитхабе - в Oculus Rift только магнитометр используется получается?
Ссылок у меня нет - просто качал проекты. Но они на работе, могу в понедельник глянуть.
В Окулусе не только магнитометр используется, но я пока детально исходники не смотрел, только описание. Модули приедут, тогда и засяду.
Вот по быстрому ссылочку нашёл: https://cribstone.github.io/humblehacker/2015/08/28/A-DIY-Flight-Controller.html

Re: Работа с MPU9250

Сб окт 08, 2016 18:44:30

Да, если не трудно, то было бы хорошо скинуть сюда
Если не мне, то кому-нибудь точно тоже пригодится

Re: Работа с MPU9250

Вс окт 09, 2016 15:32:15

Где все гуру? Никто этой темой не интересовался? :solder:

Re: Работа с MPU9250

Пн окт 10, 2016 10:49:33

Вот несколько обещанных ссылок, по которым я качал проекты.
На Ардуине:
http://www.rcgroups.com/forums/showthread.php?t=1677559
https://geektimes.ru/post/275102/
http://www.edtracker.org.uk/ - этот точно поддерживает MPU-9250
На STM32 - варианты Oculus Rift:
https://www.reddit.com/r/DIYRift/comments/2vur7o/build_a_working_diy_rift_tracker_based_on_the/
https://github.com/yetifrisstlama/Foculus_Rift_Tracker_STM32F3DISCOVERY
Собственно из них можно брать алгоритмы обработки измеренных данных.

Re: Работа с MPU9250

Пн окт 10, 2016 19:13:24

Serj_K, спасибо, будет чем заняться к выходным по ссылкам

Добавлено after 2 hours 10 seconds:
Хм, ссылка на гиктаймс навела на идею "безрукого" манипулирования ПК

Re: Работа с MPU9250

Ср окт 19, 2016 18:26:59

Приехали мне модули. Завтра начну разбираться.

Re: Работа с MPU9250

Ср окт 19, 2016 19:26:48

у меня пока времени не хватает плотно заняться темой
вообще есть 2 способа получить координаты (углы) ориентации датчика в пространстве:

1. вручную математически обработать данные гироскопа, акселерометра и магнитометра, алгоритм Маджвика или Махони - почему-то адекватных результатов не дало у меня (писал выше), однако наткнулся на редкий обзор результатов разных датчиков и то вскользь, где именно mpu9150 тоже примерно так же реагирует (упоминается вскользь)
https://forum.warthunder.ru/index.php?/ ... ?p=3485026

2. использовать DMP (процессор движения), который выдает готовые данные (кватернион, что-то по отслеживанию шагов, еще что-то) (алгоритм самим производителем предоставляется), вот по этому пути попробовать получить ориентацию планирую попробовать
https://github.com/kauailabs/navxmxp/bl ... roller.cpp

из всех данных критично в основном получить четкое вращение вокруг оси, направленной перпендикулярно земле (Z), т.к. ни один датчик самостоятельно этого дать не может так, чтобы это было стабильно

Re: Работа с MPU9250

Пт ноя 11, 2016 15:14:24

Перелопатил я исходники Rift DK1 под MPU9250, прошил контроллер. В прошивке контроллер общается с модулем по SPI на 20Мгц, а опрос магнетометра происходит по внутренней I2C шине MPU9250 на 400кГц, гироскоп работает как I2C мастер. Решил сделать правильно - опрашиваю регистр статуса I2C на предмет завершения передачи для последующего чтения регистров с переданными нужными lfyysvb. Но чтение по SPI "проглатывает" нужный байт, а флаги состояния после чтения регистра сбрасываются. При последующем чтении регистра там уже 0 и опрос зацикливается. Отладка в кокосе какая-то недоделанная, причину такой работы при чтении по SPI отловить пока не смог. Скорее всего переделаю так, чтобы не анализировать флаги, просто ,буду читать данные по времени.

Re: Работа с MPU9250

Пт ноя 11, 2016 20:13:13

Я переписывал весь код пошагово для себя, для понимания - естественно какие-то куски кода брал из других проектов, но старался с пониманием того, что делаю, в итоге все датчики по отдельности работают, шлют данные, вроде бы вполне правдоподобные, но вся соль оказалась после попыток объединить показания датчиков для крена, тангажа и рыска - но нет, тут я застрял

Мне кажется вполне достаточно для начала общаться с датчиком по i2c (или только по spi) - это упростит задачу в начале, а потом уже комбинировать после получения результатов обработки, пока все еще сил и времени не хватает прошерстить DMP

кстати, пишу в keil (HAL) - особо проблем с ним нет, у меня, по крайней мере

Re: Работа с MPU9250

Пн ноя 28, 2016 20:15:41

Обнаружил следующий глюк чипа MPU-9250: если частота семплирования акселерометра/гироскопа установлена 8кГц (для Rift DK1), при работе с чипом по SPI и включении в нём режима I2C Master для общения с магнетометром при чтении любого регистра магнетометра меняется частота семплирования акселерометра/гироскопа на 4кГц и на 8кГц уже не возвращается. Также при работе с чипом по SPI и включении в нём режима I2C Master наблюдается очень плохой запуск модуля. Видно образуются конфликты между внешней SPI и внутренней I2C. Переходить полностью на I2C не хочу, поэтому с магнетометром попробую общаться через внешнюю I2C AUX шину чипа, к которой он по идее подключён. При таком варианте работа с магнетометром будет независима от работы с акселерометром/гироскопом, то есть как с отдельным чипом.

Re: Работа с MPU9250

Сб дек 03, 2016 17:56:55

didim писал(а):Обработка данных производится в радианах, а перевод в градусы только в самом конце. Мои результаты использования этого алгоритма: компенсация почти не работает, даже при минимальных отклонениях показания магнитометра остаются недостоверными при наклонах датчика.
Почему? Вроде как метод обоснован и должен хотя бы минимально работать.


Результат снова недостоверный – кажется, что показания стали еще хуже. Углы плавают. Что здесь не так?


Использую акселерометр из микросхемы MPU6050 и магнитометр HMC5883L (микросхемы эти есть в явном виде на сборках GY-86, GY-87 , на GY-91 они объеденены в один чип) , сигналы поступают на Arduino UNO.
Данная формула компенсации наклона нормально работает. Но для этого магнитометр кроме калибровки нуля по осям X и Y , совершаемой оборотом в горизонтальной плоскости, нужно обязательно калибровать по оси Z (достаточно просто перевернуть вверх ногами магнитометр). Калибровки акселерометра не потребовалось.

Исходники (программа и библиотеки) взял у Корнелиуса. http://www.jarzebski.pl/arduino/rozwiaz ... owych.html
Код замечательно работает, но Корнелиус по какой-то причине не ввел компенсацию нуля магнитометра по оси Z. Без нее компенсация будет однобокой.

С компенсацией по Z, получается вот такая картинка (использован код Корнелиуса для Procrssing) при качании этих датчиков (наклонно компенсированного компаса) до + - 45 градусов во всех плоскостях, и нескольких значениях азимута (в руках это сложно сделать, поэтому азимут - зеленая линия слегка загибается). Красная линия показания азимута от магнитометра без учета показаний акселерометра.
https://yadi.sk/i/0vzThONlzbMKY

Вот скриншот более подробный. При превышении угла наклона больше чем на 45 градусов, компенсация перестает работать и зеленая линия (компенсированное значение) подскакивает и сливается с красной (некомпенсированное значение азимута компаса).
https://yadi.sk/i/KHvW9exP327ehf

Грел датчики феном примерно до 70 градусов, дрейф азимута не превысил 2 градуса.

В дальнейшем планирую сделать калибровку средствами самого микроконтроллера (без компьютера), ну и фильтр , например, Калмана прислюнявить.

Собственно делался компас для автопилота на лодку. Тряски и сильных наклонов там нет. До этого использовался магнитометр на кардане.

Re: Работа с MPU9250

Пт дек 09, 2016 13:47:48

Докладываю по MPU-9250. Вроде запустил я его в полном объёме - работа с МК по SPI, данные из магнетометра считываются в автоматическом режиме с нужной частотой. Единственный нюанс - плохо работает при частоте семплирования акселерометра/гироскопа 8кГц, при 1кГц всё отлично. Данные из магнетометра считываются в регистры MPU-9250 посредством I2C Master самой MPU-9250 на скорости 400кГц, можно и 500, но смысла нет. Прошивка - модифицированная Oculus Rift DK1.

Недокументироанная возможность или особенность работы MPU-9250: при возникновении прерывания по готовности данных от акселерометра/гироскопа и разрешенной работой с интерфейсом I2C_Slave_x (например I2C_SLV0_CTRL с включённым битом I2C_SLV0_EN) происходит автоматический запуск работы с I2C_Slave_x с последними состояниями настройки регистров I2C_Slave_x. То есть, если последней операцией с I2C_Slave_x было чтение регистров данных магнетометра, то эта операция будет запущена автоматически с частотой возникновения прерывания. В результате после завершения цикла передачи данных по внутренней шине I2C имеется возможность за один цикл чтения по SPI получить данные со всех сенсоров.

Применительно к Oculus Rift DK1 опрос акселерометра/гироскопа сделал с частотой 1кГц, для магнетометра частота опроса 100Гц. Максимальная частота готовности данных магнетометра не на много больше 100Гц для автоматического режима, что делает бессмысленными попытки использования режима однократных измерений с принудительным запуском. Для получения частоты опроса магнетометра 100Гц I2C_Slave включается только каждый десятый цикл измерения акселерометра/гироскопа.
Теперь займусь проверкой работы сенсора собственно в качестве Oculus Rift DK1. Интересует прохождение калибровки, так как магнетометр MPU-9250 не имеет настроек своей работы в отличие от HMC5983, который применяется в Oculus Rift DK1. Возможно придётся эмулировать эти настройки программно.

Re: Работа с MPU9250

Сб дек 10, 2016 09:16:51

Подключил к компу, установил ПО от Oculus. Сам трекер находится, но из за другого магнетометра не проходит калибровка. Нужно функцию калибровки мегнетометра эмулировать программно. Хотя можно пойти и кардинально другим путём - сделать независимый от Oculus эмулятор джойстика или мышки. Главное, что сенсор работает.

Re: Работа с MPU9250

Сб дек 10, 2016 09:23:03

Насколько точно он работает? "Шум" в показаниях есть? Получится ли с точностью до градуса или лучше позиционировать с таким ПО для датчика?

Re: Работа с MPU9250

Сб дек 10, 2016 12:27:56

Как конечное устройство - Oculus Rift DK1 - не работает, в том числе из за отсутствия дисплейной части. Сейчас планирую переписать прошивку под обычный HID джойстик, тогда всё будет видно.

Re: Работа с MPU9250

Ср дек 14, 2016 15:27:22

Ну что ж, выкинул из прошивки почти все Oculus Rift - специфичные вещи, переписал HID дескриптор под джойстик, вывел значения регистров сенсоров в "аналоговом" виде осей джойстика.
"Шумы" есть, но явного дрифта в статическом положении сенсора нет. Магнетометр имеет маленькую чувствительность, так как имеет большой диапазон - данные нужно множить примерно на 50 для получения соизмеримых значений с остальными датчиками.
Теперь нужно пропустить данные через фильтр и получить кватернион.

Re: Работа с MPU9250

Пн дек 19, 2016 10:24:40

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

На данный момент реализовал два варианта HID устройств - 3-х осевой джойстик и мышка. У джойстика дрифта вообще не видно, а мышка совсем немного "гуляет" (наверное в районе десятых градуса), но у неё чувствительность сделана примерно в 10 раз выше. Чувствительность мышки буду ещё подбирать.
Ответить