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/15 15:45]
jonathan_p
ws1819:verkehrssimulation [2019/04/01 19:59] (aktuell)
stefanborn
Zeile 1: Zeile 1:
-====Verkehrssimulation==== +Wir haben nichts auszusetzen. :-)
-von Seohyun Bae und Jonathan Pittrof+
  
-===Was kann unsere Simulation?​=== +====== Verkehrssimulation ====== 
-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. ​+ 
 +=== von Seohyun Bae und Jonathan Pittrof === 
 + 
 +==== 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. ​An den Kreuzungen gibt es die Möglichkeit,​ Ampelschaltungen anzupassen und die daraus resultierenden Veränderungen zu betrachten. 
 + 
 +{{:​ws1819:​screenshot_7_.png|}}
  
 ---- ----
  
-===Projektplanung===+===== Projektplanung ​=====
  
-==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
   * Ein Fahrzeug, dass beschleunigen,​ bremsen und Kurven fahren kann   * Ein Fahrzeug, dass beschleunigen,​ bremsen und Kurven fahren kann
Zeile 22: 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
   * HARMS, Volker, 2004. //Physik für Mediziner und Pharmazeuten//​. Unbekannter Ort: Harms-Verlag. ISBN 978-3860261118   * HARMS, Volker, 2004. //Physik für Mediziner und Pharmazeuten//​. Unbekannter Ort: Harms-Verlag. ISBN 978-3860261118
  
