Stopplinien-Verhalten: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(56 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
→ zurück zur Übersicht: [[SDE-Team_2019/20]]<br/>
→ zurück zur Übersicht: [[SDE-Team_2020/21]]<br/>
----
'''Bearbeiter:''' [[Benutzer:Yanick-Christian_Tchenko|Yanick Christian Tchenko]] <br/>
'''Autoren:''' [[Benutzer: Hagen Heuer | Hagen Heuer]], [[Benutzer: Tim Kruse | Tim Kruse]] <br/>
'''Autoren:''' [[Benutzer: Hagen Heuer | Hagen Heuer]], [[Benutzer: Tim Kruse | Tim Kruse]] <br/>
'''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]]<br/>
'''Bearbeitet:''' [[Benutzer: Daniel Gosedopp | Daniel Gosedopp]], [[Benutzer: Ran Wei | Ran Wei]] <br/>
 
'''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]], [[Benutzer:Mirekgoebel | Prof. Göbel]]<br/>


== Einleitung ==
== 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. Liegt eine Vorfahrtssituation vor, muss dem Hindernis Vorfahrt gewährt und erst dann weitergefahren werden.
In dieser Aufgabestellung ist die Zielsetzung, 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, dann muss es zwei Sekunden halten und anschleißend weiterfahren.


== Anforderungen ==
== Anforderungen ==
Im Lastenheft des Projets Carolo Cup wird die Steuerung des Verhaltens des Fahrzeugs an der Stopplinie genau so wie in der folgenden Abbildung gefordert:<br>
Im Lastenheft des Projekts Carolo Cup wird die Anforderung an das Verhalten des Fahrzeugs an einer Stopplinie in REQ10.2340 festgehalten (s. Abbildung 1).<br>
<gallery mode = "traditional" widths=500px heights=150px>
<gallery mode = "traditional" widths=500px heights=150px>
File:Anforderungen.JPG|Abb. 1: Lastenheft
File:Anforderungen.JPG|<b>Abbildung 1: Lastenheftauszug Stopplinien-Verhalten.</b>
</gallery>
</gallery>


Es entstand demnach das untere Pflichtenheft: <br>
Die Umsetzung der Anforderung ist im Pflichtenheft wie folgt festgehalten:<br>
<gallery mode = "traditional" widths=1250px heights=230px>
<gallery mode = "traditional" widths=1250px heights=230px>
File:Pflichtenheft Heuer Kruse MS2.png|Abb. 2: Pflichtenheft
File:Pflichtenheft Heuer Kruse MS2.png|<b>Abbildung 2: Pflichtenheftauszug zu REQ10.2340.</b>
</gallery>
</gallery>


Zeile 33: Zeile 26:


== Konzept ==
== 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:


Als Basis für die Implementierung diente die vorhandene Matlab-Funktion für das Verhalten an Stoppkreuzungen. 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.
=== Grundidee ===
Das Modul BSF ermittelt unter anderem die Sollgeschwindigkeit des Fahrzeugs. Dies geschieht entweder auf Basis der Kurvenkrümmung oder wird bei Vorhandensein eines Hindernisses als konstant angenommen. Die Grundidee ist es, die Sollgeschwindigkeit bei Erkennung einer Stopplinie mit einem Faktor (Werte von 0 - 1) zu multiplizieren, also immer weiter zu verringern, bis das Fahrzeug 15cm vor der Linie stillsteht. Der Stillstand soll für zwei Sekunden beibehalten werden. Danach soll das Fahrzeug mit unveränderter Sollgeschwindigkeit weiterfahren (Faktor = 1). Den Verlauf des Faktorwertes zeigt Abb. 3.


Daher wurde ein neues Konzept erstellt, in dem Teile der ursprünglichen Idee berücksichtigt wurden. Zudem wurde die Matlab-Funktion um weitere Ein- und Ausgänge erweitert.
<gallery mode = "traditional" widths=500px heights=250px>
 
File:Konzept des Geschwindigkeitsfaktors.png|<b>Abbildung 3: Verlauf des Geschwindigkeitsbegrenzungsfaktors</b>
Eingänge:
*Stopplinienabstand
*Stopplininenflag
*Haltezyklus
*Zustand
*Stopplinienflag intern
*Stopplinienabstand alt
*Faktor
*Sollgeschwindigkeit
 
Ausgang:
*Geschwindigkeitsfaktor
*Haltezyklus
*Zustand
*Stopplinienflag intern
*Stopplinienabstand alt
*Faktor
 
Funktionstest 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 im Folgenden erklärt.
 
