WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Bitte um Hilfe: Kalmanfilter an Problem anpassen

 

Breningar
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2016, 11:15     Titel: Bitte um Hilfe: Kalmanfilter an Problem anpassen
  Antworten mit Zitat      
Moin,
da ich langsam verzweifle und immer nur in kleinen Schritten voran komme (danke an die Helfer hier im Forum für die kleinen Schritte) und mir die Zeit knapp wird, würde ich gerne um Hilfe bitten. Ich bin mir nicht sicher, ob das eher in Programmierung oder Signalverarbeitung passt, eigentlich eher in beides.

Ich bin ja dabei ein Model mittels Simulink und Matlab function Blöcken zu bauen. Das Ganze ist etwas umständlich und vielleicht mitunter auch nicht immer ganz sinnvoll oder der beste Weg, aber da mir bislang die Erfahrung fehlt, komme ich so am besten zurecht.

Was möchte ich machen? Ich habe an einer Fräse einen Beschleunigungsmesser und möchte Schwingungen messen und verarbeiten. Zunächst wird die Spindelgeschwindigkeit gemessen und in eine Kosinus-/Sinusserie umgewandelt. Die wird in einen NLMS-Filter gegeben, der dann einen Prognosefehler im Vergleich zu den gemessenen Schwingungen des Beschleunigungsmessers herausgibt. (Ich hoffe ich habe den NLMS-Filter diesbezüglich soweit halbwegs richtig verstanden)
Der Prognosefehler (Epsilon) wird dann als Measurementeingang für den Kalmanfilter genutzt. Während über Delays die letzten 4 Prognosefehler in einem Vektor gesammelt werden (Phi_u) und dem Kalmanfilter als Matrix H zugewiesen wird.
Bis hierhin ist das Ganze auch nicht so kompliziert, der ganze Aufbau sieht auch gut aus, die Werte für Phi_u und Epsilon kann ich zwar noch nicht so wirklich interpretieren, bewegen sich aber schon in einem richtigen Rahmen. Nur der Kalmanfilter will einfach nicht so wie ich das möchte. Vorgabe für den Kalmanfilter ist ein Satz Gleichungen.

Wenn ich das nun mit einer der wunderbaren Erklärungen im Netz vergleiche, habe ich herausgefunden:
meine Gleichung Beispiel im Netz
theta_u = x
Q = P
Re = Q
Rw = R
phi_u = H

x, bzw. theta_u ist nachher für mich auch die entscheidende Größe, die ich weiter nutzen möchte. phi_u und theta_u sind 4x1-Matrizen (Vektoren), während epsilon ein skalarer Wert ist.

Und mit dem Phi_u geht’s da schon los. Ich habe versucht den Block für den Kalmanfilter von Simulink zu nutzen, kann der Matrix H dort aber nicht phi_u zuweisen. Also habe ich einen Matlab function Block benutzt und versucht einen Kalmanfilter selber aufzubauen (mit Hilfe aus der Uni). Ich habe aber zum einen Zweifel an der Korrektheit dieses Aufbaus, zum anderen bekomme ich (ob nun richtig oder falsch) den Block nicht so eingerichtet, dass ich ihn mal ohne Fehlermeldungen zu bekommen simulieren kann.

Ich weiß so langsam nicht mehr, wie ich noch vorgehen soll und helfen kann mir keiner, bzw. will vielleicht auch keiner? Und die Profs an der Uni haben sowieso nie Zeit. Daher hoffe ich darauf, dass mir hier nochmals geholfen werden kann. Ich lade das Model (nur den Kalmanfilter mit Eingangsvariablen) und den dazugehörigen Workspace mit phi_u und epsilon in den Anhang. Vielleicht mag da jemand mit mehr Erfahrung einmal reinsehen und mir sagen, wo ich den Fehler habe?

Ich danke euch schon vorweg vielmals.

Liebe Grüße Breningar

Anhang:

Ausschnitt aus Tabelle phi_u
Ausschnitt aus Tabelle epsilon
Matlab function Block für Kalman (Ts noch falsch)

Code aus Matlab function Block:
Code:
function X  = fcn(measurement, phi_u,Ts)
%measurement = epsilon, phi_u für matrix C(H)
% Define storage for the variables that need to persist
% between time periods.
persistent P xhat Q R I F K
if isempty(P)
   % First time through the code so do some initialization
   xhat = [0 0 0 0];
   P = zeros(4,4);
   %Forward Euler
   Q=[0.3e-5 0 0 0;0 0.3e-5 0 0;0 0 0.3e-5 0;0 0 0 0.3e-5];
   R = 8e-4;  
   I=eye(4);
   F=zeros(2,2);
   K=zeros(2,1);
   end
