Stopplinien-Verhalten: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
Zeile 50: | Zeile 50: | ||
|} | |} | ||
{| class="mw-datatable" | {| class="mw-datatable" | ||
! style="font-weight: bold;" | Ausgang | ! style="font-weight: bold;" | Ausgang | ||
Zeile 64: | Zeile 62: | ||
|} | |} | ||
Die Funktion ist als Zustandsautomat implementiert, | Die Funktion ist als Zustandsautomat implementiert, mit einigen internen Variablen arbeitet. Diese sind: | ||
{| class="mw-datatable" | |||
! style="font-weight: bold;" | Variable | |||
! style="font-weight: bold;" | Variablenname (Ausgang/Eingang) | |||
! style="font-weight: bold;" | Beschreibung | |||
! style="font-weight: bold;" | Einheit | |||
|- | |||
| Zustand | |||
| zustand/zustandIN | |||
| Aktueller Zustand des Automaten | |||
| - | |||
|- | |||
| Vorheriger Stopplinienabstand | |||
| stopplinienabstandAlt/stopplinienabstandAltIN | |||
| Abstand zur Stopplinie im vorherigen Zyklus | |||
| m | |||
|- | |||
| Haltezyklus | |||
| halteZyklus/halteZyklusIN | |||
| Wenn die Zykluszeit 0.01s beträgt, dann müssen für eine Anhaltezeit von 2s 2s/0.01s = 200 Zyklen gewartet werden. Diese Variable dient als Laufvariable zum hochzählen der Anzahl der verstrichenen Zyklen. | |||
| - | |||
| Faktor | |||
| faktor/faktorIN | |||
| Muss noch ermittelt werden. | |||
| - | |||
|} | |||
Funktionstests ergaben, dass das Einspurmodell für diese Anwendung nicht verändert werden kann, da es Probleme mit einem stehenden Fahrzeug gibt. Daher wurde auf das Kinematikmodell zurückgegriffen und die Regelparameter angepasst, da dieses Modell auch für eine Geschwindigkeit kleiner 0,2 m/s² ausgelegt ist. | Funktionstests ergaben, dass das Einspurmodell für diese Anwendung nicht verändert werden kann, da es Probleme mit einem stehenden Fahrzeug gibt. Daher wurde auf das Kinematikmodell zurückgegriffen und die Regelparameter angepasst, da dieses Modell auch für eine Geschwindigkeit kleiner 0,2 m/s² ausgelegt ist. | ||
Der Programmablaufplan des neuen Konzeptes ist | Der Programmablaufplan des neuen Konzeptes ist in Abb. 3 zu sehen. | ||
<gallery mode = "traditional" widths=400px heights=1050px> | <gallery mode = "traditional" widths=400px heights=1050px> | ||
Zeile 87: | Zeile 99: | ||
</gallery> | </gallery> | ||
Zu Beginn werden Variablen eingelesen und initialisiert. Anschließend erfolgt die Abfrage der einzelnen | Zu Beginn werden Variablen eingelesen und initialisiert. Anschließend erfolgt die Abfrage der einzelnen Zustände. Das Programm wird hierbei in vier Zustände unterteilt. | ||
'''Case 1''' (Zustand == 1)<br/> | '''Case 1''' (Zustand == 1)<br/> | ||
In Case 1 werden zunächst Variablen an den Ausgang übergeben. Anschließend wird abgefragt, ob das Stopplinienflag | In Case 1 werden zunächst Variablen an den Ausgang übergeben. Anschließend wird abgefragt, ob das Stopplinienflag 1 ist. Trifft dies zu wird das interne Stopplinienflag gesetzt und der Stopplinienabstand in der Variable Faktor gespeichert. Anschließt wird der Zustand auf 2 gesetzt. Wurde keine Stopplinie gefunden, so werden die Variablen überschrieben und der Zustand nicht gewechselt. | ||
'''Case 2''' (Zustand == 2)<br/> | '''Case 2''' (Zustand == 2)<br/> |
Version vom 4. Oktober 2022, 11:18 Uhr
Autoren: Hagen Heuer, Tim Kruse
Bearbeitet: Daniel Gosedopp, Ran Wei
Betreuer: Prof. Schneider, Prof. Göbel
Einleitung
Ziel ist es, das Verhalten des Fahrzeugs an Stopplinien entsprechend den Anforderungen im Lastenheft zu implementieren. Das Fahrzeug muss nach dem Lastenheft im Falle der Erkennung einer Haltelinie immer langsamer fahren. Befindet sich es an der Stopplinie, so muss es dort stoppen und zwei Sekunden halten. Anschließend überquert es Kreuzung und setzt die Weiterfahrt fort.
Anforderungen
Im Lastenheft des Projekts Carolo Cup wird die Anforderung an das Verhalten des Fahrzeugs an einer Stopplinie in REQ10.2340 festgehalten (s. Abbildung 1).
-
Abb. 1: Lastenheftauszug Stopplinien-Verhalten.
Die Umsetzung der Anforderung ist im Pflichtenheft wie folgt festgehalten:
-
Abb. 2: Pflichtenheftauszug zu REQ10.2340.
Folgende Anforderungen können festgelegt werden und im späteren Projekt berücksichtigt werden.
- Trifft das Fahrzeug bei seiner Rundfahrt an eine Stopp-Kreuzung, so muss es 15 cm vor der Stopplinie anhalten.
- Während das Fahrzeug auf die Stopplinie zufährt, muss die Geschwindigkeit des Fahrzeugs gedrosselt werden.
- Das Fahrzeug muss vor der Stoppline halten und 2 Sekunden warten.
- Nach der Wartezeit muss das Fahrzeug die Kreuzung passieren, ohne das die Stopplinie ein weiteres Mal erkannt wird.
- Die Implementierung erfolgt in Matlab-Simulink.
Konzept
Als Basis für die Implementierung diente die vorhandene MATLAB-Funktion für das Verhalten an Stopplinien. Beim Testen dieser Funktion viel unter anderem auf, dass diese nicht lauffähig ist. Außerdem war die Implementierung der Weiterfahrt nach einer Stopplinie fehlerhaft, da das Fahrzeug die vorherige Stopplinie erneut erkennen würde. Daher wurde ein neues Konzept erstellt, in dem Teile der ursprünglichen Idee berücksichtigt wurden. Zunächst werden die externen Ein- und Ausgänge des Moduls definiert:
Eingang | Variablenname | Beschreibung | Einheit |
---|---|---|---|
Stopplinienabstand | SenKam_StoplinienAbst_f64 | Abstand von Fahrzeugfront zur Stopplinie | m |
Stopplinienflag | SenKam_StoplinienFlag_bit | Gesetzt, wenn eine Stopplinie erkannt wird | - |
Sollgeschwindigkeit | BsfVx_VxSoll_f64 | Aktuelle Sollgeschwindigkeit des Fahrzeugs | m/s |
Ausgang | Variablenname | Beschreibung | Einheit |
---|---|---|---|
Geschwindigkeitsbegrenzungsfaktor | BsfVx_Faktor_f64 | Mit diesem Faktor wird die aus der Kurvenkrümmung berechnete Sollgeschwindigkeit begrenzt, wenn eine Stopplinie erkannt wurde | - |
Die Funktion ist als Zustandsautomat implementiert, mit einigen internen Variablen arbeitet. Diese sind:
Variable | Variablenname (Ausgang/Eingang) | Beschreibung | Einheit | ||||
---|---|---|---|---|---|---|---|
Zustand | zustand/zustandIN | Aktueller Zustand des Automaten | - | ||||
Vorheriger Stopplinienabstand | stopplinienabstandAlt/stopplinienabstandAltIN | Abstand zur Stopplinie im vorherigen Zyklus | m | ||||
Haltezyklus | halteZyklus/halteZyklusIN | Wenn die Zykluszeit 0.01s beträgt, dann müssen für eine Anhaltezeit von 2s 2s/0.01s = 200 Zyklen gewartet werden. Diese Variable dient als Laufvariable zum hochzählen der Anzahl der verstrichenen Zyklen. | - | Faktor | faktor/faktorIN | Muss noch ermittelt werden. | - |
Funktionstests ergaben, dass das Einspurmodell für diese Anwendung nicht verändert werden kann, da es Probleme mit einem stehenden Fahrzeug gibt. Daher wurde auf das Kinematikmodell zurückgegriffen und die Regelparameter angepasst, da dieses Modell auch für eine Geschwindigkeit kleiner 0,2 m/s² ausgelegt ist.
Der Programmablaufplan des neuen Konzeptes ist in Abb. 3 zu sehen.
-
Abb. 3: Progammablaufplan
Zu Beginn werden Variablen eingelesen und initialisiert. Anschließend erfolgt die Abfrage der einzelnen Zustände. Das Programm wird hierbei in vier Zustände unterteilt.
Case 1 (Zustand == 1)
In Case 1 werden zunächst Variablen an den Ausgang übergeben. Anschließend wird abgefragt, ob das Stopplinienflag 1 ist. Trifft dies zu wird das interne Stopplinienflag gesetzt und der Stopplinienabstand in der Variable Faktor gespeichert. Anschließt wird der Zustand auf 2 gesetzt. Wurde keine Stopplinie gefunden, so werden die Variablen überschrieben und der Zustand nicht gewechselt.
Case 2 (Zustand == 2)
Ist der Case 2 aktiv, so werden zunächst Variablen mit dem vorherigen Wert überschrieben. Wenn das Stopplinienflag intern Eins ist, wird dieses mit dem selben Wert überschrieben.
Ist der Stopplinienabstand Null, so wurde die Stopplinie verloren und der Stopplinienabstand wird mit Hilfe der Geschwindigkeit und dem Faktor sowie der Simulationszeit interpoliert. Durch die Rechnung Stopplinienabstand = Stopplinienabstand alt - Geschwindigkeit * 0,005 wird die zurückgelegte Strecke im letzten Programmzyklus vom alten Abstand subtrahiert. Somit ergibt sich der neue Stopplinienabstand. Anschließend wird die neue Geschwindigkeit errechnet und der Zustand auf Zwei gesetzt.
Falls die errechnete Geschwindigkeit größer Eins sein sollte, wird der Faktor auf Eins begrenzt.
Wenn der Stopplinienabstand kleiner 15 cm sein sollte, werden die Motoren abgeschaltet und der Zustand auf Drei gesetzt.
Sollte das Stopplinienflag intern nicht gesetzt sein, so wird dieses wieder auf Null gesetzt, das Fahrzeug auf Sollgeschwindigkeit beschleunigt und der Zustand auf 1 gesetzt.
Zuletzt wird noch der Stopplinienabstand gesichert.
Case 3 (Zustand = 3)
In Case 3 werden zunächst die Variablen gesichert. Anschließend wird der aktuelle Haltezyklus mit dem vorgegebenen Haltezyklus verglichen. Mit Hilfe dieser Haltezyklen kann die Haltezeit erfasst werden, da die Simulationszeit 0,005 Sekunden beträgt. Solange die Haltezyklen geringer sind wie die vorgegebene Zahl, werden diese um eins addiert und der Case 3 nicht verlassen. Im anderen Fall wird Fahrzeug wieder beschleunigt und es wird in den Case 4 gewechselt.
Case 4 (Zustand = 4)
Im vierten Case wird der Abstand zur Stopplinie abgefragt. Falls dieser größer Null ist, soll das Fahrzeug weiter fahren und den Case nicht verlassen. Falls der Abstand zur Stopplinie Null ist, soll in den Case 1 gewechselt werden und dort auf eine neue Stopplinie reagiert werden.
Falls kein Case ausgewählt wurde, soll in den vorherigen Case gewechselt werden und das Fahrzeug weiter fahren.
-
Abb. 4: Verhalten der Geschwindigkeit
Ziel ist es das folgende Verhalten, wie in Abbildung 4 zu sehen, zu erreichen. Der Geschwindigkeitsfaktor hat den Wert 1 angenommen und das Fahrzeug fährt mit konstanter Geschwindigkeit. Wird eine Stopplinie erkannt, so soll das Fahrzeug verzögern bis es zum Stillstand kommt. Nach den zwei Sekunden Wartezeit soll das Fahrzeug wieder beschleunigen, weshalb der Geschwindigkeitsfaktor den Wert 1 annimmt.
Umsetzung und Ergebnis der Simulationsumgebung
Autoren: Hagen Heuer, Tim Kruse
Die Umsetzung der Implementierung erfolgt wie bereits erwähnt im Offline-Modell mit Hilfe von Simulink und Matlab c-Code. Hierfür wurde eine Matlab-Funktion eingefügt und anhand des Programmablaufplans programmiert. Da die Funktion in jedem Zyklus neu aufgerufen wird, gehen die vorherigen Werte der Variablen verloren. Dies musst allerdings für zwei Werte verhindert werden, da diese im nächsten Zyklen von Bedeutung sind. Somit wurde das Ausgangssignal über einen Memory-Baustein an den Eingang zurück gegeben. Außerdem wurden im Memory-Baustein passende initialwerte hinterlegt, da im ersten Aufruf der Funktion noch keine Werte errechnet wurden.
Die Matlab-Funktion ist zudem in Abbildung 5 zu sehen.
-
Abb. 5: Matlab-Funktion
Das Ergebnis des Stopplinienverhalten wird in der nachfolgenden Abbildung dargestellt. Im ersten Diagramm ist das Stopplinienflag zu sehen, welches bei Detektion einer Stopplinie auf Eins wechselt.
Im zweiten Diagramm ist der dazugehörige Stopplinienabstand zu sehen. Diese ist solange Null bis eine Stopplinie erkannt wurde. Die Stopplinie kann ab einem Abstand von 1 Meter oder weniger erfasst werden. In der Kurve ist zudem gut zu erkennen, dass das Fahrzeug beginnt zu verzögern, da der Abstand nicht Linear abnimmt.
Funktionstest ergaben, dass es zu einem Verlust der Stopplinie kommen kann. Für diesen Fall wurde eine Interpolation des Stopplinienabstands implementiert. Hierdurch kann auf Basis der Geschwindigkeit der Stopplinienabstand errechnet werden.
Im letzten Diagramm wird die errechnete Geschwindigkeit ausgegeben. Auf diese wird der Faktor aus der Matlab-Funktion addiert. Auch in dieser Kurve ist gut zu sehen, dass das Fahrzeug verzögert. Wenn der Abstand 15 cm oder weniger beträgt, werden die Motoren abgeschaltet, da der Faktor auf Null abfällt.
Nach der zweisekündigen Wartezeit beschleunigt das Fahrzeug wieder und der Abstand zur Stopplinie nimmt linear weiter ab. Erreicht dieser Null, so wird die Stopplinie überfahren und das Stopplinienflag wird wieder Null.
-
Abb. 6: Ergebnis
Das Verhalten wird zudem im folgenden Video ersichtlich.
Unit-Test & Integrations-Test
Autoren: Hagen Heuer, Tim Kruse
Im Folgenden sind die einzelnen Testfälle für den Unit- und Integrations-Test zu sehen. Durch die Eingabe von Parametern konnten folgende Testfälle geprüft werden.
Die fehlerfreie Funktionsweise ist zudem im eingefügten Video zu sehen.
ID | Testfallbeschreibung | Eingänge(SenKam_StoplinieAbst_f64 , SenKam_StoplinieFlag_bit )
|
Ausgang(BSFVx_Faktor_i8 )
|
Erwartetes Ergebnis | Testergebnis | Testperson | Datum |
---|---|---|---|---|---|---|---|
1 | Das Fahrzeug fährt mit der vorgegebenen Geschwindigkeit, wenn keine Stopplinie erkannt wurde. | SenKam_StoplinienFlag_bit = 0, SenKam_StoplinienAbst_f64 = 0 | 1 | Vollgas | 1 | Heuer, Kruse | 15.06.2020 |
2 | Trifft das Fahrzeug bei seiner Rundfahrt an eine Stopp-Kreuzung so muss es 15cm vor der Stopplinie anhalten | SenKam_StoplinienFlag_bit = 1, SenKam_StoplinienAbst_f64 <= 15 Max_Abstand | 0 | Fahrzeug Stoppt | 0 | Heuer, Kruse | 15.06.2020 |
3 | Das Fahrzeug muss im Bereich zwischen 0.15m und 1m vor der Stopplinie immer langsamer fahren. | SenKam_StoplinienFlag_bit = 1, 15<SenKam_StoplinienAbst_f64<=100 | 0<BSFVx_Faktor_i8 <1
|
Bremsen | 0<BSFVx_Faktor_i8 <1
|
Heuer, Kruse | 15.06.2020 |
4 | Das Fahrzeug bremst bei eingeleiteter Bremsung weiter ab, auch wenn das Stopplinienflag verloren geht. | SenKam_StoplinienFlag_bit = 0, SenKam_StoplinienAbst_f64 = 0 | 0<BSFVx_Faktor_i8 <1
|
Bremsen | 0<BSFVx_Faktor_i8 <1
|
Heuer, Kruse | 15.06.2020 |
5 | Das Fahrzeug muss bei Stopplinienerkennung im Bereich weiter als 1m weiter normal fahren. | SenKam_StoplinienFlag_bit = 1, SenKam_StoplinienAbst_f64>100 | BSFVx_Faktor_i8 = 1
|
Nicht unterbrochene Fahrt | BSFVx_Faktor_i8 = 1
|
Heuer, Kruse | 15.06.2020 |
Diskussion
Design-Review des Konzept
In Abbildung 4 fehlt die Beschriftung der Achsen.
- Gelöst am 06.06.2020
Warum woher kommt die 0.8, durch die der Abstand zur Stopplinie geteilt wird?
- Behoben am 07.06.2020
Wie soll mit dem "Verlust" einer Stopplinie Umgegangen werden? (Stopplinie wird erkannt und als zu-überquerend klassifiziert, wird dann aber aus nicht näher bekannten Gründen nicht mehr erkannt)
- Konzept dahingehend überarbeitet am 10.06.2020
Hier und da finden sich Rechtschreibfehler.
- Rechtschreibfehler korrigiert am 27.06.2020
Review: Marius Köhler, 02.06.2020
Review des überarbeiteten Konzepts ergab keine Beanstandung.
Review II: Marius Köhler, 15.06.2020
→ zurück zur Übersicht: SDE-Team_2020/21