OSE Stopplinienerkennung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(19 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
<!-- Kopieren Sie diesen Header in Ihren Artikel, damit er aufgelistet wird.  -->
<!-- Kopieren Sie diesen Header in Ihren Artikel, damit er aufgelistet wird.  -->
'''Autor:''' [[Benutzer:Florian Brinkmann| Florian Brinkmann]] <br>
'''Autoren:''' [[Benutzer:Florian Brinkmann| Florian Brinkmann]] & [[Benutzer:Suryaa Kalamani-Ramamoorthy| Suryaa Kalamani Ramamoorthy]] <br>
<!-- '''Bearbeitet von:''' <br> -->
<!-- '''Bearbeitet von:''' <br> -->
'''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]]<br/>
'''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]]<br/>
Zeile 9: Zeile 9:
<br>
<br>


= Motivation =
== Motivation ==
Gemäß REQ10.2340 aus dem Lastenheft soll das autonome Fahrzeug an einer Stopp-Kreuzung anhalten. Dementsprechend muss die Stopplinie mittels Kamera detektiert werden. Dabei gilt es zu unterschieden, ob es sich um eine 40 mm breite Stopplinie oder eine schmalere Linie handelt, an der nicht gehalten werden muss. Zusätzlich enthält das Requirement den Hinweis, dass die Kreuzung rechtwinklig ist, sodass auch die Stopplinie in einem rechten Winkel zur Fahrbahnmarkierung liegt.  <ref> GÖBEL, M. und SCHNEIDER, U. Lastenheft für das Projekt „Autonomes Fahrzeug“. Lippstadt: 2019. Verfügbar unter: [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Anforderungsmanagement/Lastenheft/Lastenheft_Autonomes_Fahrzeug.pdf SVN-Link] </ref>
[[Datei:CCF REQ10.2340 Verhalten an Stopp-Kreuzungen.png|600px|thumb|right|Abbildung 1: Anforderung an das Verhalten an einer Stopp-Kreuzung]]
Gemäß der in Abbildung 1 dargestellten REQ10.2340 aus dem Lastenheft soll das autonome Fahrzeug an einer Stopp-Kreuzung anhalten. Dementsprechend muss die Stopplinie mittels Kamera detektiert werden. Dabei gilt es zu unterschieden, ob es sich um eine 40 mm breite Stopplinie oder eine schmalere Linie handelt, an der nicht gehalten werden muss. Zusätzlich enthält das Requirement den Hinweis, dass die Kreuzung rechtwinklig ist, sodass auch die Stopplinie in einem rechten Winkel zur Fahrbahnmarkierung liegt.  <ref> GÖBEL, M. und SCHNEIDER, U. Lastenheft für das Projekt „Autonomes Fahrzeug“. Lippstadt: 2019. Verfügbar unter: [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Anforderungsmanagement/Lastenheft/Lastenheft_Autonomes_Fahrzeug.pdf SVN-Link] </ref>


