Прежде всего, я впервые пытаюсь сделать фильтр Калмана.
Ранее я опубликовал следующий вопрос « Отфильтровать шум и отклонения от значений скорости» в 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
Я реализовал свой фильтр Калмана в соответствии с этим руководством: Фильтр Калмана для чайников .
Моя реализация выглядит так (псевдокод).
//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 будет уменьшаться при каждом запуске этого обновления, что означает, что я доверяю своим новым значениям тем меньше, чем дольше работает мой фильтр (?). Я не хочу этого
Я перешел от простого скользящего среднего (простого и экспоненциально взвешенного) к использованию этого. Прямо сейчас я не могу получить такие же хорошие результаты, как это.
Мой вопрос заключается в том, является ли это правильной реализацией, и если моя предыдущая дисперсия ошибок и стандартное отклонение выглядят хорошо в соответствии с примерами значений, которые я опубликовал? Мои параметры на самом деле просто выбираются случайным образом, чтобы посмотреть, смогу ли я получить хорошие результаты. Я пробовал несколько разных диапазонов, но с плохими результатами. Если у вас есть какие-либо предложения по изменениям, которые я могу сделать, это будет очень признательно. Извините, если отсутствуют некоторые очевидные вещи. Первое размещение здесь тоже.