Перш за все, це перший раз, коли я намагаюся зробити фільтр Кальмана.
Раніше я розміщував наступне запитання Відфільтруйте шум та відхилення від значень швидкості на StackOverflow, де описується фон для цієї публікації. Це типовий зразок значень, який я намагаюся фільтрувати. Вони не обов'язково повинні зменшуватись, що стосується тут. Але швидкість змін зазвичай така
X ------- Y
16 --- 233,75
24 --- 234,01
26 --- 234,33
32 --- 234,12
36 --- 233,85
39 --- 233,42
47 --- 233,69
52 --- 233,68
55 --- 233,76
60 --- 232,97
66 --- 233,31
72 --- 233,99
Я реалізував свій фільтр Kalman відповідно до цього підручника: Kalman Filter for Dummies .
Моя реалізація виглядає приблизно так (псевдокод).
//Standard deviation is 0.05. Used in calculation of Kalman gain
void updateAngle(double lastAngle){
if(firsTimeRunning==true)
priorEstimate = 0; //estimate is the old one here
priorErrorVariance = 1.2; //errorCovariance is the old one
else
priorEstimate = estimate; //estimate is the old one here
priorErrorVariance = errorCovariance; //errorCovariance is the old one
rawValue = lastAngle; //lastAngle is the newest Y-value recieved
kalmanGain = priorErrorVariance / (priorErrVariance + 0.05);
estimate = priorEstimate + (kalmanGain * (rawValue - priorEstimate));
errorCovariance = (1 - kalmanGain) * priorErrVariance;
angle = estimate; //angle is the variable I want to update
} //which will be lastAngle next time
Я починаю з попередньої оцінки 0. Це, здається, працює добре. Але я помічаю, що kalmanGain зменшуватиметься кожного разу, коли це оновлення запускається, це означає, що я довіряю своїм новим значенням менше, чим довше працює мій фільтр (?). Я цього не хочу.
Я перейшов від простого використання ковзної середньої (простої та експоненціальної зваженої) до використання цього. Зараз я навіть не можу отримати таких хороших результатів, як це було.
Моє запитання: чи це правильна реалізація, і якщо моя попередня відхилення помилок і стандартне відхилення виглядають добре відповідно до наведених нами зразків? Мої параметри насправді вибираються випадковим чином, щоб побачити, чи зможу я отримати хороші результати. Я спробував кілька різних діапазонів, але з поганими результатами. Якщо у вас є якісь пропозиції щодо змін, які я можу зробити, це буде дуже вдячно. Вибачте, якщо відсутні якісь очевидні речі. Перший раз також розміщую тут.