<gallery mode = "traditional" widths=400px heights=1050px>
File:BSF Stopplinienverhalten.png|Abb. 3: Progammablaufplan
</gallery>
</gallery>


Zu Beginn werden Variablen eingelesen und initialisiert. Anschließend erfolgt die Abfrage der einzelnen Cases. Das Programm wird hierbei in vier Cases unterteilt.
Am Anfang ist der Faktor 1, bis eine Stopplinie erkannt wird. Dann verringert er sich kontinuierlich, bis zum Wert 0, sodass das Auto immer langsamer wird und schließlich 15cm vor der Stopplinie zum Stillstand kommt. Hier wird für zwei Sekunden gewartet. Danach wird der Faktor wieder auf 1 gesetzt, sodass wieder auf errechnete Sollgeschwindigkeit beschleunigt wird.


'''Case 1'''  (Zustand == 1)<br/>
=== Festlegung von Ein- und Ausgängen ===
In Case 1 werden zunächst Variablen an den Ausgang übergeben. Anschließend wird abgefragt, ob das Stopplinienflag Eins 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/>
Zur Umsetzung der Funktion werden zunächst die Ein- und Ausgänge festgelegt. Diese zeigt Tab. 1.
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.
{| class="wikitable" style="margin:auto" style="text-align: center;
|+ Tabelle 1: Ein- und Ausgangsvariablen
! Art !! Variablenname !! Beschreibung !! Einheit
|-
| Eingang
| SenKam_Stopplinienabstand_f64
| Abstand von Fahrzeugfront zur Stopplinie
| m
|-
| Eingang
| SenKam_Stopplinienflag_bit
| Gesetzt, wenn eine Stopplinie erkannt wird
| -
|-
| Eingang
| Vorfahrtssituation_bit
| Gesetzt, wenn ein Hindernis an der Kreuzung steht.
| -
|-
| Eingang
| T
| Zykluszeit der Simulation
| s
|-
| Ausgang
| BsfVx_Faktor_f64
| Geschwindigkeitsbegrenzungsfaktor, falls Stopplinie erkannt wurde
| -
|}


Zuletzt wird noch der Stopplinienabstand gesichert.
=== Programmablauf ===
Das Programm wird als Zustandsautomat realisiert, dessen Zustandsdiagramm Abbildung 3 zeigt.


'''Case 3'''  (Zustand = 3)<br/>
<gallery mode = "traditional" widths=800px heights=380px>
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.  
Datei:Stoppverhalen Automat.png|<b>Abb. 3: Progammablaufplan des Stopplinien-Verhaltens.</b>
</gallery>


'''Case 4'''  (Zustand = 4)<br/>
Zu Beginn werden Variablen eingelesen und initialisiert. Anschließend erfolgt die Abfrage des Zustands. Das Programm wird hierbei in vier Zustände unterteilt.
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.
'''Zustand 1 - Auf Stopplinie warten'''<br>
Im ersten Zustand werden zunächst Variablen an den Ausgang übergeben. Anschließend wird abgefragt, ob das Stopplinienflag 1 ist. Trifft dies zu wird der Zustand auf 2 gesetzt. Wurde keine Stopplinie gefunden, so wird der Zustand nicht gewechselt.


<gallery mode = "traditional" widths=500px heights=250px>
'''Zustand 2 - Abbremsen nach Stopplinienerkennung'''<br>
File:Konzept des Geschwindigkeitsfaktors.png|Abb. 4: Verhalten der Geschwindigkeit
In diesem Zustand wird abgebremst. Ist der Stopplinienabstand kleiner als 15cm, werden die Motoren abgeschaltet und der Zustand auf 3 gesetzt.
</gallery>


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.
'''Zustand 3 - An Stopplinie warten'''<br>
 
In diesem Zustand wird an der Stopplinie gewartet. Liegt keine Vorfahrtssituation vor, beträgt die Wartezeit 2 Sekunden, ansonsten wird solange gewartet, bis das Hindernis die Kreuzung passiert hat.
<onlyinclude><div style="clear:{{{{{|safesubst:}}}#switch:{{{1}}}
| links|left = left
| rechts|right = right
| #default = both
}};"></div></onlyinclude>


