Skip to content
Snippets Groups Projects
standdertechnik.tex 13.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jan Wille's avatar
    Jan Wille committed
    \chapter{Stand der Technik} \label{chap: stand der technik}
    
    
    Jan Wille's avatar
    Jan Wille committed
    	\section{Techniken zur Fahrspurerkennung}
    
    Jan Wille's avatar
    Jan Wille committed
    		Das Thema Fahrspurerkennung beschäftigt die Wissenschaft und auch die Automobilindustrie bereits seit einigen Jahren. Im Folgenden möchte ich
    		daher die existierenden üblichen Ansätze zu diesem Thema erläutern. Dabei ist besonders interessant, wie diese in diese Arbeit einfließen.
    
    Jan Wille's avatar
    Jan Wille committed
    		\subsection{Geometrische und algorithmische Ansätze}
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    			Bei den klassischen und ältesten Methoden wird an die Thematik mit mathe\-ma\-tisch-geo\-me\-trisch\-en Ansätzen herangegangen. Diese
    			werden zu Algorithmen verknüpft, um unterschiedliche Informationen herauszuarbeiten, zu verknüpfen und das Ergebnis zu verfeinern.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    			Grundlage bilden hierbei verschiedene Operationen, mit welchen sich Bilder verändern lassen. Solche Operationen verknüpfen eine bestimmen
    			menge an Pixeln eines Ursprungsbildes mittels einer mathematischen Operation, um ein neues \gls{Pixel} für das Zielbild zu ermitteln. Ein
    			relativ simples Beispiel hierfür ist das Bilden eines Mittelwertes von jeweils drei Farbpixeln, um ein Schwarzweißbild zu erzeugen.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    			% Häufig kommen bei diesen Operationen sogenannten \gls{Kernel} zum Einsatz. Dabei handelt es sich um Matrizen, welche je nach Anwendung
    			% Werte enthalten. Um nun ein \gls{Pixel} des Zielbildes zu bestimmen, wird ein entsprechender Bildausschnitt im Ursprungsbild ausgewählt und
    			% jeder \gls{Pixel} mit einem Element des \glspl{Kernel} verrechnet. Danach wird die Ergebnis Matrix zum neuen Wert für das Zielpixel zusammen
    			% gefasst, häufig durch simples Summieren. Auf diese weise werden zum Beispiel viele Filterfunktionen umgesetzt.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    			% Der für diese Arbeit relevante \gls{gauss-filter} verwendet einen \gls{Kernel}, dessen Werte um den Kernel-Mittelpunkt Normalverteilt
    			% sind. Dieser wird für jeden \gls{Pixel} mit der entsprechend großen \gls{Pixelnachbarschaft} multipliziert und aufsummiert. Dadurch wird
    			% der gewichtete Mittelwert aller Nachbarpixel gebildet und das Bild geglättet.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    			Der sehr grobe Ablauf, welcher solche Operationen zu einem Algorithmus verknüpft, ist in \autoref{fig: genersich} skizziert. Dabei sind
    			die Einzelschritte in der Realität jedoch häufig sehr kompliziert. Begonnen wird eigentlich immer mit einem Vorbereitung-Schritt, da die
    			Bilder einer Kamera nur selten direkt verwendet werden können. Teilweise ist eine solche Vorverarbeitung aber auch Hardwareseitig oder in
    			vorgelagerten Programmteilen umgesetzt. Meisten wird das Bild außerdem in ein Schwarzweißbild umgewandelt, da so nur ein Drittel der
    			Pixel untersucht werden müssen, was die Performance verbessert.
    
    			\begin{figure}
    				\includegraphics[scale=.85]{svg/PAP_generisch_markerdetektion.pdf}
    				\caption{Generischer Ablauf von Fahrspurerkennung (nach \cite{laneDetection:aReview})}
    				\label{fig: genersich}
    			\end{figure}
    
    			Bei den sogenannten Features handelt es sich um spezifische, möglichst eindeutige Muster im Bild. Im Fall von Fahrspurmarkierungen sind
    			dies eigentlich immer Kannten und Ecken ebendieser. Häufig wird hier der \gls{canny} eingesetzt, der von John Canny in
    			\cite{Canny:computationAlapproachEdgeDetection} entwickelt wurde. Dieser Algorithmus ist sehr gut zum Identifizieren von Kantenpixeln
    			geeignet und erzeigt ein Binärbild, in dem nur noch ein \gls{Pixel} dicke Umrisse verbleiben.
    
    			Das genaue Vorgehen um Features zu finden und zu verknüpfen, hängt von der Methode ab. In \cite{laneDetection:aReview} werden verscheiden
    			Möglichkeiten die Hough Transformation zu verwenden miteinander verglichen und \cite{assistanceSystem:laneDetection-vehicleRecognition}
    			verwendet zusätzlich eine Methode zum Kombinieren von einzelnen Liniensegmenten. \cite{robustLaneMarkingDetection} demonstriert einen
    			Ansatz, um direkt Mittellinien von Fahrspurmarkierungen anhand von bekannten Größenparametern abzuleiten.
    
    			Das Ergebnis kann durch das Einbeziehen weiterer Informationen noch weiter verbessert werden. Oft wird hier  das originale
    			Farbbild mit einbezogen (siehe \cite{laneDetection:aReview}), aber auch das Zurückgreifen auf das vorherige Bild, wie in
    			\cite{LaneDetection_basedOnRidge} eingesetzt, ist möglich.
    
    
    			\medskip
    			Da diese Techniken bereits langfristig erprobt und daher sehr stark optimiert sind, eignen sie sich besonders gut für den Einsatz in
    			dieser Arbeit. Auch der gezeigte Ablauf wird in dieser Arbeit so angewendet.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    			Insbesondere die gezeigten Methoden des \gls{canny} werden später noch einmal aufgegriffen. Die in vielen Quellen erwähnte Hough
    			Transformation wurde aber bereits im Voraus als zu rechenintensiv ausgeschlossen.
    
    
    
    Jan Wille's avatar
    Jan Wille committed
    		\subsection{Deep Learning Ansätze}
    
    			Alternativ zu den traditionellen Ansätzen gibt es die neuen Deep Learning Methoden. Hier werden sogenannte \emph{Convolutional Neural
    			Networks} (kurz \emph{CNN}) verwendet. Diese Netzwerke bestehen aus mehreren Schichten, welche von einem Eingangsbild nacheinander
    			durchlaufen werden.
    
    Jan Wille's avatar
    Jan Wille committed
    
    		\todo[inline]{
    			Was ist das? \\
    			Warum hier nicht? \\
    			Was ist ungeeignet?
    		}
    
    
    Jan Wille's avatar
    Jan Wille committed
    	% \section{Lochkamera Modell} \label{sec: pinhole model}
    
    	% 	\begin{align} \label{eq: camera}
    	% 			\begin{pmatrix}
    	% 				u \\ v \\ 1
    	% 			\end{pmatrix}
    	% 			&=
    	% 			\begin{pmatrix}
    	% 				f_x & 0 & c_x \\
    	% 				0 & f_y & c_y \\
    	% 				0 &   0 &   1 \\
    	% 			\end{pmatrix}
    	% 			\begin{pmatrix}
    	% 				r_{11} & r_{12} &r_{13} & t_1 \\
    	% 				r_{21} & r_{22} &r_{23} & t_2 \\
    	% 				r_{31} & r_{32} &r_{33} & t_3 \\
    	% 			\end{pmatrix}
    	% 			\begin{pmatrix}
    	% 				x \\ y \\ z \\ 1
    	% 			\end{pmatrix}
    	% 			\\
    	% 			p &= K \cdot T[RT] \cdot
    	% 	\end{align}
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    	\section{OpenCV} \label{sec: opencv}
    
    
    Jan Wille's avatar
    Jan Wille committed
    		Das Open-Source-Projekt \gls{OpenCV} (kurz für \emph{Open Source Computer Vision Library}) ist eine Sammlung von Softwaremodulen, die der
    
    Jan Wille's avatar
    Jan Wille committed
    		Bildverarbeitung und dem maschinellen Lernen dienen. Sie verfügt über mehr als 2500 optimierte Algorithmen mit denen Anwendungen wie
    
    Jan Wille's avatar
    Jan Wille committed
    		Objekterkennung, Bewegungserkennung und 3D-Modell Extraktion erstellt werden können. Daher ist sie eine der Standardbibliotheken, wenn es um
    
    Jan Wille's avatar
    Jan Wille committed
    		digitale Bildverarbeitung geht und wird fast immer zur Demonstration neuer Konzepte benutzt. Da sie sowohl in C/\gls{C++}, Java und Python
    		genutzt werden kann, ist sie außerdem sehr vielseitig und hat den Vorteil, dass Konzepte in einer abstrakten Sprache wie \gls{python} getestet
    
    Jan Wille's avatar
    Jan Wille committed
    		werden und später relativ simple in eine hardwarenahe Programmiersprache übersetzt werden können. Weitere Informationen sind in der
    		Dokumentation des Projektes \cite{OpenCV:homepage} zu finden.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    		In dieser Arbeit wird diese Bibliothek daher insbesondere für die Entwicklungsphase verwendet. Da der Bibliothekskunde jedoch auch viele
    		potenziell nicht benötigte Zusatzfunktionen mit bring, wird auch ein wechsel auf eine eigene Implementierung mit besserer Performance in
    		Betracht gezogen.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    	\section{Das Robot Operating System} \label{sec: ros}
    
    
    Jan Wille's avatar
    Jan Wille committed
    		Das \glslink{ROS}{Robot Operating System} (kurz: ROS) ist eine Sammlung von Software Bibliotheken und Werkzeugen, die zum Erstellen von Roboter
    		Applikationen dienen. Es bietet eine eigene Paketverwaltung über die bestehende Bibliotheksfunktionen für die Verwendung
    		heruntergeladen werden können. Dabei handelte es sich um  verschiedenste Anwendungen, angefangen Treibern, über fertige, direkt anwendbare
    		Algorithmen, bis zu nutzernahen Steueroberflächen und sogar (Lern-)Spiele. Die Webseite des Projektes \cite{ROS:homepage} bietet hierzu
    
    Jan Wille's avatar
    Jan Wille committed
    		weitere Informationen. Außerdem bietet \gls{ROS} Integrationen mit anderen bestehenden Projekten, wie zum Beispiel \gls{OpenCV}.
    
    		Auch wenn es sich bei \gls{ROS} genaugenommen um kein vollständiges Betriebssystem handelt, stellt es für ein solches typische
    		Funktionalitäten zur Verfügung. Beispiele hierfür sind Hardware-Abstraktion, tiefgehende Geräteverwaltung, Verwaltung von Prozessen sowie
    		Informationsweitergabe zwischen diesen und die eben genannte Paketverwaltung und damit verbundene Abstraktion von generischen, allgemein
    		benötigten Funktionen. \cite{ROS:whatsROS}
    
    
    Jan Wille's avatar
    Jan Wille committed
    		\medskip
    		Für diese Arbeit ist \gls{ROS} deshalb interessant, da sich die Ergebnisse so modular an potenzielle weitere Prozesse weitergeben lassen. Dies
    		wird durch \gls{ROS}\todo{ROS's ??} Fähigkeit möglich, Einzelprozesse als sogenannte \glslink{ROS Node}{ROS Nodes} zu erstellen. Jede
    		\gls{ROS Node} kann eigene Informationen als sogenannte \glspl{Topic} veröffentlichen und andere, parallel laufende \glspl{ROS Node} können
    		diese abonnieren.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    		Sobald eine Information in einem Prozess bereit ist, verpackt dieser sie in einem der definierten Datentypen als sogenannte \gls{ROS Message}.
    		Diese wird dann veröffentlicht und an alle Abonnenten des \glspl{Topic} verschickt. Diese können dann bei erhalt der \gls{ROS Message} auf
    		diese reagieren.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    		So lassen einzelne Komponenten dieser Arbeit abgekapselt voneinander umsetzen und stellen ihre Ergebnisse auf potenziellen, später noch
    		entwickelten Prozessen zur Verfügung.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    
    	\section{Der JetBot Roboter} \label{sec: JetBot}
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    		Beim in für diese Arbeit verwendeten Roboter handelt es sich um einen JetBot v2.1 von der Firma Sparkfun. Im Folgenden werden seine
    		Komponenten und Einsatzmöglichkeiten für diese Arbeit näher beschrieben.
    
    		Der Roboter verwendet das von Nvidia produzierte Jetson Nano Entwicklerboard \cite{jetson-nano:homepage}. Hierbei handlet es sich um einen
    		Mini-Computer der speziell für Bildverarbeitung und Selbstlehrende Algorithmen entwickelt wurde. Es verfügt über einen 4-Kern ARM Prozessor
    		als CPU sowie, neben herkömmlichen Anschlüssen für PC-Peripherie, über Anschlüsse für 2 Kameras und mehre GPIO Pins. Dadurch eignet es sich
    		bereits sehr gut für eingebettet Anwendungen.
    
    		Was dieses Board für die Anwendung in der Bildverarbeitung aber besonders interessant mach, ist die integrierte, für die Größe leistungsstarke
    		GPU. Diese kann für grafikintensive Anwendungen, aber vor allem für das Arbeiten mit Neuralen Netzen genutzt werden. Da für diese Arbeit
    		explizit nicht mit Deep Learning gearbeitet wird, um diese Ressourcen für spätere Weiterentwicklung freizuhalten, ist dieses Feature aber
    		hier uninteressant.
    
    		Die Firma Sparkfun bietet für dieses Board den Bausatz \cite{jetbot:Sparkfun} an, um einen selbstfahrenden Roboter zu bauen. Dieser wird für
    		diese Arbeit verwendet. Er stattet das Board mit einer Kamera, zwei steuerbaren Motoren, einem LCD-Display und einer Batterie aus. Der fertig
    		aufgebaute Roboter ist in \autoref{fig: JetBot} zu sehen.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    		\begin{figure}
    			\includegraphics[width=.6\textwidth]{img/jetbot_sparkfun.jpg}
    			\caption{SparkFun JetBot AI Kit V2.1 \cite{jetbot:Sparkfun}}
    
    Jan Wille's avatar
    Jan Wille committed
    			\label{fig: JetBot}
    
    Jan Wille's avatar
    Jan Wille committed
    		\end{figure}
    
    
    Jan Wille's avatar
    Jan Wille committed
    		Für diese Arbeit wird der Roboter als funktionstüchtig und einsatzbereit vorausgesetzt. Die Aufbauanleitung ist aber unter
    		\cite{jetbot:Sparkfun} und die Anleitung zum Einrichten unter \cite{jetbot:docs} zu finden.
    
    		Zusätzlich wird ein fertiger Kameratreiber vorausgesetzt. Dieser wurde als \gls{ROS Node} mit dem Namen \lstinline{camera_driver} unter ROS
    		implementiert und stellt alle $0,2\,\s$ ein aktuelles Bild auf dem \gls{Topic} \lstinline{/img/raw} zur Verfügung.
    
    
    Jan Wille's avatar
    Jan Wille committed
    
    		\subsection{Performance Baseline} \label{sub: performance baseline}
    
    
    Jan Wille's avatar
    Jan Wille committed
    			Da die Leistungsfähigkeit des JetBots relativ eingeschränkt ist und eines der Ziele dieser Arbeit lautet, parallel zu anderen, zukünftigen
    			Prozessen laufen zu können, ist es wichtig möglichst Performant zu arbeiten. Daher wird ermittelt, wie sehr der JetBot vor Beginn dieser
    			Arbeit bereits ausgelastet ist.
    
    			Begonnen wird mit der Grundleistung ohne irgendwelche laufenden Prozesse unter \gls{ROS}. Das bedeutet, das nur das Betriebssystem und
    			seine Standard-Applikationen, wie zum Beispiel der SSH-Server, laufen. Dazu wird das Terminalprogramm \lstinline{jtop} verwendet, welches
    			viele Systeminformationen und Performance-Messwerte gesammelt anzeigt. Ein Screenshot ist in \autoref{fig: jtop baseline} gezeigt.
    
    Jan Wille's avatar
    Jan Wille committed
    
    
    Jan Wille's avatar
    Jan Wille committed
    			\begin{figure}
    
    Jan Wille's avatar
    Jan Wille committed
    				\includegraphics[width=.6\textwidth, trim={0 0 12px 31px}, clip]{img/jtop_baseline.png}
    
    Jan Wille's avatar
    Jan Wille committed
    				\caption{CPU Auslastung des JetBots ohne \gls{ROS}}
    
    Jan Wille's avatar
    Jan Wille committed
    				\label{fig: jtop baseline}
    
    Jan Wille's avatar
    Jan Wille committed
    			\end{figure}
    
    
    Jan Wille's avatar
    Jan Wille committed
    			Da alle in dieser Arbeit entwickelten Programme lediglich die CPU benutzen, ist dies der einzige relevante Messwerte. Trotze sind die
    			anderen Werte interessant und werden mit dokumentiert. Wie man im Screenshot sieht, ist das System in diesem Fall kaum belastet. Die
    			Auslastung ohne irgendwelche laufenden Prozesse liegt bei $\approx8.25\,\percent$.
    
    			Relevanter ist aber der Fall mit laufender Kamera, da dies die Voraussetzung für diese Arbeit ist. Wird die Kamera-\gls{ROS Node}
    			gestartet und erneut \lstinline{jtop} überprüft, ergibt sich die in \autoref{fig: jtop cam baseline} gezeigte Screenshot.
    
    Jan Wille's avatar
    Jan Wille committed
    
    			\begin{figure}
    
    Jan Wille's avatar
    Jan Wille committed
    				\includegraphics[width=.6\textwidth, trim={0 0 12px 31px}, clip]{img/jtop_camera.png}
    
    Jan Wille's avatar
    Jan Wille committed
    				\caption{CPU Auslastung mit laufender Kamera und ROS-Core}
    
    Jan Wille's avatar
    Jan Wille committed
    				\label{fig: jtop cam baseline}
    
    Jan Wille's avatar
    Jan Wille committed
    			\end{figure}
    
    
    Jan Wille's avatar
    Jan Wille committed
    			Dort ist die CPU-Auslastung deutlich höher und liegt bei $\approx38\,\percent$. Es ist allerdings zu beachten, dass dies nicht
    			ausschließlich auf die Kamera-\gls{ROS Node} zurückzuführen ist. Um überhaupt \glslink{ROS Node}{ROS Nodes} benutzen zu können, muss das
    			sogenannte ROS Core gestartet sein. Diese geschieht automatisch beim Starten der ersten Node. Es ist für den Großteil der zusätzlichen
    			Auslastung verantwortlich, sodass zusätzliche \glspl{ROS Node} die Auslastung nur geringfügig erhöhen werden.
    
    Jan Wille's avatar
    Jan Wille committed
    	% \section{Aufgebaute Anlage} \label{sec: anlgae}