goMatlab - Mein MATLAB Forum

Mein MATLAB Forum

 
Login  | Registrieren
Bücher:

MATLAB und Simulink Lernen

Fachkräfte:
Softwareentwickler MATLAB/Simulink (w/m)
Erarbeitung von Lösungen im Bereich der Schnittstelle zum Simulink-Modell und der Benutzeroberfläche von TargetLink
dSPACE GmbH - Paderborn

Testingenieur (w/m) Testframework für Simulink-basierte Echtzeitanwendungen
Pflege des MATLAB/Simulink-Testframeworks, Spezifizieren von Testkriterien, Testfällen und Testszenarien
dSPACE GmbH - Paderborn

Testingenieur (w/m) Konfigurationswerkzeuge für Echtzeitsysteme
Einbinden von Simulink®-Simulationsmodellen, Verteilung der Simulationsmodelle auf Multicore- und Multiprozessorsysteme
dSPACE GmbH - Paderborn

Senior Softwareingenieur/in
Entwicklung von Funktionen
ESG Elektroniksystem- und Logistik-GmbH - München

Techniker als Systemspezialist/in für Test und Absicherung (Automotive)
Testing und Absicherung von Steuergeräte-Softwarefunktionen und deren Vernetzung auf Komponenten- und Systemebene
ESG Elektroniksystem- und Logistik-GmbH - Wolfsburg

weitere Angebote

Partner:




Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Parameterschätzung mit nichtlinearem Kalman-Filter (EKF/UKF)

 

EliteTUM
Forum-Anfänger
Forum-Anfänger

Beiträge: 43
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 05.01.2012, 20:56     Titel: Parameterschätzung mit nichtlinearem Kalman-Filter (EKF/UKF)
  Antworten mit Zitat      
Hallo an alle,

war nicht sicher, ob das Problem eher zu Regelungstechnik oder Signalverarbeitung gepackt werden soll. Ich versuchs mal hier, ansonsten bitte verschieben Smile

Also, ich wollte mich mal an Parameterschätzung mittels Kalman-Filterung wagen. Zu Beginn auf noch eine relative simple weise. Als Testsystem habe ich dabei das "Random (Wally) Walk"-Beispiel aus folgender Quelle genommen: http://www.personal.reading.ac.uk/~.....otes_on_kalman_filter.pdf

In Zustandsraumdarstellung sieht dieses wie folgt aus:

\frac{d}{dt} \vec{x} = \begin{vmatrix} 0 & 1 & 0 & 0 \\  0 & - \frac{1}{T}  & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 0 &  - \frac{1}{T} \end{vmatrix} \vec{x} + \begin{pmatrix} 0 & 0 \\ 0 & 1 \\ 0 & 0 \\ 1 & 0  \end{pmatrix}  \vec{u}

Der Parameter T ist dabei einfach (irgend-)eine Zeitkonstante. Diese will ich später durch einen Kalman-Filter schätzen. Um die Parameterschätzung zu einer Zustandsschätzung zu reduzieren, kann man den Parameter ja einfach als Zustand einführen (wie z.B. in Parameter Estimation for Mechanical.....an Extended Kalman Filter beschrieben). Einziger Nachtel ist dabei, dass man dadurch i.d.R. ein nichtlineares System erhält und dadurch nur noch nicht-lineare Kalman-Filter verwenden kann.
In diskreter Form ergibt sich dann nachfolgende nichtlineare Zustandsgleichung:

\vec{x}(k+1) = \begin{pmatrix} x_{1}({k+1}) \\ x_{2}({k+1}) \\ x_{3}({k+1}) \\ x_{4}({k+1}) \\ x_{5}({k+1})  \end{pmatrix} = f(\vec{x}(k),\vec{u}(k)) = \begin{pmatrix} x_{2}({k}) \\ -\frac{1}{x_{5}(k)} x_{2}(k) + u_{2}(k) \\ x_{4}(k) \\  -\frac{1}{x_{5}(k)} x_{4}(k) + u_{1}(k) \\ x_{5}(k) \end{pmatrix}