== Umsetzung und Ergebnis der Simulationsumgebung ==
'''Zustand 4 - Kreuzung überfahren'''
''' Autoren:''' Hagen Heuer, Tim Kruse<br/>
Hier wird solange gefahren, bis die Stopplinie überquert wurde, der Stopplinienabstand also <= 0 ist. Dies ist nötig, damit die Stopplinie nicht als neue Stopplinie erkannt wird und das Farzeug erneut anhält. Danach wechselt der Automat wieder in den ersten Zustand.


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.<br/>
== Umsetzung und Ergebnis der Simulation ==
Die Matlab-Funktion ist zudem in Abbildung 5 zu sehen.
Die Implementierung des Algorithmus erfolgt in Simulink als Stateflow Chart. Diese wurde nach dem Zustandsdiagramm aus Abbildung 3 aufgebaut. Der Zustandsautomat besitzt als Eingang den Stopplinienabstand. Die Kamera kann die Stopplinie aber nur bis ca. 52cm vor dem Auto sehen, sodass dieser bei Zufahrt auf die Kreuzung interpoliert werden muss. Dies geschieht im Subsystem "Berechnung_Stopplinienabstand". Um zu prüfen, ob eine Vorfahrtssituation vorliegt, muss auf die LiDAR-Objektliste zugegriffen werden. Das passiert im Subsystem "Überprüfung_Vorfahrtssituation". Im Lastenheft findet sich eine Abbildung, die zeigt, welche Bedingung zur Einleitung einer Vorfahrtssituation erfüllt sein muss. Wenn die Bedingung erfüllt ist, wird das "Vorfahrtssituation_bit" gesetzt.


<gallery mode = "traditional" widths=750px heights=400px>
<gallery mode = "traditional" widths=1100px heights=400px>
File:Matlabfunktion Stopplinienverhalten.png|Abb. 5: Matlab-Funktion
File:Stoppverhalten_Stateflow.png|<b>Abbildung 5: Implementierung der Anhalte- und Vorfahrtlogik.</b>
</gallery>
</gallery>


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.
Das Ergebnis des Stopplinienverhalten wird in der nachfolgenden Abbildung dargestellt.
 
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.<br/>
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.
 
Das Verhalten wird zudem im nebenstehenden Video ersichtlich.


<gallery mode = "traditional" widths=800px heights=520px>
<gallery mode = "traditional" widths=800px heights=520px>
File:Ergebnis StopplinienverhaltenV2.png|Abb. 6: Ergebnis
File:Ergebnis StopplinienverhaltenV2.png|<b>Abbildung 6: Wichtige Variablenwerte beim Test der Funktion.</b>
</gallery>
</gallery>


[[Datei:SDE Praktikum 20-21 Stoppkreuzung.gif|none|Abb. 7: Video der Simulation]]
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. Dieser ist solange Null, bis eine Stopplinie erkannt wurde. Die Stopplinie kann ab einem Abstand von einem Meter oder weniger erfasst werden. Am Verlauf ist zudem gut zu erkennen, dass das Fahrzeug beginnt zu verzögern, da der Abstand nicht linear abnimmt. 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.


Im letzten Diagramm wird die errechnete Sollgeschwindigkeit ausgegeben. Auch an 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.


<onlyinclude><div style="clear:{{{{{|safesubst:}}}#switch:{{{1}}}
<onlyinclude><div style="clear:{{{{{|safesubst:}}}#switch:{{{1}}}
Zeile 134: Zeile 117:
}};"></div></onlyinclude>
}};"></div></onlyinclude>


== Unit-Test ==
== Unit-Test & Integrations-Test ==
Im Folgenden sind die einzelnen Testfälle für den Unit- und Integrations-Test im Offline- und Online-Modell zu sehen.


Hier werden die verschiedenen entwickelten Komponente getestet. Die Testergebnisse ergaben nach bestimmten Eingaben die in der unteren Tabelle zu sehenden numerische Resultate.
'''Offline-Modell: '''
Durch die Eingabe von Parametern konnten folgende Testfälle in der Simulation geprüft werden.


