Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ss2024:verkehrssimulation [2024/09/26 22:13] manoulueders [Grundlegender Aufbau] |
ss2024:verkehrssimulation [2024/09/29 13:35] (aktuell) LuisJasper |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Verkehrssimulation ====== | ====== Verkehrssimulation ====== | ||
- | |||
- | |||
- | |||
- | [ Noch in Arbeit ] | ||
- | |||
- | |||
Ein Mathesis-Projekt aus dem Sommersemester 2024 \\ von Leonard Jungk, Lina Goethe, Luis Jasper und Manou Lüders | Ein Mathesis-Projekt aus dem Sommersemester 2024 \\ von Leonard Jungk, Lina Goethe, Luis Jasper und Manou Lüders | ||
Zeile 38: | Zeile 32: | ||
==== Programmstruktur ==== | ==== Programmstruktur ==== | ||
- | Das gesamte Programm besteht aus folgenden Dateien: | + | Der Programmcode besteht aus folgenden Dateien: |
* ''main.py'' | * ''main.py'' | ||
* ''Karte.py'' | * ''Karte.py'' | ||
Zeile 47: | Zeile 41: | ||
In den Dateien ''Auto.py'', ''Kreuzung.py'' und ''Strasse.py'' sind die Klassen der jeweiligen Objekte enthalten. In ''Parkplatz.py'' ist die Klasse ''Parkplatz'' enthalten, die, das Verhalten von Autos regelt, die ihr Ziel erreicht haben. In ''main.py'' befindet sich der Kern des Programms und ''karte.py'' steuert die Visualisierung und verknüpft die Objekte. | In den Dateien ''Auto.py'', ''Kreuzung.py'' und ''Strasse.py'' sind die Klassen der jeweiligen Objekte enthalten. In ''Parkplatz.py'' ist die Klasse ''Parkplatz'' enthalten, die, das Verhalten von Autos regelt, die ihr Ziel erreicht haben. In ''main.py'' befindet sich der Kern des Programms und ''karte.py'' steuert die Visualisierung und verknüpft die Objekte. | ||
+ | |||
+ | Daneben werden für das Programm noch die Datei ''Auto_B.png'', das Bild der Autos und ''ARIAL.TTF'' zum Anzeigen Schrift im gleichen Ordner benötigt. | ||
== main == | == main == | ||
Durch Ausführen der Datei ''main.py'' wird das Programm gestartet. Die Datei importiert alle Bestandteile von "Karte" und das Modul Pygame. Zu Beginn werden einige Einstellungen für Pygame festgelegt, anschließend werden die einzelnen Objekte erschaffen.\\ | Durch Ausführen der Datei ''main.py'' wird das Programm gestartet. Die Datei importiert alle Bestandteile von "Karte" und das Modul Pygame. Zu Beginn werden einige Einstellungen für Pygame festgelegt, anschließend werden die einzelnen Objekte erschaffen.\\ | ||
- | Für das Straßennetz wird zuerst ein leeres Dictionary ''strassenbuch'' benötigt, dass alle Straßen-Objekte enthalten wird. Danach werden alle Kreuzungen erschaffen und zu einer Liste ''kreuzungen'' hinzugefügt. Im nächsten Schritt werden über das Aufrufen der Methode ''connect'' auf den Kreuzungen, die Kreuzungen verbunden und Straßen erschaffen. | + | Für das Straßennetz wird zuerst ein leeres Dictionary ''strassenbuch'' benötigt, dass alle Straßen-Objekte enthalten wird. Danach werden alle Kreuzungen erschaffen und zu einer Liste ''kreuzungen'' hinzugefügt. Im nächsten Schritt werden über das Aufrufen der Methode ''connect'' auf den Kreuzungen, die Kreuzungen verbunden und Straßen erschaffen. \\ |
+ | In der Datei sind bereits drei verschiedene Straßennetze als Kommentare angelegt, das aktive ist nicht auskommentiert. Dabei ist Straßennetz 1 das einfachste, Straßennetz 2 ein komplizierteres und STraßennetz 3 dient dem Testen von Kreuzungen. \\ | ||
Danach werden für jede Kreuzung die Ampeln erschaffen und zum Schluss werden die Autos erstellt und zu der Liste ''autos'' hinzugefügt. | Danach werden für jede Kreuzung die Ampeln erschaffen und zum Schluss werden die Autos erstellt und zu der Liste ''autos'' hinzugefügt. | ||
Diese Reihenfolge ist wichtig, da die Objekte jeweils die Existenz von anderen Objekten voraussetzen. \\ | Diese Reihenfolge ist wichtig, da die Objekte jeweils die Existenz von anderen Objekten voraussetzen. \\ | ||
Zeile 66: | Zeile 64: | ||
== Karte == | == Karte == | ||
- | Die Datei ''Karte.py'' ist für die Darstellung der Objekte auf dem Fenster zuständig und regelt die einzelnen Simluationsschritte der Objekte. Sie enthält die Funktionen ''transformiere'', ''schalte_ampeln'', ''bewege_autos'' und ''karte_zeichnen''. | + | Die Datei ''Karte.py'' ist für die Darstellung der Objekte auf dem Fenster zuständig und regelt die einzelnen Simulationsschritte der Objekte. Sie enthält die Funktionen ''transformiere'', ''schalte_ampeln'', ''bewege_autos'' und ''karte_zeichnen''. |
''karte_zeichnen'' erstellt ein Objekt vom Typ Pygame.Surface. Auf dieses wird das skalierte Straßennetz gezeichnet. Da das Straßennetz so auf einer eigenen Oberfläche ist, muss in der Hauptschleife in jedem Durchlauf nur diese Oberfläche auf dem Fenster befestigt und das Straßennetz nicht neu generiert werden. | ''karte_zeichnen'' erstellt ein Objekt vom Typ Pygame.Surface. Auf dieses wird das skalierte Straßennetz gezeichnet. Da das Straßennetz so auf einer eigenen Oberfläche ist, muss in der Hauptschleife in jedem Durchlauf nur diese Oberfläche auf dem Fenster befestigt und das Straßennetz nicht neu generiert werden. | ||
Zeile 76: | Zeile 74: | ||
== Auto == | == Auto == | ||
- | Die Datei ''Auto.py'' mit der Klasse "Auto" ist für die internen Prozesse der Autos zuständig und regelt unter anderem das Fahren und die Wegfindung. Es ist der unvisualisierte Teil der Simulation, der unabhängig von dieser abläuft. | + | Die Datei ''Auto.py'' mit der Klasse "Auto" ist für die internen Prozesse der Autos zuständig und regelt unter anderem das Fahren und die Wegfindung. Die Wegfindung haben wir in den einzelnen Bestandteilen geregelt. Beim muss das Auto unterscheiden, ob es auf einer Kreuzung oder Straße fährt. Dementsprechend holt es die Maximalgeschwindigkeit und seine Trajektorie sowie Informationen über andere Autos auf diesem Objekt. Basierend darauf berechnet es seine Beschleunigung mit dem intelligent driver model und bewegt sich. Wenn es ans Ende seiner aktuellen Straße oder Kreuzung kommmt, setzt es sich zudem noch auf das nächste Objekt weiter. |
== Kreuzung == | == Kreuzung == | ||
Zeile 194: | Zeile 192: | ||
Obwohl die beiden Fälle nur an der y-Achse gespiegelt sind, ändert sich der Ankunftswinkel und muss daher anders in die Formel eingehen. | Obwohl die beiden Fälle nur an der y-Achse gespiegelt sind, ändert sich der Ankunftswinkel und muss daher anders in die Formel eingehen. | ||
- | Um aus diesen drei Punkten die Parametrisierung zu machen, wird zu erst berechnet, wie weit auf dem Kreisbogen das Auto schon gefahren ist. Als Maß hierfür wird der Winkel genommen. (Formel). Dann wird der Vektor zwischen Endpunkt der Straße und Mittelpunkt des Kreisbogens berechnet. Dieser wird dann mithilfe einer Drehmatrix um den Winkel gedreht, den das Auto schon gefahren ist und somit der neue Standort des Autos berechnet. | + | Um aus diesen drei Punkten die Parametrisierung zu machen, wird zu erst berechnet, wie weit auf dem Kreisbogen das Auto schon gefahren ist. Als Maß hierfür wird der Winkel genommen. Dann wird der Vektor zwischen Endpunkt der Straße und Mittelpunkt des Kreisbogens berechnet. Dieser wird dann mithilfe einer Drehmatrix um den Winkel gedreht, den das Auto schon gefahren ist und somit der neue Standort des Autos berechnet. |
\begin{equation} | \begin{equation} | ||
+ | b := \frac{Position}{Radius} \\ | ||
\begin{pmatrix} | \begin{pmatrix} | ||
x_0 \\ | x_0 \\ | ||
x_1 | x_1 | ||
\end{pmatrix} | \end{pmatrix} | ||
- | := | + | = |
\begin{pmatrix} | \begin{pmatrix} | ||
\cos (b) & - \sin (b) \\ | \cos (b) & - \sin (b) \\ | ||
Zeile 228: | Zeile 227: | ||
Die Position des vorderen Autos für die Formel des IDM wird aus dem zurückgegebenen Abstand und Position des Autos bestimmt. Falls sich keine weiteren Autos auf der Kreuzung befinden und die Route des betrachteten Autos nicht an der Kreuzung endet, wird als Position die Position des letzten Autos in der nächsten Straße zurückgegeben, falls dort kein Auto vorhanden ist, die Länge der nächsten Straße. | Die Position des vorderen Autos für die Formel des IDM wird aus dem zurückgegebenen Abstand und Position des Autos bestimmt. Falls sich keine weiteren Autos auf der Kreuzung befinden und die Route des betrachteten Autos nicht an der Kreuzung endet, wird als Position die Position des letzten Autos in der nächsten Straße zurückgegeben, falls dort kein Auto vorhanden ist, die Länge der nächsten Straße. | ||
- | Bei der Geschwindigkeit des vorderen Autos für das IDM wird ebenfalls das vordere Auto durch die Methode ''vorderes_auto'' bestimmt. Die Geschwindigkeit, die in das IDM eingesetzt wird,**Fetter Text** ist der Anteil der Geschwindigkeit in Richtung des betrachteten Autos. Das ist im folgenden Bild verdeutlicht. | + | Bei der Geschwindigkeit des vorderen Autos für das IDM wird ebenfalls das vordere Auto durch die Methode ''vorderes_auto'' bestimmt. Die Geschwindigkeit, die in das IDM eingesetzt wird, ist der Anteil der Geschwindigkeit in Richtung des betrachteten Autos. Das ist im folgenden Bild verdeutlicht. |
{{ :ss2024:kreuzung_vorder_v.png?nolink&250 |}} | {{ :ss2024:kreuzung_vorder_v.png?nolink&250 |}} | ||
Das betrachtete, rote Auto ist $A$, das "vordere", blaue Auto ist $B$. | Das betrachtete, rote Auto ist $A$, das "vordere", blaue Auto ist $B$. | ||
- | Es wird zunächst Winkel $\psi_{Abstand}$ zwischen dem Abstandvektor von $B$ zu $A$ und der x-Achse mithilfe der beiden Punkte der Autos über den Arcustangens bestimmt. **Die Differenz zwischen $\psi_{Abstand}$ und $\psi_B$, den Winkel des Autos $B$ ergibt den Winkel $\theta$.** | + | Es wird zunächst Winkel $\psi_{Abstand}$ zwischen dem Abstandvektor von $B$ zu $A$ und der x-Achse mithilfe der beiden Punkte der Autos über den Arcustangens bestimmt. Die Differenz zwischen $\psi_{Abstand}$ und $\psi_B$, den Winkel des Autos $B$ ergibt den Winkel $\theta$. |
Der Anteil der Geschwindigkeit von Auto $B$ in Richtung von Auto $A$ wird nun berechnet über $v_{B -> A} = -v_B \cos(\theta)$. Dabei sorgt das negative Vorzeichen dafür, dass die übergebene Geschwindigkeit von $B$ positiv ist, wenn $B$ von $A$ weg fährt und negativ, wenn $B$ auf $A$ zu fährt, wie es auch auf den Straßen der Fall ist. | Der Anteil der Geschwindigkeit von Auto $B$ in Richtung von Auto $A$ wird nun berechnet über $v_{B -> A} = -v_B \cos(\theta)$. Dabei sorgt das negative Vorzeichen dafür, dass die übergebene Geschwindigkeit von $B$ positiv ist, wenn $B$ von $A$ weg fährt und negativ, wenn $B$ auf $A$ zu fährt, wie es auch auf den Straßen der Fall ist. | ||
Zeile 309: | Zeile 308: | ||
Nachdem sich die Gruppe gefunden und auf ein Thema geeinigt hatte, legten wir erstmal die grundlegende Struktur fest, Straßen, Autos und Kreuzungen. Anschließend teilten wir uns in zwei Teams, die jeweils an ihren eigenen Funktionen arbeiteten. Zuerst haben wir uns auf simple Dinge wie das Fahren und Beschleunigen der Autos konzentriert. Dann wurde Abbiegen, aber ohne dabei auf die Kreuzung zu fahren, hinzugefügt. Außerdem verbesserten wir unsere Methode, die Geschwindigkeit der Autos anzupassen mit dem Intelligent Driver Model. Danach arbeiteten wir an immer komplexeren Teilen der Simulation, wie der Kurvenberechnung, Parametrisierung und den Ampeln. Viel Zeit wurde natürlich auch mit Bugfixing verbracht. | Nachdem sich die Gruppe gefunden und auf ein Thema geeinigt hatte, legten wir erstmal die grundlegende Struktur fest, Straßen, Autos und Kreuzungen. Anschließend teilten wir uns in zwei Teams, die jeweils an ihren eigenen Funktionen arbeiteten. Zuerst haben wir uns auf simple Dinge wie das Fahren und Beschleunigen der Autos konzentriert. Dann wurde Abbiegen, aber ohne dabei auf die Kreuzung zu fahren, hinzugefügt. Außerdem verbesserten wir unsere Methode, die Geschwindigkeit der Autos anzupassen mit dem Intelligent Driver Model. Danach arbeiteten wir an immer komplexeren Teilen der Simulation, wie der Kurvenberechnung, Parametrisierung und den Ampeln. Viel Zeit wurde natürlich auch mit Bugfixing verbracht. | ||
+ | |||
+ | === Bekannte Probleme === | ||
+ | |||
+ | Die Simulation funktioniert noch nicht vollkommen fehlerfrei, es gibt noch einzelne Probleme beim Verhalten der Autos. | ||
+ | Die zwei Probleme treten in Bezug auf Kreuzungen auf. Zum Einen gibt es noch keine funktionierende Möglichkeit für die Autos, von einer Straße aus den Abstand zu Autos in der nächsten Kreuzung zu prüfen. Das führt dazu, dass sich zum Teil sehr schnell auf Kreuzungen zu bewegen und sehr plötzlich abbremsen, sobald sie auf die Kreuzung fahren. Dabei überlappen sich die Autos auch häufig. \\ | ||
+ | Ein anderes Problem ist das Auftreten sogenannter //Deadlocks//. In unserer Simulation bedeutet dass, das mehrere Autos sich gegenseitig blockieren, und so alle beteiligten Autos stehen bleiben.Es wurde versucht das Sichtfeld anzupassen, und eine "rechts-vor-links"-Regel einzubauen, indem der Winkel des Sichtfeldes nach links auf einen kleinen Winkel, wie $\frac{\pi}{8}$ und der des Sichtfeldes nach rechts auf einen größeren, wie $\frac{\pi}{4}$, gesetzt wird. Dadurch blockieren Sich die Autos zwar seltener, aber es gibt immer noch Situationen, in denen das vorkommt. \\ | ||
+ | Das Problem śolcher Deadlocks ist bei ähnlichen Simulationen bekannt, allerdings fehlte uns die Zeit, dazu Lösungsansätze zu implementieren. | ||
===Perspektiven=== | ===Perspektiven=== | ||
Zeile 322: | Zeile 328: | ||
==== Fazit / Reflexion ==== | ==== Fazit / Reflexion ==== | ||
+ | |||
===Reflexion=== | ===Reflexion=== | ||
Wir hatten alle viel Spaß bei dem Projekt und haben vieles dazu gelernt in Sachen Simulationsdarstellung und Programmierung. Auch möchten wir – nicht ohne stolz – vermerken, dass unsere Gruppe bis zum Schluss durchgehalten hat und keine Mitglieder verloren gegangen sind. Es ist auch positiv zu vermerken, dass die Autos fahren und das grundlegende Modell funktioniert – auch wenn verschiedenste Spielereien leider nicht umgesetzt werden konnten. Auch die Ampeln funktionieren und das Modell wäre für weitere Modifikationen und Simulationen zu gebrauchen. | Wir hatten alle viel Spaß bei dem Projekt und haben vieles dazu gelernt in Sachen Simulationsdarstellung und Programmierung. Auch möchten wir – nicht ohne stolz – vermerken, dass unsere Gruppe bis zum Schluss durchgehalten hat und keine Mitglieder verloren gegangen sind. Es ist auch positiv zu vermerken, dass die Autos fahren und das grundlegende Modell funktioniert – auch wenn verschiedenste Spielereien leider nicht umgesetzt werden konnten. Auch die Ampeln funktionieren und das Modell wäre für weitere Modifikationen und Simulationen zu gebrauchen. | ||
Zeile 435: | Zeile 442: | ||
===17.09.2024=== | ===17.09.2024=== | ||
* Verteilung der Ampeln: gegenüberliegende Ampeln bilden ein Paar, das gleichzeitig grün wird | * Verteilung der Ampeln: gegenüberliegende Ampeln bilden ein Paar, das gleichzeitig grün wird | ||
+ | |||
+ | ===22.09. - 29.09.2024=== | ||
+ | * Dokumentation geschrieben | ||
+ | * Bugs entfernt | ||
+ | * kleinere Optimierungen | ||
+ | |||
+ | |||
===== Vollständiger Programmcode ==== | ===== Vollständiger Programmcode ==== | ||
+ | |||
+ | {{:ss2024:verkehrssimulation.zip| Verkehrssimulation.zip}} | ||
===== Quellen ===== | ===== Quellen ===== |