Benutzer-Werkzeuge

Webseiten-Werkzeuge


ss2024:verkehrssimulation

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ss2024:verkehrssimulation [2024/09/26 16:13]
LuisJasper
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 19: Zeile 13:
 {{ :​ss2024:​bild_auto_strasse_kreuzungen.png?​nolink&​250| Ein Auto auf einer Straße zwischen zwei Kreuzungen.}} {{ :​ss2024:​bild_auto_strasse_kreuzungen.png?​nolink&​250| Ein Auto auf einer Straße zwischen zwei Kreuzungen.}}
  
-Die Grundlage der Simulation stellen drei Arten von Objekte ​dar:+Die Grundlage der Simulation stellen drei Arten von Objekten ​dar:
   * //​Straßen//,​ die als Strecken in einem zweidimensionalen Koordinatensystem existieren.   * //​Straßen//,​ die als Strecken in einem zweidimensionalen Koordinatensystem existieren.
   * //​Kreuzungen//,​ die als Punkte in dem gleichen Koordinatensystem liegen, Straßen miteinander verbinden und damit Anfangs- und Endpunkte der Straßen sind.   * //​Kreuzungen//,​ die als Punkte in dem gleichen Koordinatensystem liegen, Straßen miteinander verbinden und damit Anfangs- und Endpunkte der Straßen sind.
Zeile 28: Zeile 22:
 Bei der Simulation von Autos gibt es zwei grobe Ansätze: Bei dem makroskopischen Ansatz werden die Autos als Gesamtheit analog zu Fluidsystemen beschrieben. Dagegen werden bei dem mikroskopischen Ansatz die individuellen Autos betrachtet. <​sup>​[1]</​sup>​ \\ Bei der Simulation von Autos gibt es zwei grobe Ansätze: Bei dem makroskopischen Ansatz werden die Autos als Gesamtheit analog zu Fluidsystemen beschrieben. Dagegen werden bei dem mikroskopischen Ansatz die individuellen Autos betrachtet. <​sup>​[1]</​sup>​ \\
 Bei dieser Simulation wird ein makroskopisches Modell, das //​Intelligent Driver Model// (IDM) von Treiber, Hennecke und Helbing verwendet.<​sup>​[1]</​sup>​ Ein Auto beschleunigt und bremst dabei abhängig vom Verhalten des vorderen Autos und die Autos folgen einander, ohne einander zu überholen. \\ Bei dieser Simulation wird ein makroskopisches Modell, das //​Intelligent Driver Model// (IDM) von Treiber, Hennecke und Helbing verwendet.<​sup>​[1]</​sup>​ Ein Auto beschleunigt und bremst dabei abhängig vom Verhalten des vorderen Autos und die Autos folgen einander, ohne einander zu überholen. \\
-Die Autos haben in der Simulation eine Start- und eine Zielkreuzung. Bei Start der Simulation bestimmt jedes Autos seine Route anhand der Kreuzungen, die zur Zielkreuzung führen. Anschließend starten die Autos auf der Straße von der ersten Kreuzung zur zweiten Kreuzung der Route. Sie fahren bis zum Ende dieser Straße und biegen über die Kreuzung auf die nächste Straße ab. Das wird so lange wiederholt, bis die Zielkreuzung erreicht ist.+Die Autos haben in der Simulation eine Start- und eine Zielkreuzung. Bei Start der Simulation bestimmt jedes Auto seine Route anhand der Kreuzungen, die zur Zielkreuzung führen. Anschließend starten die Autos auf der Straße von der ersten Kreuzung zur zweiten Kreuzung der Route. Sie fahren bis zum Ende dieser Straße und biegen über die Kreuzung auf die nächste Straße ab. Das wird so lange wiederholt, bis die Zielkreuzung erreicht ist.
  
-Die Straßen besitzen ein inneres, eindimensionales Koordinatensystem auf dem die Koordinate eines Autos den Abstand zum Anfang der Straße darstellt ​und zwischen Null und der Länge der Straße ​liegt. Autos können sich auf Straßen nur in eine Richtung vom Anfangs- zum Endpunkt bewegen. Die Straßen in der Simulation kann man sich damit als einzelne Straßenspuren in der Realität vorstellen.+Die Straßen besitzen ein inneres, eindimensionales Koordinatensystem auf dem die Koordinate eines Autos den Abstand zum Anfang der Straße darstellt. Sie liegt dabei zwischen Null und der Länge der Straße. Autos können sich auf Straßen nur in eine Richtung vom Anfangs- zum Endpunkt bewegen. Die Straßen in der Simulation kann man sich damit als einzelne Straßenspuren in der Realität vorstellen.
  