{| class="mw-datatable"
{| class="wikitable" style="margin:auto" style="text-align: center;
|+ Tabelle 3: Tests für das Stopplinienverhalten in der Simulation.
! style="font-weight: bold;" | ID
! style="font-weight: bold;" | ID
! style="font-weight: bold;" | Testfallbeschreibung
! style="font-weight: bold;" | Testfallbeschreibung
! style="font-weight: bold;" | Eingänge(<code>SenKam_StoplinieAbst_f64</code>, <code>SenKam_StoplinieFlag_bit</code>)
! style="font-weight: bold;" | Eingänge
! style="font-weight: bold;" | Ausgang(<code>BSFVx_Faktor_i8</code>)
! style="font-weight: bold;" | Ausgang
! style="font-weight: bold;" | Erwartetes Ergebnis
! style="font-weight: bold;" | Erwartetes Ergebnis
! style="font-weight: bold;" | Testergebnis
! style="font-weight: bold;" | Testergebnis
Zeile 150: Zeile 136:
| 1
| 1
| Das Fahrzeug fährt mit der vorgegebenen Geschwindigkeit, wenn keine Stopplinie erkannt wurde.
| Das Fahrzeug fährt mit der vorgegebenen Geschwindigkeit, wenn keine Stopplinie erkannt wurde.
| SenKam_StoplinienFlag_bit = 0,  SenKam_StoplinienAbst_f64 = 0  
| <code>SenKam_Stopplinienflag_bit = 0</code><code>SenKam_Stopplinienabstand_f64 = 0</code>
| 1
| 1
| Vollgas
| Vollgas
| 1
| 1
| Heuer, Kruse
| Gosedopp, Wei
| 15.06.2020
| 04.01.2023
|-
|-
| 2
| 2
| Trifft das Fahrzeug bei seiner Rundfahrt an eine Stopp-Kreuzung so muss es 15cm vor der Stopplinie anhalten
| Trifft das Fahrzeug bei seiner Rundfahrt an eine Stopp-Kreuzung so muss es 0.15m vor der Stopplinie anhalten
| SenKam_StoplinienFlag_bit = 1, SenKam_StoplinienAbst_f64 <= 15 Max_Abstand
| <code>SenKam_Stopplinienflag_bit = 1</code>, <code>SenKam_Stopplinienabstand_f64 <= 0.15</code>
| 0
| 0
| Fahrzeug Stoppt  
| Fahrzeug Stoppt  
| 0
| 0
| Heuer, Kruse
| Gosedopp, Wei
| 15.06.2020
| 04.01.2023
|-
|-
| 3
| 3
| Das Fahrzeug fährt weiter, wenn keine Stopplinie erkannt wurde.  
| Das Fahrzeug muss im Bereich zwischen 0.15m und 1m vor der Stopplinie immer langsamer fahren.
| SenKam_StoplinienFlag_bit = 0, SenKam_StoplinienAbst_f64 existiert
| <code>SenKam_Stopplinienflag_bit = 1</code>, <code>15 < SenKam_Stopplinienabstand_f64 <= 100</code>
| 1
| <code>0 < BSFVx_Faktor_f64 < 1 </code>
| Nicht plausibeler Fall. (Da keine Stopplinie erkannt wurde)  
| Bremsen  
| 1
| <code>0 < BSFVx_Faktor_f64 < 1 </code>
| Tchenko (mit Zustimmung von Prof. Schneider)
| Gosedopp, Wei
| 15.11.2019
| 04.01.2023
|-
|-
| 4
| 4
| Das Fahrzeug muss im Bereich zwischen 0.15m und 1m vor der Stopplinie immer langsamer fahren.
| Das Fahrzeug bremst bei eingeleiteter Bremsung weiter ab, auch wenn das Stopplinienflag verloren geht.
| SenKam_StoplinienFlag_bit = 1, 15<SenKam_StoplinienAbst_f64<=100
| <code>SenKam_Stopplinienflag_bit = 0</code>, <code>SenKam_Stopplinienabstand_f64 = 0</code>
| 0<<code>BSFVx_Faktor_i8</code><1
| <code> 0 < BSFVx_Faktor_f64 < 1 </code>
| Bremsen   
| Bremsen   
| 0<<code>BSFVx_Faktor_i8</code><1
| <code> 0 < BSFVx_Faktor_f64 < 1 </code>
| Heuer, Kruse
| Gosedopp, Wei
| 15.06.2020
| 04.01.2023
|-
|-
| 5
| 5
| Das Fahrzeug muss bei Stopplinienerkennung im Bereich weiter als 1m weiter normal fahren.
| Das Fahrzeug muss bei Stopplinienerkennung im Bereich weiter als 1m weiter normal fahren.
| SenKam_StoplinienFlag_bit = 1, SenKam_StoplinienAbst_f64>100
| <code>SenKam_Stopplinienflag_bit = 1</code>, <code>SenKam_Stopplinienabstand_f64 > 100</code>
| <code>BSFVx_Faktor_i8</code> = 1
| <code>BSFVx_Faktor_f64 = 1 </code>
| Nicht unterbrochene Fahrt  
| Nicht unterbrochene Fahrt  
| <code>BSFVx_Faktor_i8</code> = 1  
| <code>BSFVx_Faktor_f64 = 1 </code>
| Heuer, Kruse
| Gosedopp, Wei
| 15.06.2020
| 04.01.2023
|-
| 6
| Liegt eine Vorfahrtssituation vor, muss das Fahrzeug solange warten, bis das Hindernis die Kreuzung überquert hat.
| <code>SenKam_Stopplinienflag_bit = 1</code>, <code>SenKam_Stopplinienabstand_f64 <= 15</code>, <code>Vorfahrtssituation_bit = 1</code>
| <code>BSFVx_Faktor_f64 = 0 </code>
| Fahrzeug wartet, bis Hindernis die Kreuzung überquert hat
| <code>BSFVx_Faktor_f64 = 0 </code>
| Gosedopp, Wei
| 04.01.2023
|}
|}
Die Abbildung "Simulationsergebnis unter Berücksichtigung unterschiedlicher Testfälle" steht ferner graphisch dar, wie sich die Werte des <code>BSFVx_Faktor_i8</code> in Abhängigkeit der simulierten Werte für <code>SenKam_StoplinienFlag_bit </code> und <code>SenKam_StoplinienAbst_f64</code> verändert. Dies erfolgt unter Anwendung des entwickelten Moduls zur Steeurung des Fahrzeugsverhaltens an der Stopplinie. (Siehe Abb. 4)


