julian korrekturlesen

This commit is contained in:
2024-08-14 23:27:06 +02:00
parent 37ed53ed5e
commit 1b85d32a56
23 changed files with 251 additions and 114 deletions
+6 -6
View File
@@ -2,14 +2,14 @@
\label{ssec:navigation_implementation}
Diese Klasse vereinigt die Verwaltung der Route mit den Sensorwerten wie die Positionsdaten und Ausrichtung, damit die eigentliche Navigation bereitgestellt werden kann. Außerdem werden die Anforderungen an die Genauigkeit überwacht. Die Navigation wird von den Modi zur Aufzeichnung und Abfahrt der Route benötigt.
\par
Es wurde ein \mintinline{c++}|enum Status| implementiert, welcher von einigen Funktionen der Klasse genutzt wird, um Informationen über das Ergebnis der aufgerufenen Funktion zu informieren. Es kann mitgeteilt werden, ob die Genauigkeit unzureichend ist, keine Änderungen erfolgt sind, etwas geändert und ob die etwas abgeschlossen wurde. Des Weiteren wird in derselben Header-Datei das \mintinline{c++}|struct CourseCorrection| definiert, um die Distanz und die anzuwendende Kurskorrektur zum Zielpunkt in einem Datentypen zu vereinen.
Es wurde ein \mintinline{c++}|enum Status| implementiert, welcher von einigen Funktionen der Klasse genutzt wird, um Informationen über das Ergebnis der aufgerufenen Funktion zu informieren. Es kann mitgeteilt werden, ob Änderungen vorgenommen wurden oder die aktuelle Genauigkeit mangelhaft ist. Zusätzlich besteht die Möglichkeit über den Abschluss einer Aktion zu informieren. Des Weiteren wird in derselben Header-Datei das \mintinline{c++}|struct CourseCorrection| definiert, um die Distanz und die anzuwendende Kurskorrektur zum Zielpunkt in einem Datentypen zu vereinen.
\subsection{Modus - Route aufzeichnen}
Um eine Route aufzeichnen zu können, wurde zum einen die \mintinline{c++}|class CaptureRoute| implementiert, welche von der bereits vorhanden Klasse zum manuellen Verfahren des Rovers erbt und damit auch in der Hierarchie des \texttt{DiveModi} Interfaces zu finden ist. Dadurch kann der Modus dem bestehenden System ohne weitere Änderungen hinzugefügt werden.
\par
Die Instanz der \mintinline{c++}|class Navigation| wird von dem aktuellen Modus erzeugt, dafür wird Komponente \texttt{SensorData} benötigt und eine Route. Die \texttt{SensorData} Komponente wird jedem \texttt{DriveModi} über den Konstruktor zur Verfügung gestellt. Wenn keine Route übergeben wird, erzeugt die \texttt{Navigation} eine eigene. Da eine neue Route aufgezeichnet werden soll, ist dieses Verhalten gewollt.
Die Instanz der \mintinline{c++}|class Navigation| wird von dem aktuellen Modus erzeugt. Dafür wird Komponente \texttt{SensorData} benötigt und eine Route. Die \texttt{SensorData} Komponente wird jedem \texttt{DriveModi} über den Konstruktor zur Verfügung gestellt. Wenn keine Route übergeben wird, erzeugt die \texttt{Navigation} eine eigene. Da eine neue Route aufgezeichnet werden soll, ist dieses Verhalten gewollt.
\par
Um die aktuellen Koordinaten der Route hinzuzufügen, muss der Aktions-Button auf der Fernbedienung gedrückt werden. Dadurch versucht \texttt{Navigation} die Route zu erweitern. Dies kann fehlschlagen, wenn die Genauigkeit der aktuellen Position nicht den eingestellten Anforderungen entspricht oder die aktuelle Position zu nah an der, sofern vorhanden, vorherigen ist. Der minimale Abstand zwischen zwei Punkten kann ebenfalls eingestellt werden. Auch der maximale Abstand zwischen zwei Punkten ist definiert und kann eingestellt werden. Wenn die gesamte Route aufgezeichnet wurde, kann der Modus verlassen werden. Dabei wird die Instanz von Navigationsklasse zerstört und damit auch die dort gehaltene Route. Deshalb wird diese zwischengespeichert und überschreibt gegebenenfalls die zuletzt gespeicherte Route. Ein Überschreiben erfolgt nur, wenn die Route mindestens über zwei Einträge verfügt. Die Datenhaltung der Route wird über statische Funktionen und Member in der Klasse \texttt{Route} realisiert, die zwischengespeicherte Route ist dementsprechend nicht persistent.
Um die aktuellen Koordinaten der Route hinzuzufügen, muss der Aktions-Button auf der Fernbedienung gedrückt werden. Dadurch versucht \texttt{Navigation} die Route zu erweitern. Dies kann fehlschlagen, wenn die Genauigkeit der aktuellen Position nicht den eingestellten Anforderungen entspricht oder die aktuelle Position zu nah an der, sofern vorhanden, vorherigen ist. Der minimale Abstand zwischen zwei Punkten kann ebenfalls eingestellt werden. Auch der maximale Abstand zwischen zwei Punkten ist definiert und kann eingestellt werden. Wenn die gesamte Route aufgezeichnet wurde, kann der Modus verlassen werden. Dabei wird die Instanz von Navigationsklasse zerstört und damit auch die dort gehaltene Route. Deshalb wird diese zwischengespeichert und überschreibt gegebenenfalls die zuletzt gespeicherte Route. Ein Überschreiben erfolgt nur, wenn die Route mindestens über zwei Einträge verfügt. Die Datenhaltung der Route wird über statische Funktionen und Member in der Klasse \texttt{Route} realisiert. Die zwischengespeicherte Route ist dementsprechend nicht persistent.
\par
Der Modus wird über einen Menüeintrag gestartet. Während der Modus aktiv ist, werden im Menü neben Informationen über Sensorwerte und die bisher aufgezeichnete Route auch Einstellungen zu der geforderten Genauigkeit geboten.
@@ -22,12 +22,12 @@
Auch der \texttt{Autopilot} verfügt über ein Menü, über welches dieser aufgerufen wird. Das Menü stellt Status-, Sensor-, Routen- und Navigationsinformationen zur Verfügung und ermöglicht das Einstellen der wie präzise ein Punkt angefahren werden muss, ob nach Abschluss der Route diese von vorn gestartet werden soll und ob der aktuelle Zielpunkt eingefroren werden soll, was dazu führt, dass die Route an diesem Punkt pausiert wird.
\subsubsection{Kursberechnung}
Das Ziel der Kursberechnung ist es, ein vorzeichenbehaftete Kurskorrektur in Grad zu erzeugen. Dafür muss die aktuelle Ausrichtung bekannt sein. Für diese Information stehen drei Quellen zur Verfügung.
Das Ziel der Kursberechnung ist es, eine vorzeichenbehaftete Kurskorrektur in Grad zu erzeugen. Dafür muss die aktuelle Ausrichtung bekannt sein. Für diese Information stehen drei Quellen zur Verfügung.
\begin{itemize}
\item Das Magnetometer liefert absolute Werte, welche die Ausrichtung laut Datenblatt \cite[]{QST} im optimalen Fall auf \(2^\circ\) genau beschreiben.
\item Die nächste Quelle ergibt sich aus den gefahrenen Strecken des Rovers. Dafür wird der erste Punkt nach einer Rotation und der letzte Punkt vor einer Rotation festgehalten und daraus die Ausrichtung mit der \mintinline{c++}|int16_t Point::courseTo(Point&); | Methode berechnet. Diese Variante ist bei kurzen Strecken ungenau und wird mit steigendem Abstand zwischen den Punkten genauer, wenn die Positionsbestimmung im niedrigen Zentimeterbereich erfolgt. Sollte der Rover durch den Untergrund oder anderen Fehlern keine Gerade fahren, sondern eine leichte Kurve, wird dieses Verfahren ungenauer.
\item Es bleibt noch das hinzugefügte Gyroskop, dieses kann keine absoluten Werte bestimmen. Dafür kann es präzise relative Drehwerte angeben. Es eignet sich also, um bei einem vorgegebenen Winkel die Drehung zu überwachen. Die Genauigkeit hätte zusätzlich erhöht werden können, wenn die Implementierung der 9-Achsen Sensorfusion funktional gewesen wäre.
\item Es bleibt noch das hinzugefügte Gyroskop. Dieses kann keine absoluten Werte bestimmen. Dafür kann es präzise relative Drehwerte angeben. Es eignet sich also, um bei einem vorgegebenen Winkel die Drehung zu überwachen. Die Genauigkeit hätte zusätzlich erhöht werden können, wenn die Implementierung der 9-Achsen Sensorfusion funktional gewesen wäre.
\end{itemize}
Nachdem die Datenquelle ausgewählt wurde, muss der Kurs von der aktuellen Position zum Zielpunkt berechnet werden. Von diesem Ergebnis wird die aktuelle Ausrichtung subtrahiert. Anschließend muss das Resultat auf den gewünschten Wertbereich normiert werden.
@@ -43,7 +43,7 @@
};
\end{minted}
Wenn die Navigationsanweisungen bei der Navigationsklasse abgefragt werden, muss das genannte \mintinline{c++}|struct| der Funktion als Referenz übergeben werden. Der Rückgabewert wird für das bereits beschriebene \mintinline{c++}|enum Navigation::Status| verwendet. Darüber wird mitgeteilt, ob die Navigationsanweisungen aktualisiert wurden oder, weshalb dies nicht geschah. Zum Beispiel, wenn der Rover seine Position nicht wesentlich verändert hat, die aktuelle Positionsbestimmung zu ungenau ist oder das Ziel erreicht wurde.
Wenn die Navigationsanweisungen bei der Navigationsklasse abgefragt werden, muss das genannte \mintinline{c++}|struct| der Funktion als Referenz übergeben werden. Der Rückgabewert wird für das bereits beschriebene \mintinline{c++}|enum Navigation::Status| verwendet. Darüber wird mitgeteilt, ob die Navigationsanweisungen aktualisiert wurden oder weshalb dies nicht geschah. Zum Beispiel, wenn der Rover seine Position nicht wesentlich verändert hat, die aktuelle Positionsbestimmung zu ungenau ist oder das Ziel erreicht wurde.
\subsubsection{Autopilot Aufbau}
Der Autopilot ist einem Zustandsautomaten nachempfunden. In den verschiedenen Zuständen können unterschiedliche und gleiche Funktionen aufgerufen werden. Die beiden häufigsten Funktionsaufrufe in den verschiedenen Status sollen erläutert werden: