Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws1819: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
ws1819:verkehrssimulation [2019/03/17 14:02]
jonathan_p
ws1819:verkehrssimulation [2019/04/01 19:59] (aktuell)
stefanborn
Zeile 1: Zeile 1:
 +Wir haben nichts auszusetzen. :-)
 +
 ====== Verkehrssimulation ====== ====== Verkehrssimulation ======
  
Zeile 5: Zeile 7:
 ==== Was kann unsere Simulation? ==== ==== Was kann unsere Simulation? ====
  
-Mit der von uns entwickelten Verkehrssimulation kann ein einfaches Straßennetz mit Kurven, Kreuzungen und einspurigen Fahrbahnen angelegt werden und anschließend der Verkehrsfluss mit beliebig vielen Fahrzeugen betrachtet werden. Den Fahrzeugen können dabei Eigenschaften,​ wie Wunschgeschwindigkeit,​ Maximalbeschleunigung und Reaktionszeit übergeben werden. ​+Mit der von uns entwickelten Verkehrssimulation kann ein einfaches Straßennetz mit Kurven, Kreuzungen und einspurigen Fahrbahnen angelegt werden und anschließend der Verkehrsfluss mit beliebig vielen Fahrzeugen betrachtet werden. Den Fahrzeugen können dabei Eigenschaften,​ wie Wunschgeschwindigkeit,​ Maximalbeschleunigung und Reaktionszeit übergeben werden. ​An den Kreuzungen gibt es die Möglichkeit,​ Ampelschaltungen anzupassen und die daraus resultierenden Veränderungen zu betrachten. 
 + 
 +{{:​ws1819:​screenshot_7_.png|}}
  
 ---- ----
Zeile 13: Zeile 17:
 ==== Ursprüngliches Ziel: ==== ==== Ursprüngliches Ziel: ====
  
-Simulation und Optimierung eines kleinen ​Ausschnitts ​von Berlins Straßennetz. +Unser ursprüngliches Ziel war es, einen kleinen ​Ausschnitt ​von Berlins Straßennetz ​in unser Programm zu übernehmen und anschließend zu optimieren.
  
-==== Zwischenziele====+==== Zwischenziele ====
  
   * OpenGL, pygame und pyglet Grundlagen verstehen   * OpenGL, pygame und pyglet Grundlagen verstehen
Zeile 26: Zeile 29:
   * Benutzeroberfläche   * Benutzeroberfläche
  
-==== Verwendete Literatur====+==== Verwendete Literatur ====
  
   * TREIBER, Martin und Arne KERSTING, 2010. //​Verkehrsdynamik und -simulation:​ Daten, Modelle und Anwendungen der Verkehrsflussdynamik//​. Heidelberg: Springer. ISBN 978-3-642-05227-9   * TREIBER, Martin und Arne KERSTING, 2010. //​Verkehrsdynamik und -simulation:​ Daten, Modelle und Anwendungen der Verkehrsflussdynamik//​. Heidelberg: Springer. ISBN 978-3-642-05227-9