== Diskussion ==
Die fehlerfreie Funktionsweise ist zudem im eingefügten Video zu sehen.
''' Design-Review des Konzept '''
[[Datei:SDE Praktikum 20-21 Stoppkreuzung.gif|none|<b>Abbildung 7: Video der Simulation.</b>]]


In Abbildung 4 fehlt die Beschriftung der Achsen.
'''Online-Modell: '''
* Gelöst am 06.06.2020


Warum woher kommt die 0.8, durch die der Abstand zur Stopplinie geteilt wird?
{| class="wikitable" style="margin:auto" style="text-align: center;
* Behoben am 07.06.2020
|+ Tabelle 4: Tests für das Stopplinienverhalten am Fahrzeug.
! style="font-weight: bold;" | ID
! style="font-weight: bold;" | Testfallbeschreibung
! style="font-weight: bold;" | Eingänge
! style="font-weight: bold;" | Ausgang
! style="font-weight: bold;" | Erwartetes Ergebnis
! style="font-weight: bold;" | Testergebnis
! style="font-weight: bold;" | Testperson
! style="font-weight: bold;" | Datum
|-
| 1
| Das Fahrzeug fährt mit der vorgegebenen Geschwindigkeit, wenn keine Stopplinie erkannt wurde.
| <code>SenKam_StoplinienFlag_bit = 0</code>,  <code>SenKam_StoplinienAbst_f64 = 0 </code>
|
| Das Fahrzeug fährt mit Vollgas.
|
|
|
|-
| 2
| Das Fahrzeug muss im Bereich zwischen 0.15m und 1m vor der Stopplinie immer langsamer fahren.
| <code>SenKam_StoplinienFlag_bit = 1</code>, <code>15 < SenKam_StoplinienAbst_f64 <= 100</code>
|
| Fahrzeug bremst ab. 
|
|
|
|-
| 3
| Das Fahrzeug bremst bei eingeleiteter Bremsung weiter ab, auch wenn das Stopplinienflag verloren geht.
| <code>SenKam_StoplinienFlag_bit = 0</code>, <code>SenKam_StoplinienAbst_f64 = 0</code>
|
| Fahrzeug bremst ab. 
|
|
|
|-
| 4
| Trifft das Fahrzeug bei seiner Rundfahrt an eine Stopp-Kreuzung so muss es 0.15m vor der Stopplinie anhalten
| <code>SenKam_StoplinienFlag_bit = 1</code>, <code>SenKam_StoplinienAbst_f64 <= 0.15</code>
|
| Fahrzeug stoppt vollständig.
|
|
|
|-
| 5
| Das Fahrzeug muss bei Stopplinienerkennung im Bereich weiter als 1m weiter normal fahren.
| <code>SenKam_StoplinienFlag_bit = 1</code>, <code>SenKam_StoplinienAbst_f64 > 100</code>
|
| Fahrzeug bremst nicht ab.
|
|
|
|-
| 6
| Liegt eine Vorfahrtssituation vor, muss das Fahrzeug solange warten, bis das Hindernis die Kreuzung überquert hat.
| <code>SenKam_Stopplinienflag_bit = 1</code>, <code>SenKam_Stopplinienabstand_f64 <= 15</code>, <code>Vorfahrtssituation_bit = 1</code>
|
| Fahrzeug wartet, bis Hindernis die Kreuzung überquert hat
|
|
|
|}


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)