-Die Kreuzungen liegen als Punkte im zweidimensionalen Koordinatensystem vor und haben zusätzlich einen Radius wobei Autos, die sich innerhalb von diesem befinden, als auf der Kreuzung fahrend gezählt werden. Die Kreuzungen sind somit vereinfacht als Kreise dargestellt. Ein Auto folgt beim Abbiegen auf einer Kreuzungen ​einer bestimmten Kurve innerhalb des Kreuzungsradius,​ die bei der vorherigen befahrenen Straße beginnt und bei der nächsten, durch die Route bestimmten, Straße endet.+Die Kreuzungen liegen als Punkte im zweidimensionalen Koordinatensystem vor und haben zusätzlich einen Radiuswobei Autos, die sich innerhalb von diesem befinden, als auf der Kreuzung fahrend gezählt werden. Die Kreuzungen sind vereinfacht als Kreise dargestellt. Ein Auto folgt beim Abbiegen auf einer Kreuzung ​einer bestimmten Kurve innerhalb des Kreuzungsradius,​ die bei der vorherigen befahrenen Straße beginnt und bei der nächsten, durch die Route bestimmten, Straße endet.
  
-Die Simulation wurde in der Programmiersprache Python realisiert und mithilfe des Moduls Pygame visualisiert. Sie erfordert pygame 2.6.0 und numpy 2.0.1 als Module.+Die Simulation wurde in der Programmiersprache Python realisiert und mithilfe des Moduls Pygame visualisiert. Sie erfordert pygame 2.6.0 und numpy 2.0.1 als Module ​um funktionsfähig zu sein.
  
 ==== 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 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 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. ​\\ 
-Danach werden für jede Kreuzung die Ampeln erschaffen und zum Schluss werden die Autos erschaffen ​und zu der Liste ''​autos''​ hinzugefügt.+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.
 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. \\
 Im nächsten Abschnitt wird das Fenster initialisiert,​ und das Straßennetz,​ sowie gegebenenfalls der Parkplatz für die Visualisierung erschaffen. Danach werden Straßennetz,​ Ampeln, Autos und gegebenenfalls der Parkplatz angezeigt. Im nächsten Abschnitt wird das Fenster initialisiert,​ und das Straßennetz,​ sowie gegebenenfalls der Parkplatz für die Visualisierung erschaffen. Danach werden Straßennetz,​ Ampeln, Autos und gegebenenfalls der Parkplatz angezeigt.
  
-Danach ​beginnt in der Hauptschleife die Simulation, die so lange weiter läuft, bis das Programm gestoppt wird. in Ihr wird geprüft ob die Simulation durch drücken ​der Leertaste gestoppt wird, und wenn das nicht der Falls ist werden folgende Schritte wiederholt ausgeführt:​+Anschließend ​beginnt in der Hauptschleife die Simulation, die so lange weiter läuft, bis das Programm gestoppt wird. In ihr wird geprüftob die Simulation durch Drücken ​der Leertaste gestoppt wird, und wenn das nicht der Fall istwerden folgende Schritte wiederholt ausgeführt:​
  
     * Straßennetz anzeigen     * Straßennetz anzeigen
Zeile 62: Zeile 60:
     * Autos bewegen und anzeigen     * Autos bewegen und anzeigen
     * ggf. Parkplatz anzeigen.     * ggf. Parkplatz anzeigen.
 +Der Parkplatz ist ein optionales Feature.
  
 == 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. 
-Dabei werden zuerst die Straßen als breite Linien von Mittelpunkt der Anfangs- ​zur Endkreuzung gezeichnet, wobei sie aus Sicht der Straße nach rechts versetzt werden. Anschließend werden die Kreuzungen als Kreise um die Mittelpunkte gezeichnet.+Dabei werden zuerst die Straßen als breite Linien von Mittelpunkt der Anfangs- ​zu dem der Endkreuzung gezeichnet, wobei sie aus Sicht der Straße nach rechts versetzt werden. Anschließend werden die Kreuzungen als Kreise um ihre Mittelpunkte gezeichnet.
 In der Funktion wird ebenfalls die Umrechnung vom internen Koordinatensystem in das der Visualisierung festgelegt. Die Karte-Oberfläche wird an ''​main.py''​ zurückgegeben. \\ In der Funktion wird ebenfalls die Umrechnung vom internen Koordinatensystem in das der Visualisierung festgelegt. Die Karte-Oberfläche wird an ''​main.py''​ zurückgegeben. \\