Zeile 39: Zeile 42:
   * pyglet Dokumentation:​ [[https://​pyglet.readthedocs.io/​en/​pyglet-1.3-maintenance/​]]   * pyglet Dokumentation:​ [[https://​pyglet.readthedocs.io/​en/​pyglet-1.3-maintenance/​]]
   * Simulationsbeispiele:​ [[http://​traffic-simulation.de/​]]   * Simulationsbeispiele:​ [[http://​traffic-simulation.de/​]]
 +
 +==== Aufgabenverteilung ====
 +
 +Jonathan:
 +  * Grafische Umsetzung (also anfangs noch PyOpenGL, später dann PyGame)
 +  * Programmgrundstruktur aus drei Klassen und einem ''​Loop'',​ der ständig ausgeführt wird
 +  * Die Methoden ''​change'',​ ''​fahre'',​ ''​zeichne'',​ ''​pruefe_ampel'',​ ''​pruefe_kollision'',​ ''​zeichne_fahrbahn'',​ ''​zeichne_ampel'',​ ''​phasen''​
 +  * Das "​eckige",​ aber zuverlässige Abbiegen der Fahrzeuge
 +  * Die Wiki
 +
 +Seohyun:
 +  * Das "​runde"​ Abbiegen der Fahrzeuge
 +  * Die Methoden ''​fahre''​ und ''​pruefe_ampel''​ für das Abbiegen angepasst
 +  * Die ''​__init__''​-Methoden angefangen
 +  * Die Erklärung zur ''​abbiegen''​-Methode in der Wiki
  
 ===== Protokolle ===== ===== Protokolle =====
  
 Unsere wöchentlichen Protokolle gibt es hier: [[ws1819:​verkehrssimulation:​protokolle|ws1819:​verkehrssimulation:​Protokolle]] Unsere wöchentlichen Protokolle gibt es hier: [[ws1819:​verkehrssimulation:​protokolle|ws1819:​verkehrssimulation:​Protokolle]]
- 
----- 
  
 ===== Dokumentation ===== ===== Dokumentation =====
  
 Unser Programm besteht aus den drei Klassen ''​Fahrzeug'',​ ''​Fahrbahn''​ und ''​Ampel''​. Bei der visuellen Darstellung haben wir uns letztendlich für PyGame entschieden,​ da dieses viel einfacher ist, als PyOpenGL und für unsere Simulation vollkommen ausreicht.\\ ​ Unser Programm besteht aus den drei Klassen ''​Fahrzeug'',​ ''​Fahrbahn''​ und ''​Ampel''​. Bei der visuellen Darstellung haben wir uns letztendlich für PyGame entschieden,​ da dieses viel einfacher ist, als PyOpenGL und für unsere Simulation vollkommen ausreicht.\\ ​
-Das Programm besitzt eine ''​Haupt-Schleife''​, die mehrfach in der Sekunde ausgeführt wird. In jedem Zeitschritt des Programms wird zuerst der Hintergrund,​ also das Straßennetz mit Pygame gezeichnet:+Das Programm besitzt eine Haupt-Schleife,​ die mehrfach in der Sekunde ausgeführt wird. In jedem Zeitschritt des Programms wird zuerst der Hintergrund,​ also das Straßennetz mit Pygame gezeichnet:
 <code python> <code python>
 for row in range(maphoehe):​ for row in range(maphoehe):​
Zeile 57: Zeile 73:
 Danach werden alle Ampeln an ihre angegebenen Positionen gezeichnet und zum Schluss die Fahrzeuge, für die nacheinander alle Methoden der Klasse ''​Fahrzeug''​ ausgeführt werden. Danach werden alle Ampeln an ihre angegebenen Positionen gezeichnet und zum Schluss die Fahrzeuge, für die nacheinander alle Methoden der Klasse ''​Fahrzeug''​ ausgeführt werden.
  
-===Die Klasse ''​Fahrzeug''​===+==== Die Klasse ''​Fahrzeug'' ​====
  
 Jedes Objekt der Klasse ''​Fahrzeug''​ hat 13 Attribute: Jedes Objekt der Klasse ''​Fahrzeug''​ hat 13 Attribute:
Zeile 71: Zeile 87:
   * Die Fahrbahn, auf der sich das Fahrzeug gerade befindet   * Die Fahrbahn, auf der sich das Fahrzeug gerade befindet
  
-==Die ''​change''​-Methode==+=== Die ''​change''​-Methode ​===
  
 Diese Methode vergleicht die Wunschgeschwindigkeit ''​v_optimal''​ mit der aktuellen Geschwindigkeit ''​v''​ jeden Fahrzeuges und entscheidet dementsprechend,​ ob das Fahrzeug beschleunigen oder bremsen soll. Die entsprechend berechnete Beschleunigung wird dann als Wert für ''​a''​ festgelegt. Diese Methode vergleicht die Wunschgeschwindigkeit ''​v_optimal''​ mit der aktuellen Geschwindigkeit ''​v''​ jeden Fahrzeuges und entscheidet dementsprechend,​ ob das Fahrzeug beschleunigen oder bremsen soll. Die entsprechend berechnete Beschleunigung wird dann als Wert für ''​a''​ festgelegt.
  
-==Die ''​fahre''​-Methode==+=== Die ''​fahre''​-Methode ​===
  
 ''​fahre''​ ist dafür zuständig, aus der aktuellen Geschwindigkeit und Beschleunigung,​ die neuen Koordinaten von jedem Fahrzeug zu berechnen. Dazu wird zuerst die Fahrtrichtung geprüft und dann mit der Formel ''​fahre''​ ist dafür zuständig, aus der aktuellen Geschwindigkeit und Beschleunigung,​ die neuen Koordinaten von jedem Fahrzeug zu berechnen. Dazu wird zuerst die Fahrtrichtung geprüft und dann mit der Formel
Zeile 83: Zeile 99:
 aktualisiert. aktualisiert.
  
-==Die ''​zeichne''​-Methode==+=== Die ''​zeichne''​-Methode ​===
  
 Diese Methode prüft, ob sich das Fahrzeug aus dem Fenster bewegt und setzt es dann wieder an den Anfang der Straße. Außerdem wird das Fahrzeug mit der Methode Diese Methode prüft, ob sich das Fahrzeug aus dem Fenster bewegt und setzt es dann wieder an den Anfang der Straße. Außerdem wird das Fahrzeug mit der Methode
Zeile 91: Zeile 107:
 an die entsprechende Stelle in das PyGame-Fenster gezeichnet. Die Null am Ende des Befehls bedeutet, dass das gezeichnete Rechteck mit Farbe ausgefüllt wird. an die entsprechende Stelle in das PyGame-Fenster gezeichnet. Die Null am Ende des Befehls bedeutet, dass das gezeichnete Rechteck mit Farbe ausgefüllt wird.
  
-==Die ''​abbiegen''​- Methode ==+=== Die ''​abbiegen''​- Methode ​===
  
 Mit dieser Methode hatten wir einige Schwierigkeiten. Letztendlich hatten wir zwei verschiedene Programme, eines wo die Fahrzeuge zwar in einem schönen Bogen abbiegen, dafür aber häufig nach dem Abbiegevorgang nicht mehr ganz gerade weiterfahren und in den Gegenverkehr geraten. In dem zweiten Programm biegen die Fahrzeuge, ohne einen Bogen zu fahren einfach abrupt um 90° ab, bleiben dafür aber zuverlässig auf ihrer Fahrbahn. Mit dieser Methode hatten wir einige Schwierigkeiten. Letztendlich hatten wir zwei verschiedene Programme, eines wo die Fahrzeuge zwar in einem schönen Bogen abbiegen, dafür aber häufig nach dem Abbiegevorgang nicht mehr ganz gerade weiterfahren und in den Gegenverkehr geraten. In dem zweiten Programm biegen die Fahrzeuge, ohne einen Bogen zu fahren einfach abrupt um 90° ab, bleiben dafür aber zuverlässig auf ihrer Fahrbahn.
Zeile 138: Zeile 154:
 Nach dem Abbiegen ist das Fahrzeug nicht mehr auf der vorigen Straße, sondern auf der neuen Straße. Deswegen entfernen wir das Fahrzeug aus der Fahrzeugliste von der vorigen Straße, und fügen das zur Fahrzeugliste von der neuen Straße. Das Fahrzeug hat neue Richtung, die der Straße gehört, und fährt weiter. Nach dem Abbiegen ist das Fahrzeug nicht mehr auf der vorigen Straße, sondern auf der neuen Straße. Deswegen entfernen wir das Fahrzeug aus der Fahrzeugliste von der vorigen Straße, und fügen das zur Fahrzeugliste von der neuen Straße. Das Fahrzeug hat neue Richtung, die der Straße gehört, und fährt weiter.
  
-==Die ''​prüfe_ampel''​-Methode==+=== Die ''​prüfe_ampel''​-Methode ==
 + 
 +Auch bei dieser Methode wird zuerst geprüft, in welcher Richtung das Fahrzeug unterwegs ist. Danach wird zu jeder Ampel, die das Fahrzeug passieren könnte der Abstand ausgerechnet. Sobald die Ampel rot oder gelb ist und der Abstand zur Ampel gering genug ist, wird die Wunschgeschwindigkeit des Fahrzeuges auf Null gesetzt, sodass es beim nächsten Durchlauf der change-Methode beginnt zu bremsen.\\ Der Programmcode für die Fahrtrichtung ''​x''​ sieht so aus:
  
-Auch bei dieser Methode wird zuerst geprüft, in welcher Richtung das Fahrzeug unterwegs ist. Danach wird zu jeder Ampel, die das Fahrzeug passieren könnte der Abstand ausgerechnet. Sobald die Ampel rot oder gelb ist und der Abstand zur Ampel gering genug ist, wird die Wunschgeschwindigkeit des Fahrzeuges auf Null gesetzt, sodass es beim nächsten Durchlauf der change-Methode beginnt zu bremsen.\\ Der Programmcode für die Fahrtrichtung ''​x''​ sieht so aus:\\ 
 <code python> <code python>
 if self.richtung == "​x":​ if self.richtung == "​x":​
Zeile 153: Zeile 170:
 </​code>​ </​code>​
  
-==Die ''​prüfe_kollision''​-Methode==+=== Die ''​prüfe_kollision''​-Methode ​===
  
 Der Name dieser Methode ist etwas missverständlich,​ denn eigentlich dient diese Methode dazu, Kollisionen durch rechtzeitiges Abbremsen zu verhindern. Dazu gibt es eine global zugängliche Liste ''​belegt[]''​. Diese Liste enthält immer alle aktuellen x- und y-Koordinaten von jedem Fahrzeug. Nacheinander wird jedes Element dieser Liste betrachtet und der x- und y-Abstand zum aktuellen Fahrzeug, unter Beachtung der Fahrzeuglänge,​ ausgerechnet. Wenn sich das jeweils betrachtete Fahrzeug weniger als 5 Pixel links oder rechts vom aktuellen Fahrzeug befindet, wird als nächstes geschaut, wie weit das Fahrzeug aus der Liste sich vor, oder hinter dem aktuellen Fahrzeug befindet. In dynamischen Intervallen (doppelter Sicherheitsabstand,​ Sicherheitsabstand,​ halber Sicherheitsabstand und zu nah), wird die Geschwindigkeit des aktuellen Fahrzeugs entsprechend angepasst. Als Sicherheitsabstand nehmen wir die Faustformel ''​Halber Tacho = Sicherheitsabstand''​. Sollte festgestellt werden, dass sich kein Fahrzeug im relevanten Bereich vor dem aktuellen Fahrzeug befindet, wird die Wunschgeschwindigkeit auf die Maximal erlaubte Geschwindigkeit gestellt. Das bewirkt auch, dass das Fahrzeug an einer grün gewordenen Ampel wieder losfährt (die Wunschgeschwindigkeit wird an einer roten Ampel auf 0 gesetzt). Der Name dieser Methode ist etwas missverständlich,​ denn eigentlich dient diese Methode dazu, Kollisionen durch rechtzeitiges Abbremsen zu verhindern. Dazu gibt es eine global zugängliche Liste ''​belegt[]''​. Diese Liste enthält immer alle aktuellen x- und y-Koordinaten von jedem Fahrzeug. Nacheinander wird jedes Element dieser Liste betrachtet und der x- und y-Abstand zum aktuellen Fahrzeug, unter Beachtung der Fahrzeuglänge,​ ausgerechnet. Wenn sich das jeweils betrachtete Fahrzeug weniger als 5 Pixel links oder rechts vom aktuellen Fahrzeug befindet, wird als nächstes geschaut, wie weit das Fahrzeug aus der Liste sich vor, oder hinter dem aktuellen Fahrzeug befindet. In dynamischen Intervallen (doppelter Sicherheitsabstand,​ Sicherheitsabstand,​ halber Sicherheitsabstand und zu nah), wird die Geschwindigkeit des aktuellen Fahrzeugs entsprechend angepasst. Als Sicherheitsabstand nehmen wir die Faustformel ''​Halber Tacho = Sicherheitsabstand''​. Sollte festgestellt werden, dass sich kein Fahrzeug im relevanten Bereich vor dem aktuellen Fahrzeug befindet, wird die Wunschgeschwindigkeit auf die Maximal erlaubte Geschwindigkeit gestellt. Das bewirkt auch, dass das Fahrzeug an einer grün gewordenen Ampel wieder losfährt (die Wunschgeschwindigkeit wird an einer roten Ampel auf 0 gesetzt).
Zeile 176: Zeile 193:
 </​code>​ </​code>​
  
-===Die Klasse ''​Fahrbahn''​===+==== Die Klasse ''​Fahrbahn'' ​====
  
 Die Klasse Fahrbahn hat die Attribute Startkachel,​ Endkachel, Fahrtrichtung,​ Fahrzeugliste und Ampelliste. Die Klasse Fahrbahn hat die Attribute Startkachel,​ Endkachel, Fahrtrichtung,​ Fahrzeugliste und Ampelliste.
  
-==Die ''​zeichne_fahrbahn''​-Methode==+=== Die ''​zeichne_fahrbahn''​-Methode ​===
  
 Diese Methode dient dazu, die Fahrbahntexturen und Kreuzungstexturen an die entsprechenden Stellen der Tilemap einzufügen. Dazu werden die Koordinaten der Startkachel und Endkachel ausgelesen und zwischen diesen Kacheln die Straße gezeichnet.\\ Diese Methode dient dazu, die Fahrbahntexturen und Kreuzungstexturen an die entsprechenden Stellen der Tilemap einzufügen. Dazu werden die Koordinaten der Startkachel und Endkachel ausgelesen und zwischen diesen Kacheln die Straße gezeichnet.\\
Zeile 192: Zeile 209:
 </​code>​ </​code>​
  
-==Die fuege_fahrzeug_hinzu- und fuege_ampel_hinzu-Methode==+=== Die ''​fuege_fahrzeug_hinzu''​- und ''​fuege_ampel_hinzu''​-Methode ​===
  
 Diese beiden Methoden speichern einmalig alle Fahrzeuge und alle Ampeln in jeweils einer eigenen Liste für jede Fahrbahn ein. Diese Listen werden dann später ständig mit den aktuellen Daten aktualisiert. Diese beiden Methoden speichern einmalig alle Fahrzeuge und alle Ampeln in jeweils einer eigenen Liste für jede Fahrbahn ein. Diese Listen werden dann später ständig mit den aktuellen Daten aktualisiert.
  
-===Die Klasse ''​Ampel''​===+==== Die Klasse ''​Ampel'' ​====
  
 Die Klasse ''​Ampel''​ hat folgende Attribute: Die Klasse ''​Ampel''​ hat folgende Attribute:
Zeile 207: Zeile 224:
   * q (zum abspeichern der vorherigen Ampelfarbe)   * q (zum abspeichern der vorherigen Ampelfarbe)
  
-==Die zeichne-Methode==+=== Die ''​zeichne''​-Methode ​===
  
 Diese Methode zeichnet, abhängig von der Ausrichtung der Ampel, ein Rechteck auf die entsprechende Stelle auf der Kreuzung. Diese Methode zeichnet, abhängig von der Ausrichtung der Ampel, ein Rechteck auf die entsprechende Stelle auf der Kreuzung.
Zeile 215: Zeile 232:
 ''​ampelfarben''​ ist eine Liste mit RGB-Farbcodes für die verschiedenen Ampelfarben,​ also z.B. ''​[255,​0,​0]''​ für ''​rot''​ ''​ampelfarben''​ ist eine Liste mit RGB-Farbcodes für die verschiedenen Ampelfarben,​ also z.B. ''​[255,​0,​0]''​ für ''​rot''​
  
-==Die phasen-Methode==+=== Die ''​phasen''​-Methode ​===
  
 Diese Methode steuert die Ampelphasen. Bei jedem Aufruf wird der ''​timer''​ jeder Ampel um ''​t''​ (ist normalerweise 1) erhöht. Sobald der Timer einen bestimmten Wert überschritten hat, schaltet die Ampel um. Von rot und grün wird immer auf gelb geschaltet, von gelb, wird abhängig von ''​q''​ auf rot oder grün geschaltet. Diese Methode steuert die Ampelphasen. Bei jedem Aufruf wird der ''​timer''​ jeder Ampel um ''​t''​ (ist normalerweise 1) erhöht. Sobald der Timer einen bestimmten Wert überschritten hat, schaltet die Ampel um. Von rot und grün wird immer auf gelb geschaltet, von gelb, wird abhängig von ''​q''​ auf rot oder grün geschaltet.
Zeile 221: Zeile 238:
 ---- ----
  
-===Fazit===+===== Fazit =====
  
 Mit unserem fertigen Programm haben wir leider nicht alles erreicht, was wir erreichen wollten. Was uns insbesondere noch fehlt, sind Vorfahrtsregeln,​ Unterschiedliche Fahrertypen,​ Abbiegen an Kreuzungen, mehrspurige Fahrbahnen, Kreisverkehre und maßstabsgetreue Geschwindigkeiten und Entfernungen. Vieles von dem wäre mit mehr Zeit noch gut umsetzbar gewesen. Wir haben uns vor allem geärgert, so viel Zeit in PyOpenGL gesteckt zu haben, um es am Ende dann doch durch Pygame zu ersetzen.\\ Mit unserem fertigen Programm haben wir leider nicht alles erreicht, was wir erreichen wollten. Was uns insbesondere noch fehlt, sind Vorfahrtsregeln,​ Unterschiedliche Fahrertypen,​ Abbiegen an Kreuzungen, mehrspurige Fahrbahnen, Kreisverkehre und maßstabsgetreue Geschwindigkeiten und Entfernungen. Vieles von dem wäre mit mehr Zeit noch gut umsetzbar gewesen. Wir haben uns vor allem geärgert, so viel Zeit in PyOpenGL gesteckt zu haben, um es am Ende dann doch durch Pygame zu ersetzen.\\
 Trotzdem sind wir insgesamt ganz zufrieden mit der Simulation. Gut gefällt uns zum Beispiel die Performance:​ selbst mit 50 gleichzeitig simulierten Fahrzeugen, fällt die Framerate nicht unter 100fps. Und obwohl die Simulation im Detail nicht auf geprüften Daten beruht, lässt sich doch ein ganz guter Gesamteindruck von einer Verkehrssituation gewinnen, der sich wahrscheinlich nicht allzu sehr von der Realität unterscheidet. Trotzdem sind wir insgesamt ganz zufrieden mit der Simulation. Gut gefällt uns zum Beispiel die Performance:​ selbst mit 50 gleichzeitig simulierten Fahrzeugen, fällt die Framerate nicht unter 100fps. Und obwohl die Simulation im Detail nicht auf geprüften Daten beruht, lässt sich doch ein ganz guter Gesamteindruck von einer Verkehrssituation gewinnen, der sich wahrscheinlich nicht allzu sehr von der Realität unterscheidet.
  
-===Der Code===+===== Der Code =====
  
 Es gibt zwei Versionen des Programms: Es gibt zwei Versionen des Programms:
ws1819/verkehrssimulation.1552827746.txt.gz · Zuletzt geändert: 2019/03/17 14:02 von jonathan_p