Forum: PC-Programmierung Simulink Modell aus Matlab steuern


von gunknown (Gast)


Lesenswert?

Hallo,

ich habe ein gekoppeltes DGL system in simulink modelliert.
Dieses modell möchte ich nun nutzen, um mein matlab programm mit 
sinnvollen daten zu versorgen.
Das bedeutet ich möchte die ausgänge des simulink modells von matlab aus 
"live" lesen und entsprechend über die eingänge darauf reagieren.

Obwohl ich das ganze weiterhin für einen trivialen anwendungsfall von 
matlab/simulink halte haben meine recherchen ergeben, dass das ganze 
nicht ganz einfach ist (wenn überhaupt möglich). Zumindest habe ich 
bisher noch keine zufriedenstellende lösung gefunden.

Mittels sim() kann ich die simulation lediglich von matlab aus starten 
und am ende die ausgabe auslesen. So kann ich die ausgabe aber nicht 
überwachen und meine eingänge entsprechend neu definieren.
Die nächste idee war die simulation mittels set_param('sim', 
'SimulationCommand', 'pause'); regelmäßig anzuhalten, die ausgabe zu 
lesen und die eingänge entsprechend neu zu definieren.
1
 for k=1:5        
2
        set_param('sim2','SimulationCommand', 'pause');
3
        simout
4
        set_param('sim2', 'SimulationCommand', 'continue');
5
        pause(1);
6
    end
Soetwas führt dabei aber nicht zum gewünschten ziel. Vielmehr scheint 
es, dass die schleife erst abgearbeitet wird nachdem die simulation 
komplett fertig ist, was ich ja eigentlich gerade nicht möchte.

Also entweder hab ich die funktionsweise von matlab/simulink total 
mißverstanden oder ich bin komplett auf dem falschen weg.
Ich hoffe es kann mir jemand helfen.

von gunknown (Gast)


Lesenswert?

Ok, ich denke mittlerweile doch auf dem falschen weg zu sein.
Ich erkenne selbst einige probleme, warum es so nicht gehen kann.

Ich habe nun eine neue idee entwickelt, die auch funktionieren müsste.
Bevor ich nun allerdings anfange darauf großartig aufzubauen möchte ich 
doch nochmal nachfragen ob dieser weg "der standard" ist, oder ob es 
nicht doch noch andere möglichkeiten gibt (nach wie vor kann ich nicht 
glauben dass matlab/simulink nicht auf meine vorgesehene art verwendet 
werden soll/kann).

Meine idee ist nun folgende.
Ich starte die simulation für einen kurzen zeitraum und speicher den 
ausgangsvektor am simulationsende ab. Anschließend starte ich eine neue 
(kurze) simulation wobei ich zuvor die parameter auf die werte der 
letzten simulation setze, und ggf. die eingangsparameter abänder. 
Außerdem wird auch die simulationszeit entsprechend verschoben.

In matlab code sieht das dann so aus:
1
clear;
2
timestep=3;
3
4
starttime=0;
5
endtime=starttime+timestep;
6
set_param('auto_bsp/Constant', 'Value', '0.6');
7
set_param('auto_bsp/Integrator2', 'InitialCondition', '0');
8
sim('auto_bsp', [starttime, endtime]);
9
%speicher parameter am ender der simulation
10
endvalindex=size(simout);
11
endval=simout(endvalindex(1),1);
12
13
starttime=endtime;
14
endtime=endtime+timestep;
15
%starte simulation mit den endparametern der letzten simulation
16
set_param('auto_bsp/Integrator2', 'InitialCondition', num2str(endval));
17
%setze neue eingangsparameter (beispielhaft)
18
set_param('auto_bsp/Constant', 'Value', '-0.6');
19
sim('auto_bsp', [starttime, endtime]);

von shu (Gast)


Lesenswert?

Hallo,
ich glaube du verstehst Matlab nicht so ganz richtig. Die Simulation der 
DGL wird ja nicht in Echtzeit durchgeführt, von daher macht es wenig 
Sinn auf Simulationsergebnisse von Hand zu reagieren. Klar kannst du die 
Simulation anhalten und dann mit anderen Anfangsbedingungen y(0)=yo, 
yp(0)=yop...wieder starten. Wie wärs mit einem Regler?

Gruß

von gunknown (Gast)


Lesenswert?

Ja, das mein erst genanntes vorgehen keinen sinn hat habe ich 
mittlerweile auch erkannt.

Aber ich kann ja mal mein gesamtziel erklären, vllt wird das problem 
dann klarer.

Ich habe in simulink die kinematischen bewegungsgleichungen eines 
mehrkörpersystems modelliert. Auf basis eines suchalgorithmus möchte ich 
nun durch variation der eingangsparameter eine bestimmte 
zielkonfiguration erreichen.
Der algorithmus funktioniert so, dass er vom startpunkt in alle 
möglichen richtungen geht (durch variation der eingangsparameter), und 
von jedem (diskreten) teilergebnis wieder in alle möglichen richtungen, 
bis die gewünschte zielkonfiguration erreicht ist.
Das ergebnis ist dann eine wertefolge der eingabeparameter die mein 
system vom startpunkt in die gewünschte zielkonfiguration überführt.

Aus diesem grund brauche ich direkt zwischenergebnisse aus meinem 
simulink modell. Daraus hat sich meine oben genannte zweite idee 
entwickelt. Aber ist es denn sinnvoll so vorzugehen bzw. gibt es 
andere/bessere möglichkeiten?