-''​schalte_ampeln''​ wird in jedem Durchlauf der Hauptschleife aufgerufen und schaltet die Ampeln, wie im [[ss2024:​verkehrssimulation#​Ampeln|Teil zu den Ampeln]] erklärt. Die Ampeln werden dann je nach Ampelphase in der Farbe rot oder grün ans Ende ihrer Straße gezeichnet. +''​schalte_ampeln''​ wird in jedem Durchlauf der Hauptschleife aufgerufen und schaltet die Ampeln, wie im [[ss2024:​verkehrssimulation#​Ampeln|Teil zu den Ampeln]] erklärt. Die Ampeln werden dann je nach Ampelphase in der Farbe rot oder grün ans Ende ihrer Straße gezeichnet. ​\\ 
-''​bewege_autos''​ geht alle Autos durch, ruft auf ihnen die Funktion ''​fahren'',​ nimmt die zurückgegebene Position entgegen und befestigt das Bild der Autos an der richtigen Position im Winkel des Autos auf dem Fenster.+''​bewege_autos''​ geht alle Autos durch, ruft auf ihnen die Funktion ''​fahren'' ​auf, nimmt die zurückgegebene Position entgegen und befestigt das Bild der Autos an der richtigen Position im Winkel des Autos auf dem Fenster. ​\\
 ''​transformiere''​ ist eine Hilfsfunktion,​ die das interne zweidimensionale Koordinatensystem in das Koordinatensystem der Visualisierung umrechnet. ''​transformiere''​ ist eine Hilfsfunktion,​ die das interne zweidimensionale Koordinatensystem in das Koordinatensystem der Visualisierung umrechnet.
  
 == 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. 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 ==
 +Die Klasse "​Kreuzung"​ in ''​Auto.py''​ umfasst Methoden um die Kreuzungen mit Straßen zu verbinden, die später erläuterte Abbiegekurvenparametrisierung zu errechnen sowie den Autos auf der Kreuzung Informationen über Position und Geschwindigkeit anderer auf der Kreuzung befindlichen Autos zu liefern und beinhaltet die Klasse Ampel, die wiederum die Ampeln regelt.
  
 == Strasse == == Strasse ==
 +Die Elemente der Klasse "​Strasse"​ verbinden Kreuzungen und bieten den Autos auf ihnen Methoden zum Informationsabruf von Position und Geschwindigkeit anderer auf der Straße befindlichen Autos.
  
 == Parkplatz == == Parkplatz ==
  
 +Die Aufgabe der Klasse ''​Parkplatz''​ in der Datei ''​Parkplatz.py''​ ist es die Autos anzuzeigen, die ihr Ziel bereits erreicht haben. Dafür gibt es innerhalb der Klasse die Pygame-Oberfläche ''​parkplatz'',​ deren Größe von der Größe des Bildes für die Autos abhängig ist, und die während der Simulation als graues Rechteck am rechten Rand angezeigt wird. Wenn ein Auto seine Zielkreuzung erreicht hat, wird seine Variable ''​strasse''​ auf ''"​parkplatz"''​ gesetzt. Durch die Methode ''​parke''​ der Parkplatz-Klasse werden ein Bild des Autos, Start- und Zielkreuzung,​ Dauer bis zum Erreichen des Ziels und Durchschnittsgeschwindigkeit zu der Oberfläche ''​parkplatz''​ hinzugefügt. Autos auf der Straße ''"​parkplatz"''​ werden im weiteren Verlauf des Programms ignoriert.
 +Durch aufrufen der Methode ''​geparkte_autos''​ wird die Parkplatz-Oberfläche mit den Details zu den Autos, und einem Zähler für die vergangene Zeit auf dem Fenster angezeigt.
  
 ==== Einzelne Elemente ==== ==== Einzelne Elemente ====
Zeile 95: Zeile 99:
 \end{equation} \end{equation}
  
-$v $  ist Momentangeschwindigkeit \\ +$v $  ist die Momentangeschwindigkeit\\ 
-$v_0 $  ist Maximalgeschwindigkeit mit meist $v_0 = 15 m/s $\\ +$v_0 $  ist die Maximalgeschwindigkeit mit meist $v_0 = 15 m/s$\\ 
-$\Delta v $ ist Annäherungsrate also Geschwindigkeitsdifferenz zum vorderen Auto.\\ +$\Delta v $ ist die Annäherungsratealso die Geschwindigkeitsdifferenz zum vorderen Auto.\\ 
-$s $ ist Entfernung zum Nächsten ​Auto, also Position des vorderen Autos minus eigene ​position ​minus 5 Meter Autolänge.\\ +$s $ ist die Entfernung zum nächsten ​Auto, also die Position des vorderen Autos minus eigene ​Position ​minus 5 Meter Autolänge.\\ 
-$T = 1,5s$ ist Sicherheitsabstandszeit \\ +$T = 1,5s$ ist die Sicherheitsabstandszeit\\ 
-$\alpha = 0,73 m/s^2$ ist Maximalbeschleunigung \\ +$\alpha = 0,73 m/s^2$ ist die Maximalbeschleunigung\\ 
-$b = 1,67 m/s^2 $ ist angenehme Entschleunigung (/Bremsung) \\ +$b = 1,67 m/s^2 $ ist die angenehme Entschleunigung (/Bremsung)\\ 
-$ \delta = 4 $ ist Gewichtungsexponent für Nähe zur Maximalgeschwindigkeit $v_0$ \\ +$ \delta = 4 $ ist der Gewichtungsexponent für die Nähe zur Maximalgeschwindigkeit $v_0$ \\ 
-$ s_0 = 2m $ ist Mindestabstand+$ s_0 = 2m $ ist der Mindestabstand.
  
-Der Term $\left(\frac{v}{v_0}\right)^\delta$ wird durch den großen Exponenten schnell ​Groß wenn die Geschwindigkeitsbegrenzung überschritten wird und schnell klein wenn sie unterschritten ist. +Der Term $\left(\frac{v}{v_0}\right)^\delta$ wird durch den großen Exponenten schnell ​groß, ​wenn die Geschwindigkeitsbegrenzung überschritten wird und schnell klein wenn sie unterschritten ist. 
-Der Termn $\cfrac{s_0 + vT + \cfrac{v \cdot \Delta v }{2\sqrt{\alpha b}}}{s} $ bildet ein Verhältnes aus gewünschtem und aktuellem Abstand zum Vorderen ​Auto. Der gewünschte Abstand setzt sich dabei aus der Summe von Mindestabstand $s_0$, der Entfernung die das Auto in den nächsten $T = 1,5s$ zurücklegen würde und einem sicherheitsabstand ​der mit wachsender ​Eigengeschwindigkeut ​sowie wachsender Annäherungsrate steigt. Er bremst ​auso das auto wenn es zu nahe an das nächste kommt.+Der Term $\cfrac{s_0 + vT + \cfrac{v \cdot \Delta v }{2\sqrt{\alpha b}}}{s} $ bildet ein Verhältnes aus gewünschtem und aktuellem Abstand zum vorderen ​Auto. Der gewünschte Abstand setzt sich dabei aus der Summe von Mindestabstand $s_0$, der Entfernung die das Auto in den nächsten $T = 1,5s$ zurücklegen würde und einem Sicherheitsabstand, ​der mit wachsender ​Eigengeschwindigkeit ​sowie wachsender Annäherungsrate steigt. Er bremst ​auch das Auto wenn es zu nahe an das nächste ​Fahrzeug ​kommt.
  
 Dies ist folgendermaßen implementiert:​ Dies ist folgendermaßen implementiert:​
Zeile 116: Zeile 120:
 === Wegfindungsalgorithmus === === Wegfindungsalgorithmus ===
  
-Zur Wegfindung nutzt das Auto den Dijkstra-Algorithmus. Dafür braucht es eine Liste an Kreuzungen und Straßen. Jeder Straße wird ein Wert zugewiesen, der zeigt, wie lange das Auto von ihrem Anfang zu ihrem Ende braucht, in unserem Fall ist dies ihre Länge. Beginnend mit der Anfangskreuzung geht das Auto alle Kreuzungen, die über eine Straße direkt mit ihr Verbunden ​sind, durch. Dabei wird jeder Kreuzung zugeordnet, wie lange das Auto bis zu ihr braucht (im ersten Schritt also einfach wie lang der Weg von der Anfangskreuzung aus ist) und von welcher Kreuzung der schnellste Weg kam. +Zur Wegfindung nutzt das Auto den Dijkstra-Algorithmus. Dafür braucht es eine Liste an Kreuzungen und Straßen. Jeder Straße wird ein Wert zugewiesen, der zeigt, wie lange das Auto von ihrem Anfang zu ihrem Ende braucht, in unserem Fall ist dies ihre Länge. Beginnend mit der Anfangskreuzung geht das Auto alle Kreuzungen, die über eine Straße direkt mit ihr verbunden ​sind, durch. Dabei wird jeder Kreuzung zugeordnet, wie lange das Auto bis zu ihr braucht (im ersten Schritt also einfach wie lang der Weg von der Anfangskreuzung aus ist) und von welcher Kreuzung der schnellste Weg kam. 
    
-Aus allen Kreuzungen, die so erreicht wurden, wird mit der Kreuzung weitergemacht,​ die am schnellsten erreicht wurde. Von dieser werden wieder alle angrenzenden Kreuzungen überprüft. Wird eine Kreuzung, zu der Bereits ​ein Weg führt, gefunden, werden beide verglichen und der schnellere gespeichert. Danach wird der selbe Schritt mit der Kreuzung wiederholt, die von allen verbleibenden den kürzesten Weg von der Anfangskreuzung zu sich hat.+Aus allen Kreuzungen, die so erreicht wurden, wird mit der Kreuzung weitergemacht,​ die am schnellsten erreicht wurde. Von dieser werden wieder alle angrenzenden Kreuzungen überprüft. Wird eine Kreuzung, zu der bereits ​ein Weg führt, gefunden, werden beide verglichen und der schnellere gespeichert. Danach wird der selbe Schritt mit der Kreuzung wiederholt, die von allen verbleibenden den kürzesten Weg von der Anfangskreuzung zu sich hat.
  
 Sobald alle Kreuzungen auf diesem Weg kontrolliert wurden, kann man den schnellsten Weg zur Zielkreuzung rekonstruieren,​ indem man so lange verfolgt, von welcher Kreuzung der schnellste Weg kam, bis man bei der Anfangskreuzung ist.  Sobald alle Kreuzungen auf diesem Weg kontrolliert wurden, kann man den schnellsten Weg zur Zielkreuzung rekonstruieren,​ indem man so lange verfolgt, von welcher Kreuzung der schnellste Weg kam, bis man bei der Anfangskreuzung ist. 
Zeile 188: 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 218: Zeile 223:
 {{ :​ss2024:​kreuzung_vorderes.png?​nolink&​300 |}} {{ :​ss2024:​kreuzung_vorderes.png?​nolink&​300 |}}
  
-Es wird das Auto $A$ betrachtet, das den Abstand zu Auto $B$ prüft, $v_A$ ist dessen Geschwindigkeitsvektor. Dieser ist im Auto-Objekt über den Betrag der Geschwindigkeit und den Winkel des Autos zur x-Achse gespeichert. Der Winkel zur x-Achse $\varphi_A$ ist im Bild in rot zu sehen. Zwischen den Mittelpunkten beider Autos gibt es eine Abstandgerade,​ im Bild schwarz. Durch die Abstände der Punkte der beiden Autos in x- und y-Richtung wird über den Arcustangens der Winkel$\varphi_{Abstand}$ der Verbindungsgeraden zur x-Achse bestimmt. Wenn Differenz von $\varphi_A$ und $\varphi_{Abstand}$ kleiner ist, als der Winkel des Sichtfeldes,​ wird der Abstand der beiden Autos als Betrag des Vektors vom Mittelpunkt von $A$ zum Mittelpunkt von $B$ berechnet. Ist dieser Betrag kleiner als der bisher gespeicherte kleinste Abstand, wird stattdessen dieser als neuer kleinster Abstand, und das Auto $B$ als vorderes Autos gespeichert. Nachdem alle Autos auf der Kreuzung so überprüft wurden, werden das ""​vordere"​ Auto und der kleinste Abstand zurückgegeben.+Es wird das Auto $A$ betrachtet, das den Abstand zu Auto $B$ prüft, $v_A$ ist dessen Geschwindigkeitsvektor. Dieser ist im Auto-Objekt über den Betrag der Geschwindigkeit und den Winkel des Autos zur x-Achse gespeichert. Der Winkel zur x-Achse $\varphi_A$ ist im Bild in rot zu sehen. Zwischen den Mittelpunkten beider Autos gibt es eine Abstandgerade,​ im Bild schwarz. Durch die Abstände der Punkte der beiden Autos in x- und y-Richtung wird über den Arcustangens der Winkel$\varphi_{Abstand}$ der Verbindungsgeraden zur x-Achse bestimmt. Wenn die Differenz von $\varphi_A$ und $\varphi_{Abstand}$ kleiner ist, als der Winkel des Sichtfeldes,​ wird der Abstand der beiden Autos als Betrag des Vektors vom Mittelpunkt von $A$ zum Mittelpunkt von $B$ berechnet. Ist dieser Betrag kleiner als der bisher gespeicherte kleinste Abstand, wird stattdessen dieser als neuer kleinster Abstand, und das Auto $B$ als vorderes Autos gespeichert. Nachdem alle Autos auf der Kreuzung so überprüft wurden, werden das ""​vordere"​ Auto und der kleinste Abstand zurückgegeben.
  
-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 istdie 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 die das IDM eingesetzt wird 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 wirdist 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 |}}
Zeile 228: Zeile 233:
 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.
  
 === Umrechnung der Koordinatensysteme === === Umrechnung der Koordinatensysteme ===
