From b61695392077f2126ad68b5840a9e8bc8097fbe8 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 11 Aug 2024 14:31:02 +0200 Subject: [PATCH] - more pictures - more fixes - more literatur --- .vscode/ltex.dictionary.de-DE.txt | 57 ++++++++++++++ .vscode/ltex.hiddenFalsePositives.de-DE.txt | 6 ++ .vscode/regSnips.code-snippets | 41 +++++----- 040_3_2_grundlagen_protokolle_gnss.tex | 2 +- 050_hardwareauswahl.tex | 18 +++-- 060_2_implementierung_basisstation.tex | 83 ++++++++++++++------ 060_3_implementierung_basisstation.tex | 26 +++--- 060_4_implementierung_rover.tex | 38 ++++----- Literatur.bib | 26 ++++++ img/antenneDach.jpg | Bin 0 -> 11350 bytes img/antenneHalterung.png | Bin 0 -> 15927 bytes img/gnssHalter.png | Bin 0 -> 18255 bytes img/halbschalen.png | Bin 0 -> 26438 bytes img/pcHalter.png | Bin 0 -> 17308 bytes 14 files changed, 215 insertions(+), 82 deletions(-) create mode 100644 img/antenneDach.jpg create mode 100644 img/antenneHalterung.png create mode 100644 img/gnssHalter.png create mode 100644 img/halbschalen.png create mode 100644 img/pcHalter.png diff --git a/.vscode/ltex.dictionary.de-DE.txt b/.vscode/ltex.dictionary.de-DE.txt index 5457369..c32984c 100644 --- a/.vscode/ltex.dictionary.de-DE.txt +++ b/.vscode/ltex.dictionary.de-DE.txt @@ -104,3 +104,60 @@ PoE-fähige PoE-Extender GPS-RTK-SMA Breakout +iso-Datei +root-Benutzer +text +nameserver +xxx.xxx.xxx.xxx +interface +ifdown +ifup +bash +Sudo +root-Rechten +apt-get +sudo +rtk +rtk-Benutzer +usermod +aG +PermitRootLogin +no +service +sshd +restart +u-center +install +tty +Yaml-Block +rtk-Benutzers +make +Extenders +Packet-View +RAWX +timeout +screen-Sitzung +convbin +scp +TMODE +.service +rtk.service +Auxiliary-I +class +SensorData +void +developers +outdated +Casters +NTRIPClientStates +enum +openingConnection +pushingData +closingConnection +notAvailable +waiting +struct +Coordinates +Postionsspeicherung +bool +RouteInfo diff --git a/.vscode/ltex.hiddenFalsePositives.de-DE.txt b/.vscode/ltex.hiddenFalsePositives.de-DE.txt index e62f344..08e1bed 100644 --- a/.vscode/ltex.hiddenFalsePositives.de-DE.txt +++ b/.vscode/ltex.hiddenFalsePositives.de-DE.txt @@ -17,3 +17,9 @@ {"rule":"DE_CASE","sentence":"^\\QDie in Tabelle \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q bezeichnete MSM4 enthält die Pseudorange, Phaserange und CNR (Carrier to Noise Ratio).\\E$"} {"rule":"DE_CASE","sentence":"^\\Q\\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q Damit das Protokoll möglichst gut unterstützt wird, orientiert es sich stark an dem HTTP (Hypertext Transfer Protokoll)in der Version 1.1.\\E$"} {"rule":"EINHEIT_LEERZEICHEN","sentence":"^\\QStandard Verabschiedung Frequenzband [GHz] max. brutto Datenrate 802.11a 1999 2,4 & 5 \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q 802.11b 1999 2,4 \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q 802.11g 2003 2,4 \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q 802.11n 2009 2,4 & 5 \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q 802.11ac 2013 5 \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q 802.11ax 2019 2,4 & 5 \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q 802.11be ausstehend 2,4, 5 & 6 \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q Ausschnitt verschiedener IEEE 802.11 Standards\\E$"} +{"rule":"UPPERCASE_SENTENCE_START","sentence":"^\\Qsudo.\\E$"} +{"rule":"UPPERCASE_SENTENCE_START","sentence":"^\\Qdeaktiviert werden.\\E$"} +{"rule":"LT_RECOMMENDATION_ESSENTIAL","sentence":"^\\QDer Compiler inklusive weiterer benötigter Tools wie []text|make| ist in dem Paket []text|build-essential| enthalten.\\E$"} +{"rule":"UPPERCASE_SENTENCE_START","sentence":"^\\Qdie Antenne soll am Ende des C-Profils, welches zur Verlängerung des Pfostens dient, befestigt werden.\\E$"} +{"rule":"ALTERNATIVEN_FUER_ANGLIZISMEN","sentence":"^\\QDamit die Aufzeichnung nicht als Kind-Prozess der Remote-Sitzung läuft wird das Hilfsprogramm []bash|screen| installiert, da ansonsten ein Abbruch der Verbindung auch die Aufzeichnung frühzeitig beenden würde.\\E$"} +{"rule":"ALTERNATIVEN_FUER_ANGLIZISMEN","sentence":"^\\QDamit die Aufzeichnung nicht als Kind-Prozess der Remote-Sitzung läuft, wird das Hilfsprogramm []bash|screen| installiert, da ansonsten ein Abbruch der Verbindung auch die Aufzeichnung frühzeitig beenden würde.\\E$"} diff --git a/.vscode/regSnips.code-snippets b/.vscode/regSnips.code-snippets index 46c4097..880d0c6 100644 --- a/.vscode/regSnips.code-snippets +++ b/.vscode/regSnips.code-snippets @@ -30,25 +30,25 @@ "prefix": "image", "body": [ "\\begin{figure}[ht]", - "\t\\vspace{1cm}", - "\t\\centering", - "\t\\includegraphics[width=\\linewidth]{Bilder/$1.jpg}", - "\t\\caption{$0}", - "\t\\label{fig:$0}", + "\t\\vspace{1cm}", + "\t\\centering", + "\t\\includegraphics[width=\\linewidth]{img/$1.png}", + "\t\\caption{$0}", + "\t\\label{fig:$1}", "\\end{figure}", ], "description": "Rahmen zum Einfügen eines Bildes" }, - "Anforderung Rover": { - "prefix": "reqR", - "body": "\\textbf{$2F\\_REQ\\_Rover\\_$1:} $0", - "description": "Kürzel für eine Anforderung" - }, - "Anforderung Fernbedienung": { - "prefix": "reqF", - "body": "\\textbf{$2F\\_REQ\\_Fernbedienung\\_$1:} $0", - "description": "Kürzel für eine Anforderung" - }, + "Anforderung Rover": { + "prefix": "reqR", + "body": "\\textbf{$2F\\_REQ\\_Rover\\_$1:} $0", + "description": "Kürzel für eine Anforderung" + }, + "Anforderung Fernbedienung": { + "prefix": "reqF", + "body": "\\textbf{$2F\\_REQ\\_Fernbedienung\\_$1:} $0", + "description": "Kürzel für eine Anforderung" + }, "Test Layout": { "prefix": "test", "body": [ @@ -73,14 +73,14 @@ "\t\\centering", "\t\\caption{$1}", "\t\\begin{tabular}{|c|c|c|}", - "\t\t\\hline", + "\t\t\\hline", "\t\t\\textbf{$3} & \\textbf{$4} & \\textbf{$5} \\\\\\", - "\t\t\\hline", + "\t\t\\hline", "\t\\end{tabular}", "\t\\label{tab:$2}", - "\\end{table}" + "\\end{table}" ], - "description": "Fügt das Grundgerüst für eine Tabelle ein" + "description": "Fügt das Grundgerüst für eine Tabelle ein" }, "Tabelle Zeile": { "prefix": "z2", @@ -91,5 +91,4 @@ ], "description": "Fügt eine Zeile mit 2 Spalten hinzu" }, - -} \ No newline at end of file +} diff --git a/040_3_2_grundlagen_protokolle_gnss.tex b/040_3_2_grundlagen_protokolle_gnss.tex index db68572..d0e1787 100644 --- a/040_3_2_grundlagen_protokolle_gnss.tex +++ b/040_3_2_grundlagen_protokolle_gnss.tex @@ -79,7 +79,7 @@ \begin{figure}[ht] \centering \includegraphics[width=\linewidth]{img/satellite.jpg} - \caption{Modell eines Satelliten von dem GNSS Galileo \protect\footnote[1]{This file comes from Science Museum Collections, a website operated by Science Museum Group, a non-departmental public body in the UK. This tag does not indicate the copyright status of the attached work. A normal copyright tag is still required. See Commons:Licensing. (\url{https://commons.wikimedia.org/wiki/File:Galileo_satellite_model.jpg}), \url{https://creativecommons.org/licenses/by/4.0/legalcode}}} + \caption{Modell eines Satelliten von dem GNSS Galileo \protect\footnote[1]{Bild eines Galileo Satellit from Science Museum Collections made by Paragon Creative, lizenziert unter [CC BY 4.0] \url{https://creativecommons.org/licenses/by/4.0/legalcode}, abgerufen von \url{https://commons.wikimedia.org/wiki/File:Galileo_satellite_model.jpg}}} \label{fig:satellite} \end{figure} diff --git a/050_hardwareauswahl.tex b/050_hardwareauswahl.tex index f78b5c1..66394f0 100644 --- a/050_hardwareauswahl.tex +++ b/050_hardwareauswahl.tex @@ -36,27 +36,35 @@ Da der Rover bereits mit einem GNSS-Modul und einer passenden Antenne ausgestattet ist, muss lediglich für die Basisstation weitere Hardware angeschafft werden. Dabei ist zu beachten, dass nicht die gleiche Hardware wie die des Rovers verwendet werden kann, weil GNSS-Modul ZED-F9K lediglich Korrekturdaten für die eigene Positionsbestimmung verarbeiten und keine Korrekturdaten für andere GNSS-Module erzeugen kann. \subsubsection{GNSS-Modul} - Für die Basisstation wurde ein Modul aus der gleichen Produktfamilie gewählt. Die Bezeichnungen unterscheiden sich nur durch das letzte Zeichen. Der U-Blox Chip ZED-F9P \cite[]{zed-f9p} kann die benötigten Korrekturdaten erzeugen. Für die Integration in das Gesamtsystem wurde das von SparkFun !!!Data sheet!!! kreierte Entwicklungsboard mit dem ZED-F9P ausgewählt. Dieses verfügt, ähnlich wie das GNSS-Board des Rovers, über einen USB-C-Anschluss, Stiftleisten unter anderem mit I2C, SPI und zwei Serial Ports sowie einer SMA-Buchse für den Anschluss der GNSS-Antenne. Außerdem zeigen auf dem Board angebrachte LEDs an, ob Positionsbestimmung zurzeit möglich ist und ob RTK verwendet wird. Der Betriebstemperaturbereich des ZED-F9P reicht von \(-40^\circ C\) bis \(85^\circ C\). + Für die Basisstation wurde ein Modul aus der gleichen Produktfamilie gewählt. Die Bezeichnungen unterscheiden sich nur durch das letzte Zeichen. Der U-Blox Chip ZED-F9P \cite[]{zed-f9p} kann die benötigten Korrekturdaten erzeugen. Für die Integration in das Gesamtsystem wurde das von SparkFun \cite[]{sparkZedf9p} kreierte Entwicklungsboard mit dem ZED-F9P ausgewählt. Dieses verfügt, ähnlich wie das GNSS-Board des Rovers, über einen USB-C-Anschluss, Stiftleisten unter anderem mit I2C, SPI und zwei Serial Ports sowie einer SMA-Buchse für den Anschluss der GNSS-Antenne. Außerdem zeigen auf dem Board angebrachte LEDs an, ob Positionsbestimmung zurzeit möglich ist und ob RTK verwendet wird. Der Betriebstemperaturbereich des ZED-F9P reicht von \(-40^\circ C\) bis \(85^\circ C\). \par Ausschlaggebenden für die Auswahl dieses, in Abbildung \ref{fig:zedf9p} gezeigten, Moduls war die einfache Verbindung des Moduls über USB-C mit dem Computer, den passenden Betriebstemperaturbereich und die bereits bekannte Software der Produktfamilie zur Konfiguration des Moduls. \begin{figure}[ht] \centering - \includegraphics[width=\linewidth]{img/zed-f9p.jpg} + \includegraphics[width=0.5\linewidth]{img/zed-f9p.jpg} \caption{Das verbaute GNSS Modul von SparkFun mit dem ZED-F9P \protect\footnote[2]{GPS-RTK-SMA Breakout von Sparkfun, lizenziert unter [CC BY 2.0] \url{https://creativecommons.org/licenses/by/2.0/legalcode.en}, abgerufen von \url{https://www.sparkfun.com/products/16481}}} \label{fig:zedf9p} \end{figure} \subsubsection{GNSS-Antenne} - Bei der gewählten Antenne handelt es sich um das Modell JCA228F von der Firma Jinchang Electron. !!!Data cheet!!! Diese wird als GNSS Multi-Band Surveying Antenne vermarktet und eignet sich besonders für den stationären Einsatz als Referenzstation. Die Antenne erfüllt die Anforderungen der IP 67 Schutzklasse und ist zusätzlich mit dem Betriebstemperaturbereich von \(-40^\circ C\) bis \(85^\circ C\) für ganzjährigen ungeschützten Einsatz im Freien geeignet. Da es sich um eine aktive Antenne handelt, wird diese über das GNSS-Modul mit Strom versorgt, dabei sind Gleichspannungen von \(3V - 12V\) zulässig. Die Stromaufnahme wird mit kleiner gleich \(50mA\) angegeben. Es werden alle Frequenzbänder der aktuellen GNSS unterstützt. Die Montage erfolgt, in dem die Antenne auf eine \(\frac{5}{8}\) Zoll Schraube mit 11 Gewindegängen pro Zoll nach dem amerikanischen UNC (5/8''-11UNC) Standard aufgeschraubt wird. An der Antenne befindet sich eine TNC-Buchse zur Verbindung mit dem GNSS-Modul, da sich die Anschlüsse unterscheiden braucht es ein Adapterkabel, welches mit einem TNC-Stecker und einem SMA-Stecker endet. Das erworbene Antennenkabel weist eine Länge von \(2,5m\) auf. !!!Bild der Antenne?!!! + Bei der gewählten Antenne, welche in Abbildung \ref{fig:antenneDach} zu sehen ist, handelt es sich um das Modell JCA228F von der Firma Jinchang Electron \cite[]{antenneDach}. Diese wird als GNSS Multi-Band Surveying Antenne vermarktet und eignet sich besonders für den stationären Einsatz als Referenzstation. Die Antenne erfüllt die Anforderungen der IP 67 Schutzklasse und ist zusätzlich mit dem Betriebstemperaturbereich von \(-40^\circ C\) bis \(85^\circ C\) für ganzjährigen ungeschützten Einsatz im Freien geeignet. Da es sich um eine aktive Antenne handelt, wird diese über das GNSS-Modul mit Strom versorgt, dabei sind Gleichspannungen von \(3V - 12V\) zulässig. Die Stromaufnahme wird mit kleiner gleich \(50mA\) angegeben. Es werden alle Frequenzbänder der aktuellen GNSS unterstützt. Die Montage erfolgt, in dem die Antenne auf eine \(\frac{5}{8}\) Zoll Schraube mit 11 Gewindegängen pro Zoll nach dem amerikanischen UNC (5/8''-11UNC) Standard aufgeschraubt wird. An der Antenne befindet sich eine TNC-Buchse zur Verbindung mit dem GNSS-Modul, da sich die Anschlüsse unterscheiden braucht es ein Adapterkabel, welches mit einem TNC-Stecker und einem SMA-Stecker endet. Das erworbene Antennenkabel weist eine Länge von \(2,5m\) auf. + + \begin{figure}[ht] + \vspace{1cm} + \centering + \includegraphics[width=0.5\linewidth]{img/antenneDach.jpg} + \caption{Seitliche Ansicht auf die Antenne} + \label{fig:antenneDach} + \end{figure} \section{Installationskasten} - Für Installation der nicht wasserfesten Komponenten wird ein Installationskasten benötigt, um diese zu schützen. Für ein einheitlicheres Bild wurde ein Kasten von derselben Firma, wie der vorhandene Gewählt. Allerdings wurde für günstigere Temperaturen in dem Kasten die helle Ausführung gewählt. Bei dem Installationskasten handelt es sich um den KF 5000 H von der Firma Hensel. Laut des Datenblatts \cite{kasten} verfügt dieser über die Schutzklassen IP66, TP67 und IP69. Unter dem Punkt Umgebungsbedingungen wird als Einsatzgebiet die ungeschützte Installation genannt, dabei ist die Umgebungstemperatur von \(-25^\circ C\) bis \(70^\circ C\) angegeben. Als Ausnahme wird die maximale Umgebungstemperatur über 24 Stunden mit \(55^\circ C\) angegeben. Durch diese Eigenschaften ist der Kasten für die Dachinstallation geeignet. + Für Installation der nicht wasserfesten Komponenten wird ein Installationskasten benötigt, um diese zu schützen. Für ein einheitlicheres Bild wurde ein Kasten von derselben Firma, wie der vorhandene Gewählt. Allerdings wurde für günstigere Temperaturen in dem Kasten die helle Ausführung gewählt. Bei dem Installationskasten handelt es sich um den \texttt{KF 5000 H} von der Firma Hensel. Laut des Datenblatts \cite{kasten} verfügt dieser über die Schutzklassen IP66, TP67 und IP69. Unter dem Punkt Umgebungsbedingungen wird als Einsatzgebiet die ungeschützte Installation genannt, dabei ist die Umgebungstemperatur von \(-25^\circ C\) bis \(70^\circ C\) angegeben. Als Ausnahme wird die maximale Umgebungstemperatur über 24 Stunden mit \(55^\circ C\) angegeben. Durch diese Eigenschaften ist der Kasten für die Dachinstallation geeignet. \par Die Innenmaße bieten bei einer hochkantigen Ausrichtung einen Installationsraum von 320x215x106mm (hxbxt). Somit lassen sich der Computer, der PoE-Splitter und das GNSS-Modul nebeneinander platzieren. Die Montage soll auf einer Hutschiene stattfinden, die dem Kasten noch hinzugefügt wird. Außerdem müssen für den Computer und das GNSS-Modul entsprechende Halterungen geschaffen werden. \section{Gyroskop} \label{sec:gyroskop} - Die Anforderung ein Gyroskop zu integrieren soll durch das GY-521 Modul !!!data sheet!!! von AZ-Delivery erfüllt werden. Auf dem Modul ist ein Chip mit der Bezeichnung MPU-6050 aufgelötet. Dieser vereinigt einen 3-Achsen Gyroskop und eine 3-Achsen Beschleunigungssensor. Das Gyroskop kann auf den Bereich der erwarteten Winkelgeschwindigkeiten eingestellt werden, diese reichen von \(\pm 250^\circ/sec\) bis \(\pm 2000^\circ/sec\). Der Beschleunigungssensor ist ebenfalls anpassbar, von \(\pm 2g\) bis \(\pm 16g\). Die analogen Werte der Sensoren werden mit 16-Bit ADC digitalisiert. Des Weiteren verfügt der MPU-6050 über einen Digital Motion Processor (DMP), dieser kann zu den vom Sensor erzeugten 6-Achsen zusätzlich die 3-Achsen von einem extern über I2C angeschlossenen Magnetometer verrechnen. Die Daten, welche durch diese Sensorfusion entstehen, erhöhen die Genauigkeit, ergeben ein Zugewinn an Information bezüglich der Ausrichtung des Chips und erlauben es dem Nutzer diese zentral abzurufen. + Die Anforderung ein Gyroskop zu integrieren soll durch das GY-521 Modul \cite[]{gyroskop} von AZ-Delivery erfüllt werden. Auf dem Modul ist ein Chip mit der Bezeichnung MPU-6050 aufgelötet. Dieser vereinigt einen 3-Achsen Gyroskop und eine 3-Achsen Beschleunigungssensor. Das Gyroskop kann auf den Bereich der erwarteten Winkelgeschwindigkeiten eingestellt werden, diese reichen von \(\pm 250^\circ/sec\) bis \(\pm 2000^\circ/sec\). Der Beschleunigungssensor ist ebenfalls anpassbar, von \(\pm 2g\) bis \(\pm 16g\). Die analogen Werte der Sensoren werden mit 16-Bit ADC digitalisiert. Des Weiteren verfügt der MPU-6050 über einen Digital Motion Processor (DMP), dieser kann zu den vom Sensor erzeugten 6-Achsen zusätzlich die 3-Achsen von einem extern über I2C angeschlossenen Magnetometer verrechnen. Die Daten, welche durch diese Sensorfusion entstehen, erhöhen die Genauigkeit, ergeben ein Zugewinn an Information bezüglich der Ausrichtung des Chips und erlauben es dem Nutzer diese zentral abzurufen. \par Die Kommunikation findet über I2C statt, dies ermöglicht die Einbindung des Sensors in das bestehende System. Durch das Board von AZ-Delivery ist eine Versorgung mit der gegebenen Spannung von \(5V\) möglich. Der bereits verbaute Kompass könnte vom ESP32 getrennt und an das GY-521 Modul angeschlossen werden. diff --git a/060_2_implementierung_basisstation.tex b/060_2_implementierung_basisstation.tex index ef2954f..d44d801 100644 --- a/060_2_implementierung_basisstation.tex +++ b/060_2_implementierung_basisstation.tex @@ -1,25 +1,25 @@ \section{Basisstation} \label{sec:Basisstation} - Für die Errichtung der Referenzstation stellte sich zunächst die Frage, wie das System aufgebaut werden soll. Dabei sind die bereits beschriebenen Anforderungen im Abschnitt \ref{sec:referenzstation_req} entstanden. Um das System den Anforderungen entsprechend erstellen zu können wurde die Hardwareauswahl in dem vorangegangenen Kapitel \ref{cha:Hardwareauswahl} bereits beschrieben. Deshalb wird in diesem Abschnitt die noch fehlende Installation und Konfiguration der Komponenten thematisiert. Darüber hinaus werden für die vollständige Montage Formteile benötigt, welche mit einem 3D-Drucker produziert werden sollen. + Für die Errichtung der Referenzstation stellte sich zunächst die Frage, wie das System aufgebaut werden soll. Dabei sind die bereits beschriebenen Anforderungen im Abschnitt \ref{sec:referenzstation_req} entstanden. Um das System den Anforderungen entsprechend erstellen zu können, wurde die Hardwareauswahl in dem vorangegangenen Kapitel \ref{cha:Hardwareauswahl} bereits beschrieben. Deshalb wird in diesem Abschnitt, die noch fehlende Installation und Konfiguration der Komponenten thematisiert. Weiterhin werden für die vollständige Montage Formteile benötigt, welche mit einem 3D-Drucker produziert werden sollen. \subsection{Installation Betriebssystem} Im ersten Schritt muss der Server betriebsbereit gemacht werden, dafür muss ein Betriebssystem installiert werden. Dazu soll das in Unterabschnitt \ref{ssec:debian} beschriebene Debian genutzt werden. \par Da der Server über übliche Anschlüsse für einen Monitor verfügt, kann die Installation über den Installationsassistenten mittels Tastatur und Bildschirm durchgeführt werden. Dafür wurde die iso-Datei von Debian so auf einen USB-Stick geschrieben, dass dieser Bootfähig ist. Während der Installation wurden die meisten Einstellungen bei ihrem Standard belassen. \par - Nach der erfolgreichen Installation des Betriebssystems wurde sich zunächst als root Benutzer angemeldet, um die ersten grundlegenden Einstellungen zu tätigen. + Nach der erfolgreichen Installation des Betriebssystems wurde sich zunächst als root-Benutzer angemeldet, um die ersten grundlegenden Einstellungen zu tätigen. \subsubsection{Netzwerk} Nach der Installation bezieht der Server seine Netzwerkkonfiguration über einen DHCP-Server. Für eine feste Installation eines Servers ist die manuelle Konfiguration der Netzwerkschnittstelle dringend empfohlen, damit die IP-Adresse zu jeder Zeit persistent und bekannt ist. Dafür müssen zwei Dateien editiert werden und der Name des Netzwerkinterfaces muss bekannt sein. Die erste Datei mit dem Pfad \url{/etc/network/interfaces} enthält die Konfigurationen aller auf dem System verfügbaren Interfaces. Da der Server lediglich über ein Interface verfügt, kann in der Datei auch der Name des Interfaces abgelesen werden. !!!Im folgenden Dings ist die Conf:!!! - Die zweite Datei ist unter dem Pfad \url{/etc/resolv.conf} zu finden. In diese Datei müssen die zu benutzen DNS-Server eingetragen werden. In jeder Zeile kann ein Eintrag getätigt werden. In diesem Fall nach dem Muster \flqq nameserver xxx.xxx.xxx.xxx\frqq. In dem Netz der FH-Dortmund lauten die IP-Adressen der Nameserver \mintinline{text}|172.22.1.10| und \mintinline{text}|172.22.1.20| + Die zweite Datei ist unter dem Pfad \url{/etc/resolv.conf} zu finden und definiert die zu benutzenden DNS-Server. Dabei wird in jeder Zeile nach dem folgenden Muster ein Nameserver angegeben: \flqq nameserver xxx.xxx.xxx.xxx\frqq. In dem Netz der FH-Dortmund lauten die IP-Adressen der Nameserver \mintinline{text}|172.22.1.10| und \mintinline{text}|172.22.1.20|. \par - Die Netzwerkkonfiguration wurde durch einen Mitarbeiter im Hardwarelabor der FH-Dortmund festgelegt und im System eingepflegt. Wenn die Bearbeitung der Datei abgeschlossen ist, muss das Netzwerkinterface neu gestartet werden. Dies kann mit dem Befehl !!!command!!! oder einem Neustart des Computers erfolgen. + Die Netzwerkkonfiguration wurde durch einen Mitarbeiter im Hardwarelabor der FH-Dortmund festgelegt und im System eingepflegt. Wenn die Bearbeitung der Datei abgeschlossen ist, muss das Netzwerkinterface neu gestartet werden. Dies kann mit dem Befehl \mintinline{bash}|ifdown | gefolgt von \mintinline{bash}|ifup | oder einem Neustart des Computers erfolgen. - \subsubsection{sudo} - Sudo ist ein Programm aus den Paketquellen von Debian, dass es anderen Nutzern erlauben kann Befehle mit root-Rechten auszuführen. Diese Vorgehensweise empfiehlt sich, damit nicht alle Befehle automatisch mit root-Rechten ausgeführt werden und das vollständige System über ein normales Benutzerkonto gesteuert werden kann. Das Paket kann mit dem Paketverwaltungstool \mintinline{bash}|apt-get| installiert werden. Davor sollten die Paketquellen jedoch aktualisiert und möglich Paketupdates installiert werden. Um die Aktualisierung und die Installation auszuführen müssen diese Befehle ausgeführt werden: + \subsubsection{Sudo} + Sudo ist ein Programm aus den Paketquellen von Debian, dass es anderen Nutzern erlauben kann, Befehle mit root-Rechten auszuführen. Diese Vorgehensweise empfiehlt sich, damit nicht alle Befehle automatisch mit root-Rechten ausgeführt und das vollständige System über ein normales Benutzerkonto gesteuert werden kann. Das Paket kann mit dem Paketverwaltungstool \mintinline{bash}|apt-get| installiert werden. Davor sollten die Paketquellen jedoch aktualisiert und möglich Paketupdates installiert werden. Um die Aktualisierung und die Installation auszuführen, müssen diese Befehle ausgeführt werden: \begin{minted}[linenos, gobble=5]{bash} apt-get update @@ -27,34 +27,34 @@ apt-get install sudo \end{minted} - Im Anschluss müssen die Benutzer welche neben dem root-Benutzer ebenfalls Befehle mit erweiterten Rechten ausführen können sollen in die Benutzergruppe \mintinline{text}|sudo???| hinzugefügt werden. Für den bei der Installation automatisch erstellen Benutzer \mintinline{text}|rtk| sieht der Befehl wie folgt aus: \mintinline{text}|usermod -aG sudo rtk???|. - Danach wird der root-Account abgemeldet und nur noch der rtk-Benutzer verwendet. Befehle können nun mit einem vorangestellten \mintinline{bash}|sudo| als Administrator ausgeführt werden. + Im Anschluss müssen die Benutzer, welche neben dem root-Benutzer ebenfalls Befehle mit erweiterten Rechten ausführen können sollen, in die Benutzergruppe \mintinline{text}|sudo| hinzugefügt werden. Für den bei der Installation automatisch erstellen Benutzer \mintinline{text}|rtk| sieht der Befehl wie folgt aus: \mintinline{bash}|usermod -aG sudo rtk|. + Danach wird der root-Benutzer abgemeldet und nur noch der rtk-Benutzer verwendet. Befehle können nun mit einem vorangestellten \mintinline{bash}|sudo| als Administrator ausgeführt werden. - \subsubsection{ssh-server} - Der SSH-Server wird ebenfalls über die Paketquellen installiert, der Paketname entspricht der Überschrift dieses Abschnitts. Mit einem SSH-Server wird die Verwaltung des System über das Netzwerk ermöglicht und damit der Zugriff auf das Terminal erheblich zu vereinfacht. Der Server kann in mit den Standardeinstellungen betrieben werden, für eine erhöhte Sicherheit wird jedoch der Login mit dem root-Account verboten. Dafür wird in der Konfigurationsdatei (\url{/etc/ssh/sshd_config}) die Zeile \mintinline{text}|PermitRootLogin no| ergänzt und der SSH-Server anschließend mit \mintinline{bash}|sudo service sshd restart| neugestartet. + \subsubsection{SSH-Server} + Der SSH-Server wird ebenfalls über die Paketquellen installiert, der Paketname entspricht der Überschrift dieses Abschnitts. Mit einem SSH-Server wird die Verwaltung des Systems über das Netzwerk ermöglicht und damit der Zugriff auf das Terminal erheblich zu vereinfacht. Der Server kann in mit den Standardeinstellungen betrieben werden, für eine erhöhte Sicherheit wird jedoch der Log-in mit dem root-Benutzer verboten. Dafür wird in der Konfigurationsdatei (\url{/etc/ssh/sshd_config}) die Zeile \mintinline{text}|PermitRootLogin no| ergänzt und der SSH-Server anschließend mit \mintinline{bash}|sudo service sshd restart| neu gestartet. \par - Ab diesem Zeitpunkt der Installation kann der Server headless betrieben werden. Es ist nur noch eine die Netzwerkverbindung und die Stromversorgung notwendig. Zum einloggen wird ein SSH-Client, die Zugangsdaten und die Adresse des Servers benötigt. + Ab diesem Zeitpunkt der Installation kann der Server ohne Monitor und Tastatur betrieben werden. Es ist nur noch eine die Netzwerkverbindung und die Stromversorgung notwendig. Für den Log-in wird ein SSH-Client, die Zugangsdaten und die Adresse des Servers benötigt. \subsection{ser2net vorbereiten} - Die Konfiguration der GNSS-Module von U-Blox lässt sich am einfachsten mit dem u-center (siehe Abschnitt \ref{sssec:u-blox}) erledigen. Da das u-center ausschließlich unter Windows verfügbar und ein Programm mit grafischer Oberfläche ist, kann es nicht auf dem Server ausgeführt werden. Allerdings ist es nicht praktikabel das GNSS-Modul aus dem System der Referenzstation zu entfernen, um es an einem anderen Computer zu konfigurieren. Deshalb bietet sich die Installation von ser2net an, damit die Verbindung zwischen dem u-center und dem GNSS-Modul über eine Netzwerkverbindung aufgebaut werden kann. + Die Konfiguration der GNSS-Module von U-Blox lässt sich am einfachsten mit dem u-center (siehe Abschnitt \ref{sssec:u-blox}) erledigen. Da das u-center ausschließlich unter Windows verfügbar und ein Programm mit grafischer Oberfläche ist, kann es nicht auf dem Server ausgeführt werden. Allerdings ist es nicht praktikabel, das GNSS-Modul aus dem System der Referenzstation zu entfernen, um es an einem anderen Computer zu konfigurieren. Deshalb bietet sich die Installation von ser2net an, damit die Verbindung zwischen dem u-center und dem GNSS-Modul über eine Netzwerkverbindung aufgebaut werden kann. \par - Die Installation erfolgt über die Paketquellen mit \mintinline{bash}|sudo apt-get install ser2net|. Das Programm wird dem Betriebssystem als Service hinzugefügt und läuft damit ständig. Da die Verbindung nur zur Verfügung stehen soll wenn diese auch benötigt wird, kann der automatische Start des Service beim Bootvorgang mit dem Befehl + Die Installation erfolgt über die Paketquellen mit \mintinline{bash}|sudo apt-get install ser2net|. Das Programm wird dem Betriebssystem als Service hinzugefügt und läuft damit ständig. Da die Verbindung nur zur Verfügung stehen soll, wenn diese auch benötigt wird, kann der automatische Start des Service beim Bootvorgang mit dem Befehl \begin{minted}[linenos, gobble=4]{bash} sudo systemctl disable ser2net \end{minted} - deaktiviert werden. Die nächsten beiden Befehle sind zum stoppen und starten des Services. Nach der Deaktivierung läuft der Service weiter bis der Computer neugestartet wird oder der Service mit dem ersten Befehl gestoppt wird. + deaktiviert werden. Die nächsten beiden Befehle sind zum Stoppen und starten des Services. Nach der Deaktivierung läuft der Service weiter, bis der Computer neu gestartet oder der Service mit dem ersten Befehl gestoppt wird. \begin{minted}[linenos, gobble=4]{bash} sudo systemctl stop ser2net sudo systemctl start ser2net \end{minted} - Um ein serielles Interface über ser2net im Netzwerk freizugeben muss dieses in der Konfigurationsdatei (\url{/etc/ser2net.yaml}) deklariert werden. Dafür muss der Gerätepfad des GNSS-Moduls bekannt sein. Dieser kann herausgefunden werden indem das Modul an einen USB-Port angesteckt wird und in dem Verzeichnis \url{/dev} nach einer neuen Datei geschaut wird, welche mit \mintinline{text}|tty| beginnt. In der Konfigurationsdatei wird der folgende Yaml-Block ergänzt: + Um ein serielles Interface über ser2net im Netzwerk freizugeben, muss dieses in der Konfigurationsdatei (\url{/etc/ser2net.yaml}) deklariert werden. Dafür muss der Gerätepfad des GNSS-Moduls bekannt sein. Dieser kann herausgefunden werden, indem das Modul an einen USB-Port angesteckt und in dem Verzeichnis \url{/dev} nach einer neuen Datei geschaut wird, welche mit \mintinline{text}|tty| beginnt. In der Konfigurationsdatei wird der folgende Yaml-Block ergänzt: % \begin{minted}[linenos, gobble=4, tabsize=4, showtabs=no]{yaml} - % connection: &con0096 + % connection: con0096 % accepter: tcp,2000 % enable: on !!!mach mal richtig hier!!! % options: @@ -64,10 +64,10 @@ % connector: serialdev,/dev/ttyS0,9600n81,local % \end{minted} - Sollte der Service zum Zeitpunkt der Konfiguration aktiv gewesen sein, muss es mit dem genannten Befehl gestoppt werden und kann anschließend je nach Bedarf aktiviert werden. Sobald der Service aus Abschnitt \ref{ssec:pushService} aktiv ist, muss dieser gestoppt werden bevor eine Verbindung zu ser2net aufgebaut wird. Wenn dies nicht geschieht, ist es nicht vorhersehbar an welchen Service die ankommenden Daten des GNSS-Moduls geleitet werden. + Sollte der Service zum Zeitpunkt der Konfiguration aktiv gewesen sein, muss es mit dem genannten Befehl gestoppt und kann anschließend je nach Bedarf aktiviert werden. Sobald der Service aus Abschnitt \ref{ssec:pushService} aktiv ist, muss dieser gestoppt werden, bevor eine Verbindung zu ser2net aufgebaut wird. Wenn dies nicht geschieht, ist es nicht vorhersehbar, an welchen Service die ankommenden Daten des GNSS-Moduls geleitet werden. \subsection{RTKLib installieren} - Die in den Grundlagen unter \ref{sssec:rtklib} beschriebene RTKLib ist nicht über die Paketquellen verfügbar und muss deshalb auf dem Server kompiliert werden. Um das Projekt von GitHub clonen zu können muss Git installiert werden. Außerdem wird als Abhängigkeit die Bibliothek \mintinline[]{text}|libpng-dev| benötigt. Der Compiler inklusive weiterer benötigter Tools wie \mintinline[]{text}|make| ist in dem Paket \mintinline[]{text}|build-essential| enthalten. Für die vollständige Installation wird die folgende Befehlsfolge in dem Home-Verzeichnis des rtk-Benutzers benötigt: + Die in den Grundlagen unter \ref{sssec:rtklib} beschriebene RTKLib ist nicht über die Paketquellen verfügbar und muss deshalb auf dem Server kompiliert werden. Um das Projekt von GitHub klonen zu können, muss Git installiert werden. Außerdem wird als Abhängigkeit die Bibliothek \mintinline[]{text}|libpng-dev| benötigt. Der Compiler inklusive weiterer benötigter Tools wie \mintinline[]{text}|make| ist in dem Paket \mintinline[]{text}|build-essential| enthalten. Für die vollständige Installation wird die folgende Befehlsfolge in dem Home-Verzeichnis des rtk-Benutzers benötigt: \begin{minted}[linenos, gobble=4]{bash} sudo apt-get update @@ -85,14 +85,51 @@ Die Installation auf dem Dach wurde in ihren groben Zügen bei der in der Einleitung des Kapitels \ref{cha:Hardwareauswahl} beschriebenen Begehung des Installationsortes geplant. Von diesem Plan wurde die in dem Kapitel folgende Hardwareauswahl abgeleitet. Im ersten Schritt sollen nun alle Vorbereitungen getroffen werden, welche von dem Installationsort unabhängig sind. Im Anschluss wird die eigentliche Montage auf dem Dach vorgenommen. \subsubsection{Befestigungen} - Die anzubringenden Komponenten benötigen Halterungen und Befestigungspunkte. Diese werden im folgenden Beschrieben: + Die anzubringenden Komponenten benötigen Halterungen und Befestigungspunkte. Diese werden im Folgenden beschrieben: \begin{itemize} - \item die \textbf{Antenne} soll am Ende des C-Profils welches zur Verlängerung des Pfostens dient befestigt werden. Dafür wurde ein Formteil konstruiert (siehe Abbildung !!!). Im wesentlichen besteht diesel Teil aus einem Quader, welcher in das C-Profil eingeführt werden kann. Der Quader verfügt über eine Bohrung, damit dieser mittels einer Schrauben-Mutter-Kombination am C-Profil fixiert werden kann. Am oberen Ende befindet sich ein Gewinde auf welches die Antenne aufgeschraubt werden kann, + \item die \textbf{Antenne} soll am Ende des C-Profils, welches zur Verlängerung des Pfostens dient, befestigt werden. Dafür wurde ein Formteil konstruiert (siehe Abbildung \ref{fig:antenneHalterung}). Im Wesentlichen besteht dieses Teil aus einem Quader, welcher in das C-Profil eingeführt werden kann. Der Quader verfügt über eine Bohrung, damit dieser mittels einer Schrauben-Mutter-Kombination am C-Profil fixiert werden kann. Am oberen Ende befindet sich ein Gewinde, auf welches die Antenne aufgeschraubt werden kann, - \item der \textbf{Installationskasten} soll unterhalb des vorhandenen Kastens am Pfosten angebracht werden. Als Maße stehen der gemessene Durchmesser des Pfostens (\(90mm\)) und der aus dem Datenblatt !!!cite!!! verfügbare Lochabstand der Befestigungslöcher des Kastens. Mit diesen Werten konnte eine Halterung konstruiert werden, welche aus zwei Halbschalen besteht. Ein Halbschale verfügt über abstehende Arme mit vorhandenen Löchern für M!!!-Schrauben, an denen der Kasten befestigt werden kann. Die M!!!-Schrauben können von hinten mit der passenden Mutter gesichert werden. In die gleich Halbschale können passgenau M8-Muttern eingelegt werden. Die andere Halbschale verfügt über die Löcher und Vertiefungen um diese mit zwei M8-Schrauben an der anderen Halbschale befestigen zu können. Die Halterungen wurde für den oberen und den unteren Teil des Kastens jeweils einmal ausgedruckt. Eine Halterung ist in Abbildung !!!ref!!! zu sehen, + \item der \textbf{Installationskasten} soll unterhalb des vorhandenen Kastens am Pfosten angebracht werden. Als Maße stehen der gemessene Durchmesser des Pfostens (\(90mm\)) und der aus dem Datenblatt \cite[]{kasten} verfügbare Lochabstand der Befestigungslöcher des Kastens. Mit diesen Werten konnte eine Halterung konstruiert werden, welche aus zwei Halbschalen besteht. Eine Halbschale verfügt über abstehende Arme mit vorhandenen Löchern für M4-Schrauben, an denen der Kasten befestigt werden kann. Die M4-Schrauben können von hinten mit der passenden Mutter gesichert werden. In die gleiche Halbschale können passgenau M8-Muttern eingelegt werden. Die andere Halbschale verfügt über die Löcher und Vertiefungen, um diese mit zwei M8-Schrauben an der anderen Halbschale befestigen zu können. Die Halterungen wurde für den oberen und den unteren Teil des Kastens jeweils einmal ausgedruckt. Eine Halterung ist in Abbildung \ref{fig:halbschalen} zu sehen, - \item für den \textbf{Server} wird eine Halterung benötigt, damit dieser an der Hutschiene im Installationskasten befestigt werden kann. Es bot sich an die mitgelieferten Winkel und Schrauben von dem Computer in die Konstruktion mit einzubeziehen. Die Winkel sind für die Wandmontage gedacht und werden nach Herstellervorgaben auf der Rückseite des Computers befestigt, so dass nach der Montage der Winkel Befestigungspunkte neben Computer benutzbar sind. Die Winkel haben einen Versatz, der den Computer theoretisch etwas von der Wand hervorstehen lassen würde. Um die Befestigung an der Hutschiene zu ermöglichen, wurden die Winkel um \(180^\circ\) verdreht. Dadurch entsteht auf der Rückseite der Computer ein breites Trapez mit geringer Höhe. Diese Form wurde als Grundplatte für den Adapter genutzt. Auf dieser Grundplatte befinden sich neben der Aufnahme für die Hutschiene herausstehende Kegel, welche genutzt werden um den Adapter mittels der am Winkel vorgesehenen Löcher zur Wandmontage zu fixieren, !!!Bild?!!! + \item für den \textbf{Server} wird eine Halterung benötigt, damit dieser an der Hutschiene im Installationskasten befestigt werden kann. Es bot sich an, die mitgelieferten Winkel und Schrauben von dem Computer in die Konstruktion einzubeziehen. Die Winkel sind für die Wandmontage gedacht und werden nach Herstellervorgaben auf der Rückseite des Computers befestigt, sodass nach der Montage der Winkel Befestigungspunkte neben Computer benutzbar sind. Die Winkel haben einen Versatz, der den Computer theoretisch etwas von der Wand hervorstehen lassen würde. Um die Befestigung an der Hutschiene zu ermöglichen, wurden die Winkel um \(180^\circ\) verdreht. Dadurch entsteht auf der Rückseite der Computer ein breites Trapez mit geringer Höhe. Diese Form wurde als Grundplatte für den Adapter genutzt. Auf dieser Grundplatte befinden sich neben der Aufnahme für die Hutschiene herausstehende Kegel, welche genutzt werden, um den Adapter mittels der am Winkel vorgesehenen Löcher zur Wandmontage zu fixieren, (siehe Abbildung \ref{fig:pcHalter}) - \item die letzte Konstruktion soll das \textbf{GNSS-Modul} ebenfalls an der Hutschiene fixieren. Das Formteil ist ein etwas in die Länge gezogene Quader. An einem Ende befindet sich der Mechanismus für die Hutschiene. Für das Modul ist eine Vertiefung mit Aussparungen für die Anschlüsse eingefügt worden. Das Modul wird durch das Einschieben einer Deckplatte gesichert. Das Formteil wird in Abbildung !!!ref!!! gezeigt. + \item die letzte Konstruktion soll das \textbf{GNSS-Modul} ebenfalls an der Hutschiene fixieren. Das Formteil ist ein etwas in die Länge gezogene Quader. An einem Ende befindet sich der Mechanismus für die Hutschiene. Für das Modul ist eine Vertiefung mit Aussparungen für die Anschlüsse eingefügt worden. Das Modul wird durch das Einschieben einer Deckplatte gesichert. Das Formteil wird in Abbildung \ref{fig:gnssHalter} gezeigt. \end{itemize} + + + \begin{figure}[htbp] + \centering + \begin{minipage}[b]{0.40\textwidth} + \centering + \includegraphics[width=\textwidth]{img/antenneHalterung.png} + \caption{Formteil für die Befestigung der Antenne} + \label{fig:antenneHalterung} + \end{minipage} + \hfill + \begin{minipage}[b]{0.40\textwidth} + \centering + \includegraphics[width=\textwidth]{img/halbschalen.png} + \caption{Halterung für den Installationskasten am Mast} + \label{fig:halbschalen} + \end{minipage} + \end{figure} + + + \begin{figure}[htbp] + \centering + \begin{minipage}[b]{0.40\textwidth} + \centering + \includegraphics[width=\textwidth]{img/pcHalter.png} + \caption{Montageplatte für den Server auf einer Hutschiene} + \label{fig:pcHalter} + \end{minipage} + \hfill + \begin{minipage}[b]{0.40\textwidth} + \centering + \includegraphics[width=\textwidth]{img/gnssHalter.png} + \caption{Gehäuse für das GNSS-Modul zur Befestigung auf einer Hutschiene} + \label{fig:gnssHalter} + \end{minipage} + \centering + \end{figure} diff --git a/060_3_implementierung_basisstation.tex b/060_3_implementierung_basisstation.tex index 699f360..f25f368 100644 --- a/060_3_implementierung_basisstation.tex +++ b/060_3_implementierung_basisstation.tex @@ -1,7 +1,7 @@ \subsubsection{Installationskasten bestücken} - Der Installationskasten kann weitgehend vorbereitet werden. Dafür wurden zunächst ein Loch an der unteren Seite gebohrt, welches groß genug ist um ein RJ45-Stecker durchzuführen. Weiterhin wurde die Hutschiene außer mittig positioniert, damit im unteren Raum mehr Platz für Kabel bleibt. Danach wurden die beiden Halbschalen an der Rückseite des Kastens befestigt, weil die Löcher für die Befestigungen durch die Komponenten teilweise verdeckt werden. Anschließend konnten die Komponenten an der Hutschiene befestigt werden. Die Komponenten wurden rechtsbündig verbaut. Dabei wurde der PoE-Splitter links neben dem Server und das GNSS-Modul rechts neben dem Server eingehackt. Diese beiden Komponenten auf je eine Seite des Computers zu befestigen, vereinfacht die Kabelführung. Der PoE-Splitter befindet sich auf der linken Seite, weil dieser die beste Klemmwirkung an der Hutschiene aufweist und so das verrücken der anderen Komponenten verhindert. + Der Installationskasten kann weitgehend vorbereitet werden. Dafür wurden zunächst ein Loch an der unteren Seite gebohrt, welches groß genug ist, um einen RJ45-Stecker durchzuführen. Weiterhin wurde die Hutschiene außer mittig positioniert, damit im unteren Raum mehr Platz für Kabel bleibt. Danach wurden die beiden Halbschalen an der Rückseite des Kastens befestigt, weil die Löcher für die Befestigungen durch die Komponenten teilweise verdeckt werden. Anschließend konnten die Komponenten an der Hutschiene befestigt werden. Die Komponenten wurden rechtsbündig verbaut. Dabei wurde der PoE-Splitter links neben dem Server und das GNSS-Modul rechts neben dem Server eingehackt. Diese beiden Komponenten auf je eine Seite des Computers zu befestigen, vereinfacht die Kabelführung. Der PoE-Splitter befindet sich auf der linken Seite, weil dieser die beste Klemmwirkung an der Hutschiene aufweist und so das Verrücken der anderen Komponenten verhindert. \par - Um den Computer über den PoE-Splitter mit Strom zu versorgen wurde ein Kabel mit einem Hohlbuchsenstecker konfektioniert. Das andere Ende des Kabels wurde verzinnt und an dem Blockterminal des Splitters angebracht. Das Netzwerkkabel von dem PoE-Splitter zu dem Server konnte ebenfalls schon eingesetzt werden. Mit einem USB-C auf USB-A Kabel wurde die Verbindung zwischen dem GNSS-Modul und dem Server hergestellt. Das Antennenkabel wurde durch das gebohrte Loch geführt und an dem GNSS-Modul angeschraubt. Der vorbereitete Installationskasten wird in Abbildung \ref{fig:vorbereitetKasten} dargestellt. + Um den Computer über den PoE-Splitter mit Strom zu versorgen, wurde ein Kabel mit einem Hohlbuchsenstecker konfektioniert. Das andere Ende des Kabels wurde verzinnt und an dem Blockterminal des Splitters angebracht. Das Netzwerkkabel von dem PoE-Splitter zu dem Server konnte ebenfalls schon eingesetzt werden. Mit einem USB-C auf USB-A Kabel wurde die Verbindung zwischen dem GNSS-Modul und dem Server hergestellt. Das Antennenkabel wurde durch das gebohrte Loch geführt und an dem GNSS-Modul angeschraubt. Der vorbereitete Installationskasten wird in Abbildung \ref{fig:vorbereitetKasten} dargestellt. \par Als weitere Vorbereitung wurden weitere benötigte Netzwerkkabel bereitgelegt und Adapter für die Antennenmontage wurde an dem C-Profil befestigt. @@ -16,7 +16,7 @@ \subsubsection{Montage} Die Montage began mit der Befestigung des Installationskastens, dafür wurde in je eine Halbschale ein griffiges Klebeband eingebracht, um den Halt zu verbessern. Der Kasten wurde an den Pfosten gehalten und durch die dazugehörigen Halbschalen fixiert. Daraufhin wurde die Antenne an dem C-Profil befestigt und das Antennenkabel angeschlossenen. Das C-Profil wurde an den bei der Begehung besprochen Befestigungspunkten angebracht. Das Antennenkabel wurde mit Kabelbindern an dem C-Profil befestigt. \par - Als nächstes musste der PoE-Extender in den vorhanden Anschlusskasten eingebracht werden. Dieser wurde ebenfalls an der Hutschiene befestigt. Das von dem !!!DragiLoRaWAN-Gateway?!!! kommende Ethernetkabel wurde aus der Hutschienen-RJ45-Buchse entnommen und in mit dem ersten Ausgang des Extenders verbunden. Der Eingang wurde mit dem nun freien Port an der Hutschiene verbunden. Danach wurde kontrolliert, ob der vorhandene System wieder einsatzbereit ist. Für die letzte herzustellende Verbindung zwischen dem Poe-Extender und dem Poe-Splitter, musste das Loch in dem vorhanden Installationskasten etwas aufgebohrt werden. Danach konnte das Kabel verlegt werden, wobei die überschüssige Länge des Kabel im neuen Installationskasten aufgewickelt wurde. Die Abbildung \ref{fig:poeextenderkasten} zeigt den verbauten Extender im Installationskasten. Durch die Betriebs-LED des Servers und den LEDs des Netzwerkinterfaces konnte schon während der Installation festgestellt werden, dass der Server mit Strom versorgt wird und einen Link aufbauen konnten. + Als Nächstes musste der PoE-Extender in den vorhandenen Anschlusskasten eingebracht werden. Dieser wurde ebenfalls an der Hutschiene befestigt. Das von dem LoRaWAN-Gateway kommende Ethernetkabel wurde aus der Hutschienen-RJ45-Buchse entnommen und in mit dem ersten Ausgang des Extenders verbunden. Der Eingang wurde mit dem nun freien Port an der Hutschiene verbunden. Danach wurde kontrolliert, ob das vorhandene System wieder einsatzbereit ist. Für die letzte herzustellende Verbindung zwischen dem PoE-Extender und dem PoE-Splitter, musste das Loch in dem vorhandenen Installationskasten etwas aufgebohrt werden. Danach konnte das Kabel verlegt werden, wobei die überschüssige Länge des Kabels im neuen Installationskasten aufgewickelt wurde. Die Abbildung \ref{fig:poeextenderkasten} zeigt den verbauten Extender im Installationskasten. Durch die Betriebs-LED des Servers und den LEDs des Netzwerkinterfaces konnte schon während der Installation festgestellt werden, dass der Server mit Strom versorgt wird und einen Link aufbauen konnten. \begin{figure}[ht] \vspace{1cm} @@ -27,21 +27,21 @@ \end{figure} \subsection{Antennenposition bestimmen} - Die nun folgenden Schritte wurde alle von einem Remote-Arbeitsplatz durchgeführt. + Die jetzt folgenden Schritte wurde alle von einem Remote-Arbeitsplatz durchgeführt. \par - Damit die Antennenposition bestimmt werden kann sind im grundlegenden drei Schritte notwendig: + Damit die Antennenposition bestimmt werden kann, sind im grundlegenden drei Schritte notwendig: \setlist{noitemsep} \begin{enumerate} \item Rohdaten des GNSS-Moduls aufzeichnen, \item die Rohdaten in das RINEX-Format konvertieren - \item und die Daten von einem Post Processing Dienst auswerten lassen. + \item und die Daten von einem PostProcessing Dienst auswerten lassen. \end{enumerate} \setlist{} - Damit die Rohdaten aufgezeichnet werden können, muss das Modul so konfiguriert werden, dass es diese ausgibt. Dafür wird das u-center und die Verbindung über ser2net genutzt. Die dafür benötigte Installation unter Windows, sowie die grundlegende Nutzung vom u-center wird im Anhang \ref{cha:winAndUcenter} beschrieben. Im u-center muss der Nachrichtentyp RAWX und RAW!!!?!!! für die USB-Schnittstelle aktiviert werden. Ob die benötigten Daten gesendet werden kann in !!!Packet-View?!!! kontrolliert werden. + Damit die Rohdaten aufgezeichnet werden können, muss das Modul so konfiguriert werden, dass es diese ausgibt. Dafür wird das u-center und die Verbindung über ser2net genutzt. Die dafür benötigte Installation unter Windows, sowie die grundlegende Nutzung vom u-center wird im Anhang \ref{cha:winAndUcenter} beschrieben. Im u-center muss der Nachrichtentyp RAWX für die USB-Schnittstelle aktiviert werden. Ob die benötigten Daten gesendet werden, kann in Packet-View vom u-center kontrolliert werden. \par - Die Aufzeichnung der Daten übernimmt der Kommunikations-Server der RTKLib. Das Programm heißt in der Kommandozeilenversion \mintinline[]{text}|STR2STR| und kann einen Dateneingang auf mehrere Datenausgänge übertragen. In diesem Fall werden die Daten des GNSS-Moduls in eine Datei geschrieben. Die meisten Post Processing Dienst verarbeiten bis zu 24 Stunden Aufzeichnungslänge, deshalb wird für die höchste Genauigkeit genau diese Dauer für die Einmessung verwendet. Die Länge der Aufzeichnung wird über den \mintinline[]{bash}|timeout| Befehl gesteuert. Damit die Aufzeichnung nicht als Kind-Prozess der Remote-Sitzung läuft wird das Hilfsprogramm \mintinline[]{bash}|screen| installiert, da ansonsten ein Abbruch der Verbindung auch die Aufzeichnung frühzeitig beenden würde. Aus dieser Beschreibung ergibt sich diese Befehlsfolge: + Die Aufzeichnung der Daten übernimmt der Kommunikations-Server der RTKLib. Das Programm heißt in der Kommandozeilenversion \mintinline[]{text}|STR2STR| und kann einen Dateneingang auf mehrere Datenausgänge übertragen. In diesem Fall werden die Daten des GNSS-Moduls in eine Datei geschrieben. Die meisten PostProcessing Dienste verarbeiten bis zu 24 Stunden Aufzeichnungslänge, deshalb wird für die höchste Genauigkeit genau diese Dauer für die Einmessung verwendet. Die Länge der Aufzeichnung wird über den \mintinline[]{bash}|timeout| Befehl gesteuert. Damit die Aufzeichnung nicht als Kind-Prozess der Remote-Sitzung läuft, wird das Hilfsprogramm \mintinline[]{bash}|screen| installiert, da ansonsten ein Abbruch der Verbindung auch die Aufzeichnung frühzeitig beenden würde. Aus dieser Beschreibung ergibt sich diese Befehlsfolge: \begin{minted}[linenos, gobble=4, breaklines]{bash} sudo apt-get update @@ -62,7 +62,7 @@ ./RTKLIB/app/consapp/convbin/gcc/convbin -od -os -oi -ot -ti 30 observation.ubx \end{minted} - Für die Erklärung der verwendeten Optionen folgt ein Ausschnitt aus dem Manual der RTKLib !!!cite!!!: + Für die Erklärung der verwendeten Optionen folgt ein Ausschnitt aus dem Manual der RTKLib \cite[97]{rtklibMan}: \setlist{noitemsep} \begin{itemize}[label=-] @@ -74,17 +74,17 @@ \end{itemize} \setlist{} - Die umgewandelte Datei muss als nächstes zu einem Post Processing Dienst übermittelt werden, der gewählte Dienst erhält die Daten über ein Formular im Browser, deshalb ist die einfachste Variante die Datei \url{ubservation.obs} auf einen Rechner mit einer Desktopumgebung zu kopieren. Dafür wurde die Datei mit dem Programm \mintinline[]{bash}|scp| über ssh kopiert. + Die umgewandelte Datei muss anschließend an einen PostProcessing Dienst übermittelt werden, der gewählte Dienst erhält die Daten über ein Formular im Browser, deshalb ist die einfachste Variante die Datei \url{ubservation.obs} auf einen Rechner mit einer Desktopumgebung zu kopieren. Dafür wurde die Datei mit dem Programm \mintinline[]{bash}|scp| über SSH kopiert. \par Nach einigen Stunden wird die Auswertung per E-Mail versandt. In dem erhaltenen Archiv befinden sich eine PDF (siehe Anhang \ref{cha:auswerungObservation}) in der die Auswertung grafisch veranschaulicht wird und neben anderen Dateien die Datei \url{observation.sum}. In dieser wird ab Zeile 69 die Position der Antenne im Erdkoordinatensystem angegeben. Zusätzlich werden geschätzt Genauigkeiten angegeben, diese liegen je nach Achse zwischen \(1,8mm\) und \(5,2mm\). \par - Die Koordinaten für X, Y und Z müssen nun über das u-center in das GNSS-Modul programmiert werden. Dafür muss in der Konfigurationsansicht der TMODE ausgewählt werden. In den Einstellungen des TMODE muss der Modus auf \texttt{fixed} eingestellt werden, danach können die Koordinaten im gleichen Fenster eingetragen werden. Damit das Modul auch die Korrekturdaten ausgibt kann ich das Fenster zur Konfiguration der Nachrichten gewechselt werden. Dort sollten die Nachrichten für die Rohdaten wieder entfernt werden, um das Datenaufkommen zu reduzieren. Danach können die RTCM3 Nachrichten mit den Nummern 1005, 1074, 1084, 1094, 1124 und 1230 aktiviert werden. Ob die Konfiguration erfolgreich war kann wieder im Packet View Fenster kontrolliert werden. Diese Finale Konfiguration des Moduls sollte in den Flash des Moduls geschrieben werden um auch über einen neustart hinweg verfügbar zu sein. Dafür kann in der Menüleiste der Punkt !!!?!!! ausgewählt werden. + Die Koordinaten für X, Y und Z müssen nun über das u-center in das GNSS-Modul programmiert werden. Dafür muss in der Konfigurationsansicht der TMODE ausgewählt werden. In den Einstellungen des TMODE muss der Modus auf \texttt{fixed} eingestellt werden, danach können die Koordinaten im gleichen Fenster eingetragen werden. Damit das Modul auch die Korrekturdaten ausgibt, kann in das Fenster zur Konfiguration der Nachrichten gewechselt werden. Dort sollten die Nachrichten für die Rohdaten wieder entfernt werden, um das Datenaufkommen zu reduzieren. Danach können die RTCM3 Nachrichten mit den Nummern 1005, 1074, 1084, 1094, 1124 und 1230 aktiviert werden. Ob die Konfiguration erfolgreich war, kann wieder im Packet-View Fenster kontrolliert werden. Diese finale Konfiguration des Moduls sollte in den Flash des Moduls geschrieben werden, damit auch über einen Neustart hinweg verfügbar zu sein. Dafür kann in der Menüleiste der Punkt \texttt{Save Config} ausgewählt werden. \subsection{Service einrichten} \label{ssec:pushService} - Die von dem GNSS-Modul generierten Korrekturdaten müssen kontinuierlich an den Ntrip-Caster weitergeleitet werden. Dafür wird der bereits zuvor genutzte Kommunikationsserver der RTKLib verwendet. Als Ausgang wird anstelle der Datei nun der Ntrip-Caster angegeben. + Die von dem GNSS-Modul generierten Korrekturdaten müssen kontinuierlich an den Ntrip-Caster weitergeleitet werden. Dafür wird der bereits zuvor genutzte Kommunikations-Server der RTKLib verwendet. Als Ausgang wird anstelle der Datei nun der Ntrip-Caster angegeben. \par - Damit die Ausgabe automatisch protokolliert wird und der Kommunikationsserver auch nach einem Neustart des Servers automatisch startet wird dem Betriebssystem ein Service hinzugefügt. Dafür muss eine Datei mit root-Rechten und der Endung \texttt{.service}, welche den Service definiert unter dem Pfad \url{/etc/systemd/system} erstellt werden. Der Inhalt der erstellten Datei \texttt{rtk.service} sieht wie folgt aus: + Damit die Ausgabe automatisch protokolliert wird und der Kommunikations-Server auch nach einem Neustart des Servers automatisch startet, wird dem Betriebssystem ein Service hinzugefügt. Dafür muss eine Datei mit root-Rechten und der Endung \texttt{.service}, welche den Service definiert, unter dem Pfad \url{/etc/systemd/system} erstellt werden. Der Inhalt der erstellten Datei \texttt{rtk.service} sieht wie folgt aus: \begin{minted}[linenos, gobble=4, breaklines]{bash} [Unit] diff --git a/060_4_implementierung_rover.tex b/060_4_implementierung_rover.tex index 5a8a581..22f07d3 100644 --- a/060_4_implementierung_rover.tex +++ b/060_4_implementierung_rover.tex @@ -1,19 +1,19 @@ \section{Rover} - Die Implementierungen für den Rover beginnen mit der Integration des Gyroskops, dies umschließt den Einbau der Hardware und das einbinden der Sensorwerte in die dafür vorgesehene Komponente. Im nächsten Schritt wird der Ntrip-Client dem System hinzugefügt, damit in den folgenden Prozessen die hochgenaue Positionsbestimmung verfügbar ist. Sobald das GNSS-Modul die Korrekturdaten verarbeitet, kann die Implementierung der Verwaltung für die Routen beginnen. Danach sind alle voraussetzungen gegeben um den Modus zum Routen aufzeichnen programmieren zu können. Daraufhin können die Algorithmen für das automatische befahren der Route entwickelt werden. + Die Implementierungen für den Rover beginnen mit der Integration des Gyroskops, dies umschließt den Einbau der Hardware und das Einbinden der Sensorwerte in die dafür vorgesehene Komponente. Im nächsten Schritt wird der Ntrip-Client dem System hinzugefügt, damit in den folgenden Prozessen die hochgenaue Positionsbestimmung verfügbar ist. Sobald das GNSS-Modul die Korrekturdaten verarbeitet, kann die Implementierung der Verwaltung für die Routen beginnen. Danach sind alle Voraussetzungen gegeben, um den Modus zum Routen aufzeichnen programmieren zu können. Daraufhin können die Algorithmen für das automatische Befahren der Route entwickelt werden. \subsection{Gyroskop installieren} - Die elektrische Verbindung des Moduls wird über vier Pins hergestellt, dabei handelt es sich um die zwei I2C Leitungen sowie Masse und die Spannungsversorgung. Das Modul kann mit \(+5V\) betrieben werden. Auf der Hauptplatine sind Pin-Leisten vorhanden um weitere I2C-Module, welche mit \(+5V\) betrieben werden können, dem System hinzufügen zu können. + Die elektrische Verbindung des Moduls wird über vier Pins hergestellt, dabei handelt es sich um die zwei I2C Leitungen sowie Masse und die Spannungsversorgung. Das Modul kann mit \(+5V\) betrieben werden. Auf der Hauptplatine sind Pin-Leisten vorhanden, um weitere I2C-Module, welche mit \(+5V\) betrieben werden können, dem System hinzufügen zu können. \par - Das Modul wird mit einer nicht bestückten Pin-Leise geliefert, daher bestand die Möglichkeit eine gewinkelte Pin-Leiste einzulöten. Es wurde eben diese Pin-Leiste gewählt um das Modul waagerecht mit einer weiteren Platine verbinden zu können. Bei der zusätzlichen Platine handelt es sich lediglich um einen Verteiler, welcher in Abbildung !!!ref!!! gezeigt wird. Dort ist zu sehen wie der Verteiler, durch seine L-Form, an einem Querbalken mit einer Maul-Büroklammer befestigt wird. Das MPU-6050 Module wird seitlich an eine ebenfalls gewinkelte Sockel-Leiste eingesteckt. Auf der Oberseite der Platine befinden sich drei weitere Konnektoren an denen das Display und das Magnetometer angeschlossen werden. Zwei der Konnektoren sind für das Magnetometer um es entweder an den I2C-Bus des ESP32 oder an den Auxiliary-I2C-Bus des MPU-6050 anzuschließen. Auf der Unterseite der Platine ist ein Kabel angelötet welches auf die Hauptplatine gesteckt wird. + Das Modul wird mit einer nicht bestückten Pin-Leise geliefert, daher bestand die Möglichkeit eine gewinkelte Pin-Leiste einzulöten. Es wurde eben diese Pin-Leiste gewählt, um das Modul waagerecht mit einer weiteren Platine verbinden zu können. Bei der zusätzlichen Platine handelt es sich lediglich um einen Verteiler, welcher in Abbildung !!!ref!!! gezeigt wird. Dort ist zu sehen, wie der Verteiler, durch seine L-Form, an einem Querbalken mit einer Maul-Büroklammer befestigt wird. Das MPU-6050 Module wird seitlich an eine ebenfalls gewinkelte Sockel-Leiste eingesteckt. Auf der Oberseite der Platine befinden sich drei weitere Konnektoren, an denen das Display und das Magnetometer angeschlossen werden. Zwei der Konnektoren sind für das Magnetometer, um es entweder an den I2C-Bus des ESP32 oder an den Auxiliary-I2C-Bus des MPU-6050 anzuschließen. Auf der Unterseite der Platine ist ein Kabel angelötet, welches auf die Hauptplatine gesteckt wird. \par - Durch diese weitere Platine wurde zum einen der benötigte feste Platz für das neue Modul geschaffen und zum anderen die Möglichkeit offen gehalten den bereits verbauten Kompass nun über den MPU-6050 zu nutzen um eine 9-Achsen Sensorfusion zu ermöglichen. Der Versuch diese 9-Achsen Sensorfusion zu implementieren ist gescheitert. Der Hersteller wirbt zwar mit dieser Funktion, jedoch ist die Rechenleitung des Chips nicht ausreichend hoch genug um die Funktion umzusetzen. Daher müssten Berechnung dafür auf den ESP32 ausgelagert werden !!!cite \url{https://www.i2cdevlib.com/devices/mpu6050#help}!!!. Dieser Weg wurde aufgrund der Komplexität nicht weiter verfolgt. + Durch diese weitere Platine wurde zum einen der benötigte feste Platz für das neue Modul geschaffen und zum anderen die Möglichkeit offen gehalten, den bereits verbauten Kompass nun über den MPU-6050 zu nutzen, um eine 9-Achsen Sensorfusion zu ermöglichen. Der Versuch diese 9-Achsen Sensorfusion zu implementieren ist gescheitert. Der Hersteller wirbt zwar mit dieser Funktion, jedoch ist die Rechenleitung des Chips nicht ausreichend hoch genug, damit die Funktion umzusetzen werden kann. Daher müssten Berechnung dafür auf den ESP32 ausgelagert werden !!!cite \url{https://www.i2cdevlib.com/devices/mpu6050#help}!!!. Dieser Weg wurde aufgrund der Komplexität nicht weiter verfolgt. \par - Die Einbindung des Sensors in den vorhandenen Programmcode erfolgte mit der bereits vorhanden \mintinline{c++}|class SensorData|. Für die Kommunikation mit dem Sensor wird die Bibliothek \texttt{I2Cdevlib-MPU6050} verwendet. Der Klasse wurden neben einer Funktionen zum Datenerhalt, die Funktion \mintinline{c++}|void enableGyroscope();| hinzugefügt. Diese erzeugt ein Objekt für den MPU6050 und initialisiert sowohl den MPU6050 als auch den verbauten Digital Motion Processor. Außerdem werden ermittelte Offsets eingestellt. Die periodische aufgerufene \mintinline{c++}|void run();| Funktion wurde ebenfalls erweitertet und überprüft jetzt im jeden Durchgang ob neue Daten des Sensors verfügbar sind und verarbeitet diese dann. + Die Einbindung des Sensors in den vorhandenen Programmcode erfolgte mit der bereits vorhanden \mintinline{c++}|class SensorData|. Für die Kommunikation mit dem Sensor wird die Bibliothek \texttt{I2Cdevlib-MPU6050} verwendet. Der Klasse wurden neben einer Funktion zum Datenerhalt, die Funktion \mintinline{c++}|void enableGyroscope(); | hinzugefügt. Diese erzeugt ein Objekt für den MPU-6050 und initialisiert sowohl den MPU-6050 als auch den verbauten Digital Motion Processor. Außerdem werden ermittelte Offsets eingestellt. Die periodische aufgerufene \mintinline{c++}|void run(); | Funktion wurde ebenfalls erweitertet und überprüft jetzt in jedem Durchgang, ob neue Daten des Sensors verfügbar sind und verarbeitet diese dann. \subsection{Ntrip Client} \label{ssec:ntripclient} - Die Implementierungen des Clients orientiert sich an dem von der RTCM herausgegebenen Paper \glqq Best Practices for NTRIP Client developers\grqq \cite{NTRIPWorkingGroup2023}. Außerdem können beide Revisionen des Protokolls mit dem Client benutzt werden. Die Revision 1 ist offiziell von der RTCM als \texttt{outdated} markiert. Der in dieser Arbeit verwendete Caster \url{rtk2go.com} gibt jedoch in seinen Statistiken an, dass \(95\%\) der eingehenden Verbindungen die Revision 1 verwenden. Zusätzlich kann durch die Implementierung beider Revisionen die angegeben Abwärtskompatibilität getestet werden. Des weiteren wird die Authentisierung mit Benutzernamen und Kennwort sowie die Übermittlung des eigenen Standorts an den Caster implementiert. Der Eigene Standort ist für Caster wichtig, welche mit einem Netz aus Referenzstationen betrieben werden. Die Implementierung erfolgt also damit der Rover auch abseits der errichteten Referenzstation von anderen Anbietern mit Korrekturdaten versorgt werden kann. + Die Implementierungen des Clients orientiert sich an dem von der RTCM herausgegebenen Paper \glqq Best Practices for NTRIP Client developers\grqq \cite{NTRIPWorkingGroup2023}. Zudem können beide Revisionen des Protokolls mit dem Client benutzt werden. Die Revision 1 ist offiziell von der RTCM als \texttt{outdated} markiert. Der in dieser Arbeit verwendete Caster \url{rtk2go.com} gibt jedoch in seinen Statistiken an, dass \(95\%\) der eingehenden Verbindungen die Revision 1 verwenden. Zusätzlich kann durch die Implementierung beider Revisionen, die angegeben Abwärtskompatibilität getestet werden. Des Weiteren wird die Authentisierung mit Benutzernamen und Kennwort sowie die Übermittlung des eigenen Standorts an den Caster implementiert. Der eigene Standort ist für Caster wichtig, welche mit einem Netz aus Referenzstationen betrieben werden. Die Implementierung erfolgt also, damit der Rover auch abseits der errichteten Referenzstation von anderen Anbietern mit Korrekturdaten versorgt werden kann. \subsubsection{Einstellungen} Eine Instanz des Clients fordert die Adresse des Casters, den Mountpoint, die Zugangsdaten und das GNSS-Modul als Parameter für den Konstruktor, diese sind nur durch eine neue Instanz änderbar. Der Benutzername und das Passwort können ignoriert werden, wenn eine Anmeldung bei dem Caster ohne Zugangsdaten möglich ist. @@ -30,13 +30,13 @@ \setlist{} \subsubsection{Zustandsautomaten} - Der Ntrip Client wurde nach dem Schema eines Zustandsautomaten entworfen, welcher in Abbildung !!!ref!!! skizziert wird. Im folgenden wird auf die Funktionalitäten der einzelnen Zustände eingegangen. Die Zustände werden durch das \mintinline{c++}|enum NTRIPClientStates| definiert. + Der Ntrip Client wurde nach dem Schema eines Zustandsautomaten entworfen, welcher in Abbildung !!!ref!!! skizziert wird. Im Folgenden wird auf die Funktionalitäten der einzelnen Zustände eingegangen. Die Zustände werden durch das \mintinline{c++}|enum NTRIPClientStates| definiert. \begin{itemize} - \item \textbf{openingConnection} In diesem Zustand wird versucht die Verbindung zu dem Caster aufzubauen. Dafür wird zwischen den Revisionen von Ntrip unterschieden, ob die Position gesendet werden soll und ob Zugangsdaten angegeben worden sind. Sollte der Verbindungsaufbau scheitern wird in den \texttt{waiting} Zustand gewechselt ansonsten in den \texttt{pushingData} Zustand. + \item \textbf{openingConnection} In diesem Zustand wird versucht, die Verbindung zu dem Caster aufzubauen. Dafür wird zwischen den Revisionen von Ntrip unterschieden, ob die Position gesendet werden soll und ob Zugangsdaten angegeben worden sind. Sollte der Verbindungsaufbau scheitern, wird in den \texttt{waiting} Zustand gewechselt, ansonsten in den \texttt{pushingData} Zustand. \item \textbf{pushingData} Wenn eine Verbindung zu dem Caster besteht, befindet sich der Client in diesem Zustand und leitet die empfangenen Daten an das GNSS-Modul weiter. Es kann nur in den \texttt{closingConnection} Zustand gewechselt werden. - \item \textbf{closingConnection} Sollt der Ntrip Client deaktiviert werden oder ein Timeout festgestellt werden, wird in diesen Zustand gewechselt, damit die Verbindung aus Sicht des Clients ordnungsgemäß beendet wird. Sobald die Verbindung getrennt ist wird der \texttt{waiting} Zustand aktiv. - \item \textbf{waiting} Wenn dieser Zustand betreten wird, wurde die Verbindung getrennt und es wird darauf gewartet in den \texttt{openingConnection} Zustand zu wechseln. Dafür muss entweder der Client wieder aktiviert werden oder die automatische Wiederverbindung muss aktiviert sein. + \item \textbf{closingConnection} Sollte der Ntrip Client deaktiviert oder ein Timeout festgestellt werden, wird in diesen Zustand gewechselt, damit die Verbindung aus Sicht des Clients ordnungsgemäß beendet wird. Sobald die Verbindung getrennt ist, wird der \texttt{waiting} Zustand aktiv. + \item \textbf{waiting} Wenn dieser Zustand betreten wird, wurde die Verbindung getrennt und es wird darauf gewartet, in den \texttt{openingConnection} Zustand zu wechseln. Dafür muss entweder der Client wieder aktiviert werden oder die automatische Wiederverbindung muss aktiviert sein. \item \textbf{notAvailable} Dieser Zustand wird betreten, wenn keine Verbindung zum Internet bereitsteht. \end{itemize} @@ -45,16 +45,16 @@ Die Implementierung der Routen Verwaltung erfolgt über die \mintinline{c++}|class Route|, welche eine Liste zur Speicherung der Punkte nutzt. Die Punkte sind Instanzen der \mintinline{c++}|class Point|. Es herrscht also eine 1 zu n Beziehung zwischen \mintinline{c++}|class Route| und \mintinline{c++}|class Point|. \subsubsection{Postionen mit \mintinline{c++}|class Point|} - Eine Instanz dieser Klasse besteht unter anderem aus den Koordinaten, welche in dem \mintinline{c++}|struct Coordinates| als zwei \mintinline{c++}|double| Werte gespeichert werden. Zusätzlich kann die Zeit der Erzeugung und die geschätzte Genauigkeit des Punktes angegeben und gespeichert werden. Neben Methoden zur Datenkontrolle und Zugriff wird die Funktionalität der Klasse durch diese beiden Funktionen gegeben: + Eine Instanz dieser Klasse besteht unter anderem aus den Koordinaten, welche in dem \mintinline{c++}|struct Coordinates| als zwei \mintinline{c++}|double| Werte gespeichert werden. Zusätzlich kann die Zeit der Erzeugung und die geschätzte Genauigkeit des Punktes angegeben und gespeichert werden. Neben den Methoden zur Datenkontrolle und Zugriff wird die Funktionalität der Klasse durch diese beiden Funktionen gegeben: \begin{itemize} - \item \mintinline{c++}|double distanceTo(Point);| errechnet die Entfernung zwischen den Koordinaten der Instanz zu dem gegeben Punkt. Für die Berechnung wird die Erdkrümmung vernachlässigt, deshalb kann der Satz des Pythagoras genutzt werden. Dafür müssen die Grad angegebenen Koordinaten zunächst in Radianten umgewandelt werden und anschließend in ein kartesisches Koordinatensystem überführt werden. Anschließend kann die Entfernung der beiden Punkte berechnet werden. Dafür werden die beiden Koordinaten einer Achse voneinander abgezogen und anschließend quadriert. Die Ergebnisse der beiden Achsen werden schließlich aufsummiert und radiziert. + \item \mintinline{c++}|double distanceTo(Point); | errechnet die Entfernung zwischen den Koordinaten der Instanz zu dem gegebenen Punkt. Für die Berechnung wird die Erdkrümmung vernachlässigt, deshalb kann der Satz des Pythagoras genutzt werden. Dafür müssen die in Grad angegebenen Koordinaten zunächst in Radianten umgewandelt und anschließend in ein kartesisches Koordinatensystem überführt werden. Anschließend kann die Entfernung der beiden Punkte berechnet werden. Dafür werden die beiden Koordinaten einer Achse voneinander abgezogen und anschließend quadriert. Die Ergebnisse der beiden Achsen werden schließlich aufsummiert und radiziert. \begin{eqnarray} d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} \end{eqnarray} - \item \mintinline{c++}|int16_t courseTo(Point);| errechnet den Kurs von dem aktuellen Punkt zu dem gegebenen Punkt und gibt ihn in Grad aus. \(0^\circ\) entspricht Norden. Von da an wird im Uhrzeigersinn weiter gezählt, sodass \(270^\circ\) beispielsweise einen Kurs nach Westen angeben würden. Für die Berechnung müssen die Längen- und Breitengrade zunächst in Radianten umgewandelt werden. Anschließend kann dann mit der Formel + \item \mintinline{c++}|int16_t courseTo(Point);| errechnet den Kurs von dem aktuellen Punkt zu dem gegebenen Punkt und gibt ihn in Grad aus. \(0^\circ\) entspricht Norden. Von da an wird im Uhrzeigersinn weiter gezählt, sodass \(270^\circ\) etwa einen Kurs nach Westen angeben würden. Für die Berechnung müssen die Längen- und Breitengrade zunächst in Radianten umgewandelt werden. Anschließend kann dann mit der Formel \begin{eqnarray} \theta = \text{atan2}(\sin(\Delta \lambda)cos(\phi_2), \cos(\phi_1)\sin(\phi_2) - \sin(\phi_1)\cos(\phi_2)\cos(\Delta \lambda)) @@ -68,23 +68,23 @@ \lambda_1, \lambda_2 &\widehat{=}& \text{Längengrad der Punkte} \end{eqnarray} - Anschließend muss \(\theta\) wieder in Grad umgewandelt werden und mit modulo auf den Wertebereich \(0 \text{ bis } 360\) normalisiert werden. + Anschließend muss \(\theta\) wieder in Grad umgewandelt und mit dem modulo-Operator auf den Wertebereich \(0 \text{ bis } 360\) normalisiert werden. \end{itemize} \subsubsection{Postionsspeicherung mit \mintinline{c++}|class Route|} - Die Klasse nutzt die Implementierung der Liste aus der C++ Standardbibliothek. Darüber hinaus wird ein Iterator für diese Liste von der Klasse verwaltet. Mit primitiven Datentypen wird festgehalten ob die Route gestartet ist und der wievielte Punkt gerade aus der Route selektiert ist. + Die Klasse nutzt die Implementierung der Liste aus der C++ Standardbibliothek. Überdies wird ein Iterator für diese Liste von der Klasse verwaltet. Mit primitiven Datentypen wird festgehalten, ob die Route gestartet und der wievielte Punkt gerade aus der Route selektiert ist. \par - Die Funktionen der Klasse beschränken sich darauf den Iterator und Liste zu verwalten. Der Liste können nur Daten hinzugefügt werden. Die Entfernung einzelner Punkte ist nicht möglich und erfordert das Löschen der gesamten Liste. Es kann jeweils der nächste oder der vorherige Punkt ausgewählt werden. Die Route kann am Ende oder am Anfang gestartet werden. Soll die Route im Umgekehrter Reihenfolge abgefahren werden muss diese am Ende gestartet werden und immer der vorherige Punkt der Route abgerufen werden. Bei einem Fehler, weil beispielsweise keine Route aufgezeichnet wurde, wird von Funktionen eine Instanz von der \mintinline{c++}|class Point| mit den Koordinaten \(0 \text{ und } 0\) zurückgegeben. Dies kann von aufrufenden Funktion überprüft werden, dafür wurde eigens die Funktion \mintinline{c++}|bool Point::isValid();| implementiert. + Die Funktionen der Klasse beschränken sich darauf, den Iterator und Liste zu verwalten. Der Liste können nur Daten hinzugefügt werden. Die Entfernung einzelner Punkte ist nicht möglich und erfordert das Löschen der gesamten Liste. Es kann jeweils der nächste oder der vorherige Punkt ausgewählt werden. Die Route kann am Ende oder am Anfang gestartet werden. Soll die Route im umgekehrter Reihenfolge abgefahren werden, muss diese am Ende gestartet und immer der vorherige Punkt der Route abgerufen werden. Bei einem Fehler, weil beispielsweise keine Route aufgezeichnet wurde, wird von Funktionen eine Instanz von der \mintinline{c++}|class Point| mit den Koordinaten \(0 \text{ und } 0\) zurückgegeben. Dies kann von der aufrufenden Funktion überprüft werden, dafür wurde eigens die Funktion \mintinline{c++}|bool Point::isValid(); | implementiert. \par - Damit Informationen über die Route abgefragt werden können, wurde ein Datentyp hinzugefügt. Das \mintinline{c++}|struct RouteInfo| enthält die Gesamtzahl der in der Route gespeicherten Punkte und der wievielte davon gerade ausgewählt ist. + Damit Informationen über die Route abgefragt werden können, wurde ein Datentyp hinzugefügt. Das \mintinline{c++}|struct RouteInfo| enthält die Gesamtzahl der in der Route gespeicherten Punkte sowie den Index des selektierten Punktes. \subsubsection{Verwaltung über das Menü} - In die vorhandene Menüstruktur wurde in der ersten Ebene der Punkt \flqq Route\frqq{} als Untermenü hinzugefügt. Dieses Menü stellt die in der folgenden Liste erläuterten Funktionen bereit. Für einige dieser Funktionen wird auf eine entwickelte HTTP-API zugegriffen, deshalb muss für diese Funktionen eine Internetverbindung bestehen. Die serverseitige Implementierung der API wird im Anhang \ref{cha:httpApi} beschrieben. Werden Teile der API auf dem Rover genutzt, zeigt dieser den HTTP-Code an. Mit diesem lässt sich erkennen ob die ausgeführte Operation korrekt ausgeführt wurde. + In die vorhandene Menüstruktur wurde in der ersten Ebene der Punkt \flqq Route\frqq{} als Untermenü hinzugefügt. Dieses Menü stellt die in der folgenden Liste erläuterten Funktionen bereit. Für einige dieser Funktionen wird auf eine entwickelte HTTP-API zugegriffen, deshalb muss für diese Funktionen eine Internetverbindung bestehen. Die serverseitige Implementierung der API wird im Anhang \ref{cha:httpApi} beschrieben. Werden Teile der API auf dem Rover genutzt, zeigt dieser den HTTP-Code an. Mit diesem kann erkannt werden, ob die ausgeführte Operation korrekt ausgeführt wurde. \begin{itemize} \item \textbf{Points} - Unter diesem Punkt können die einzelnen Koordinaten der in der Route gespeicherten Punkte betrachtet werden. \item \textbf{Clear} - Löscht die aktuell lokal erstellte Route. - \item \textbf{Import} - Bei Auswahl dieses Punktes muss der Benutzter die ID der Route wissen mit der diese Exportiert wurde. Sofern die gewählte ID existiert, wird die Route heruntergeladen und steht dem Rover nun zur Verfügung. Wenn bereits ein Route lokal vorhanden war, wird diese durch importierte überschrieben. In diesem Fall könnte die gefährdete Route vorher exportiert werden. + \item \textbf{Import} - Bei Auswahl dieses Punktes muss der Benutzer die ID der Route wissen, mit der diese exportiert wurde. Sofern die gewählte ID existiert, wird die Route heruntergeladen und steht dem Rover nun zur Verfügung. Wenn bereits eine Route lokal vorhanden war, wird diese durch importierte überschrieben. In diesem Fall könnte die gefährdete Route vorher exportiert werden. \item \textbf{Export} - Mit dieser Funktionen können Routen für die spätere Verwendung gesichert werden. Dafür muss ihnen eine ID zugewiesen werden, unter dieser ID lässt sich die Route später wieder abrufen. \item \textbf{Delete} - Mit Delete kann eine exportierte Route mit ihrer ID gelöscht werden, dies betrifft allerdings nicht aktuell lokal vorhandene Route. \end{itemize} diff --git a/Literatur.bib b/Literatur.bib index 470fff3..b03627a 100644 --- a/Literatur.bib +++ b/Literatur.bib @@ -233,4 +233,30 @@ version = {R05}, } +@Online{sparkZedf9p, + author = {sparkfun}, + title = {SparkFun GPS-RTK-SMA Breakout - ZED-F9P (Qwiic)}, + url = {https://www.sparkfun.com/products/16481}, + urldate = {2024-08-10}, +} + +@Manual{antenneDach, + author = {{JIAXING JINCHANG ELECTRONIC TECHNOLOGY CO.,LTD}}, + title = {GNSS Surveying Antenna - JCA228F}, +} + +@Manual{gyroskop, + author = {AZ-Delivery}, + title = {GY-521 6-Achsen Gyroskop und Beschleunigungssensor}, + url = {https://cdn.shopify.com/s/files/1/1509/1638/files/GY-521_6-Achsen_Gyroskop_und_Beschleunigungssensor_Datenblatt_AZ-Delivery_Vertriebs_GmbH_b35673f3-1fb8-423c-a533-524c216d92dd.pdf?v=1627564500}, + urldate = {2024-08-10}, +} + +@Manual{rtklibMan, + author = {T. Takasu}, + date = {2013-04-29}, + title = {RTKLIB ver. 2.4.2 Manual}, + urldate = {2024-08-11}, +} + @Comment{jabref-meta: databaseType:biblatex;} diff --git a/img/antenneDach.jpg b/img/antenneDach.jpg new file mode 100644 index 0000000000000000000000000000000000000000..741dccf464361334f8e3ccb2f12d02455bb6bd0b GIT binary patch literal 11350 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 KrU4?{(0>3RBLO1- literal 0 HcmV?d00001 diff --git a/img/antenneHalterung.png b/img/antenneHalterung.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf587fff0530d69d4750981e66223ff574c6bc7 GIT binary patch literal 15927 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 literal 0 HcmV?d00001 diff --git a/img/gnssHalter.png b/img/gnssHalter.png new file mode 100644 index 0000000000000000000000000000000000000000..5739684114f5e7753824fb7275653ad623ed4ac1 GIT binary patch literal 18255 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 literal 0 HcmV?d00001 diff --git a/img/halbschalen.png b/img/halbschalen.png new file mode 100644 index 0000000000000000000000000000000000000000..076dcc6cb8e6e080187821e8071b98c598ff7124 GIT binary patch literal 26438 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 literal 0 HcmV?d00001 diff --git a/img/pcHalter.png b/img/pcHalter.png new file mode 100644 index 0000000000000000000000000000000000000000..ec59461b9a51ff0f5e2e03f74e9538d8a4ad1eae GIT binary patch literal 17308 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 F{{x6Dgh2oR literal 0 HcmV?d00001