diff --git a/.vscode/ltex.dictionary.de-DE.txt b/.vscode/ltex.dictionary.de-DE.txt index de79d3e97faacfae69426c6145dbf55f11702a40..e51476ca43788877c84dc0ce86342ee1fb3bec63 100644 --- a/.vscode/ltex.dictionary.de-DE.txt +++ b/.vscode/ltex.dictionary.de-DE.txt @@ -16,3 +16,24 @@ Kalibrierungs-Parameter Reprojektions-Fehler Kalibriermusters Kalibrierungsergebnisse +Node +Nodelet +Nodes +entzerrer +Mappings +JetBots +remap +toCvCopy +getOptimalNewCameraMatrix +Skalierungsparameter +Verzerrungsparameter +main +norm +projectPoints +objpoints +undistort +calibrateCamera +findChessboardCorners +cornerSubPix +jtop +Debug-Nachricht diff --git a/.vscode/ltex.hiddenFalsePositives.de-DE.txt b/.vscode/ltex.hiddenFalsePositives.de-DE.txt index 49a84f80a334f4706825f02561e944ed5c5eadf5..e483b873b6d319aa7bc9077b0270bf45a2c02897 100644 --- a/.vscode/ltex.hiddenFalsePositives.de-DE.txt +++ b/.vscode/ltex.hiddenFalsePositives.de-DE.txt @@ -3,3 +3,11 @@ {"rule":"GERMAN_SPELLER_RULE","sentence":"^(\\s?chap/\\w*,?)+$"} {"rule":"GERMAN_SPELLER_RULE","sentence":"^\\QFür den längerfristigen Einsatz wäre eine Umsetzung in \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q mit Dummies wünschenswert.\\E$"} {"rule":"DE_CASE","sentence":"^\\QAuf der Projektfläche Autonomes Fahren des Instituts für Konstruktionselemente, Mechatronik und Elektromobilität (IKME) der Hochschule Hannover ist eine große urbane Kreuzung im Maßstab 1:18 nachgebildet.\\E$"} +{"rule":"GERMAN_SPELLER_RULE","sentence":"^\\QBeim Start der \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q wird die main() Funktion aufgerufen, welche die notwendigen \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q Funktionen zur Initialisierung aufruft, das benötigt \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q abonniert und die eigenen Dummies veröffentlicht.\\E$"} +{"rule":"DE_AGREEMENT","sentence":"^\\QDiese benutzt die zuvor bestimmten Mappings, um jeden Pixel des Originalbildes an die korrekte Position im entzerrten Bild zu übertragen.\\E$"} +{"rule":"GERMAN_SPELLER_RULE","sentence":"^\\QDie dazu notwendigen Funktionen sind im \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q-Paket cv_bridge zur Verfügung gestellt.\\E$"} +{"rule":"GERMAN_SPELLER_RULE","sentence":"^\\QDie \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q callback_undistort_image() wurde während der Initialisierung an das \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q /img/raw angehängt und wird nun für jedes dort veröffentlichte Bild aufgerufen.\\E$"} +{"rule":"DE_VERBAGREEMENT","sentence":"^\\QDie \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q callback_undistort_image() wurde während der Initialisierung an das \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q /img/raw angehängt und wird nun für jedes dort veröffentlichte Bild aufgerufen.\\E$"} +{"rule":"GERMAN_SPELLER_RULE","sentence":"^\\QBeim Start der \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q wird die main() Funktion aufgerufen, welche die notwendigen \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q Funktionen zur Initialisierung aufruft, das benötigt \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q abonniert, ein \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q anhängt und die eigenen Dummies veröffentlicht.\\E$"} +{"rule":"GERMAN_SPELLER_RULE","sentence":"^\\QDie Beziehung der Dummies ist in \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q Grafisch dargestellt.\\E$"} +{"rule":"GERMAN_SPELLER_RULE","sentence":"^\\QUm die Laufzeit der \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q zu bestimmen wird die aktuelle Zeit wie sie von der Funktion ros::Time::now() zurückgegeben wird verwendet.\\E$"} diff --git a/Bachelorarbeit.pdf b/Bachelorarbeit.pdf index 720bdc2d36d04a6ef20f2d4520518f4e5c852d87..6381cdcf5a1fae5e6330a063b63e5c81d962b13b 100644 Binary files a/Bachelorarbeit.pdf and b/Bachelorarbeit.pdf differ diff --git "a/bib/Glossareintr\303\244ge.tex" "b/bib/Glossareintr\303\244ge.tex" index 375e6855c11c1da6e96fea25541a5c82ddf6a233..7b6d0f84eb1e5672c97a2f263893e315ad7cf7fd 100644 --- "a/bib/Glossareintr\303\244ge.tex" +++ "b/bib/Glossareintr\303\244ge.tex" @@ -26,6 +26,7 @@ \newglossaryentry{ROS Node}{ name={ROS Node}, + text={Node}, description={ Eine ROS Node ist ein Teilprogramm welches von \gls{ROS} verwaltet wird. Es kann Informationen als \gls{Topic} veröffentlichen und \glspl{Topic} Abonieren um die dort veröffentlichen Informationen weiter zu verarbeiten. @@ -49,6 +50,14 @@ } } +\newglossaryentry{Callback}{ + name={Callback-Funktion}, + description={ + Eine Funtkion die unter bestimmten Bedingungen automatisch aufgerufen wird. Im Bezug aus \gls{ROS} geht es meistens um Funktion die für jede + Nachricht auf einem abonierten \gls{Topic} mit deren Inhalt aufgerufen werden. + } +} + \newglossaryentry{OpenCV}{ name={OpenCV}, description={ diff --git a/chap/kalibrierung.tex b/chap/kalibrierung.tex index 47a1497def44cc1e5c3b6ea354408ba0ffc2ae43..3b9386cc86123c14df4c34130cb1e98b04e9b0d6 100644 --- a/chap/kalibrierung.tex +++ b/chap/kalibrierung.tex @@ -52,7 +52,7 @@ \begin{figure} \missingfigure{Sensor-Linse alignment} - \caption{Probleme in der ausrichtung von Sensor und Linse (nach \cite{Matlab:CameraCalibration})} + \caption{Probleme in der Ausrichtung von Sensor und Linse (nach \cite{Matlab:CameraCalibration})} \end{figure} Mathematisch wird diese Verzerrung durch den folgenden Zusammenhang beschrieben. \cite{Hanning:highPrecisionCamCalibration} @@ -92,7 +92,7 @@ Zur Durchführung der Kalibrierung wir ein Python-Script erstellt, um die den Vorgang einfach und wiederholbar zu machen. Als Vorlage für dieses dient die Anleitung zur Kamera Kalibrierung aus der \gls{OpenCV} Dokumentation \cite{OpenCV:CameraCalibration}. - Außerdem wird eine \gls{ROS Nodelet} erstellt, welches die Kalibrierung auf den Video-Stream anwendet und korrigierte Bilder publisht. + Außerdem wird eine \gls{ROS Nodelet} erstellt, welches die Kalibrierung auf den Video-Stream anwendet und korrigierte Bilder veröffentlicht. \subsection{Python Script zur Durchführung der Kalibrierung} @@ -149,7 +149,7 @@ \begin{lstlisting}[ float, style=example, - caption=Finden un Verarbeiten der Kalibrierbilder, + caption=Finden und Verarbeiten der Kalibrierbilder, language=Python ] # get all images in current directory @@ -363,7 +363,7 @@ jeden Pixel des Originalbildes an die korrekte Position im entzerrten Bild zu übertragen. Dabei wird linear interpoliert. Das Erhalten Bild wird auf die \gls{ROI} reduziert und unter dem \gls{Topic} \lstinline{\img\color} veröffentlicht. Außerdem wird ein - Schwarz-Weiß Version erzeugt und diese als \lstinline{\img\gray} veröffentlicht. + Schwarz-Weiß Version erzeugt und diese als \lstinline{\img\gray} veröffentlicht (was hier aber nicht gezeigt ist). \begin{lstlisting}[ float, @@ -391,16 +391,30 @@ \end{lstlisting} + \pagebreak \subsubsection{Performance Betrachtung} + Da diese \gls{ROS Node} eine Grundlagenfunktion darstellt und parallel zu jeder anderen Anwendungen laufen muss, ist es wichtig, dass + sie möglichst Performant ist und wenig Ressourcen des JetBots verbraucht. + + Daher wurde die mittlere CPU Auslastung und die durchschnittliche Laufzeit der \gls{Callback}, welche ja für jedes Bild durchlaufen + wird, gemessen. + \begin{figure} \includegraphics[width=.6\textwidth, trim={0 0 12px 31px}, clip]{img/jtop_camera.png} \caption{CPU Auslastung des JetBots mit laufender Kamera und entzerrer \gls{ROS Node}} \label{fig: jtop cam+undist} \end{figure} - Runtime: $\approx 6\,\ms$ + Der \lstinline{jtop} Screenshot in \autoref{fig: jtop cam+undist} zeigt die CPU Nutzung bei aktivem ROS-Core, Kameratreiber und + der neu erstellten Entzerrer \gls{ROS Node}. Die durchschnittliche CPU Auslastung liegt bei ungefähr $38,75\,\percent$, ist also nur + sehr geringfügig höher als die in \autoref{sub: performance baseline} gemessene Grundauslastung ohne die neue \gls{ROS Node}. + Um die Laufzeit der \gls{ROS Node} zu bestimmen wird die aktuelle Zeit wie sie von der Funktion \lstinline{ros::Time::now()} + zurückgegeben wird verwendet. Die aktuelle Zeit beim Start der \gls{Callback} wird abgespeichert. Nach Durchlauf der Funktion wird + erneut die aktuelle Zeit bestimmt und die Differenz in Sekunden als Debug-Nachricht ausgegeben. Die Laufzeit der \gls{ROS Node} wird + über einige Zeit gemittelt. Dabei ergibt sich eine Laufzeit von $\approx 6\,\ms$. \section{Extrinsische Kalibrierung} \label{sec: extrensic} + diff --git a/img/jtop_cameraUndistort.png b/img/jtop_cameraUndistort.png new file mode 100644 index 0000000000000000000000000000000000000000..b2eb3d7e0d7327cbb1cecb3038200b1667a92e00 Binary files /dev/null and b/img/jtop_cameraUndistort.png differ diff --git a/svg/Topics_undistorter.svg b/svg/Topics_undistorter.svg new file mode 100644 index 0000000000000000000000000000000000000000..7803bce7d841f807c7dbb0dbc634f47b967a7a83 --- /dev/null +++ b/svg/Topics_undistorter.svg @@ -0,0 +1,160 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="120.7037mm" + height="41.861954mm" + viewBox="0 0 120.7037 41.861954" + version="1.1" + id="svg5" + inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)" + sodipodi:docname="Topics_undistorter.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="mm" + showgrid="false" + inkscape:zoom="2.0000001" + inkscape:cx="198.99999" + inkscape:cy="71.499998" + inkscape:window-width="1920" + inkscape:window-height="1017" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:current-layer="layer1" + showguides="true" /> + <defs + id="defs2" /> + <g + inkscape:label="Ebene 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-28.913275,-85.538655)"> + <g + id="g5537" + transform="translate(-1.1817297,-0.41207338)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 60.177857,98.553756 v 0 7.452714 h 28.391578" + id="path4701" + sodipodi:nodetypes="cccc" /> + <path + style="fill:#000000;stroke:none;stroke-width:0.205976px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 88.569435,105.27919 2.00542,0.72728 -2.00542,0.72727 v -0.72727 z" + id="path4703" + sodipodi:nodetypes="ccccc" /> + <text + xml:space="preserve" + style="font-size:3.175px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;stroke-width:0.264583" + x="63.784973" + y="104.61102" + id="text5531"><tspan + sodipodi:role="line" + id="tspan5529" + style="font-size:3.175px;text-align:start;text-anchor:start;stroke-width:0.264583" + x="63.784973" + y="104.61102">/img/raw</tspan></text> + </g> + <g + id="g5650" + transform="translate(-1.6662807)"> + <text + xml:space="preserve" + style="font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;stroke-width:0.264583" + x="49.329571" + y="92.995155" + id="text842"><tspan + sodipodi:role="line" + id="tspan840" + style="text-align:center;text-anchor:middle;stroke-width:0.264583" + x="49.329571" + y="92.995155">/camera_driver</tspan></text> + <path + id="rect3184" + style="fill:none;fill-rule:evenodd;stroke:#0d47a1;stroke-width:0.512;stroke-linecap:round" + d="m 30.835556,85.794655 h 29.826852 7.214232 v 6.173514 6.173514 H 60.662408 30.835556 v -6.173514 z" + sodipodi:nodetypes="ccccccccc" /> + </g> + <g + id="g10176" + transform="translate(59.04212,13.214155)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 60.177857,98.553756 v 0 7.452714 h 28.391578" + id="path10168" + sodipodi:nodetypes="cccc" /> + <path + style="fill:#000000;stroke:none;stroke-width:0.205976px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 88.569435,105.27919 2.00542,0.72728 -2.00542,0.72727 v -0.72727 z" + id="path10170" + sodipodi:nodetypes="ccccc" /> + <text + xml:space="preserve" + style="font-size:3.175px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;stroke-width:0.264583" + x="63.784973" + y="104.61102" + id="text10174"><tspan + sodipodi:role="line" + id="tspan10172" + style="font-size:3.175px;text-align:start;text-anchor:start;stroke-width:0.264583" + x="63.784973" + y="104.61102">/img/gray</tspan></text> + </g> + <g + id="g5659" + transform="translate(58.557569,13.626228)"> + <text + xml:space="preserve" + style="font-size:3.88056px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;stroke-width:0.264583" + x="49.329571" + y="92.972412" + id="text5655"><tspan + sodipodi:role="line" + id="tspan5653" + style="text-align:center;text-anchor:middle;stroke-width:0.264583" + x="49.329571" + y="92.972412">/image_undistorter</tspan></text> + <path + id="path5657" + style="fill:none;fill-rule:evenodd;stroke:#0d47a1;stroke-width:0.512;stroke-linecap:round" + d="M 30.835556,85.794655 H 67.87664 v 6.173514 6.173514 H 60.662408 30.835556 v -6.173514 z" + sodipodi:nodetypes="cccccccc" /> + </g> + <g + id="g10188" + transform="translate(59.04212,20.666869)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 60.177857,98.553756 v 0 7.452714 h 28.391578" + id="path10180" + sodipodi:nodetypes="cccc" /> + <path + style="fill:#000000;stroke:none;stroke-width:0.205976px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 88.569435,105.27919 2.00542,0.72728 -2.00542,0.72727 v -0.72727 z" + id="path10182" + sodipodi:nodetypes="ccccc" /> + <text + xml:space="preserve" + style="font-size:3.175px;line-height:1.25;font-family:Arial;-inkscape-font-specification:Arial;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;stroke-width:0.264583" + x="63.784973" + y="104.61102" + id="text10186"><tspan + sodipodi:role="line" + id="tspan10184" + style="font-size:3.175px;text-align:start;text-anchor:start;stroke-width:0.264583" + x="63.784973" + y="104.61102">/img/color</tspan></text> + </g> + </g> +</svg>