Zeile 235: Zeile 240:
 Die Koordinatensysteme sind: Die Koordinatensysteme sind:
     * Das eindimensionale Koordinatensystem innerhalb einer Straße mit der Einheit Meter     * Das eindimensionale Koordinatensystem innerhalb einer Straße mit der Einheit Meter
-    * Das zweidimensionale interne Koordinatensystem mit der Einheit+    * Das zweidimensionale interne Koordinatensystem mit der **Einheit**
     * Das Koordinatensystem der Visualisierung mit der Einheit Pixel     * Das Koordinatensystem der Visualisierung mit der Einheit Pixel
 +
 +== Straßenkoordinatensystem zum internen Koordinatensystem ==
  
 {{ :​ss2024:​koordinatensystem_strasse.png?​nolink&​300|}} {{ :​ss2024:​koordinatensystem_strasse.png?​nolink&​300|}}
  
-Das einfachste Koordinatensystem ist das einer Straße, das nur eine Achse besitzt. Wie schon erwähnt wird eine Position auf deiner ​Straße wird durch eine Koordinate dargestellt,​ die den Abstand vom Anfang der Straße angibt. Die Umrechnung in das interne zweidimensionale Koordinatensystem erfolgt wie rechts zu sehen:\\+Das einfachste Koordinatensystem ist das einer Straße, das nur eine Achse besitzt. Wie schon erwähnt wird eine Position auf einer Straße wird durch eine Koordinate dargestellt,​ die den Abstand vom Anfang der Straße angibt. Die Umrechnung in das interne zweidimensionale Koordinatensystem erfolgt wie rechts zu sehen:\\
 $A$ ist die Anfangs- und $B$ die Endkreuzung einer Straße der Länge $S$, $pos$ die Koordinate auf der Straße. Die Straße bildet mit $\Delta x$ und $\Delta y$ ein rechtwinkliges Dreieck. Der Winkel $\varphi$ wird im Programmcode berechnet über $A$ ist die Anfangs- und $B$ die Endkreuzung einer Straße der Länge $S$, $pos$ die Koordinate auf der Straße. Die Straße bildet mit $\Delta x$ und $\Delta y$ ein rechtwinkliges Dreieck. Der Winkel $\varphi$ wird im Programmcode berechnet über
 <code python> <code python>