Im [[SDE-Team 2022/23|Wintersemester 2022/23]] hat sich das [[SDE-Team_2022/23#Team_5_-_OSE:_Stopplinienerkennung_und_Querverkehr |Team OSE (Stopplinienerkennung)]] damit beschäftigt die Stopplinienerkennung in die aktuelle Software zu implementieren. Dabei wurde zunächst der [[Stopplinienerkennung mit Hough-Transformation |Lösungsansatz mittels Hough-Transformation]] von [[Benutzer:Kevin Hustedt| Kevin Hustedt]] und [[Benutzer:Moritz Oberg| Moritz Oberg]] verfolgt. Jedoch wurde hierbei festgestellt, dass die genutzte Hough-Transformation mit der eingesetzten OpenCV 3.0.0-Version zu Speicherzugriffsverletzungen führt. Aus diesem Grund wurde der im folgenden vorgestellte Ansatz verfolgt. Bevor der Ansatz mit Visual Studio umgesetzt wurde, ist der Ansatz mit MATLAB<sup>®</sup> validiert worden. Die Ergebnisse der Umsetzung des C-Codes sind zunächst im [https://svn.hshl.de/svn/MTR_SDE_Praktikum/branches/2022_10_05_OSE_Stopplinienerkennung Branch 2022_10_05_OSE_Stopplinienerkennung] gesichert worden.
Im [[SDE-Team 2022/23|Wintersemester 2022/23]] hat sich das [[SDE-Team_2022/23#Team_5_-_OSE:_Stopplinienerkennung_und_Querverkehr |Team OSE (Stopplinienerkennung)]] damit beschäftigt die Stopplinienerkennung in die aktuelle Software zu implementieren. Dabei wurde zunächst der [[Stopplinienerkennung mit Hough-Transformation |Lösungsansatz mittels Hough-Transformation]] von [[Benutzer:Kevin Hustedt| Kevin Hustedt]] und [[Benutzer:Moritz Oberg| Moritz Oberg]] verfolgt. Jedoch wurde hierbei festgestellt, dass die genutzte Hough-Transformation mit der eingesetzten OpenCV 3.0.0-Version zu Speicherzugriffsverletzungen führt. Aus diesem Grund wurde der im folgenden vorgestellte Ansatz verfolgt.  


= Ansatz =
Die Entwicklung der Stopplinienerkennung erfolgt einfachheitshalber mit dem Entwicklungsumgebung MATLAB<sup>®</sup>. Um trotzdem den Programmcode für das C-Projekt in Visual Studio bereitstellen zu können, soll aus dem MATLAB<sup>®</sup>-Code mit Hilfe der in MATLAB<sup>®</sup> integrierten App "MATLAB Coder" automatsiert C++-Code generiert werden. Daher befindet sich der MATLAB<sup>®</sup>-Code im Softwareordner [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung OSE_Stopplinienerkennung] und der generierte Programmcode im [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Draufsicht_Spurpolynom_RS232 Projektverzeichnis des Visual Studio Projekts] im Ordner [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Draufsicht_Spurpolynom_RS232/Bahnspurpolynom_verlinkt/MATLAB_Coder_Stopplinienerkennung MATLAB_Coder_Stopplinienerkennung]. Die weitere Entwicklung am Visual Studio Projekt erfolgte im [https://svn.hshl.de/svn/MTR_SDE_Praktikum/branches/2022_10_05_OSE_Stopplinienerkennung Branch 2022_10_05_OSE_Stopplinienerkennung]. Mit der Revision 8360 wurden alle Änderungen vom Branch auf den Trunk übertragen.
== Stopplinienerkennung ==
<!--
[[Datei:Stopplinienerkennung Prinzip.gif|400px|thumb|left|Mathematisches Prinzip der Stopplinienerkennung]]
== Anforderungen ==
[[Datei:Stopplinienerkennung PAP.png|200px|thumb|right|Ablauf der Stopplinienerkennung]]
{| class="wikitable"
Der neue Ansatz basiert prinzipiell auf einer Zählung der weißen Pixel in jeder Bildzeile. Da allerdings in Kurven die Stopplinie nicht in einer einzelnen, sondern in mehreren Bildzeilen dargestellt wird, musste eine Möglichkeit gesucht werden, um auch schräge Stopplinien detektieren zu können. Dieses Problem kann gelöst werden, indem die Ergebnisse der zuvor erfolgten Spurerkennung eingesetzt werden. Aus den Koeffizienten der Fahrbahnmarkierung wird für jede Bildzeile der Richtungsvektor <math>\vec{r_1}</math> der Fahrbahnmarkierung bestimmt. Da eine Stopplinie senkrecht zur Fahrbahnmarkierung ist, kann der Richtungsvektor der Fahrbahnmarkierung um 90° gedreht werden, um den Richtungsvektor der Stopplinie <math>\vec{r_2}</math> zu berechnen. Mit Hilfe des Stopplinien-Richtungsvektors <math>\vec{r_2}</math> wird ein Punkt <math>P_3</math> auf der potentiellen Stopplinie bestimmt (siehe Abbildung). Dieser wird wiederum dazu genutzt, um die Koeffizienten einer Geraden zu bestimmen, auf der die potentielle Stopplinie liegt. Ausgehend von einem Punkt auf der Fahrbahnmarkierung werden mit Hilfe der Geradengleichung Koordinaten von einzelnen Pixeln bestimmt, auf denen die potentielle Stopplinie liegt. Anschließend werden die Pixelwerte der bestimmten Koordinaten ausgelesen und bei einem weißen Pixel eine Zählvariable erhöht. Erreicht diese Zählvariable einen Schwellwert, ist eine Stopplinie erkannt worden. Dieses Vorgehen ist auch in dem nebenstehenden PAP dargestellt.
|+ style = "text-align: left"|Tabelle ?: Anforderungen an die Stopplinienerkennung
! style="font-weight: bold;" | ID
! style="font-weight: bold;" | Inhalt
! style="font-weight: bold;" | Ersteller
! style="font-weight: bold;" | Datum
! style="font-weight: bold;" | Geprüft von
! style="font-weight: bold;" | Datum
|-
| 1
| Die Stopplinie muss mittels Kamerabild erkannt werden.
| Florian Brinkmann
| 05.10.2022
| Suryaa Kalamani-Ramamoorthy
| 05.10.2022
|-
| 2
| Die Stopplinie mit einer doppelten Breite (40 mm) muss von einer Haltelinie einfacher Breite (20 mm) unterschieden werden können.
| Florian Brinkmann
| 05.10.2022
| Suryaa Kalamani-Ramamoorthy
| 05.10.2022
|-
| 3
| Die Start-/Ziellinie (doppelte Breite (40 mm) über beide Fahrbahnen) darf nicht als Stopplinie erfasst werden.
| Florian Brinkmann
| 05.10.2022
| Suryaa Kalamani-Ramamoorthy
| 05.10.2022
|-
| 4
| Der Abstand zwischen Fahrzeug und Stopplinie muss bestimmt werden (Tolerant 10 %). Die Einheit des Abstandes ist gemäß Schnittstellendokumentation zu wählen.
| Suryaa Kalamani-Ramamoorthy
| 05.10.2022
| Florian Brinkmann
| 05.10.2022
|-
| 5
| Der Abstand zwischen Fahrzeug und Stopplinie muss im Fahrzeugkoordinatensystem bestimmt werden.
| Suryaa Kalamani-Ramamoorthy
| 05.10.2022
| Florian Brinkmann
| 05.10.2022
|-
|}
-->
 
== Ansatz ==
Die Stopplinienerkennung kann in zwei Teile gegliedert werden. Zunächst geht es erst einmal um die Detektion einer Stopplinie auf der Fahrbahn. In einem zweiten Schritt muss dann für eine detektierte Stopplinie der Abstand zwischen dieser Stopplinie und dem Fahrzeug ermittelt werden. Im folgenden werden die Ansätze für die beiden Teilaufgaben vorgestellt.
 
=== Stopplinienerkennung ===
[[Datei:Stopplinienerkennung Prinzip.gif|400px|thumb|right|Abbildung 2: Mathematisches Prinzip der Stopplinienerkennung]]
[[Datei:Stopplinienerkennung PAP.png|200px|thumb|right|Abbildung 3: Ablauf der Stopplinienerkennung]]
Der neue Ansatz basiert prinzipiell auf einer Zählung der weißen Pixel in jeder Bildzeile. Da allerdings in Kurven die Stopplinie nicht in einer einzelnen, sondern in mehreren Bildzeilen dargestellt wird, musste eine Möglichkeit gesucht werden, um auch schräge Stopplinien detektieren zu können. Dieses Problem kann gelöst werden, indem die Ergebnisse der zuvor erfolgten Spurerkennung eingesetzt werden. Aus den Koeffizienten der Fahrbahnmarkierung wird für jede Bildzeile der Richtungsvektor <math>\vec{r_1}</math> der Fahrbahnmarkierung bestimmt. Da eine Stopplinie senkrecht zur Fahrbahnmarkierung ist, kann der Richtungsvektor der Fahrbahnmarkierung um 90° gedreht werden, um den Richtungsvektor der Stopplinie <math>\vec{r_2}</math> zu berechnen. Mit Hilfe des Stopplinien-Richtungsvektors <math>\vec{r_2}</math> wird ein Punkt <math>P_3</math> auf der potentiellen Stopplinie bestimmt (siehe Abbildung 2). Dieser wird wiederum dazu genutzt, um die Koeffizienten einer Geraden zu bestimmen, auf der die potentielle Stopplinie liegt. Ausgehend von einem Punkt auf der Fahrbahnmarkierung werden mit Hilfe der Geradengleichung Koordinaten von einzelnen Pixeln bestimmt, auf denen die potentielle Stopplinie liegt. Anschließend werden die Pixelwerte der bestimmten Koordinaten ausgelesen und bei einem weißen Pixel eine Zählvariable erhöht. Erreicht diese Zählvariable einen Schwellwert, ist eine Stopplinie erkannt worden. Dieses Vorgehen ist auch in dem nebenstehenden PAP (Abbildung 3) dargestellt.


== Abstandsberechnung ==
=== Abstandsberechnung ===
Neben der Erkennung der Stopplinie ist es für den späteren Einsatz der Software notwendig, auch den Abstand <math>a</math> zwischen dem Fahrzeug und der Stopplinie zu bestimmen. Da die Stopplinie in einem ausgeschnittenen ROI der Vogelperspektive gesucht wird, muss die Lage des ROI im Fahrzeugkoordinaten bekannt sein. Die Ergebnisse der Bestimmung der Lage des ROI sind im oberen Abschnitt [[OSE_Softwareumgebung#Schritt_1:_Transformation|Transformation]] hinterlegt. Wie die nebenstehende Abbildung zeigt, basiert der Ansatz zur Bestimmung des Abstands zur Stopplinie auf zwei Teilen:  
Neben der Erkennung der Stopplinie ist es für den späteren Einsatz der Software notwendig, auch den Abstand <math>a</math> zwischen dem Fahrzeug und der Stopplinie zu bestimmen. Da die Stopplinie in einem ausgeschnittenen ROI der Vogelperspektive gesucht wird, muss die Lage des ROI im Fahrzeugkoordinaten bekannt sein. Die Ergebnisse der Bestimmung der Lage des ROI sind im Abschnitt [[OSE_Softwareumgebung#Schritt_1:_Transformation|Transformation im Artikel OSE Softwareumgebung]] hinterlegt. Wie die nebenstehende Abbildung 4 zeigt, basiert der Ansatz zur Bestimmung des Abstands zur Stopplinie auf zwei Teilen:  
[[Datei:PrinzipAbstandStopplinie.png|200px|thumb|right|Abstandberechnung zwischen Stopplinie und Fahrzeug]]
[[Datei:PrinzipAbstandStopplinie.png|200px|thumb|right|Abbildung 4: Abstandberechnung zwischen Stopplinie und Fahrzeug]]
# Der Abstand <math>s</math> zwischen Stopplinie und unterem Rand des ROI wird durch Bestimmung der Bogenlänge des Spurpolynoms ermittelt. Die berechnete Bogenlänge in Pixel muss noch in mm umgerechnet werden. Hierzu wird der oben beschriebene [[OSE_Softwareumgebung#Schritt_1:_Transformation|Umrechnungsfaktor]] in Längsrichtung verwendet.  
# Der Abstand <math>s</math> zwischen Stopplinie und unterem Rand des ROI wird durch Bestimmung der Bogenlänge des Spurpolynoms ermittelt. Die berechnete Bogenlänge in Pixel muss noch in mm umgerechnet werden. Hierzu wird der oben beschriebene [[OSE_Softwareumgebung#Schritt_1:_Transformation|Umrechnungsfaktor]] in Längsrichtung verwendet.  
# Der Abstand zwischen dem unteren Rand des ROI und Fahrzeug wird als konstant angenommen, sodass hierfür die [[:Datei:OSE_ROI_Fahrzeug_1.png|Lage des ROI im Fahrzeug-KOS]] eingesetzt wird.
# Der Abstand zwischen dem unteren Rand des ROI und Fahrzeug wird als konstant angenommen, sodass hierfür die [[:Datei:OSE_ROI_Fahrzeug_1.png|Lage des ROI im Fahrzeug-KOS]] eingesetzt wird.
Damit ergibt sich für die Abstandsberechnung folgende Formel: <math> a = s \cdot 2,4 \frac{mm}{px} + 520 mm</math>
Damit ergibt sich für die Abstandsberechnung folgende Formel: <math> a = s \cdot 2,4 \frac{mm}{px} + 520\,mm</math>


Die Bogenlänge <math> s </math> des Spurpolynoms  <math> x = f(y) = a \cdot y^2 + b \cdot y + c </math>  kann auf 2 Arten berechnet werden:
Die Bogenlänge <math> s </math> des Spurpolynoms  <math> x = f(y) = a \cdot y^2 + b \cdot y + c </math>  kann auf 2 Arten berechnet werden:
# Das Spurpolynom kann in kleine Abschnitte unterteilt werden, für die dann jeweils die euklidische Distanz berechnet wird <ref name="papula1">[https://hshl.bsz-bw.de/cgi-bin/koha/opac-detail.pl?biblionumber=114006&query_desc=kw%2Cwrdl%3A%20Papula%20Band%201 PAPULA, L. Mathematik für Ingenieure und Naturwissenschaftler Band 1. Ein Lehr- und Arbeitsbuch für das Grundstudium. 15. Auflage. Wiesbaden: Springer Vieweg, 2018. ISBN 978-3-658-21746-4.]</ref>:  <math> ds = \sqrt{dx^2 + dy^2} </math>
# Das Spurpolynom kann in kleine Abschnitte unterteilt werden, für die dann jeweils die euklidische Distanz berechnet wird <ref name="papula1">[https://hshl.bsz-bw.de/cgi-bin/koha/opac-detail.pl?biblionumber=114006&query_desc=kw%2Cwrdl%3A%20Papula%20Band%201 PAPULA, L. Mathematik für Ingenieure und Naturwissenschaftler Band 1. Ein Lehr- und Arbeitsbuch für das Grundstudium. 15. Auflage. Wiesbaden: Springer Vieweg, 2018. ISBN 978-3-658-21746-4.]</ref>:  <math> ds = \sqrt{dx^2 + dy^2} </math>
# Mit Hilfe der Integralrechnung kann die Formel aus 1. zu  <math> s = \int_{y_S}^{y_{max}} \sqrt{1 + [f'(y)]^2} dy </math>  umgestellt werden <ref name="papula1" />, wobei als Grenzen des Integrals die y-Bildkoordinate der Stopplinie <math> y_S </math> und der untere Rand des ROI <math> y_{max} = 1113 </math> eingesetzt werden.
# Mit Hilfe der Integralrechnung kann die Formel aus 1. zu  <math> s = \int_{y_S}^{y_{max}} \sqrt{1 + [f'(y)]^2} dy </math>  umgestellt werden <ref name="papula1" />, wobei als Grenzen des Integrals die y-Bildkoordinate der Stopplinie <math> y_S </math> und der untere Rand des ROI <math> y_{max} = 1113 </math> eingesetzt werden.
Die Berechnung der Bogenlänge wurde im MATLAB-Code für beide Verfahren implementiert ([https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/berechneStopplinienAbstand.m <code>berechneStopplinienAbstand.m</code> (Revision 8137)]). Da das erste Verfahren weniger Rechenzeit in Anspruch nimmt, ist dieses letztendlich in der Funktion [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/berechneStopplinienAbstand.m <code>berechneStopplinienAbstand.m</code>] umgesetzt worden. Detaillierte Ergebnisse des Vergleichs sind in der [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/_Semesterordner/WS2022/Sprint_2/Team_5_OSE_Stopplinie/Praesentation.pptx Meilensteinpräsentation] zu finden.
Die Berechnung der Bogenlänge wurde im MATLAB-Code für beide Verfahren implementiert ([https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/berechneStopplinienAbstand.m <code>berechneStopplinienAbstand.m</code> (Revision 8137)]). Da das erste Verfahren weniger Rechenzeit in Anspruch nimmt, ist dieses in der Funktion [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/berechneStopplinienAbstand.m <code>berechneStopplinienAbstand.m</code>] umgesetzt worden. Detaillierte Ergebnisse des Vergleichs sind in der [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/_Semesterordner/WS2022/Sprint_2/Team_5_OSE_Stopplinie/Praesentation.pptx Meilensteinpräsentation] zu finden.


= Umsetzung des Ansatzes mit MATLAB<sup>®</sup> =
== Umsetzung des Ansatzes mit MATLAB<sup>®</sup> ==
In einem ersten Schritt wurde der Ansatz der Stopplinienerkennung in dem MATLAB-Skript [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/_Semesterordner/WS2022/Sprint_1/Team_5_OSE_Stopplinie/stopplinienerkennung.m stopplinienerkennung.m (Revision 7857)] für einige Situationen erfolgreich validiert. Auf Anregung bei der Meilensteinpräsentation soll der Ansatz für die gesamte Strecke validiert werden, bevor der Ansatz endgültig in C-Code umgesetzt wird.  
In einem ersten Schritt wurde der Ansatz der Stopplinienerkennung in dem MATLAB-Skript [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/_Semesterordner/WS2022/Sprint_1/Team_5_OSE_Stopplinie/stopplinienerkennung.m stopplinienerkennung.m (Revision 7857)] für einige Situationen erfolgreich validiert. Auf Anregung bei der Meilensteinpräsentation soll der Ansatz für die gesamte Strecke validiert werden, bevor der Ansatz endgültig in C-Code umgesetzt wird.  


[[Datei:Ezgif-3-aa149494be25.gif]] '''Ab dem Revisionsstand 8088 befinden sich alle notwendigen Dateien für die Stopplinienerkennung im Software-Ordner''' [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung OSE_Stopplinienerkennung]
[[Datei:Ezgif-3-aa149494be25.gif]] '''Ab dem Revisionsstand 8088 befinden sich alle notwendigen MATLAB-Dateien für die Stopplinienerkennung im Software-Ordner''' [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung OSE_Stopplinienerkennung]


Zur Validierung sind folgende Vorbereitungsschritte notwendig:
Zur Validierung sind folgende Vorbereitungsschritte notwendig:
Zeile 42: Zeile 95:
* Um die Stopplinienerkennung zu validieren, wurde das Framework [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/testStopplinienerkennung.m <code>testStopplinienerkennung.m</code>] erstellt, dass die Videoframes und die Spurparameter einliest und mit diesen Werten dann die Funktion [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/stopplinienerkennung.m <code>stopplinienerkennung.m</code>] aufruft.
* Um die Stopplinienerkennung zu validieren, wurde das Framework [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/testStopplinienerkennung.m <code>testStopplinienerkennung.m</code>] erstellt, dass die Videoframes und die Spurparameter einliest und mit diesen Werten dann die Funktion [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/stopplinienerkennung.m <code>stopplinienerkennung.m</code>] aufruft.


= Umsetzung der Stopplinienerkennung in Visual Studio =
== Umsetzung der Stopplinienerkennung in Visual Studio ==
<!--Stopplinienerkennung(imgT, OSE_StopplinieErkannt, OSE_StopplinienAbstand);-->
<!--Stopplinienerkennung(imgT, OSE_StopplinieErkannt, OSE_StopplinienAbstand);-->
Die Umsetzung der Stopplinienerkennung in C++-Code besteht aus zwei Schritten. Zunächst wird mit Hilfe von MATLAB Coder der gewünschte C++-Code generiert, der dann wiederum im zweiten Schritt in den Code des vorhandenen Visual Studio Projekts eingebunden werden muss. Die beiden Schritte werden nachfolgend dokumentiert.
Die Umsetzung der Stopplinienerkennung in C++-Code besteht aus zwei Schritten. Zunächst wird mit Hilfe von MATLAB Coder der gewünschte C++-Code generiert, der dann wiederum im zweiten Schritt in den Code des vorhandenen Visual Studio Projekts eingebunden werden muss. Die beiden Schritte werden nachfolgend dokumentiert.


== Code-Generation mit MATLAB Coder ==
=== Code-Generation mit MATLAB Coder ===
Die Umsetzung der Stopplinienerkennung in Visual Studio wurde mit Hilfe des MATLAB Coders realisiert. Die entsprechende [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/stopplinienerkennung.prj Projektdatei] befindet sich im SVN. Zunächst wird der Nutzer durch die GUI von MATLAB Coder geführt. Dabei werden folgende Schritte durchlaufen:
Die Umsetzung der Stopplinienerkennung in Visual Studio wurde mit Hilfe des MATLAB Coders realisiert. Die entsprechende [https://svn.hshl.de/svn/MTR_SDE_Praktikum/trunk/Software/OSE_Stopplinienerkennung/stopplinienerkennung.prj Projektdatei] befindet sich im SVN. Zunächst wird der Nutzer durch die GUI von MATLAB Coder geführt. Dabei werden folgende Schritte durchlaufen:
# Auswahl des Skriptes/der Funktion, für die Code generiert werden soll: <code>stopplinienerkennung</code>
# Auswahl des Skriptes/der Funktion, für die Code generiert werden soll: <code>stopplinienerkennung</code>
# Definition der Übergabeparameter:
# Definition der Übergabeparameter:
## <code>img</code>: double(1113 x 752)
## <code>img</code>: double(1113 x 752) '''Achtung: Sollte die Größe des Bildes im Visual Studio Projekt verändert werden, muss der C-Code mit den aktualisierten Werten neu generiert werden!'''
## <code>a</code>: double(1 x 1)
## <code>a</code>: double(1 x 1)
## <code>b</code>: double(1 x 1)
## <code>b</code>: double(1 x 1)
## <code>c</code>: double(1 x 1)
## <code>c</code>: double(1 x 1)
# Suche nach Laufzeitproblemen (hier kann ein Check der Software durchgeführt werden=
# Suche nach Laufzeitproblemen (hier kann ein Check der Software durchgeführt werden)
# Code-Generation: Mit einem Klick auf "Generate" wird der C++-Code erzeugt, wobei hier noch einige Einstellungen getroffen werden können:
# Code-Generation: Mit einem Klick auf "Generate" wird der C++-Code erzeugt, wobei hier noch einige Einstellungen getroffen werden können:
## Build type: <code>Source Code</code>
## Build type: <code>Source Code</code>
Zeile 65: Zeile 118:
# Abschluss: Hier kann das Code-Package als *.zip-Datei heruntergeladen werden, muss es aber nicht!
# Abschluss: Hier kann das Code-Package als *.zip-Datei heruntergeladen werden, muss es aber nicht!


== Anpassung des Visual Studio Projekts ==
=== Anpassung des Visual Studio Projekts ===
Nachdem nun der C++-Code generiert und bereits im Ordner [https://svn.hshl.de/svn/MTR_SDE_Praktikum/branches/2022_10_05_OSE_Stopplinienerkennung/Bahnspurpolynom_verlinkt/MATLAB_Coder_Stopplinienerkennung <code>MATLAB_Coder_Stopplinienerkennung</code>] abgelegt wurde, kann nun die Einbindung in das [https://svn.hshl.de/svn/MTR_SDE_Praktikum/branches/2022_10_05_OSE_Stopplinienerkennung VS-Projekt] beginnen.
Nachdem nun der C++-Code generiert und bereits im Ordner [https://svn.hshl.de/svn/MTR_SDE_Praktikum/branches/2022_10_05_OSE_Stopplinienerkennung/Bahnspurpolynom_verlinkt/MATLAB_Coder_Stopplinienerkennung <code>MATLAB_Coder_Stopplinienerkennung</code>] abgelegt wurde, kann nun die Einbindung in das [https://svn.hshl.de/svn/MTR_SDE_Praktikum/branches/2022_10_05_OSE_Stopplinienerkennung VS-Projekt] beginnen.


Zeile 76: Zeile 129:
* Die von MATLAB generierte Funktion nutzt nicht den Datentyp <code>cv::Mat</code>, sondern ein eindimensionales Array mit 836976 Elementen (<math>1113 \cdot 752 = 836976</math>). Daher müssen vor der Übergabe des aktuellen Frames die einzelnen Pixel in dem eindimensionalen Array <code>imgSLE</code> abgelegt werden. Die Ablage der einzelnen Pixel erfolgt dabei analog zu dem generierten [https://svn.hshl.de/svn/MTR_SDE_Praktikum/branches/2022_10_05_OSE_Stopplinienerkennung/Bahnspurpolynom_verlinkt/MATLAB_Coder_Stopplinienerkennung/examples Beispiel]. Da Probleme mit der Größe des Heaps auftraten, wurde das Array dynamisch angelegt. Wichtig ist dabei, dass das Array im Anschluss wieder gelöscht wird.
* Die von MATLAB generierte Funktion nutzt nicht den Datentyp <code>cv::Mat</code>, sondern ein eindimensionales Array mit 836976 Elementen (<math>1113 \cdot 752 = 836976</math>). Daher müssen vor der Übergabe des aktuellen Frames die einzelnen Pixel in dem eindimensionalen Array <code>imgSLE</code> abgelegt werden. Die Ablage der einzelnen Pixel erfolgt dabei analog zu dem generierten [https://svn.hshl.de/svn/MTR_SDE_Praktikum/branches/2022_10_05_OSE_Stopplinienerkennung/Bahnspurpolynom_verlinkt/MATLAB_Coder_Stopplinienerkennung/examples Beispiel]. Da Probleme mit der Größe des Heaps auftraten, wurde das Array dynamisch angelegt. Wichtig ist dabei, dass das Array im Anschluss wieder gelöscht wird.


= Testkonzept =
== Testkonzept ==
Für die OSE Softwareumgebung wurden verschiedene Testfälle sowohl für die Simulation als auch für Tests am Fahrzeug entwickelt. Die beiden Artikel und die verschiedenen Testfälle sind in der unten stehenden Tabelle 1 verlinkt. Bitte die Tabelle aktuell halten.
Für die OSE Softwareumgebung wurden verschiedene Testfälle sowohl für die Simulation als auch für Tests am Fahrzeug entwickelt. Die beiden Artikel und die verschiedenen Testfälle sind in der unten stehenden Tabelle 1 verlinkt. Bitte die Tabelle aktuell halten.


Zeile 92: Zeile 145:
|}
|}


= Literatur =
== Literatur ==


<references />
<references />

Aktuelle Version vom 22. Januar 2023, 11:43 Uhr

Autoren: Florian Brinkmann & Suryaa Kalamani Ramamoorthy
Betreuer: Prof. Schneider

→ zurück zum Hauptartikel: OSE Softwareumgebung
→ zurück zum Hauptartikel: OSE - Objekt - und Spurerkennung
→ zurück zum Hauptartikel: Praktikum SDE

Motivation

Abbildung 1: Anforderung an das Verhalten an einer Stopp-Kreuzung

Gemäß der in Abbildung 1 dargestellten REQ10.2340 aus dem Lastenheft soll das autonome Fahrzeug an einer Stopp-Kreuzung anhalten. Dementsprechend muss die Stopplinie mittels Kamera detektiert werden. Dabei gilt es zu unterschieden, ob es sich um eine 40 mm breite Stopplinie oder eine schmalere Linie handelt, an der nicht gehalten werden muss. Zusätzlich enthält das Requirement den Hinweis, dass die Kreuzung rechtwinklig ist, sodass auch die Stopplinie in einem rechten Winkel zur Fahrbahnmarkierung liegt. [1]

Im Wintersemester 2022/23 hat sich das Team OSE (Stopplinienerkennung) damit beschäftigt die Stopplinienerkennung in die aktuelle Software zu implementieren. Dabei wurde zunächst der Lösungsansatz mittels Hough-Transformation von Kevin Hustedt und Moritz Oberg verfolgt. Jedoch wurde hierbei festgestellt, dass die genutzte Hough-Transformation mit der eingesetzten OpenCV 3.0.0-Version zu Speicherzugriffsverletzungen führt. Aus diesem Grund wurde der im folgenden vorgestellte Ansatz verfolgt.

Die Entwicklung der Stopplinienerkennung erfolgt einfachheitshalber mit dem Entwicklungsumgebung MATLAB®. Um trotzdem den Programmcode für das C-Projekt in Visual Studio bereitstellen zu können, soll aus dem MATLAB®-Code mit Hilfe der in MATLAB® integrierten App "MATLAB Coder" automatsiert C++-Code generiert werden. Daher befindet sich der MATLAB®-Code im Softwareordner OSE_Stopplinienerkennung und der generierte Programmcode im Projektverzeichnis des Visual Studio Projekts im Ordner MATLAB_Coder_Stopplinienerkennung. Die weitere Entwicklung am Visual Studio Projekt erfolgte im Branch 2022_10_05_OSE_Stopplinienerkennung. Mit der Revision 8360 wurden alle Änderungen vom Branch auf den Trunk übertragen.

Ansatz

Die Stopplinienerkennung kann in zwei Teile gegliedert werden. Zunächst geht es erst einmal um die Detektion einer Stopplinie auf der Fahrbahn. In einem zweiten Schritt muss dann für eine detektierte Stopplinie der Abstand zwischen dieser Stopplinie und dem Fahrzeug ermittelt werden. Im folgenden werden die Ansätze für die beiden Teilaufgaben vorgestellt.

Stopplinienerkennung

Abbildung 2: Mathematisches Prinzip der Stopplinienerkennung
Abbildung 3: Ablauf der Stopplinienerkennung

Der neue Ansatz basiert prinzipiell auf einer Zählung der weißen Pixel in jeder Bildzeile. Da allerdings in Kurven die Stopplinie nicht in einer einzelnen, sondern in mehreren Bildzeilen dargestellt wird, musste eine Möglichkeit gesucht werden, um auch schräge Stopplinien detektieren zu können. Dieses Problem kann gelöst werden, indem die Ergebnisse der zuvor erfolgten Spurerkennung eingesetzt werden. Aus den Koeffizienten der Fahrbahnmarkierung wird für jede Bildzeile der Richtungsvektor der Fahrbahnmarkierung bestimmt. Da eine Stopplinie senkrecht zur Fahrbahnmarkierung ist, kann der Richtungsvektor der Fahrbahnmarkierung um 90° gedreht werden, um den Richtungsvektor der Stopplinie zu berechnen. Mit Hilfe des Stopplinien-Richtungsvektors wird ein Punkt auf der potentiellen Stopplinie bestimmt (siehe Abbildung 2). Dieser wird wiederum dazu genutzt, um die Koeffizienten einer Geraden zu bestimmen, auf der die potentielle Stopplinie liegt. Ausgehend von einem Punkt auf der Fahrbahnmarkierung werden mit Hilfe der Geradengleichung Koordinaten von einzelnen Pixeln bestimmt, auf denen die potentielle Stopplinie liegt. Anschließend werden die Pixelwerte der bestimmten Koordinaten ausgelesen und bei einem weißen Pixel eine Zählvariable erhöht. Erreicht diese Zählvariable einen Schwellwert, ist eine Stopplinie erkannt worden. Dieses Vorgehen ist auch in dem nebenstehenden PAP (Abbildung 3) dargestellt.

Abstandsberechnung

Neben der Erkennung der Stopplinie ist es für den späteren Einsatz der Software notwendig, auch den Abstand zwischen dem Fahrzeug und der Stopplinie zu bestimmen. Da die Stopplinie in einem ausgeschnittenen ROI der Vogelperspektive gesucht wird, muss die Lage des ROI im Fahrzeugkoordinaten bekannt sein. Die Ergebnisse der Bestimmung der Lage des ROI sind im Abschnitt Transformation im Artikel OSE Softwareumgebung hinterlegt. Wie die nebenstehende Abbildung 4 zeigt, basiert der Ansatz zur Bestimmung des Abstands zur Stopplinie auf zwei Teilen:

Abbildung 4: Abstandberechnung zwischen Stopplinie und Fahrzeug
  1. Der Abstand zwischen Stopplinie und unterem Rand des ROI wird durch Bestimmung der Bogenlänge des Spurpolynoms ermittelt. Die berechnete Bogenlänge in Pixel muss noch in mm umgerechnet werden. Hierzu wird der oben beschriebene Umrechnungsfaktor in Längsrichtung verwendet.
  2. Der Abstand zwischen dem unteren Rand des ROI und Fahrzeug wird als konstant angenommen, sodass hierfür die Lage des ROI im Fahrzeug-KOS eingesetzt wird.

Damit ergibt sich für die Abstandsberechnung folgende Formel:

Die Bogenlänge des Spurpolynoms kann auf 2 Arten berechnet werden:

  1. Das Spurpolynom kann in kleine Abschnitte unterteilt werden, für die dann jeweils die euklidische Distanz berechnet wird [2]:
  2. Mit Hilfe der Integralrechnung kann die Formel aus 1. zu umgestellt werden [2], wobei als Grenzen des Integrals die y-Bildkoordinate der Stopplinie und der untere Rand des ROI eingesetzt werden.

Die Berechnung der Bogenlänge wurde im MATLAB-Code für beide Verfahren implementiert (berechneStopplinienAbstand.m (Revision 8137)). Da das erste Verfahren weniger Rechenzeit in Anspruch nimmt, ist dieses in der Funktion berechneStopplinienAbstand.m umgesetzt worden. Detaillierte Ergebnisse des Vergleichs sind in der Meilensteinpräsentation zu finden.

Umsetzung des Ansatzes mit MATLAB®

In einem ersten Schritt wurde der Ansatz der Stopplinienerkennung in dem MATLAB-Skript stopplinienerkennung.m (Revision 7857) für einige Situationen erfolgreich validiert. Auf Anregung bei der Meilensteinpräsentation soll der Ansatz für die gesamte Strecke validiert werden, bevor der Ansatz endgültig in C-Code umgesetzt wird.

Ab dem Revisionsstand 8088 befinden sich alle notwendigen MATLAB-Dateien für die Stopplinienerkennung im Software-Ordner OSE_Stopplinienerkennung

Zur Validierung sind folgende Vorbereitungsschritte notwendig:

  • Das transformierte Video muss aus Visual Studio heraus abgespeichert werden. Da Probleme mit den openCV-Funktionen cv::imwrite und write auftraten, wurde die Funktion saveImageData (Revision 7967) realisiert, die für jedes Frame alle Pixelwerte in je eine txt-Datei schreibt. Anschließend wurden die txt-Dateien mit dem MATLAB-Skript txt2mat.m (Revision 8088) in mat-Dateien umgewandelt. Diese wurden im Ordner Videoframes (Revision 8088) abgelegt.
  • Damit die Spurerkennung nicht mit MATLAB realisiert werden muss, wurden neben dem transformierten Video auch die zugehörigen Spurparameter in einer csv-Datei gesichert. Die zugehörige Funktion saveSpurparameter wurde mit der Revision 7927 ergänzt. Die spurparameter.csv-Datei (Revision 8088) besteht aus vier Spalten: In der ersten Spalte befindet sich die Nummer des Frames. Die weiteren drei Spalten beinhalten die Koeffizienten des Spurpolynoms (a, b und c).
  • Um die Stopplinienerkennung zu validieren, wurde das Framework testStopplinienerkennung.m erstellt, dass die Videoframes und die Spurparameter einliest und mit diesen Werten dann die Funktion stopplinienerkennung.m aufruft.

Umsetzung der Stopplinienerkennung in Visual Studio

Die Umsetzung der Stopplinienerkennung in C++-Code besteht aus zwei Schritten. Zunächst wird mit Hilfe von MATLAB Coder der gewünschte C++-Code generiert, der dann wiederum im zweiten Schritt in den Code des vorhandenen Visual Studio Projekts eingebunden werden muss. Die beiden Schritte werden nachfolgend dokumentiert.

Code-Generation mit MATLAB Coder

Die Umsetzung der Stopplinienerkennung in Visual Studio wurde mit Hilfe des MATLAB Coders realisiert. Die entsprechende Projektdatei befindet sich im SVN. Zunächst wird der Nutzer durch die GUI von MATLAB Coder geführt. Dabei werden folgende Schritte durchlaufen:

  1. Auswahl des Skriptes/der Funktion, für die Code generiert werden soll: stopplinienerkennung
  2. Definition der Übergabeparameter:
    1. img: double(1113 x 752) Achtung: Sollte die Größe des Bildes im Visual Studio Projekt verändert werden, muss der C-Code mit den aktualisierten Werten neu generiert werden!
    2. a: double(1 x 1)
    3. b: double(1 x 1)
    4. c: double(1 x 1)
  3. Suche nach Laufzeitproblemen (hier kann ein Check der Software durchgeführt werden)
  4. Code-Generation: Mit einem Klick auf "Generate" wird der C++-Code erzeugt, wobei hier noch einige Einstellungen getroffen werden können:
    1. Build type: Source Code
    2. Language: C++
    3. Interface style: Functions
    4. More Settings → Path →
      1. Working folder: Project folder
      2. Build folder: Specified folder
      3. Build folder name: Hier muss je nach lokalem Projektverzeichnis der vollständige lokale Dateipfad zum Ordner ...\OSE_Draufsicht_Spurpolynom_RS232\Bahnspurpolynom_verlinkt\MATLAB_Coder_Stopplinienerkennung (SVN-Link) eingefügt werden
  5. Abschluss: Hier kann das Code-Package als *.zip-Datei heruntergeladen werden, muss es aber nicht!

Anpassung des Visual Studio Projekts

Nachdem nun der C++-Code generiert und bereits im Ordner MATLAB_Coder_Stopplinienerkennung abgelegt wurde, kann nun die Einbindung in das VS-Projekt beginnen.

In einem ersten Schritt müssen die generierten Dateien mit dem Projekt verknüpft werden.

  • Die Header-Dateien können mit Hilfe zusätzlicher Include-Verzeichnisse eingebunden werden. Dies kann in Visual Studio im Projektmappen-Explorer unter OSE_Draufsicht_Spurpolynom_RS232 → Eigenschaften → Konfigurationseigenschaften → VC++-Verzeichnisse → Includeverzeichnisse → bearbeiten erfolgen. Hier muss nun eine neue Zeile mit dem Inhalt $(ProjectDir)MATLAB_Coder_Stopplinienerkennung eingefügt werden. Damit wird der Ordner mit den generierten Dateien inkludiert. $(ProjectDir) ermöglicht dabei, dass der Pfad unabhängig vom lokalen Verzeichnis ist. Wichtig ist allerdings, dass nach $(ProjectDir) kein / eingefügt wird, da dies automatisch ergänzt wird. Der erzeugte Dateipfad kann unten unter "Ausgewerteter Wert" kontrolliert werden.
  • Zwar befinden sich die *.cpp-Dateien auch in diesem Ordner, jedoch werden diese hierdurch nicht inkludiert. Hierzu muss im Projektmappen-Explorer in Visual Studio unter Quelldateien → Hinzufügen → Vorhandenes Element jede einzelne *.cpp-Datei hinzugefügt werden.

Zusätzlich müssen in der main.cpp-Datei einige Anpassungen vorgenommen werden.

  • Wie in dem von MATLAB Coder generiertem Beispiel müssen einige Header-Dateien inkludiert werden.
  • Die von MATLAB generierte Funktion nutzt nicht den Datentyp cv::Mat, sondern ein eindimensionales Array mit 836976 Elementen (). Daher müssen vor der Übergabe des aktuellen Frames die einzelnen Pixel in dem eindimensionalen Array imgSLE abgelegt werden. Die Ablage der einzelnen Pixel erfolgt dabei analog zu dem generierten Beispiel. Da Probleme mit der Größe des Heaps auftraten, wurde das Array dynamisch angelegt. Wichtig ist dabei, dass das Array im Anschluss wieder gelöscht wird.

Testkonzept

Für die OSE Softwareumgebung wurden verschiedene Testfälle sowohl für die Simulation als auch für Tests am Fahrzeug entwickelt. Die beiden Artikel und die verschiedenen Testfälle sind in der unten stehenden Tabelle 1 verlinkt. Bitte die Tabelle aktuell halten.

OSE: Test in der Simulation OSE: Test am Fahrzeug
Tabelle 1: Testfälle für die Stopplinienerkennung

Literatur



→ zurück zum Hauptartikel: OSE Softwareumgebung
→ zurück zum Hauptartikel: OSE - Objekt - und Spurerkennung
→ zurück zum Hauptartikel: Praktikum SDE