Forum: Digitale Signalverarbeitung / DSP / Machine Learning Problem mit Kalman Filter


von Schlechterwisser (Gast)


Angehängte Dateien:

Lesenswert?

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:
1
clear;
2
% ==================================================================== %
3
% Abtastzeit
4
Ta = 1e-2;
5
Tmax = 20;
6
7
% Stecke
8
Ts = 5;
9
Ks = 3;
10
simgaSystem = 0.01;
11
sigmaSensor = 0.01;
12
H = 1;                 % Sensor factor
13
14
% ==================================================================== %
15
16
% System parameters
17
B = Ks / Ts
18
F = exp(-Ta/Ts)
19
20
% varianzes
21
Q = simgaSystem * simgaSystem;  % Varianz des Systemrauschens
22
R = sigmaSensor * sigmaSensor;  % Varianz des Messrauschens
23
24
sim('simpleKalman.mdl');
25
plot(t, x, t, z, t, xKal, t, xk1, t, y, t, S, t, K);
26
legend('x','z','xKal', 'xk|k-1', 'y', 'S', 'K')

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.

von Schlechterwisser (Gast)


Lesenswert?

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?

von Jan K. (jan_k)


Lesenswert?

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

von Schlechterwisser (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Schlechterwisser (Gast)


Angehängte Dateien:

Lesenswert?

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. :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.