Zeile 253: Zeile 260:
 ''​self.anfang_gridpos[0]''​ und ''​self.anfang_gridpos[1]''​ sind für eine Straße x- und y-Koordinate der Anfangskreuzung,​ im Bild $A$. ''​self.anfang_gridpos[0]''​ und ''​self.anfang_gridpos[1]''​ sind für eine Straße x- und y-Koordinate der Anfangskreuzung,​ im Bild $A$.
 ''​offset''​ wird auf 3 gesetzt und so fahren die Autos nicht direkt zwischen den Mittelpunkten der Kreuzungen, sondern sind aus ihrer Sicht etwas nach rechts versetzt, damit die Straßenspuren getrennt voneinander verlaufen. ''​offset''​ wird auf 3 gesetzt und so fahren die Autos nicht direkt zwischen den Mittelpunkten der Kreuzungen, sondern sind aus ihrer Sicht etwas nach rechts versetzt, damit die Straßenspuren getrennt voneinander verlaufen.
 +
 +== Internes Koordinatensystem zur Visualisierung ==
 +
 +Zum Skalieren der Karte in der Funktion ''​karte_zeichnen''​ der Datei ''​karte.py''​ werden zuerst alle Kreuzungen durchgegangen,​ um die größten und kleinsten vorkommenden Werte der x- und y-Koordinaten im internen Koordinatensystem zu finden. Über die Differenz von größtem und kleinstem Wert erhält man die Spannweite der Werte in x- bzw y-Richtung. Im nächsten Schritt wird die Breite des Fensters abzüglich eines kleinen Randes durch die Spannweite in x-Richtung geteilt, das Ergebnis ist die Hilfsvariable ''​LE_x''​. Dann wird die Höhe des Fensters abzüglich des Randes durch die Spannweite in y-Richtung geteilt um ''​LE_y''​ zu erhalten. Der kleinere Wert von ''​LE_x''​ und ''​LE_y''​ wird nun als ''​LE''​ bezeichnet. ''​LE''​ ist der Faktor, der beschreibt, wie viele Pixel auf dem Bildschirm einem Meter im inneren Koordinatensystem entsprechen,​ und ist damit für die Umrechnung der Koordinatensysteme zentral.
 +Ebenfalls wichtig sind der Mittelpunkt des internen Koordinatensystems in x-Richtung ''​center_x''​ und in y-Richtung ''​center_y'',​ also jeweils die Hälfte der Spannweite in x- bzw. y-Richtung.
 +
 +Diese drei Variablen werden bei der Koordinatentransformation über der Funktion ''​transformiere'' ​ in ''​Karte.py''​ verwendet. Die Transformation von den inneren Koordinaten zu denen der Visualisierung ist im Code folgendermaßen implementiert und weiter unten grafisch dargestellt:​
 +
 +<code python>
 +new_x = int( window_width/​2 + LE*(x-center_x) )
 +new_y = int( window_height/​2 + LE*(-1*(y-center_y)) )
 +</​code>​
 +
 +Dabei sind ''​x''​ und ''​y''​ die Koordinaten des Punktes im internen Koordinatensystem und ''​new_x''​ und ''​new_y''​ die Koordinaten in dem der Visualisierung. ''​window_width''​ ist die Breite und ''​window_height''​ die Höhe des Fensters in Pixeln.
 +Bei der y-Koordinate wird mit –1 multipliziert,​ da in Pygame die y-Achse nach unten zeigt, während im internen Koordinatensystem die y-Achse nach oben zeigt.
 +Die neuen Werte werden zu ganzen Zahlen gerundet, weil sie Pixeln auf dem Bildschirm entsprechen.
 +
 +{{ :​ss2024:​transformation_koordinatensystem.png?​nolink&​650 |}}
  
 === Ampeln === === Ampeln ===
