Привет техмейкерам!
Решил написать драйвер для FunduMoto shield под нуклео 446 + андроид клиент приложение. Общение по блютузу. В набор датчиков входит сонар HC - SR04. Настроил таймер с прерываниями, счетчик ШИМ 10 мкс пробросил к пину Trigger. Всё как в лекциях, в общем.
Проблема в том, что полученные от сонара сырые данные расстояния (1) зашумленны и (2) много выбросов (outliers). Если экспоненциальное скользящее среднее справится с шумом, то как бороться в выбросами, если сонар подвешен на серво, который крутится? Робот двигается, разумеется.
Казалось бы, простой вопрос и каждый любитель сталкивался с подобным, а нагуглить подходящего не нашел. Люди статьи пишут, школьники обсуждают на форумах ардуино, а мне бы код рабочий на С… такой, как в фильтре Маджвика.
Решение, как мне кажется, лежит в накоплении последних N измерений в буфер с соответствующим отсеиванием 1-2 значений из N. Сонар настроен на частоту 10; при желании, можно поднять до 20. При таких частотах не должно быть заметно, что данные “остают” во времени, и при этом, много измерений при фиксированном положении серва позволят отфильтровать выбросы.
Не хотел создавать велосипед. Подумал, здесь люди должны знать.