-==Andere Hilfsmittel:​==+==== Andere Hilfsmittel:​ ==== 
   * Pygame Tilemap Tutorial: [[http://​usingpython.com/​pygame-tilemaps/​]]   * Pygame Tilemap Tutorial: [[http://​usingpython.com/​pygame-tilemaps/​]]
   * PyOpenGL Tutorial: [[https://​pythonprogramming.net/​opengl-rotating-cube-example-pyopengl-tutorial/​]]   * PyOpenGL Tutorial: [[https://​pythonprogramming.net/​opengl-rotating-cube-example-pyopengl-tutorial/​]]
Zeile 34: Zeile 43:
   * Simulationsbeispiele:​ [[http://​traffic-simulation.de/​]]   * Simulationsbeispiele:​ [[http://​traffic-simulation.de/​]]
  
-----+==== Aufgabenverteilung ====
  
-====Protokolle====+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
  
-===06.12.18=== +Seohyun: 
-Wir haben uns dazu entschlossen,​ uns zuerst mit den Grundlagen von PyOpenGL vertraut zu machen. Dazu haben wir ein Online-Tutorial angefangen ([[https://​pythonprogramming.net/​opengl-rotating-cube-example-pyopengl-tutorial/​]]) und dieses durchgearbeitet. ​Das Tutorial erzeugte zwar eine schöne 3D-Animation von beweglichen Würfeln, hat uns mit unserer Verkehrssimulation,​ die zweidimensional funktionieren soll, aber nicht wirklich weitergeholfen.\\ +  ​* ​Das "​runde"​ Abbiegen der Fahrzeuge 
-{{ :​ws1819:​screenshot_2_.png?​300 |}}\\ +  * Die Methoden ''​fahre''​ und ''​pruefe_ampel''​ für das Abbiegen angepasst 
-Trotzdem haben wir versucht, aus dem "3D-Programm"​ eine 2D-Version zu machen, was uns aber noch nicht gelungen ist.+  * Die ''​__init__''​-Methoden angefangen 
 +  * Die Erklärung zur ''​abbiegen''​-Methode in der Wiki
  
-===13.12.18=== +===== Protokolle =====
-Jonathan: Zuhause habe ich mich mit einem weiteren Tutorial ([[http://​usingpython.com/​pygame-tilemaps/​]]) beschäftigt,​ das mithilfe von PyGame eine Tilemap, also einen Hintergrundbereich aus einem Gitter von Kacheln, anfertigt. In PyGame hat das auch gut funktioniert,​ heute habe ich versucht, diese Tilemap in den PyOpenGL-Quellcode vom letzen Tutorial zu integrieren,​ womit es allerdings noch einige Probleme gibt. Diese Probleme bestehen hauptsächlich mit der Syntax, die in OpenGL und Pygame sehr unterschiedlich ist. Mit Pygame konnte ich bisher diese Ausgabe erzeugen: +
-{{ :​ws1819:​screenshot_3_.png?​300 |}}\\ +
-Seohyun: Ich habe versucht, das konkretes Engine machen anzufangen, und ein einfaches Engine gemacht(Gleiche Beschleunigung,​ Geschwindigkeit immer höher werden, ohne Bremse). Und ich habe überlegt, wie ich ein Rechteck bewegen lassen.+
  
-===20.12.18=== +Unsere wöchentlichen Protokolle gibt es hier: [[ws1819:verkehrssimulation:​protokolle|ws1819:​verkehrssimulation:​Protokolle]]
-JonathanHeute haben ich ein weiteres PyOpenGL Tutorial ([[http://​www.labri.fr/​perso/​nrougier/​python-opengl/​]]) angefangen, von dem ich mir etwas allgemeinere Erklärungen zu OpenGL erhoffe, um damit irgendwann unser Programm zum laufen zu bringen. Das größte Problem ist bisher, dass Python das Modul "​GLFW"​ verlangt, um den Quellcode zu kompilieren. Dieses ist allerdings nicht so einfach zu installieren und funktioniert bisher nicht bei mir. +
-Seohyun: Klasse Tutorial zu wiederholen,​ die Klasse '​Fahrzeug',​ die letztes Mal definiert wurde, zu verbessern & Klasse Fahrbahn anzufangen.+
  
-===Weihnachtferien=== +===== Dokumentation ​=====
-Jonathan: Programmgrundstruktur erstellt, Klassen Fahrzeug, Fahrbahn erstellt. Fahrzeuge bewegen sich zeitabhängig und abhängig von aktueller Geschwindigkeit,​ Wunschgeschwindigkeit und Maximalbeschleunigung. Grafische Ausgabe bisher nur über Turtle, da PyOpenGL weiterhin noch nicht läuft.\\ +
-{{ :​ws1819:​screenshot_5_.png?​300 |}} +
- +
-===17.1.19=== +
-Das Programm funktioniert jetzt mit Pygame, statt Turtle und man kann jetzt mehrere Fahrzeuge gleichzeitig fahren lassen. Bisher gibt es nur eine Straße, an deren Ende die Fahrzeuge wieder an den Anfang gesetzt werden. Da Pygame so gut funktioniert,​ haben wir uns dazu entschlossen,​ nicht mehr an OpenGL weiterzuarbeiten. Für nächste Woche: Ampeln, Kollisionen,​ vielleicht Umstellung auf zweidimensionale Simulation, um Kreuzungen realisieren zu können. +
-{{ :​ws1819:​screenshot_6_.png?​300 |}} +
- +
-===24.1.19=== +
-Jonathan: Kollisionen,​ bzw. Geschwindigkeitsanpassungen auf das vorausfahrende Fahrzeug funktionieren jetzt.\\ +
-Seohyun: Eine neue Klasse "​Ampel"​ definieren(zeichnen,​ wechselt zw. rot und grün), Bremse Versuch(Aber wenn ein Fahrzeug stoppt, fährt es nicht weiter, obwohl die Ampel wieder grün wird.) +
- +
-===07.02.2019=== +
-Jonathan: Kollisionen verbessert (Geschwindigkeitsanpassung jetzt abhängig von den Differenzgeschwindigkeiten);​ die optisch sichtbaren Fahrbahnen stimmen jetzt automatisch mit den Fahrbahnen für die Autos überein; Kreuzungen werden vom Programm erkannt und automatisch mit den entsprechenden Texturen dargestellt;​ unnötigen Programmcode entfernt; Fahrzeuge können sich jetzt auch in y-Richtung bewegen. \\ +
-Seohyun: Abbiegen geschafft, aber eckig wie Funktion 'y = x' +
- +
-===14.02.2019=== +
-Seohyun: Das kreisförmige Abbiegen mithilfe der Kreis-Formeln erfolgreich geschafft. (dt ist sehr wichtig!!) +
- +
-===Blocktermin=== +
-Seohyun: Weiter mit dem Abbiegen beschäftigt.\\ +
-Jonathan: Alle vier Fahrtrichtungen sind jetzt möglich. Fahrzeuge reagieren in alle Fahrtrichtungen auf die jeweils korrekten Ampeln und auf alle Fahrzeuge, die ihnen in den Weg kommen. Die Fahrzeuge müssen außerdem nicht mehr einzeln manuell erstellt werden, sondern werden über for-Schleifen erstellt. So können einfach große Mengen an Fahrzeugen erstellt werden. Fahrzeuge können jetzt außerdem einen einfachen Fahrtrichtungswechsel ausführen, dieser sieht aber noch sehr ruckartig aus. +
- +
----- +
- +
-====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 88: 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 102: 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 114: 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 122: 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 169: 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 184: 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 207: 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 223: 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 238: 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 246: 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 252: 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.\\ 
 +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.1552661157.txt.gz · Zuletzt geändert: 2019/03/15 15:45 von jonathan_p