Используем фильтр Калмана на Ардуино

Arduino & Pi

1.4K постов20.6K подписчиков

Добавить пост

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

5
DELETED
Автор поста оценил этот комментарий

В дополнительных региональных настройках винды можно заменить запятую на точку в Excel.

Иллюстрация к комментарию
Автор поста оценил этот комментарий

Что то это нифига не фильтр Калмана.

Автор поста оценил этот комментарий

И да мне обидно за то, что ты называешь сильношумящим датчик BMP180. Даже фильтрации данных с датчика шум от него по высоте не превышает метра (производитель заявляет 50 сантиметров в режиме экономии энергии и 17 сантиметров в режиме повышенного разрешения). То есть даже без дополнительной фильтрации видно как ты перекладываешь датчик со стола на пол и наоборот. И я считаю это более чем отличным результатом.

раскрыть ветку
Автор поста оценил этот комментарий

В переменных Pc, G, P и т д хранится информация о прошлых измерениях. И если вдруг я захочу фильтровать значения не от одного датчика, а от 10, то мне придется создавать 10 наборов таких переменных и создавать 10 дубликатов этой функции, что согласись мягко говоря не очень удобно. Лучше использовать структуры или классы, например вот так

https://gist.github.com/anonymous/7ae54f90fa923d055a5edcc29c...


В этом случае для каждого канала будет легко создать свой набор переменных


KalmanFilterTypeDef FilterTemp, FilterPressure, FilterADC;


на этапе инициализации фильтра указать для каждого канала свои параметры фильтрации


KalmanFilterInit(&FilterTemp, 0.26, 0.01);

KalmanFilterInit(&FilterPressure, 0.46, 0.1);

KalmanFilterInit(&FilterADC, 0.21, 0.0024);


и пользоваться одной и той же функцией для фильтрации нескольких каналов


Temp = KalmanFilter(&FilterTemp, NewTemp);

Pressure = KalmanFilter(&FilterPressure, NewPressure);

ADC = KalmanFilter(&FilterADC, NewADC);

раскрыть ветку
Автор поста оценил этот комментарий

Кстати, полезно. Хотел как-то сделать подсветку, которая меняет свой цвет в зависимости от угла наклона, начал делать на mpu6050, но значения даже с Калманом получались довольно нестабильные. И вот не знаю то ли я рукожоп, то ли фильтр действительно не идеален

раскрыть ветку