Verfasst am: 29.01.2016, 16:52
Titel: Problem mit Unscented Kalman Filter in Simulink
Hiho alle miteinander
Ich habe folgendes Problem und zwar soll ich mithilfe eines UKF ein Volumenstrom beim Kippenvorgang einer gefüllten Flasche abschätzen. Dabei gebe ich mit einer Solltrajektorie den Volumenstrom vor der abgeschätzt werden soll Mein UKF tut bis jetzt folgendes: (Simulation mit ode34)
Ich bekomme dabei diese komischen Überschwinger nicht weg und bin langsam mit meinem Latein am Ende. Hab auch schon Beschränkungen für Sigma Werte versucht hilft alles nix.
Zur Systembeschreibung
Der Volumenstrom ergibt sich nach Toricelli über folgende Gleichung
mit als Ausgussbreite, als Flusskonstante und als Flüssigkeitshöhe über dem Ausgusspunkt der Flasche. Unter der Voraussetzung, dass konstant ist, ergibt sich wie folgt.
Die Nebenbedingung ist, dass nie positiv werden darf (physikalisch auch logisch).
ist Teil der folgenden DGL.
dabei sind Parameter bezüglich der Flaschegeometrie.
Die Winkelgeschwindigkeit ergibt sich dabei aus der zeitlichen Ableitung des Kippwinkels.
Alle anderen Formeln sind erstmal sekundär....
Der Zustandsvektor lautet
Unten sind die gebildeten Differenzengleichungen aus den beiden DGL´s (und dem Rest)
UKF Code für Embedded Matlab Function Block in Simulink
% Input % omega Winkelgeschwindigkeit % zk Messungen zk = [Theta; w_L] in [Degr.; kg] % x0 Initial state estimate [70.5; 0; 0; 0] in [Degr./s ;Degr.; m; kg; kg] % P0 Initial error covariance matrix % Q Covariance Matrix of Process % R Covariance Matrix of Measurement % deltaT Sample Time % GeoPar Geometrieparameter [Area,dArea,dVs] % StreckenPar Parameter der Regelstrecke =[T_t; K_t; g; c; L_f; rho; T_L]; % W = Weights [Wm Wc]
% Output % x_dach Zustandsabschätzung "a posteriori" % P_dach Fehlerkovarianzmatrix "a posteriori" % sqrtP_dach Square root of the diagonal term of the estimation error covariance matrix % q_dach Abgeschätzer Ausfluss
%% Declare persistent parameters
persistent x % Zustandsvektor x = [Theta; w_L] in [Degr./s ;Degr.; m; kg; kg] persistent P % Error Kovarianzmatrix persistent Qk % Kovarianzmatrix des Prozessrauschens persistent Rk % Kovarianzmatrix des Messrauschens persistent Xm % Temporärer Zwischenspeicher für "predicted" state Sigma Punkte persistent Z % Temporärer Zwischenspeicher für "predicted" measurement Sigma Punkte
% Time Update: Sigma Punkte durchlaufen nichtlineare Funktion F
%Parameter für die Regelstrecke
g =StreckenPar(3); %Erdbeschleunigung [m/s²]
c =StreckenPar(4); % 0<c<1 Flussratenkoeffizient
L_fconst=StreckenPar(5); %Geometrie-Parameter der Gießschnauze [m]
rho=StreckenPar(6);
T_L=StreckenPar(7); %[s]
L2 = size(X,2); % Durchlauf der Sigmawerte (Spaltenweise) for k = 1:L2
% Systemgleichungen
if X(2,k)<0
q = -2/3*abs(X(2,k))^(3/2)*c*L_fconst*(2*g)^(1/2);
else
q = 2/3*(X(2,k))^(3/2)*c*L_fconst*((2*g)^(1/2)); % Signumfunktion bei q beachten muss immer Betrag -> |h(t)| sein end
% Find the prediction mean (xm) and covariance matrix (Pm)
[xm, Pm] = ukf_mean_covariance(Xm, W);
Pm = Pm + Qk;
% Predicted measurements sigma points for k = 1:L2
Z(:,k) = H(Xm(:,k)); % must be modified to match your model (only if the h function has more input or output parameters). end
% Find mean and covariance (Pz=Pzz (2x2)) [z, Pz] = ukf_mean_covariance(Z, W);
% Kalman gain matrix and state estimation
Kk = Pxz/Pz;
x = xm + Kk*(zk - z); % Find the state estimates
P = Pm - Kk*Pz*Kk'; % Estimation error covariance matrix
P = 0.5*(P+P'); % Prevent numerical problem
%% This function computes the mean and covariance matrix from the sigma points. % m is the mean computed from the sigma points. % P is the covariance matrix computed from the sigma points and the mean. function[m, P] = ukf_mean_covariance(sigmaX, W)
L2 = size(sigmaX,2); % L2=13 (Entspricht Anzahl der Gewichtungen W)
sigmaXW=zeros(size(sigmaX)); % Erstellung Vektor für Weighted Sigmas
m = sum(sigmaXW,2); % sum(A,dim) returns the sum along dimension dim. For example, if A is a matrix, then sum(A,2) is a column vector containing the sum of each row.
Pxx = zeros(size(sigmaX,1)); % size L (5x11-Vektor) for j = 1:L2
Pxx = Pxx + W(j,2)*((sigmaX(:,j)-m)*(sigmaX(:,j)-m)'); %summiert zu jedem vorherigen P die kte-Spalte mal die k-te-Spalte Transponiert.
%% This function computes the cross covariance matrix from two sets of sigma points. % P is the cross covariance matrix computed from the sigma points and the mean. % sigmaX and sigmaY are the sigma points of X and Y respectively. function P = ukf_covariance(sigmaX, sigmaY, W)
Ich vermute, dass das was mit der gleich beschriebenen Formel für den Volumenstrom bzw änderung der Füssigkeitshöhe zu tun hat. Möglichweise hat das auch iwas mit der Winkelgeschwindigkeit zu tun.
Wäre super wenn mir jemand irgendeinen Tipp geben kann.
20_12_15_UKF.zip
Beschreibung:
Hier das Modell zum selber anschaun mit allen Daten im Matlab Code : Anfangswerte Kovarianzmatrix etc. Der Matlab-Code führt das Simulink Modell selber aus und Plottet die Daten
ja ich habe da ein Matlab Function Block mit Persistent Variablen verwendet, die Persistent Variablen haben aber einen Fehler verursacht, daher habe ich mit Decouplern weitergearbeitet, um die Zustände zwischenzuspeichern.
Ich habe zur Zeit auch ein Problem, allerdings mit symbolischen Variablen in der function. Evtl könnte dein Ansatz besser geeignet sein. Ich habe die auf instrisic gestellt, aber das war nicht erfolgreich.
Mit dem EKF habe ich leider nie gearbeitet. Prinzipiell ist der UKF leichter aufzubauen als der EKF und bietet außerdem eine höhere Approximationsgenauikgeit soweit ich mich erinnere. Was für Probleme machen die symbolischen Variablen denn ?
Ich dachte das EKF sein einfacher... Naja ist egal. Es bedarf auf jeden Fall weniger Rechenzeit.
Ich hatte zunächst versucht meine nicht-lineare Gleichung symbolisch darzustellen. Dann müssen für das EKF die Jacobimatrizen bestimmen. Ich habe dann den Subs Befehl benutzt um in den Gleichungen die Symbolischen Variablen durch die aktuellen Zustandsvektoren zu ersetzen.
Aber bisher habe ich kein zufriedenstellendes Ergebniss.
Im Grunde benötigt man für das EKF nur seine beiden Funktionen f und g aus der folgenden Vorschrift
x(k+1) = f(x(k),u(k)) + w(k)
y(k) = g(x(k),u(k)) + v(k)
Gegeben habe ich die Funktion f und g in kontinuierlicher Form. Es muss also eine Diskrete Form hier von bestimmt werden und dann müssen die linearisierten Matrizen A, B, C bestimmt werden. A ist die Einheitsmatrix plus eine Abtastzeit* die Jacobimatrix df/dx. B entspricht df/du und C entspricht dg/dx.
Hat man diese Matrizen ergeben sich die übrigen Berechnungen wie beim gewöhnlichen Kalman Filter.
Okay, wie gesagt habe ich noch nie mit dem EKF gearbeitet. Der UKF hat den Vorteil dass du keine Jacobi Matrizen brauchst und Linearisieren musst du auch nicht. Versuch mal den UKF aufzubauen. Wichtig dabei sind die Parameterwahl (alpha kappa beta) und die Verwendung von Constraint Conditions (https://pdfs.semanticscholar.org/8e.....70d309d57973c61421760.pdf) falls deine Funtkion physikalische Grenzen besitzt wie z.b. nur positiver Ausfluss von Flüssigkeit. Und anstatt mit "Persitent Variablen" zu arbeiten, kannst du wie gesagt Decoupler verwenden die deine Zustände aus dem Funktion-Block führen zwischenspeichern und wieder einspeisen.
Die pfd zur Beschränkung habe ich schon als Link gepostet. Da beschränkst du deine Zustände im UKF-Algorithmus entsprechend gewissen Kriterien.
Vorgehensweise beim UKF:
- Diskretisieren der Systemgleichungen
- Aufbau des UKF über die entsprechenden Gleichungen im Matalb Function Block mithilfe deiner diskretisierten Systemgleichungen.
z.b.: nach http://citeseerx.ist.psu.edu/viewdo.....amp;rep=rep1&type=pdf
UKF Eingang:
-Gewichtungen der einzelnen Zustände ,
-Anfangsbedingungen deiner Zustände (entsprechen Mittelwert (Vektor entsprechend Systemgleichungen))
- Kovarianzmatrix
- Eingangssignal
-Messwerte
- Kovarianzmatrix System(Q) und Messrauschen (R)
UKF Algorithmus (rekusiv):
-Bestimmung der Sigmapunkte (L x 2L+1 -Matrix) welche Statistische Eingenschaften der einzelnen Zustände besitzen (mit Mittelwert x , Kovarianzmatrix P, Parameter Lambda (aus alpha beta kappa) -> L sind dabei die Anzahl der Zustände
- Durchlauf der Sigmapunkte durch deine Nichtlineare Funktion
- Bestimmung von Kovarianzmatrix (das "-" bedeutet vor korrektur und das "+" nach Korrektur)
- Bestimmung von Kovarianzmatrix
- Bestimmung des Kalman Gain aus und
- Korrektur deiner alten Zustände und Kovarianzpartrix mit Kalman Gain -> ergibt
Kann es sein, dass zwei mal 'end' fehlt in deinem code?
Einstellungen und Berechtigungen
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
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.