Hier und da finden sich Rechtschreibfehler.
== Simulation einer Vorfahrtssituation ==


Review: Marius Köhler, 02.06.2020
ACHTUNG! Die lauffähige Version wurde noch nicht in den trunk übertragen, da im Online-Modell noch keine Objektliste vorhanden ist. Dies würde die Software unkompilierbar machen! Die Ergebnisse finden sich allesamt in [https://svn.hshl.de/svn/MTR_SDE_Praktikum/branches/2022_12_14_OSE_Stopplinienverhalten/ diesem Branch]


Review des überarbeiteten Konzepts ergab keine Beanstandung.
Um eine Vorfahrtssituation zu simulieren, muss ein dynamisches Hindernis genau dann auf die Kreuzung zu fahren, wenn das CCF ebenfalls darauf zufährt oder schon da steht. Dazu müssen folgende Maßnahmen getroffen werden:


Review II: Marius Köhler, 15.06.2020
In der <code>start.m</code>-Datei muss als Simulinkmodus 4 und <code>PAR_Modi_Schalter_Fahrbahn_int = 1</code> gewählt werden. Dann muss in dem switch-case, wo der Simulinkmodus abgefragt wird, in Zustand 4 die Startposition des CCF auf
----
<code>PAR_Esm_x0_I_f64  = 5.04;        % Startposition in x_I</code>
→ zurück zur Übersicht: [[SDE-Team_2019/20]]<br/>
<code>PAR_Esm_y0_I_f64  = 0.5441;      % Startposition in y_I</code>
→ zurück zur Übersicht: [[SDE-Team_2020/21]]<br/>
<code>PAR_Esm_psi0_I_f64 = 145 * pi/180; % Startausrichtung zu x_I</code>
gesetzt werden. Nun beginnt die Fahrt in der Kurve vor der Kreuzung. Anschließend muss ein passendes Hindernis in der Simulation platziert werden. Hierzu muss in der Parameterdatei <code>param_OSE_offline.m</code> ein Hindernis mit Index <code>aIndex = 368</code> auf Fahrbahn 2 hinzugefügt werden. Danach kann die Simulation gestartet werden.

Aktuelle Version vom 9. Januar 2023, 21:02 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. Liegt eine Vorfahrtssituation vor, muss dem Hindernis Vorfahrt gewährt und erst dann weitergefahren werden.

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).

Die Umsetzung der Anforderung ist im Pflichtenheft wie folgt festgehalten:

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:

Grundidee

Das Modul BSF ermittelt unter anderem die Sollgeschwindigkeit des Fahrzeugs. Dies geschieht entweder auf Basis der Kurvenkrümmung oder wird bei Vorhandensein eines Hindernisses als konstant angenommen. Die Grundidee ist es, die Sollgeschwindigkeit bei Erkennung einer Stopplinie mit einem Faktor (Werte von 0 - 1) zu multiplizieren, also immer weiter zu verringern, bis das Fahrzeug 15cm vor der Linie stillsteht. Der Stillstand soll für zwei Sekunden beibehalten werden. Danach soll das Fahrzeug mit unveränderter Sollgeschwindigkeit weiterfahren (Faktor = 1). Den Verlauf des Faktorwertes zeigt Abb. 3.

Am Anfang ist der Faktor 1, bis eine Stopplinie erkannt wird. Dann verringert er sich kontinuierlich, bis zum Wert 0, sodass das Auto immer langsamer wird und schließlich 15cm vor der Stopplinie zum Stillstand kommt. Hier wird für zwei Sekunden gewartet. Danach wird der Faktor wieder auf 1 gesetzt, sodass wieder auf errechnete Sollgeschwindigkeit beschleunigt wird.

Festlegung von Ein- und Ausgängen

Zur Umsetzung der Funktion werden zunächst die Ein- und Ausgänge festgelegt. Diese zeigt Tab. 1.

Tabelle 1: Ein- und Ausgangsvariablen
Art Variablenname Beschreibung Einheit
Eingang SenKam_Stopplinienabstand_f64 Abstand von Fahrzeugfront zur Stopplinie m
Eingang SenKam_Stopplinienflag_bit Gesetzt, wenn eine Stopplinie erkannt wird -
Eingang Vorfahrtssituation_bit Gesetzt, wenn ein Hindernis an der Kreuzung steht. -
Eingang T Zykluszeit der Simulation s
Ausgang BsfVx_Faktor_f64 Geschwindigkeitsbegrenzungsfaktor, falls Stopplinie erkannt wurde -

