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

Structs auf Echtzeitmaschinen - numerische Probleme

 

Max24
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 26.07.2018, 10:17     Titel: Structs auf Echtzeitmaschinen - numerische Probleme
  Antworten mit Zitat      
Hallo,

ich implementiere aktuell ein Unscented Kalman Filter auf einer Echtzeitmaschine.
Um mir die Berechnung von einigen Parametern zu ersparen, werden diese zu Beginn ausgeführt und in einem struct params gespeichert:

Code:

function params = GetStaticParameters(parameters_sensorfusion)

params = struct ();


% Parameters for the UKF weights
alpha = 0.1;
beta = 2;
kappa = 0;
L = 18;   % Dimension of the state vector
Lw = 17;  % Dimension of the process noise : Lw = L - 1
N =  2 * Lw + 1;   % Number of sigma - points : N = 2 * Lw + 1

% Compute parameters
aa = alpha * alpha;
lambda = aa * (Lw + kappa) - Lw;
gamma = sqrt(Lw + lambda);

% Compute weights
Wm = (1 / ( 2 * (Lw + lambda) ) ) * ones(N, 1);
Wm(1) = lambda / ( Lw + lambda );

Wc = Wm;
Wc(1) = Wc(1) + (1 - aa + beta );

% Write UKF parameters and weights into parameter struct
params.alpha = alpha;
params.beta = beta;
params.kappa = kappa;
params.L = L;
params.Lw = Lw;
params.N = N;
params.gamma = gamma;
params.Wm = Wm;
params.Wc = Wc;
end
 


Dieses struct wird zu Beginn gebaut und mit persistent permanent im Speicher gehalten.

Ich gebe das struct dann an die verschiedenen Funktionen weiter, die die Parameter nutzen.

Es treten jedoch numerische Problem auf (Divergenz des Filters...), wenn ich das so mache.
Werden die Berechnungen in die einzelnen Funktionen ausgelagert und jedes mal durchgeführt (ohne struct), treten keine numerischen Probleme auf.

Woran kann das liegen?
Meine Idee ist, dass ich noch irgendwie definieren muss, dass es sich um double handelt um mit maximaler Präzision auf der Echtzeitmaschine gerechnet werden muss. Wird das bei structs eventuell nicht automatisch gemacht?

Vielleicht hat jemand hier schonmal ein solches Verhalten mit dem Embedded Coder beobachten können.

Beste Grüße,
Max
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.07.2018, 14:44     Titel: Re: Structs auf Echtzeitmaschinen - numerische Probleme
  Antworten mit Zitat      
Hallo Max24,

Nein, man muss bei Matlab nicht explizit angeben, dass es sich um doubles handelt, denn das ist der Default-Typ für numerische Variablen. Falls Du unsicher bist, kannst Du Dir die Typen der Felder ja einfach anschauen.

Zitat:
Ich gebe das struct dann an die verschiedenen Funktionen weiter, die die Parameter nutzen.

Bist Du sicher, dass sie in dem Struct nur lesen und nicht auch schreiben?

Zitat:
Es treten jedoch numerische Problem auf (Divergenz des Filters...), wenn ich das so mache.
Werden die Berechnungen in die einzelnen Funktionen ausgelagert und jedes mal durchgeführt (ohne struct), treten keine numerischen Probleme auf.

Das liegt garantiert an einem anderen Unterschied und nicht daran, dass Du einen Struct speicherst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Max24
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 31.07.2018, 19:14     Titel: Re: Structs auf Echtzeitmaschinen - numerische Probleme
  Antworten mit Zitat      
Tatsächlich lag es daran. Mein Vorgänger hat innerhalb der Matlab Function explizit 32-bit Gleitkommadarstellung eingestellt (zu finden unter "edit data" innerhalb von Matlab Functions für Simulink).

Ein Umstellen auf 64-bit oder noch besser eine explizite Zuweisung des Datentyps:

Code:

...
params.alpha = double(alpha);
params.beta = double(beta);
params.kappa = double(kappa);
params.L = uint8(L);
params.Lw = uint8(Lw);
params.N = uint8(N);
params.gamma = double(gamma);
params.Wm = double(Wm);
params.Wc = double(Wc);
 


löst das Problem. Defaultmäßig ist 64-bit eingestellt (bei 64-bit Matlab Installation), deswegen war das Problem schwierig zu finden.

Gruß,
Max
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 - 2024 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.