|
|
Simulation von zwei hintereinander herfahrenden Fahrzeugen |
|
chrisss86 |
Forum-Newbie
|
|
Beiträge: 6
|
|
|
|
Anmeldedatum: 08.01.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 08.01.2013, 11:41
Titel: Simulation von zwei hintereinander herfahrenden Fahrzeugen
|
|
|
|
|
Hallo liebe Matlab-Gemeinde!
Ich möchte in Simulink eine Simulation erstellen, in der ein Fahrzeug mit einer bestimmten Geschwindigkeit hinter einem anderen langsameren Fahrzeug her fährt. Bisher hab ich leider keine großen Erfahrung mit Matlab/Simulink. Es handelt sich hierbei NICHT um eine grafische Realisierung in der zwei Autos tatsächlich hintereinander herfahren sollen.
Wenn die Distanz zwischen beiden Fahrzeugen einen bestimmten Wert unterschreitet, soll die Geschwindigkeit vom hinterher fahrenden Fahrzeug während der Simulation verringert werden.
Ausgegeben werden soll die Geschwindigkeit der beiden Fahrzeuge und die Distanz zwischen den Fahrzeugen während der Simulation.
Habt ihr eine Idee wie man so etwas realisieren kann? Wenn man die Geschwindigkeit mit einem "Constant" vorgibt kann sie glaube ich nicht zur Laufzeit verändern. Gibt es Boxen denen man mit jedem Durchlauf einen anderen Wert zuordnen kann, der mit Hilfe von anderen Boxen berechnet wurde?
Ich hoffe, dass man meine Frage gut verstehen kann. Über eine Hilfe würde ich mich sehr freuen.
Gruß
chrisss
|
|
|
|
|
knilumis_baltaM |
Forum-Century
|
|
Beiträge: 241
|
|
|
|
Anmeldedatum: 20.04.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 08.01.2013, 15:10
Titel:
|
|
Du könntest z.B. den "Constant Block" mit der Geschwindigkeit auf ein "Switch Block" geben. Entscheidungsschwelle könnte zum Beispiel sein wenn Simulationszeit kleiner 0.002 ist soll er die Geschwindigkeit von Constant Block nehmen ansonsten den anderen Pfad. Der andere Pfad berechnet die Geschwindigkeit aus der Geschwindigkeitsformel von ersten und zweiten Auto.
|
|
|
chrisss86 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 6
|
|
|
|
Anmeldedatum: 08.01.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 08.01.2013, 16:55
Titel:
|
|
|
|
|
Vielen Dank knilumis_baltaM für deine Antwort
Ich hab das mit dem Switch-Block direkt mal ausprobiert und es klappt. Damit kann ich zwischen verschiedenen Geschwindigkeiten hin- und herschalten.
Allerdings gefällt mir diese Lösung noch nicht so recht. Ich möchte die Simulation nämlich noch erweitern und dafür muss ich die Geschwindigkeiten der beiden Fahrzeuge in Abhängigkeit von verschiedenen Parametern (zum Beispiel Distanz zwischen den Fahrzeugen unter einem bestimmten Wert) ändern können. Die Änderung soll dabei über eine Verzögerung erfolgen. Sprich es wird für eine bestimmte Zeit lang gebremst so dass die Geschwindigkeit sich kontinuierlich verringert. Eine Beschleunigung wäre natürlich auch denkbar (ist ja nur eine invertierte Verzögerung).
Ist es nur möglich einen Wert aus dem vorherigen Durchlauf mit Hilfe einer Rückkopplung zu "speichern" und dem System somit bei nächsten Durchlauf zur Verfügung zustellen?
Vielleicht hat ja noch jemand eine Idee? Vielen Dank schonmal im voraus
Gruß
chrisss
|
|
|
knilumis_baltaM |
Forum-Century
|
|
Beiträge: 241
|
|
|
|
Anmeldedatum: 20.04.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 09.01.2013, 08:05
Titel:
|
|
Du kannst einen Memory block nehmen. Der speichert den Wert von letzten Zeitschritt.
Könntest auch Matlab Function nehmen und da die ganzen Berechnung für die neuen Geschwindigkeiten machen und dann ausgeben.
|
|
|
chrisss86 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 6
|
|
|
|
Anmeldedatum: 08.01.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 09.01.2013, 16:23
Titel:
|
|
|
|
|
Den Memory-Block verwende ich momentan oft wenn ich einen Wert wieder zurückführen möchte. Wenn ich das nicht tue kommt immer ein Fehler.. scheinbar ist Simulink dann verwirrt und weiß nicht zu welchem step er den rückgeführten Wert verrechnen soll.
Nach langem Kampf mit Simulink hab ich es endlich hinbekommen embedded Functions zu verwenden. Musste mir extra Visual Studio 2008 Express runterladen weil bei einer 64Bit Matlab Version kein Compiler mitgeliefert wird.
Mit den Embedded Functions kann man schon einige schöne Dinge machen.
Hab es jetzt auch hinbekommen, dass ich eine Geschwindigkeit in Abhängigkeit von einer Bedingung mit einer festgelegten Verzögerung reduzieren kann.
Dazu führe ich die Aktuelle Geschwindigkeit immer wieder zurück, so dass ich sie beim nächsten Step wieder zur Verfügung habe. Die Rückführung läuft über einen Summierer an dem ich zusätzlich noch einen negativen Eingang habe mit dem ich die Geschwindigkeit reduzieren kann. Habe mal eine Beispiel-Datei angehängt.
Die Ergebnisse dieser Vorgehensweise sind sehr schön, allerdings ist das ganze schon eine ziemliche Fummelei. Will ich die Simulation um eine Kleinigkeit erweitern muss oft viel umgeändert werden.
Vielleicht hat der eine oder andere ja noch eine Idee wie man es besser machen könnte.
Sollte ich neue Fortschritte machen halte ich euch auf dem laufenden
Gruß
Chris
Beschreibung: |
|
Download |
Dateiname: |
Geschwindigkeit.mdl |
Dateigröße: |
33.46 KB |
Heruntergeladen: |
490 mal |
|
|
|
knilumis_baltaM |
Forum-Century
|
|
Beiträge: 241
|
|
|
|
Anmeldedatum: 20.04.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 09.01.2013, 16:39
Titel:
|
|
Du erstellst (vermutlich) algebraische Schleifen bei zurückführen, daher die Fehlermeldungen. Hier kann ein Delay/Memory Block dann helfen.
Gerade mit der embedded Functions (oder Matlab Functions) ist es doch einfacher: Wenn man ein neues Signal verarbeiten will kann man leicht ein Eingang hinzufügen und im code verarbeiten, als "draußen" neue Pfade und Blöcke ziehen.
Zu deinem Modell kann man jetzt nicht viel sagen, ist ja praktisch leer.
|
|
|
chrisss86 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 6
|
|
|
|
Anmeldedatum: 08.01.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 10.01.2013, 11:02
Titel:
|
|
Ja genau, Simulink sagt mir auch, dass es sich um algebraische Schleifen handelt.
Hab das Modell mal so erweitert, dass es sich ausführen lässt und die Scopes etwas anzeigen.
In der Simulation fährt ein Fahrzeug mit 100 km/h. Die sich dabei ergebende Distanz kann Scope2 entnommen werden. Über eine embedded Function überwache ich den Distanzwert und leite eine Verzögerung mit 8m/s ein, sobald das Fahrzeug 150 meter gefahren ist. Dadurch wird das Fahrzeug immer weiter verlangsamt bis es Rückwärts fährt. Die Geschwindigkeit sieht man im Scope1
Ich hoffe man kann das Model nachvollziehen.
Gruß
chrisss
Beschreibung: |
|
Download |
Dateiname: |
Geschwindigkeit.mdl |
Dateigröße: |
55.02 KB |
Heruntergeladen: |
510 mal |
|
|
|
controlnix |
Forum-Century
|
|
Beiträge: 106
|
|
|
|
Anmeldedatum: 10.06.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 10.01.2013, 14:05
Titel:
|
|
Mein Kommentar zum Bisherigen: Der bisherige Ansatz erscheint mir nicht zielführend.
Um hier eine sinnvolle Simulation des Distanzverhalten zweier Fahrzeuge aufzubauen, ist es notwendig, die Dynamik der Einzelfahrzeuge auf der Basis von Differentialgleichungen (muss nicht kompliziert sein) zu modellieren und zu simulieren. Die Einhaltung einer Distanz zwischen den Fahrzeugen erfolgt durch Regelung. Wenn dann das vorausfahrende Fahrzeug 1 beschleunigt oder verzögert, muss sich Fahrzeug 2 durch eine funktionierende Regelung danach richten.
Wenn man so vorgeht, treten die hier diskutierten Probleme gar nicht auf, und es bedarf dann auch keiner Hilfskonstruktionen mit Mem-Blöcken, algebraischen Schleifen oder Ähnlichem.
|
|
|
knilumis_baltaM |
Forum-Century
|
|
Beiträge: 241
|
|
|
|
Anmeldedatum: 20.04.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.01.2013, 08:18
Titel:
|
|
Es wäre auch wirklich gut zu wissen welche Formeln du für die Bewegung eines Autos hast bzw. welche du benutzen sollst (was soll alles berücksichtig werden?).
Hinweise zu dem Modell noch: In diesem Fall ist es glaub ich sinvoll wenn du ein Scope nimmst und im drei Eingänge gibst damit die alle relevanten Plots gleichzeitig zu sehen sind. (Scope öffnen, oben links zweites symbol (parameters) und dann im neuen Fenster "Number of axes" auf 3 setzen).
Den Memory2 Block und den Addierer kann man sehr gut mit einem Integrator ersetzen.
Erstell zu aller erst ein Model das die Bewegung eines Autos wiedergibt. Dann kannst du es kopieren und als das zweite Fahrzeug nehmen.
|
|
|
chrisss86 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 6
|
|
|
|
Anmeldedatum: 08.01.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 14.01.2013, 11:42
Titel:
|
|
|
|
|
Hoffe Ihr hattet alle ein schönes Wochenende
@controlnix
Ich glaube dir, dass man es mit Hilfe von DGL's einfach modellieren könnte. Nur weiß ich leider keinen richtigen Ansatz dafür. Bei der Simulation soll es sich auch nicht um eine Regelung handeln, in der sich die Fahrzeuge kontinuierlich an das Verhalten des anderen Fahrzeugs anpassen soll. Viel mehr geht es bei der Simulation um einen Bremseingriff, der kurz vor einer Kollision einsätzen und somit einen Aufprall verhindern soll.
@knilumis_baltaM
Das man den Addierer durch einen Integrator ersetzen kann ist eine sehr gute Idee. Allerdings sind die Ergebnisse, die der Integrator liefert um 1/1000 kleiner als die der Addierer+Mem Kombination. Kann es sein, dass der Integrator die Werte nur jede Sekunde abgreift? Fixed Step-Size ist ja 0,001. Das würde den Faktor 1000 erklären. Hab schon geschaut ob ich beim Integrator irgendwas in der Richtung einstellen kann, hab aber nichts gefunden. Vielleicht weißt du da weiter.
Berücksichtigt werden soll bei der Simulation eigentlich nicht viel. Lediglich die Geschwindigkeit, Beschleunigung und Verzögerung des Fahrzeugs.
Wünsche euch einen guten Start in die neue Woche
|
|
|
knilumis_baltaM |
Forum-Century
|
|
Beiträge: 241
|
|
|
|
Anmeldedatum: 20.04.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 14.01.2013, 14:29
Titel:
|
|
Wenn du keine dgls verwendest, dann kannst du auch den solver (strg+e) auf discrete stellen und einen "Discrete-Time Integrator" verwenden. Bei ihm stellst du die sample time dann auf 0.001 (standard ist 1).
|
|
|
chrisss86 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 6
|
|
|
|
Anmeldedatum: 08.01.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 14.01.2013, 15:19
Titel:
|
|
Ich habe es genau so gemacht wie du gesagt hast. Solver auf "discrete" stellen, den "Discrete-Time Integrator" verwenden und dort die sample-Time "0.001" eintragen. Trotzdem sind die Ergebnisse immer noch um den Faktor 1000 zu klein. Gibt es vielleicht noch Dinge die umgestellt werden müssen?
Gruß
chrisss
|
|
|
knilumis_baltaM |
Forum-Century
|
|
Beiträge: 241
|
|
|
|
Anmeldedatum: 20.04.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 15.01.2013, 07:41
Titel:
|
|
Bei dem discrete Integrator stellst du Integrator method auf Accumulation: Forward Euler
|
|
|
Raketenmaid |
Forum-Fortgeschrittener
|
|
Beiträge: 58
|
|
|
|
Anmeldedatum: 28.09.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 17.01.2013, 18:32
Titel:
|
|
|
|
|
chrisss86 hat Folgendes geschrieben: |
Hoffe Ihr hattet alle ein schönes Wochenende
@controlnix
Ich glaube dir, dass man es mit Hilfe von DGL's einfach modellieren könnte. Nur weiß ich leider keinen richtigen Ansatz dafür. Bei der Simulation soll es sich auch nicht um eine Regelung handeln, in der sich die Fahrzeuge kontinuierlich an das Verhalten des anderen Fahrzeugs anpassen soll. Viel mehr geht es bei der Simulation um einen Bremseingriff, der kurz vor einer Kollision einsätzen und somit einen Aufprall verhindern soll.
|
Mal ne blöde Frage: Soll Deine Simulation nur irgendwie das Wirkungsprinzip dieses Bremsvorgangs veranschaulichen, oder soll es schon eine Simulation sein, bei der das physikalische Verhalten analysiert werden soll?
Im ersteren Fall reicht eine einfache Darstellung, theoretisch könntest Du einfach die gewünschte Distanz als Funktion der Zeit zum vorausfahrenden Auto vorgeben, die sich halt zeitlich ändert nach Einleiten des Bremsmanövers.
Willst Du aber das physikalische System darstellen, dann weiß ich nicht, wie Du das umsetzen willst ohne dass Du die Bewegungsgleichungen aufstellst? Das müssen ja noch nicht mal komplizierte sein, wenn Du Dich auf die eindimensionale trägheitsbehaftete Bewegung beschränkst. Dann brauchst Du aber auch eine Regelung mit Rückführung.
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|