Im prinzip kann ich auch die ähnlichkeit zu einem regler erkennen, aber 
wie ich damit ans ziel kommen soll ist mir völlig unklar.

von shu (Gast)


Lesenswert?

hm ich glaub das geht etwas einfacher. Kennst dich mit diskreter 
Regelungstechnik etwas aus?
-Diskretes Zustandsraummodell erstellen
-Steuerbarkeitsmatrix Qs aufstellen
-Un=(Qs)^-1*(Xn - (A^n)*Xo)
- und schon hast du deine Steuerfolge Un
n darf bei SISO System nicht kleiner sein als die Ordnung.
Das geht natürlich nur wenn dein System auch steuerbar ist.
Gruß

von gunknown (Gast)


Lesenswert?

Meine kenntnisse der regelungstechnik sind leider auf grundlagen 
beschränkt.
Erste recherchen bei google über dein genanntes verfahren haben bisher 
noch nichts konkretes hervorgebracht. Ich hoffe morgen in der bibliothek 
ein buch mit genauerer beschreibung des verfahrens zu finden.
Die diskreten zustände Xn kommen, nehme ich an, aus dem diskretisierten 
zustandsmodell.
Um daraus Xns zu berechnen muß ich aber ja wieder eingänge draufgeben, 
die ich im folgenden ja eigentlich erst berechnen möchte!?

Hmm naja, da sollte ich mich wohl erstmal etwas schlau lesen.

Danke für die Hilfe soweit.
Gruß

von shu (Gast)


Lesenswert?

Zuerst musst mal das kontinuierliche Modell der Form:
erstellen. wobei y Ausgang, x Zustand und u dein Eingang ist.

Nun erstellst du das diskrete Zustandsraummodell:

Nun die diskrete Steuerbarkeitsmatrix:

Die Steuerfolge ist dann:
wobei Xo ist dein Anfangszustandsvektor, Xn dein Zielvektor ist.

Gruß

von gunknown (Gast)


Lesenswert?

Hallo,
vielen Dank für die unterstützung.

Ich wollte das ganze nun mal an einem beispiel ausprobieren.
Dazu nehme ich die kinematischen bewegungsgleichungen eines 
nicht-holonomen fahrzeugs:

x_p = V*cos(roh)*cos(psi)
y_p = V*cos(roh)*sin(psi)
psi_p = V/L*tan(roh)

Wobei roh der eingestellte lenkwinkel und v die geschwindigkeit des 
fahrzeugs ist. _p repräsentiert die ableitung.
x und y sind die koordinaten des bezugspunktes auf dem fahrzeug, und psi 
der gierwinkel des fahrzeugs.
[roh,V] sind eingangsgrößen, [x,y,psi] ist sowohl mein zustand als auch 
mein ausgang.

Das problem ist, dass das system nicht linear ist, daher kann ich die 
zustandsraumbeschreibung so nicht angeben.
Ist dein verfahren überhaupt auf nichtlineare system anwendbar?
Eine linearisierung kommt auch nicht in frage, da ich mich ziemlich 
stark von einem arbeitspunkt entfernen würde.

Weiterhin verstehe ich die mathematik der diskretisierung nicht.
A ist ja eine matrix. Sind die formeln wie folgt zu interpretieren:
Ad[1,1] = e^(A[1,1]*T)
Ad[1,2] = e^(A[1,2]*T)
...
?

von shu (Gast)


Lesenswert?

Hallo,
die Formel gelten für lineare System. Wenn dir eine Linearisierung zu 
ungenau ist, wird das wohl mit diesem Vorgehen nichts.
 ist übrigens die Transistionsmatrix und wird wie folgt gebildet:
I ist die Einheitsmatrix und L^-1 die inverse Laplacetransformation.

Du willst doch dein System von einem Anfangszustand A zu einem 
Endzustand B bringen. Da bietet sich doch wunderbar ein Regler, an der 
dieses übernimmt.
Allerdings musst dich dann, wenn dir eine Linearisierung zu ungenau ist 
ein nicht linearen Regler bauen, was mit beschränkten Regelungstechnik 
Kenntnissen wohl nicht so ohne weiteres möglich ist.


Gruß

von gunknown (Gast)


Lesenswert?

Hi,

im obigen beispiel soll das auto von A nach B kommen. Eine 
linearisierung kommt da leider nicht infrage, da als folge eines 
konstanten lenkwinkels eine kreisbahn (bzw. klothoide) ein grundlegendes 
element der trajektorie ist und schlecht linearisiert werden kann, zumal 
größere kreisbögen, also große winkeldifferenzen abgefahren werden.

Ich werde nochmals recherchen zum reglerentwurf nichtlinearer systeme 
anstellen. Ansonsten verwirkliche ich den oben genannten algorithmus, 
was soweit auch schon ganz gut funktioniert.
Die frage ist eben nur wie sich das ganze im vergleich mit anderen 
möglichkeiten schlägt, und ob es nicht viel bessere methoden gibt.
Die paper die ich aber bisher zum thema gelesen habe basieren alle 
entweder auf analytischen methoden, oder der suche im 
konfigurationsraum. Von daher liege ich evtl. nicht ganz falsch.

Trotzdem nochmal danke für deine unterstützung.

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.