Zeile 261: Zeile 286:
  
 ''​Ampel''​ ist eine innere Klasse, innerhalb der Klasse ''​Kreuzung''​. Die Kreuzungen besitzen eine Liste aller ihrer Ampeln, wobei jede Ampel einer eingehenden Straße zugeordnet ist. ''​Ampel''​ ist eine innere Klasse, innerhalb der Klasse ''​Kreuzung''​. Die Kreuzungen besitzen eine Liste aller ihrer Ampeln, wobei jede Ampel einer eingehenden Straße zugeordnet ist.
-Die Ampeln bringen die Autos zum anhalten, indem sich selbst zum Ende der Liste ''​autos''​ der ihr zugeordneten Straße hinzufügen. Da die Objekte eine Position auf der Straße, kurz vor Beginn der Kreuzung und eine Geschwindigkeit von Null besitzen, werden sie von den Autos auf der Straße wie ein vorderes Autos behandelt, ein Auto bremst also ab, wenn es sich der Ampel nähert. Wenn die Phase der Ampeln sich auf grün ändert entfernt sich die Ampel aus der ''​autos''​-Liste ihrer Straße, ​durch das vorderste Autos wieder beschleunigen kann. Die Schaltung der Ampeln erfolgt über die Methode ''​schalte''​ der Klasse ''​Ampel''​.+Die Ampeln bringen die Autos zum Anhalten, indem sie sich selbst zum Ende der Liste ''​autos''​ der ihr zugeordneten Straße hinzufügen. Da die Objekte eine Position auf der Straße, kurz vor Beginn der Kreuzung und eine Geschwindigkeit von Null besitzen, werden sie von den Autos auf der Straße wie ein vorderes Autos behandelt, ein Auto bremst also ab, wenn es sich der Ampel nähert. Wenn die Phase der Ampeln sich auf grün ändertentfernt sich die Ampel aus der ''​autos''​-Liste ihrer Straße, ​wodurch ​das vorderste Autos wieder beschleunigen kann. Die Schaltung der Ampeln erfolgt über die Methode ''​schalte''​ der Klasse ''​Ampel''​.
  
 In der Realität werden in der Regel bei einer Kreuzung mit vier Eingängen die Ampeln von gegenüberliegenden Straßen gleichzeitig grün. In der Simulation wird dieses Verhalten für eine beliebige Anzahl an Eingängen verallgemeinert,​ indem die Eingänge einer Kreuzung jeweils Paare bilden. In der Realität werden in der Regel bei einer Kreuzung mit vier Eingängen die Ampeln von gegenüberliegenden Straßen gleichzeitig grün. In der Simulation wird dieses Verhalten für eine beliebige Anzahl an Eingängen verallgemeinert,​ indem die Eingänge einer Kreuzung jeweils Paare bilden.
