Как работает дополнительный фильтр?

Я пытаюсь объединить данные акселерометра и гироскопа, чтобы точно измерить углы наклона и рыскания объекта. После изучения дополнительного фильтра и попытки его реализации у меня возникло несколько вопросов о том, как он работает.

Я читал, что фильтр «доверяет» данным гироскопа, если происходит большое угловое движение, и что он «доверяет» данным акселерометра, если объект стабилен.

http://www.pieter-jan.com/node/11 В этой статье дополнительный фильтр описывается следующим образом:

* угол = 0,98 (угол + gyrData * dt) + 0,02 * (accData) *

Мне кажется, что предпочтение отдается данным гироскопа. На следующем изображении http://www.pieter-jan.com/images/resize/Complementary_Filter.png , найденный в нижней части страницы, отфильтрованные данные, кажется, «приближаются» к данным акселерометра, даже если данные гироскопа дрейфовали. Я не понимаю, почему это происходит, когда расчет предполагает, что предпочтение отдается данным гироскопа. Я наблюдал это и на других фотографиях. Во время моего собственного тестирования мне нужно было «поменять местами» 0,98 и 0,02, предполагая, что данные акселерометра предпочтительнее, чтобы получить аналогичные результаты. Я пропустил полное непонимание того, как работает этот фильтр? Нормально ли «предпочитать» данные акселерометра?

Кроме того, когда угол объекта необходимо контролировать в течение длительного периода времени, не становятся ли данные гироскопа бесполезными, поскольку дрейф настолько велик, как фильтр компенсирует это?


person MrBigRig    schedule 03.03.2017    source источник


Ответы (2)


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

GyroAngle += d°/s * time_between_cycles
FilteredAngle = 0.98*GyroAngle + 0.02*AccelerometerAngle

Вместо этого я должен был делать это:

FilteredAngle = 0.98*(FilteredAngle + d°/s * time_between_cycles) + 0.02*AccelerometerAngle

Выполнение этого дало гораздо лучшие результаты

person MrBigRig    schedule 04.03.2017

Я пытаюсь сделать что-то похожее на это. Я реализую дополнительный фильтр в своем коде Arduino, используя датчик LSM9DS0 (он имеет встроенный гироскоп/акселерометр https://www.adafruit.com/product/2021

Есть значение фильтра, с которым я играл, и метод калибровки, который я пытаюсь использовать, но я не могу избавиться от него на 100%. Всегда есть небольшое отклонение от угла, и я никогда не могу получить 100% отфильтрованный угол без ошибок.

person user7838253    schedule 30.05.2018