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>