Programmablauf

Das Programm wird als Zustandsautomat realisiert, dessen Zustandsdiagramm Abbildung 3 zeigt.

Zu Beginn werden Variablen eingelesen und initialisiert. Anschließend erfolgt die Abfrage des Zustands. Das Programm wird hierbei in vier Zustände unterteilt.

Zustand 1 - Auf Stopplinie warten
Im ersten Zustand werden zunächst Variablen an den Ausgang übergeben. Anschließend wird abgefragt, ob das Stopplinienflag 1 ist. Trifft dies zu wird der Zustand auf 2 gesetzt. Wurde keine Stopplinie gefunden, so wird der Zustand nicht gewechselt.

Zustand 2 - Abbremsen nach Stopplinienerkennung
In diesem Zustand wird abgebremst. Ist der Stopplinienabstand kleiner als 15cm, werden die Motoren abgeschaltet und der Zustand auf 3 gesetzt.

Zustand 3 - An Stopplinie warten
In diesem Zustand wird an der Stopplinie gewartet. Liegt keine Vorfahrtssituation vor, beträgt die Wartezeit 2 Sekunden, ansonsten wird solange gewartet, bis das Hindernis die Kreuzung passiert hat.

Zustand 4 - Kreuzung überfahren Hier wird solange gefahren, bis die Stopplinie überquert wurde, der Stopplinienabstand also <= 0 ist. Dies ist nötig, damit die Stopplinie nicht als neue Stopplinie erkannt wird und das Farzeug erneut anhält. Danach wechselt der Automat wieder in den ersten Zustand.

Umsetzung und Ergebnis der Simulation

Die Implementierung des Algorithmus erfolgt in Simulink als Stateflow Chart. Diese wurde nach dem Zustandsdiagramm aus Abbildung 3 aufgebaut. Der Zustandsautomat besitzt als Eingang den Stopplinienabstand. Die Kamera kann die Stopplinie aber nur bis ca. 52cm vor dem Auto sehen, sodass dieser bei Zufahrt auf die Kreuzung interpoliert werden muss. Dies geschieht im Subsystem "Berechnung_Stopplinienabstand". Um zu prüfen, ob eine Vorfahrtssituation vorliegt, muss auf die LiDAR-Objektliste zugegriffen werden. Das passiert im Subsystem "Überprüfung_Vorfahrtssituation". Im Lastenheft findet sich eine Abbildung, die zeigt, welche Bedingung zur Einleitung einer Vorfahrtssituation erfüllt sein muss. Wenn die Bedingung erfüllt ist, wird das "Vorfahrtssituation_bit" gesetzt.

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. Dieser ist solange Null, bis eine Stopplinie erkannt wurde. Die Stopplinie kann ab einem Abstand von einem Meter oder weniger erfasst werden. Am Verlauf ist zudem gut zu erkennen, dass das Fahrzeug beginnt zu verzögern, da der Abstand nicht linear abnimmt. 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.

Im letzten Diagramm wird die errechnete Sollgeschwindigkeit ausgegeben. Auch an 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.

Unit-Test & Integrations-Test

Im Folgenden sind die einzelnen Testfälle für den Unit- und Integrations-Test im Offline- und Online-Modell zu sehen.

Offline-Modell: Durch die Eingabe von Parametern konnten folgende Testfälle in der Simulation geprüft werden.