Hoffe bisher stimmt mein Gedankengang? Die Zahl im Index soll die Nummer des Zustandes sein, durchnummeriert von x_1 bis x_5. Der Zustand x_5 entspricht dabei der Zeitkonstante T.
Da es sich um die diskrete Form handelt, wird ja nicht die Ableitung angegeben (also keine ODEs) sondern eine Gleichung für den Zustand zum nächsten Zeitpunkt. Deshalb steht in der letzten Zeile auch, dass der Zustand x_5 konstant bleibt, also zum Zeitpunkt k und k+1 gleich ist. Das passt doch so, oder?

Nun verwende ich die beiden nichtlinearen Kalman-Filter nach Yi Cao von MatLab-Central, in etwas abgeänderter Form. Die Originale gibts hier:
Extended Kalman Filter (EKF): http://www.mathworks.com/matlabcent.....lman-filter/content/ekf.m
Unscented Kalman Filter (UKF): http://www.mathworks.com/matlabcent.....lman-filter/content/ukf.m

Meine abgeäderten Varianten sind angehängt!

Sooo, nun langer Rede kurzer Sinn: ich versuche das ganze nun in einem Skript in einzelnen Schritten zu simulieren und danach mittels Kalman-Filter die Zustände zu schätzen. Das funktioniert für x_1 bis x_4 auch super. Aber ausgerechnet der Parameter (= Zustand) x_5 wird falsch geschätzt. Kann mir einer einen Tipp geben wieso und wie ich das behebe?

Mein gesamter Code sieht dann so aus (hänge es auch als MatLab-Skript an!):

Code:
%   Test EKF and UKF for 'Random Wally Walk'
clear;
clc;

%%  Configuration
n = 5;          % number of states
T = 3;          % time constant for Wally

N = 200;        % total dynamic steps

qt = 0.6;       % true std of process
rt = 0.3;       % true std of measurement

q = 0.6;        % std of process (assumed value)
r = 0.3;        % std of measurement (assumed value)
Q = q^2*eye(n); % covariance of process
R = r^2;        % covariance of measurement  

%%  Preparation

% allocate memory
sR = zeros(n,N);    % reference
sV = zeros(n,N);    % reference + process noise
zV = zeros(2,N);    % measurement
xV = zeros(n,N);    % estimate for EKF
xVu = zeros(n,N);    % estimate for UKF


%%  1. Step - Create a (ideal) Reference Simulation of our Dynamic System
%
%   This will represent our System as it would behave in an ideal world.
%   The System-Behaviour is described by the non-linear function f(x,u).
%   The System-Input is u, The System-States x.

f = @(x,u)[x(2); -1/x(5) * x(2) + u(2); x(4); -1/x(5) * x(4) + u(1); x(5)];
              % non-linear state equation for 'random wally walk'

% Simulate a walk of N steps where the input is a [0,1] random variable
u=randn(N,2);


s_init = [0;0;1;0;T];
              % initial state

s = s_init;

% Now let's calculate all N simulation steps for our discrete System
for k = 1:N
  sR(:,k)= s;                      % save actual state
  s = f(s,u(k,:));                 % update process
end


%%  2. Step - Add Process Noise to the Dynamic System
%
%   We simulated the ideal behaviour of our System in Step 1.
%   Because of NOT ideal conditions, we have deviations between
%   ideal and non-ideal behaviour. This is to be represented here
%   with the true random process noise qt.

for k = 1:N
  sV(:,k)= sR(:,k) + [qt * randn(n-1,1); 0];    % save state of reference + process noise
end


%%  3. Step - Make Measurement's (with Measurement Noise)
%
%   Our measurement's are defined in our measurement equation h(x,u).
%  

h=@(x,u)[x(1); x(3)];
              % measurement equation
              % we will be able to make a direct measure of
              % only the x/y positions


for k = 1:N
  z = h(sV(:,k),u(k,:)) + rt * randn(2,1);   % make measurement from the reference + process noise by passing it to h(x,u)
                                             % additionally we have to add the true measurement noise rt

  zV(:,k)  = z;                              % save measurments
end


%%  4. Step - Do the Filtering with the EKF (Extended Kalman Filter)
%
%

x = s_init + [qt * randn(n-1,1); 0];
              % initial state with process noise

P = eye(n);
              % initial state covariance
             
