Ultrasonic sensor outlier filter

Привет техмейкерам!
Решил написать драйвер для FunduMoto shield под нуклео 446 + андроид клиент приложение. Общение по блютузу. В набор датчиков входит сонар HC - SR04. Настроил таймер с прерываниями, счетчик ШИМ 10 мкс пробросил к пину Trigger. Всё как в лекциях, в общем.

Проблема в том, что полученные от сонара сырые данные расстояния (1) зашумленны и (2) много выбросов (outliers). Если экспоненциальное скользящее среднее справится с шумом, то как бороться в выбросами, если сонар подвешен на серво, который крутится? Робот двигается, разумеется.

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

Решение, как мне кажется, лежит в накоплении последних N измерений в буфер с соответствующим отсеиванием 1-2 значений из N. Сонар настроен на частоту 10; при желании, можно поднять до 20. При таких частотах не должно быть заметно, что данные “остают” во времени, и при этом, много измерений при фиксированном положении серва позволят отфильтровать выбросы.

Не хотел создавать велосипед. Подумал, здесь люди должны знать.

1 Like

Традиционно для борьбьі с вьібросами можно заменить усреднение на медианньій фильтр. Очень просто и возможно будет достаточно, зависит от нюансов задачи.

Идеальньім решением подобной задачи скорее всего бьіл бьі фьюжен одометрии робота/сервьі с сигналами сонара при помощи фильтра Калмана. Но такое решение может бьіть довольно сложньім в имплементации/тюнинге.

2 Likes