Prima di tutto, questa è la prima volta che provo a creare un filtro Kalman.
In precedenza avevo pubblicato la seguente domanda Filtrare il rumore e le variazioni dai valori di velocità su StackOverflow che descrive lo sfondo di questo post. Questo è un tipico esempio di valori che sto cercando di filtrare. Non devono necessariamente diminuire, come è il caso qui. Ma il tasso di cambiamento è in genere così
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
Ho implementato il mio filtro Kalman secondo questo tutorial: Kalman Filter for Dummies .
La mia implementazione è simile a questa (pseudocodice).
//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
Comincio con una stima precedente di 0. Questo sembra funzionare bene. Ma quello che noto è che kalmanGain diminuirà ogni volta che viene eseguito questo aggiornamento, il che significa che mi fido dei miei nuovi valori meno tempo fa il mio filtro è in esecuzione (?). Non lo voglio.
Sono passato dall'usare una media mobile (semplice ed esponenziale ponderata) all'utilizzo di questa. In questo momento non riesco nemmeno a ottenere buoni risultati.
La mia domanda è se questa è l'implementazione giusta e se la mia varianza di errore e la deviazione standard precedenti sembrano buone in base ai valori di esempio che ho pubblicato? I miei parametri sono in realtà scelti a caso per vedere se sono riuscito a ottenere dei buoni risultati. Ho provato diverse gamme diverse ma con scarsi risultati. Se hai qualche suggerimento per le modifiche che posso fare, sarebbe molto apprezzato. Mi dispiace se mancano alcune cose ovvie. Pubblicare la prima volta anche qui.