Przede wszystkim po raz pierwszy próbuję stworzyć filtr Kalmana.
Wcześniej opublikowałem następujące pytanie: Odfiltruj hałas i odchylenia od wartości prędkości na StackOverflow, które opisują tło tego postu. Jest to typowa próbka wartości, które próbuję odfiltrować. Nie muszą się zmniejszać, co ma miejsce w tym przypadku. Ale tempo zmian jest zwykle takie
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
Zaimplementowałem mój filtr Kalmana zgodnie z tym samouczkiem: Filtr Kalmana dla manekinów .
Moja implementacja wygląda następująco (pseudokod).
//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
Zaczynam od wcześniejszej oceny 0. To wydaje się działać dobrze. Ale zauważam, że kalmanGain będzie się zmniejszał za każdym razem, gdy ta aktualizacja zostanie uruchomiona, co oznacza, że ufam moim nowym wartościom, im dłużej mój filtr działa (?). Nie chce tego
Przeszedłem od używania średniej ruchomej (prostej i ważonej wykładniczo) do korzystania z tego. W tej chwili nie mogę nawet uzyskać tak dobrych rezultatów.
Moje pytanie brzmi, czy jest to właściwa implementacja i czy moja poprzednia wariancja błędu i odchylenie standardowe wyglądają dobrze zgodnie z wartościami próbki, które opublikowałem? Moje parametry są właśnie wybierane losowo, aby sprawdzić, czy mogę uzyskać dobre wyniki. Próbowałem kilku różnych zakresów, ale ze słabymi wynikami. Jeśli masz jakieś sugestie dotyczące zmian, które mogę wprowadzić, byłoby to bardzo mile widziane. Przepraszam, jeśli brakuje jakichś oczywistych rzeczy. Po raz pierwszy też tutaj zamieszczam posty.