Для моего проекта мне нужен способ определения правильной ориентации ракеты.
Я взял код для фильтра Мэгвик отсюда
https://github.com/morgil/madgwick_py
для сбора данных я использовал датчик Arduino Nano + MPU9250. Эта установка отправляет пакеты каждые 12 мс на мой ПК через последовательный порт.
Я откалибровал магнитометр, рассчитав смещения, чтобы «выровнять» начало оси и центр сферы, созданный набором измерений.
Затем я нарисовал координатную ось с помощью блендера:
3D ось
и закодировал некоторый сценарий для этого. Он просто читает значения из последовательного порта, передает их в фильтр, а затем вращает объект моей оси, используя режим вращения кватернионов.
Я немного облажался с ориентацией оси X, поэтому, когда я поворачиваю свою доску по часовой стрелке, ось на экране поворачивается против часовой стрелки. Я перебрал знаки всех компонентов X, и все стало хорошо.
Согласно этой картинке Ось MPU я перевернул оси X и Y и знак оси Z, чтобы выровнять ось магнитометра с гироскопом + акселерометр
И это почти работает с одним небольшим исключением - когда после «стабилизации» я наклоняю, то есть ось X вниз (или ось Y, не имеет значения), эта ось начинает дрейфовать к глобальной плоскости X-Y. Если я наклоню ось вверх, оставшаяся ось начнет дрейфовать вокруг глобальной оси O-Z, как это
Ось X вниз
Ось X вверх
Скорость этого дрейфа зависит от бета-фильтра Мэджвика - чем больше бета, тем больше дрейф.
Что там можно сделать?