Суть темы заключается в том, что бы разобраться с работой таких датчиков как акселерометр, гироскоп и магнитометр, работающих вместе для определения ориентации тела в пространстве.
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.
Результат снова недостоверный – кажется, что показания стали еще хуже. Углы плавают. Что здесь не так?