Tabelle 3: Tests für das Stopplinienverhalten in der Simulation.
ID Testfallbeschreibung Eingänge Ausgang Erwartetes Ergebnis Testergebnis Testperson Datum
1 Das Fahrzeug fährt mit der vorgegebenen Geschwindigkeit, wenn keine Stopplinie erkannt wurde. SenKam_Stopplinienflag_bit = 0, SenKam_Stopplinienabstand_f64 = 0 1 Vollgas 1 Gosedopp, Wei 04.01.2023
2 Trifft das Fahrzeug bei seiner Rundfahrt an eine Stopp-Kreuzung so muss es 0.15m vor der Stopplinie anhalten SenKam_Stopplinienflag_bit = 1, SenKam_Stopplinienabstand_f64 <= 0.15 0 Fahrzeug Stoppt 0 Gosedopp, Wei 04.01.2023
3 Das Fahrzeug muss im Bereich zwischen 0.15m und 1m vor der Stopplinie immer langsamer fahren. SenKam_Stopplinienflag_bit = 1, 15 < SenKam_Stopplinienabstand_f64 <= 100 0 < BSFVx_Faktor_f64 < 1 Bremsen 0 < BSFVx_Faktor_f64 < 1 Gosedopp, Wei 04.01.2023
4 Das Fahrzeug bremst bei eingeleiteter Bremsung weiter ab, auch wenn das Stopplinienflag verloren geht. SenKam_Stopplinienflag_bit = 0, SenKam_Stopplinienabstand_f64 = 0 0 < BSFVx_Faktor_f64 < 1 Bremsen 0 < BSFVx_Faktor_f64 < 1 Gosedopp, Wei 04.01.2023
5 Das Fahrzeug muss bei Stopplinienerkennung im Bereich weiter als 1m weiter normal fahren. SenKam_Stopplinienflag_bit = 1, SenKam_Stopplinienabstand_f64 > 100 BSFVx_Faktor_f64 = 1 Nicht unterbrochene Fahrt BSFVx_Faktor_f64 = 1 Gosedopp, Wei 04.01.2023
6 Liegt eine Vorfahrtssituation vor, muss das Fahrzeug solange warten, bis das Hindernis die Kreuzung überquert hat. SenKam_Stopplinienflag_bit = 1, SenKam_Stopplinienabstand_f64 <= 15, Vorfahrtssituation_bit = 1 BSFVx_Faktor_f64 = 0 Fahrzeug wartet, bis Hindernis die Kreuzung überquert hat BSFVx_Faktor_f64 = 0 Gosedopp, Wei 04.01.2023

Die fehlerfreie Funktionsweise ist zudem im eingefügten Video zu sehen.

Abbildung 7: Video der Simulation.
Abbildung 7: Video der Simulation.

Online-Modell:

Tabelle 4: Tests für das Stopplinienverhalten am Fahrzeug.
ID Testfallbeschreibung Eingänge Ausgang 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 Das Fahrzeug fährt mit Vollgas.
2 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 Fahrzeug bremst ab.
3 Das Fahrzeug bremst bei eingeleiteter Bremsung weiter ab, auch wenn das Stopplinienflag verloren geht. SenKam_StoplinienFlag_bit = 0, SenKam_StoplinienAbst_f64 = 0 Fahrzeug bremst ab.
4 Trifft das Fahrzeug bei seiner Rundfahrt an eine Stopp-Kreuzung so muss es 0.15m vor der Stopplinie anhalten SenKam_StoplinienFlag_bit = 1, SenKam_StoplinienAbst_f64 <= 0.15 Fahrzeug stoppt vollständig.
5 Das Fahrzeug muss bei Stopplinienerkennung im Bereich weiter als 1m weiter normal fahren. SenKam_StoplinienFlag_bit = 1, SenKam_StoplinienAbst_f64 > 100 Fahrzeug bremst nicht ab.
6 Liegt eine Vorfahrtssituation vor, muss das Fahrzeug solange warten, bis das Hindernis die Kreuzung überquert hat. SenKam_Stopplinienflag_bit = 1, SenKam_Stopplinienabstand_f64 <= 15, Vorfahrtssituation_bit = 1 Fahrzeug wartet, bis Hindernis die Kreuzung überquert hat


Simulation einer Vorfahrtssituation

ACHTUNG! Die lauffähige Version wurde noch nicht in den trunk übertragen, da im Online-Modell noch keine Objektliste vorhanden ist. Dies würde die Software unkompilierbar machen! Die Ergebnisse finden sich allesamt in diesem Branch

Um eine Vorfahrtssituation zu simulieren, muss ein dynamisches Hindernis genau dann auf die Kreuzung zu fahren, wenn das CCF ebenfalls darauf zufährt oder schon da steht. Dazu müssen folgende Maßnahmen getroffen werden:

In der start.m-Datei muss als Simulinkmodus 4 und PAR_Modi_Schalter_Fahrbahn_int = 1 gewählt werden. Dann muss in dem switch-case, wo der Simulinkmodus abgefragt wird, in Zustand 4 die Startposition des CCF auf PAR_Esm_x0_I_f64 = 5.04;  % Startposition in x_I PAR_Esm_y0_I_f64 = 0.5441;  % Startposition in y_I PAR_Esm_psi0_I_f64 = 145 * pi/180; % Startausrichtung zu x_I gesetzt werden. Nun beginnt die Fahrt in der Kurve vor der Kreuzung. Anschließend muss ein passendes Hindernis in der Simulation platziert werden. Hierzu muss in der Parameterdatei param_OSE_offline.m ein Hindernis mit Index aIndex = 368 auf Fahrbahn 2 hinzugefügt werden. Danach kann die Simulation gestartet werden.