for k = 1:N
  [x, P] = ekf(f,x,u(k,:),P,h,zV(:,k),Q,R);     % ekf
  xV(:,k) = x;                                  % save estimate
end


%%  5. Step - Do the Filtering with the UKF (Unscented Kalman Filter)
%
%

x = s_init + [qt * randn(n-1,1); 0];
              % initial state with process noise

P = eye(n);
              % initial state covariance
             
for k = 1:N
  [x, P] = ukf(f,x,u(k,:),P,h,zV(:,k),Q,R);     % ukf
  xVu(:,k) = x;                                  % save estimate
end


%%  6. Step - Plot
%
%   Make Plots of everything done above.
%  

subplot(n,1,1)
plot(1:N, sR(1,:), 'r-', 1:N, sV(1,:), 'b-.', 1:N, zV(1,:), 'g-', 1:N, xV(1,:), 'k:', 1:N, xVu(1,:), 'm--')
legend('Reference', 'Reference + Process Noise', 'Measurement', 'EKF', 'UKF');
subplot(n,1,2)
plot(1:N, sR(2,:), 'r-', 1:N, sV(2,:), 'b-.', 1:N, xV(2,:), 'k:', 1:N, xVu(2,:), 'm--')
subplot(n,1,3)
plot(1:N, sR(3,:), 'r-', 1:N, sV(3,:), 'b-.', 1:N, zV(2,:), 'g-', 1:N, xV(3,:), 'k:', 1:N, xVu(3,:), 'm--')
subplot(n,1,4)
plot(1:N, sR(4,:), 'r-', 1:N, sV(4,:), 'b-.', 1:N, xV(4,:), 'k:', 1:N, xVu(4,:), 'm--')
subplot(n,1,5)
plot(1:N, sR(5,:), 'r-', 1:N, sV(5,:), 'b-.', 1:N, xV(5,:), 'k:', 1:N, xVu(5,:), 'm--')





Bin für jede Hilfe dankbar!

Viele Grüße!

plots.jpg
 Beschreibung:
Plots für die 5 Zustände

Download
 Dateiname:  plots.jpg
 Dateigröße:  107.46 KB
 Heruntergeladen:  23 mal
exampleParamEst_EKF_UKF.m
 Beschreibung:
Beispiel für Parameterschätzung mittels EKF und UKF

Download
 Dateiname:  exampleParamEst_EKF_UKF.m
 Dateigröße:  3.93 KB
 Heruntergeladen:  25 mal
ukf.m
 Beschreibung:
abgeänderte Version des UKF, welcher auch die Übergabe des Inputs u erlaubt.

Download
 Dateiname:  ukf.m
 Dateigröße:  4.3 KB
 Heruntergeladen:  14 mal
ekf.m
 Beschreibung:
abgeänderte Version des EKF, welcher auch die Übergabe des Inputs u erlaubt.

Download
 Dateiname:  ekf.m
 Dateigröße:  3.11 KB
 Heruntergeladen:  13 mal

_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Guru
Forum-Guru

Beiträge: 367
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2012, 09:56     Titel:
  Antworten mit Zitat      
Hallo,

das ist mal ein Paradebeispiel für eine ordentliche Fragestellung (Quellcode gepostet, Quellen zitiert, etc.).

Allerdings ist der Übergang von der DGL zur Differenzengleichung nicht richtig. Du musst die Zeitableitung richtig diskretisieren. z.B. für gilt:

x_1(k+1) = x_1(k) + \Delta t x_2(k)

Warum der Filter nicht funktioniert kann ich allerdings auf die Schnelle nicht erkennen.

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
EliteTUM
Themenstarter

Forum-Anfänger
Forum-Anfänger

Beiträge: 43
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 06.01.2012, 13:46     Titel:
  Antworten mit Zitat      
Hallo Thomas84,

Danke für den hinweis! Puh, daran habe ich natürlich nicht gedacht. In der Quelle des "Random Wally Walk"-Beispiels wird tatsächlich kontinuierlich gerechnet.