% Calculate the Jacobians for the state and measurement equations
xhat1=xhat(1);
xhat2=xhat(2);
%Forward Euler
F=[1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1];
H = -diag(phi_u);
% Propogate the state and covariance matrices
xhat1=xhat+xhat*Ts;
P = (F*P*F') + Q;
% Calculate the Kalman gain
K = P*H'/(H'*P*H+R);
% Calculate the measurement residual
yhat = H*xhat;
resid = measurement - yhat;
% Update the state and covariance estimates
xhat = xhat + K*resid;
P=(I-K*H)*P;
% Post the results
theta = xhat(1);
end
 


Kalman.slx
 Beschreibung:

Download
 Dateiname:  Kalman.slx
 Dateigröße:  21.33 KB
 Heruntergeladen:  308 mal
Kalman.mat
 Beschreibung:

Download
 Dateiname:  Kalman.mat
 Dateigröße:  14.84 KB
 Heruntergeladen:  351 mal
Private Nachricht senden Benutzer-Profile anzeigen


Breningar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2016, 11:16     Titel:
  Antworten mit Zitat      
Hat sich erledigt, ich habe einfach einen vollkommen falschen Blick auf die Sache gehabt. Und der Kalmanfilter, den ich mit Hilfe aus der Uni gemacht habe, war auch noch vollkommen falsch aufgebaut für mein Problem.

Irgendwann ist es mir dann wie Schuppen von den Augen gefallen und der Filter war schnell und easy aufgebaut.


LG Bren
Private Nachricht senden Benutzer-Profile anzeigen
 
AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 14.12.2016, 13:27     Titel:
  Antworten mit Zitat      
Fühl dich eingeladen deine Lösung zu posten, vielleicht auch nur kurz zusammengefasst. Eventuell hilft es irgendwann jemand anderem, der ein ähnliches Problem hat Smile

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Breningar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2016, 10:49     Titel:
  Antworten mit Zitat      
Ich nehme die Einladung gerne an Wink

Der alte Code wurde für mich von einem Doktoranden geschrieben. Er hat allerdings einen fertigen Code für den Kalmanfilter genutzt und diesen versucht anzupassen. Das Ganze hat nur ein paar Minuten gedauert und lief nach dem Prinzip "Hier kann ich löschen, da kann ich löschen, da brauchst du nur ne kleine Matrix, das passt schon" ab. Dabei hat er sich die Gleichungen meiner Aufgabe nicht angesehen und auch die Dimensionen der Variablen ignoriert. Das führt natürlich zu Fehlern und da ich zwar Elektroniker bin, auf dem Gebiet Regelungstechnik, Filter, Matlab usw. noch recht neu bin (so ziemlich erst jetzt zur Bachelorarbeit/Praktikum), habe ich darauf vertraut, dass der junge Mann weiß, was er tut.
Genau das war der Fehler. Ich habe tagelang versucht Matrizen, Eingangsgrößen, ganze Blöcke zu verändern und anzupassen, leider alles ohne Erfolg.
Dann habe ich in einem Moment geistiger Klarheit (und das nüchtern !!! ) entschieden, den ganzen Filter nochmal neu anzugehen. Und zwar habe ich ganz stumpf und blöd in einen Matlab function Block in Simulink die Gleichungen zum Kalmanfilter so übernommen, wie sie in meinem Dokument standen.
Dann nochmal eben die Startwerte vorgeben, die Dimensionen angepasst und siehe da, das Ding scheint zu funktionieren. Ob die Werte die sind, die sie sein sollten ¯\_(ツ)_/¯ aber immerhin kommt etwas am Ende raus, das so aussieht, wie es wohl aussehen sollte und die Zeit wird zeigen, ob es am Ende auch wirklich richtig funktioniert.

Den neuen Code hau ich mal mit dazu:
Code:
function [theta_u,epsilon_m] = Kalmanfilter(H, Z,Ts)
%Z = epsilon für Messeingang.
%H=phi_u für Matrix C, bzw. Matrix H
%theta_u = x

persistent Q x Re Rw K

if isempty(Q)
   
   % First time through the code so do some initialization
   x = [0+0i; 0+0i; 0+0i; 0+0i];
   Q = [0+0i 0+0i 0+0i 0+0i; 0+0i 0+0i 0+0i 0+0i; 0+0i 0+0i 0+0i 0+0i; 0+0i 0+0i 0+0i 0+0i];
   Re=0.3e-5*eye(4);
   Rw = 8e-4;
   K=zeros(4,1);
end

%Prediction
Q=Q+Re                        %Q=P, Re=Q
phi_u=H';                      

%Correction

epsilon=Z;                        %epsilon=Z
Hilf=dot(phi_u,x);              %Skalarprodukt phi_u x theta_u
y=epsilon+Hilf;                  %epsilon_m=y
Tr=(Rw+phi_u*Q*phi_u');   %Tr=S
K=-Q*phi_u'*inv(Tr);
x=x+(K*y);
Q=Q*(phi_u*K)
theta_u=x;
epsilon_m=y;


LG Bren
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.