Zeile 278: Zeile 303:
 ===== Projektplanung ===== ===== Projektplanung =====
 ===Projektziele=== ===Projektziele===
-Mit der wachsender Bevölkerung in urbanen Zentren steigt auch die Wichtigkeit,​ bestehende Straßen und Verkehrsnetze möglichst effizient zu nutzen. Unsere Simulation hat als Zielsetzung,​ eine Grundlage zum Austesten verschiedener Möglichkeiten, um auf den Individualverkehr einzuwirken, zu bieten. Idee war, sowohl das Fahrverhalten als auch den Straßenplan inklusive Ampeln und Geschwindigkeitsregulierungen unabhängig voneinander veränderlich zu machen und somit die Auswirkungen einzelner Faktoren auf Staus, Durchschnittsgeschwindigkeit und Unfallraten abschätzen zu können. Stück für Stück wollten wir in die Simulation mehr Facetten einbauen und sie realitätsnäher werden lassen, um irgendwann auch echte Straßennetze zu simulieren. ​+Mit der wachsender Bevölkerung in urbanen Zentren steigt auch die Wichtigkeit,​ bestehende Straßen und Verkehrsnetze möglichst effizient zu nutzen. Unsere Simulation hat als Zielsetzung,​ eine Grundlage ​zu bieten die zum Austesten verschiedener Möglichkeiten auf den Individualverkehr einzuwirken ​genutzt werden kann. Idee war, sowohl das Fahrverhalten als auch den Straßenplan inklusive Ampeln und Geschwindigkeitsregulierungen unabhängig voneinander veränderlich zu machen und somit die Auswirkungen einzelner Faktoren auf Staus, Durchschnittsgeschwindigkeit und Unfallraten abschätzen zu können. Stück für Stück wollten wir in die Simulation mehr Facetten einbauen und sie realitätsnäher werden lassen, um irgendwann auch echte Straßennetze zu simulieren. ​
  
 ===Projektverlauf=== ===Projektverlauf===
  