Da es sich leider um 2 nicht-lineare und 2 lineare DGLs handelt kann ich leider nicht einfach den c2d-Befehl von MatLab verwenden, denke ich mal...
Interessant wäre, ob ich das ganze Beispiel auf zeitkontinuierliche Rechnung ummünzen kann. Ich hoffe mal das ist aufwandsärmer.

Zum Problem der schlechten/falschen Zustands-/Parameterschätzung ist mir ein einfaches aber leider grundlegendes Stichwort eingefallen: Beobachtbarkeit! Ich habe noch nicht untersucht, ob das System in der Form beobachtbar ist. Leider ist das auch nicht so trivial wie bei linearen Systemen. Kein Wunder, dass in der Wirtschaft immer nur mit "langweiligen" linearen Systemen gerechnet wird, es ist soviel schöner/einfacher Very Happy

Habe auf die schnelle Änderungen am Code durchgeführt und die Zustände 2 und 4 ebenfalls als messbar angenommen. Die Ergebnisse sind dann immer noch nicht zufriedenstellend, aber wenigstens steigen sie nicht einfach nur an sondern der Filter scheint wirklich zu versuchen den Parameter zu schätzen.

Andere Eingabesignale (anstatt eines Random-Signals) haben bisher keine Änderungen ergeben.

Sollte ich noch Zeit haben die ich hierin investiere, werde ich weitere (hoffentlich positive) Ergebnisse posten.
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
EliteTUM
Themenstarter

Forum-Anfänger
Forum-Anfänger

Beiträge: 43
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 06.01.2012, 13:50     Titel:
  Antworten mit Zitat      
Noch vergessen: Kann mir jemand sagen, wie ich für den fünften Zustand x_5 die DGL zeitkontinuierlich darstellen kann? Die Ableitung ist ja null, weil der Wert im idealen Fall konstant ist. zeitdiskret lässt sich das ja schön darstellen wie ich es gemacht habe. Aber zeitkontinuierlich?
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
EliteTUM
Themenstarter

Forum-Anfänger
Forum-Anfänger

Beiträge: 43
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 10.01.2012, 22:54     Titel:
  Antworten mit Zitat      
so, Update von meiner Seite:

Habe es geschafft das EKF umzuschreiben, so dass es im zeitkontinuierlichen Bereich funktioniert - also zu einem Extended Kalman-Bucy-Filter (EKBF). Ich gehe davon aus, dass obiges System in der Form nicht beobachtbar ist. Habs aber nicht weiter untersucht.

Jedoch haben meine Untersuchungen mit dem System aus folgender Quelle sehr gut funktioniert:

[1] http://academic.csuohio.edu/simond/courses/kalman/

Man siehe sich dazu das Beispiel "Parameter.m" an.

Um Vergleiche anstellen zu können würde ich nun gerne das Unscented Kalman Filter (UKF) zu einem Unscented Kalman-Bucy-Filter (UKBF) umschreiben. Also das eigtl. diskrete Filter zu einem kontinuierlich-diskreten Filter erweitern. Wollte fragen, ob das schon mal wer gemacht hat?
Als Quelle dazu habe ich folgende Links gefunden:

[2] http://www.lce.hut.fi/~ssarkka/pub/ukf-preprint.pdf
[3] http://lib.tkk.fi/Diss/2006/isbn9512281279/

Jedoch scheine ich irgendetwas falsch zu machen.

Mein Vorgehen ist bis zum Update-Schritt exakt gleich wie beim diskreten UKF in Matrixform. Jedoch berechne ich dann das Filter-Gain K wie in Gleichung (29) gezeigt. Dann berechne ich die Ableitung von m m_dot. Dann nehme ich das m aus dem letzten Zeitschritt und addiere dazu m_dot*dt (wobei dt die Zeitabstände zwischen den Filterdurchläufen ist).
Dann berechne ich ebenfalls wie in (29) P_dot und integriere es dann auf.

Irgendwie erhalte ich aber total andere Ergebnisse für EKBF und UKBF. Der UKBF gibt mir nicht mal eine Schätzung für den Parameter.

Was mich besonders verwirrt ist, dass die Messung z(t) eine "differential measurement" sein sollen. Heißt das, ich muss die zeitbezogene Änderung der Messung nehmen (sprich: diskrete Zeitableitung)?
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Options and Permissions
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2012 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.