Hallo,
ich möchte einen 1-dimensionalen Kalmanfilter mit Simulink simulieren.
Leider ist das Ausgangssignal vom erwarteten Signal verschoben.
Gemessen wird ein System 1. Ordnung G_s(s)=K_s/(T_s*s+1), das mit einem
Einheitssprung erregt wird.
Nach der Z-Transformation
G_s(z)=(K_s/T_s)/(1-exp(-T_A/T_s)*z^(-1))
komme ich auf die Kalman Parameter
B = K_s / T_s
F = exp(-T_A/T_s)
H = 1
Nachfolgend das m file:
Ich habe alles überprüft und kann den Fehler einfach nicht finden. Im
Anhang ist der Plot, der einige Signale des Filters enthält. Vielleicht
kann man daran erkennen, was falsch ist. Das blaue Signal x ist das
physikalische Signale, welches ziemlich genau dem gemessenen Signal
(grün) entspricht. Das rote Signal ist das Ausgangssignal vom Kalman
Filter.
Ich habe keine Ahnung von den Filtern und hoffe jemand kann mir beim
Einstieg helfen.
Hallo nochmal.
Ich habe nochmal die Predict und Correct Funktion mit anderen Quellen
verglichen, diese sind m.E. richtig.
Nun habe ich ein bisschen mit den Parametern rumgespielt und dabei
folgendes festgestellt:
* Der geschätzte Wert xKal bewegt sich abhängig von der Varianz des
Sensors R zwischen dem tatsächlichen Signal x und dem Signal xk|k-1. Ist
R sehr klein z.B. 1e-6 entspricht es ziemlich genau dem tatsächlichen
Signal, ist R relativ "groß", z.B. 1 entspricht es ziemlich genau
xk|k-1, bei z.B. R=1e-4 so ist es zwischen den beiden Signalen.
* Die Funktion xk|k-1 ist über die ganze Zeit ziemlich genau um
1/B=Ts/Ks zum tatsächlichen Signal verschoben.
Wenn ich mir das ein bisschen zusammenreime, soll xk|k-1 der geschätzte
Wert, abhänging vom bekannten System [F, B, H], dem
System-Eingangssignal u und der vorherigen Schätzung (bzw. dem Zustand)
x[k-1] sein. Abhängig von der Varianz des Sensors R wird entweder eher
dem gemessenen Signal oder dem vorausberechneten Signal "geglaubt".
Falls ich mir das richtig zusammengereimt habe, bleibt die Frage warum
das Signal xk|k-1 mit dem tatsächlichen Signal eine Differenz von Ts/Ks
hat. Müsste xk|k-1 nicht ziemlich genau dem idealen Signal entsprechen?
Woher kommt diese Differenz?
Schlechterwisser schrieb:> Hallo nochmal.>
Hallo!
> Ich habe nochmal die Predict und Correct Funktion mit anderen Quellen> verglichen, diese sind m.E. richtig.>
Bin leider unterwegs und kann die im Moment nicht nachvollziehen,
vielleicht schaff ichs später.
> Nun habe ich ein bisschen mit den Parametern rumgespielt und dabei> folgendes festgestellt:>> * Der geschätzte Wert xKal bewegt sich abhängig von der Varianz des> Sensors R zwischen dem tatsächlichen Signal x und dem Signal xk|k-1. Ist> R sehr klein z.B. 1e-6 entspricht es ziemlich genau dem tatsächlichen> Signal, ist R relativ "groß", z.B. 1 entspricht es ziemlich genau> xk|k-1, bei z.B. R=1e-4 so ist es zwischen den beiden Signalen.>
xKal ist nach dem Update durch den Sensor, richtig? R klein bedeutet,
dass dem Sensor mehr geglaubt wird (im Prinzip ist das Verhältnis von R
zu Q wichtig). Wenn xk|k-1 der prädizierte Wert nach der Predict Phase
sprich nach Lösen deiner DGL ist, ist macht dieses Verhalten Sinn.
> * Die Funktion xk|k-1 ist über die ganze Zeit ziemlich genau um> 1/B=Ts/Ks zum tatsächlichen Signal verschoben.>
Dann stimmt möglicherweise was mit deinem Systemmodell nicht (denn das
schätzt ja anscheinend deinen Zustand konsequent zu spät?).
>> Wenn ich mir das ein bisschen zusammenreime, soll xk|k-1 der geschätzte> Wert, abhänging vom bekannten System [F, B, H], dem> System-Eingangssignal u und der vorherigen Schätzung (bzw. dem Zustand)> x[k-1] sein. Abhängig von der Varianz des Sensors R wird entweder eher> dem gemessenen Signal oder dem vorausberechneten Signal "geglaubt".>
Da stehts ja.. genau so ist das. Aber die Kovarianzmatrix Q kommt noch
mit dazu, die angibt, wie stark das Rauschen in den Zuständen deines
Systemmodells ist.
> Falls ich mir das richtig zusammengereimt habe, bleibt die Frage warum> das Signal xk|k-1 mit dem tatsächlichen Signal eine Differenz von Ts/Ks> hat. Müsste xk|k-1 nicht ziemlich genau dem idealen Signal entsprechen?> Woher kommt diese Differenz?
Wie gesagt möglicherweise ein fehlerhaftes Modell oder falsche
Anfangszustände?
Was anderes, es macht einen Unterschied, ob du ein zeitkontinuierliches
oder zeitdiskretes Modell schätzen möchtest. Man kann ersteres in
zweiteres umrechnen, im Simulink Modell hast du einen Schalter. Nutzt du
nur das diskrete Modell? Die Systemmatrix und die Kovarianzmatrizen
verändern sich nämlich von Fall zu Fall, siehe z.B.
https://cs.adelaide.edu.au/~ianr/Teaching/Estimation/LectureNotes2.pdf ,
Kapitel 1.11
Jan K. schrieb:> Bin leider unterwegs und kann die im Moment nicht nachvollziehen,> vielleicht schaff ichs später.
Das wäre klasse!
Jan K. schrieb:> xKal ist nach dem Update durch den Sensor, richtig?
Richtig. Der Ausgang des Correction Blocks und somit auch des
Kalmanfilters.
Jan K. schrieb:> R klein bedeutet,> dass dem Sensor mehr geglaubt wird (im Prinzip ist das Verhältnis von R> zu Q wichtig).
Du hast recht. Wenn R im Vergleich zu Q groß ist, nähert sich das
Ausgangssignal xKal an das Signal xk|k-1 an. Wenn R im Vergleich zu Q
klein ist, nähert sich das Ausgangssignal an das gemessene Signal an.
Jan K. schrieb:> Wenn xk|k-1 der prädizierte Wert nach der Predict Phase> sprich nach Lösen deiner DGL ist, ist macht dieses Verhalten Sinn.
Gut. Dann muss ich nurnoch rausfinden warum dieses Signal verschoben
ist.
Jan K. schrieb:> Dann stimmt möglicherweise was mit deinem Systemmodell nicht (denn das> schätzt ja anscheinend deinen Zustand konsequent zu spät?).
Nicht zu spät. Das Signal ist auf der vertikalen Achse über die gesamte
Zeit konstant verschoben. Mein Aussage von gestern, dass diese
Verschiebung Ts/Ks groß ist muss ich zurücknehmen. Bei anderen
Parametern ergeben sich auch andere Verschiebungen. Bei jeder Simulation
scheint aber die Verschiebung über die gesamte Zeit eine konstante
Differenz (abgesehen von ein wenig Rauschen) zu den gemessenen Werten zu
haben.
Jan K. schrieb:> Dann stimmt möglicherweise was mit deinem Systemmodell nicht (denn das> schätzt ja anscheinend deinen Zustand konsequent zu spät?).
Das könnte gut sein.
Jan K. schrieb:> Wie gesagt möglicherweise ein fehlerhaftes Modell oder falsche> Anfangszustände?
Da hatte ich auch drüber nachgedacht, gerade weil die Verschiebung stets
konstant zu sein scheint. Andererseits startet ja auch das simulierte
System mit der Startbedingung x[0] = 0. Ich denke eher, es liegt am
falschen Systemmodell.
Jan K. schrieb:> Nutzt du> nur das diskrete Modell?
Ja, ich nutze das diskrete Modell.
Im Anhang habe ich nochmal das diskretisierte System angehängt, welches
im kalmanTest.png vor dem "Manual Switch" zu sehen ist. Die Ausgänge des
diskreten Systems und der parallelen Transfer Fcn darüber entsprechen
einander. Die Z-Transformation und die Parameter B und F scheinen also
richtig zu sein. Ich bin nur ein bisschen skeptisch, dass ich das Signal
in dem System-Block nochmal mit der Abtastzeit T_A multiplizieren
musste, damit es stimmt.
Ich kann mich noch wage ans Studium erinnern, dass g(n)=T_a * g(n*T_A),
womit ich dies erklären kann. Was ich aber nicht verstehe, warum nicht
auch der Measure Block oder der Kalman Block eine Multiplikation mit T_A
benötigt. Aber vermutlich such ich hier an einer vollommen falschen
Stelle.
Hallo,
ich habe den Fehler endlich gefunden. Die Multiplikation mit Ta in dem
System Block habe ich rausgenommen und vor den Eingang des Systems
gesetzt, so dass auch der u-Eingang des Kalman Filters mit Ta
multipliziert wird.
Schon funktioniert das ganze. :-)