-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. ​Zu erst 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 293: Zeile 325:
  
 ==Mehrspurige Straßen== ==Mehrspurige Straßen==
-Die jetzigen Straßen-Objekte sind alle einspurig, das bedeutet Autos können einander nicht überholen und auf jede Straße passen auf den gleichen Längenabschnitt immer die gleiche Menge an Autos. Man könnte, um mehrspurige Straßen zu simulieren, mehrere Straßen-Objekte mit der gleichen Anfangs- und Endkreuzung parallel zueinander platzieren. Dazu müsste man das Modell so erweitern, dass die Autos auf die parallelen Straßenobjekte wechseln können. So könnte man auch Straßen mit unterschiedlicher Breite simulieren, und untersuchen welchen Effekt zusätzliche Spuren auf den verkehr ​haben.+Die jetzigen Straßen-Objekte sind alle einspurig, das bedeutet Autos können einander nicht überholen und auf jede Straße passen auf den gleichen Längenabschnitt immer die gleiche Menge an Autos. Man könnte, um mehrspurige Straßen zu simulieren, mehrere Straßen-Objekte mit der gleichen Anfangs- und Endkreuzung parallel zueinander platzieren. Dazu müsste man das Modell so erweitern, dass die Autos auf die parallelen Straßenobjekte wechseln können. So könnte man auch Straßen mit unterschiedlicher Breite simulieren, und untersuchenwelchen Effekt zusätzliche Spuren auf den Verkehr ​haben.
  
 ==== 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 409: 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 =====
ss2024/verkehrssimulation.1727359989.txt.gz · Zuletzt geändert: 2024/09/26 16:13 von LuisJasper