Zunächst einmal versuche ich zum ersten Mal, einen Kalman-Filter zu erstellen.
Ich habe zuvor die folgende Frage gestellt: Herausfiltern von Geräuschen und Abweichungen von Geschwindigkeitswerten auf StackOverflow, die den Hintergrund für diesen Beitrag beschreibt. Dies ist eine typische Stichprobe von Werten, die ich filtern möchte. Sie müssen nicht unbedingt abnehmen, was hier der Fall ist. Die Änderungsrate ist jedoch normalerweise so
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
Ich habe meinen Kalman-Filter gemäß diesem Tutorial implementiert: Kalman-Filter für Dummies .
Meine Implementierung sieht so aus (Pseudocode).
//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
Ich beginne mit einer vorherigen Schätzung von 0. Dies scheint gut zu funktionieren. Was ich jedoch bemerke, ist, dass der kalmanGain jedes Mal abnimmt, wenn dieses Update ausgeführt wird, was bedeutet, dass ich meinen neuen Werten weniger vertraue, je länger mein Filter ausgeführt wird (?). Das will ich nicht
Ich ging von einem gleitenden Durchschnitt (einfach und exponentiell gewichtet) zu diesem über. Im Moment kann ich nicht einmal so gute Ergebnisse erzielen.
Meine Frage ist, ob dies die richtige Implementierung ist und ob meine vorherige Fehlervarianz und Standardabweichung gemäß den von mir veröffentlichten Beispielwerten gut aussieht. Meine Parameter werden eigentlich nur zufällig ausgewählt, um zu sehen, ob ich gute Ergebnisse erzielen kann. Ich habe verschiedene Bereiche ausprobiert, aber mit schlechten Ergebnissen. Wenn Sie Vorschläge zu Änderungen haben, die ich vornehmen kann, wäre ich Ihnen sehr dankbar. Es tut mir leid, wenn einige offensichtliche Dinge fehlen. Auch hier zum ersten Mal posten.