kleinere Anpassungen und verschieben der Heatmaperstellung in Nachbearbeitung

This commit is contained in:
Lukas Arnecke 2019-02-12 14:59:58 +01:00
parent 886e06e4d6
commit 38e9dac1b4
1 changed files with 16 additions and 12 deletions

View File

@ -91,12 +91,12 @@ Die Kommunikation zwischen Nodes, wie in läuft über ein Publisher/Subscriber
\subsection{Kartierung}
\label{kartierung}
Für die Kartierung bietet ROS das Package \textit{gmapping}, wenn die Karte mithilfe eines Lasermoduls erstellt werden soll. Dieses Package bietet die Funktionalität, um eine laserbasierte Karte mithilfe des Systems \textit{Simultaneous Localization and Mapping} (SLAM) zu erstellen. Hierbei wird eine 2D Karte aus der Kombination von den Laserdaten und der vermuteten eigenen Position erstellt. Die Daten über die eigene Position kommen aus den Odometriedaten, also der vermuteten Bewegungsrichtung und -distanz anhand der Bewegungen der Räder. Der Node \textit{slam\_gmapping} subscriped die Topics \textit{tf} und \textit{scan}, aus denen es dann die Karte berechnet und unter dem Topic map veröffentlicht. \cite{gmap}. Die Abschätzung des Drehwinkels um die eigene Achse durch Odometrie ist vergleichsweise ungenau, weshalb es zu fehlerhaften Karten kommen kann, wenn der Roboter während der Kartierung zu viele Kurven fährt. Der Abgleich mit den Laserdaten wirkt diesem Effekt entgegen, bei einem erneuten Abfahren des Bereiches können entstandene Verschiebungen erkannt und behoben werden.
Für die Kartierung bietet ROS das Package \textit{gmapping}, wenn die Karte mithilfe eines Lasermoduls erstellt werden soll. Dieses Package bietet die Funktionalität, um eine laserbasierte Karte mithilfe des Systems \textit{Simultaneous Localization and Mapping} (SLAM) zu erstellen. Hierbei wird eine 2D Karte aus der Kombination von den Laserdaten und der vermuteten eigenen Position erstellt. Die Daten über die eigene Position kommen aus den Odometriedaten, also der vermuteten Bewegungsrichtung und -distanz anhand der Bewegungen der Räder. Der Node \textit{slam\_gmapping} subscriped die Topics \textit{tf} und \textit{scan}, aus denen es dann die Karte berechnet und unter dem Topic map veröffentlicht \cite{gmap}. Die Abschätzung des Drehwinkels um die eigene Achse durch Odometrie ist vergleichsweise ungenau, weshalb es zu fehlerhaften Karten kommen kann, wenn der Roboter während der Kartierung zu viele Kurven fährt. Der Abgleich mit den Laserdaten wirkt diesem Effekt entgegen, bei einem erneuten Abfahren des Bereiches können entstandene Verschiebungen erkannt und behoben werden.
\subsection{Wireless Local Area Network}
\subsubsection{IEEE 801.11}
Der Begriff Wireless Local Area Network (WLAN) beschreibt drahtlose Netzwerkkommunikation in einem Lokalen Netzwerk mit einer Übertragung über die Luft. Hierzu gehören viele Standards, zum Beispiel auch die Datennetze, die Bluetooth verwendet. In dieser Arbeit soll es aber um den Standard IEEE 802.11 gehen, ab hier unter dem Begrif "WLAN" referenziert wird. IEEE 801.11 spezifiziert neben der Übertragung per Radiowellen noch die Übertragung per Infrarot, um die es hier aber nicht gehen soll. IEEE 802.11 im Detail die Kommunikation in Funknetzwerken. Dies entspricht der Bitübertragungsschicht im ISO-OSI Modell. Der Standard besteht aus mehreren Unternormen, die nach und nach eingeführt worden sind. Die Wichtigsten sind: 802.11, 802.11a, 802.11b, 802.11g, 802.11n, 802.11ac, 802.11ad. Bei WLAN werden heute hauptsächlich zwei Frequenzbänder genutzt. Das 2,4 GHz und das 5GHz Band. Die Tabelle \ref{wlanStandards} zeigt die verschiedenen Generationen, deren Erscheinungsjahr und die Frequenz auf der sie senden und empfangen.
Der Begriff \textit{Wireless Local Area Network (WLAN)} beschreibt drahtlose Netzwerkkommunikation in einem Lokalen Netzwerk mit einer Übertragung über die Luft. Hierzu gehören viele Standards, zum Beispiel auch die Datennetze, die Bluetooth verwendet. In dieser Arbeit soll es aber um den Standard \textit{IEEE 802.11} gehen, ab hier unter dem Begrif "WLAN" referenziert wird. IEEE 801.11 spezifiziert neben der Übertragung per Radiowellen noch die Übertragung per Infrarot, um die es hier aber nicht gehen soll. IEEE 802.11 im Detail die Kommunikation in Funknetzwerken. Dies entspricht der Bitübertragungsschicht im ISO-OSI Modell. Der Standard besteht aus mehreren Unternormen, die nach und nach eingeführt worden sind. Die Wichtigsten sind: 802.11, 802.11a, 802.11b, 802.11g, 802.11n, 802.11ac, 802.11ad. Bei WLAN werden heute hauptsächlich zwei Frequenzbänder genutzt. Das 2,4 GHz und das 5GHz Band. Die Tabelle \ref{wlanStandards} zeigt die verschiedenen Generationen, deren Erscheinungsjahr und die Frequenz auf der sie senden und empfangen.
\begin{figure}[h]
\centering
@ -111,19 +111,19 @@ Die Kommunikation zwischen zwei Teilnehmern in einem WLAN-Netz kann direkt im so
\subsubsection{SSID}
In der Hochschule Mannheim werden zum Bereitstellen eines flächendeckenden WLAN-Netzwerkes viele Basisstationen gleichzeitig eingesetzt. Um eine kontinuierliche Verbindung zu gewährleisten, auch bei sich bewegenden Mobilgeräten überlappen sich diese Bereich.
Zusätzlich werden pro Basisstation mehrere Netzwerke bereitgestellt. Diese unterscheiden sich in dem Namen des Netzwerkes der so genannten Service Set Identifier (SSID). Dieser Eindeutige Name kann im Access-Point eingestellt werden.
Zusätzlich werden pro Basisstation mehrere Netzwerke bereitgestellt. Diese unterscheiden sich in dem Namen des Netzwerkes der so genannten \textit{Service Set Identifier (SSID)}. Dieser Eindeutige Name kann im Access-Point eingestellt werden.
\subsubsection{Messen}
\begin{figure}[h]
\centering
\caption{Messen der Signalstärke mit der Android App Wifi Analyzer (Die Netzwerknamen wurden unkenntlich gemacht)}
\caption{Messen der Signalstärke mit der Android \textit{App Wifi Analyzer} (Die Netzwerknamen wurden unkenntlich gemacht)}
\includegraphics[width=10cm]{bilder/wifianalyzer}
\newline
\label{wifiAnalyzer}
\end{figure}
Um die Erreichbarkeit eines WLANs zu gewährleisten lohnt es sich die Signalstärke zu messen. Die Signalstärke ist Indikator für Stärke des ein kommenden WLAN-Signals an der WLAN-Schnittstelle. Somit kann man feststellen ob eine Signal stark genug ist um eine stabile Verbindung zu gewährleisten. Ein anderer Begriff dafür ist Received Signal Strength Indication oder auch RSSI-Wert. Gemessen wird sie in dBm, also die Dämpfung des signales. Je höher die Zahl, desto besser höher die Signalstärke. Unter Linux kann Signalstärke direkt ausgelesen werden. Hierzu kann der Befehl "iwconfig" genutzt werden. Leider ist das Ergebnis stark von der verwendeten Hardware abhängig. Unter bestimmten Umständen wird nur ein Pseudowert ohne Einheit zurückgegeben.
Um die Erreichbarkeit eines WLANs zu gewährleisten lohnt es sich die Signalstärke zu messen. Die Signalstärke ist Indikator für Stärke des ein kommenden WLAN-Signals an der WLAN-Schnittstelle. Somit kann man feststellen ob eine Signal stark genug ist um eine stabile Verbindung zu gewährleisten. Ein anderer Begriff dafür ist \textit{Received Signal Strength Indication} oder auch RSSI-Wert. Gemessen wird sie in dBm, also die Dämpfung des signales. Je höher die Zahl, desto besser höher die Signalstärke. Unter Linux kann Signalstärke direkt ausgelesen werden. Hierzu kann der Befehl "iwconfig" genutzt werden. Leider ist das Ergebnis stark von der verwendeten Hardware abhängig. Unter bestimmten Umständen wird nur ein Pseudowert ohne Einheit zurückgegeben.
Im Bild \ref{wifiAnalyzer} sieht man ein Screenshot einer Android Applikation mit der man die Signalstärke umliegender WLAN-Netzwerke messen und Anzeigen kann. Auf der X-Achse sind die verschiedenen Kanäle des 2,4GHz Bandes zu sehen. Die Y-Achse stellt die Signalstärke dar. Die ovalen, farbigen Ausschläge sind jeweils ein Netzwerk beschriftet mit der jeweiligen SSID.
Eine Andere Kenngröße ist die Verbindungsqualität, welche einer Pseudoeinstufung der Qualität der Verbindung entspricht. Diese wird aus mehreren Faktoren berechnet: Bitfehler, Übertragungsrate, Signalstärke, Synchronisationswerte und anderen Hardwaremetriken. Oftmals wird die Qualität als Bruch dargestellt. Beispiel: 41/70
@ -193,20 +193,23 @@ Als \textit{Simultaneous Localization and Mapping} (SLAM) bezeichnet das ermitte
Um die Karte auch nachträglich erstellen zu können haben wir uns dazu entschieden, die relevanten Messages aufzuzeichnen. Wir haben also eine Rosbag Datei erstellt, in der die Topics \textit{/tf}, \textit{/pose}, \textit{/base\_scan} und \textit{/wlan\_signal} gespeichert werden. Aus dieser Datei kann man auch nachträglich eine Karte erstellen und muss nicht für jeden Versuch bei der Auswertung der Daten neu mit dem Roboter fahren. Auch kann man so die Fahrt auch zuhause simulieren ohne Zugriff auf die Hardware. Der Topic /wlan\_signal ist selbst geschrieben und wir später noch genauer erklärt.
\subsection{Kartenerstellung aus aufgezeichneter Fahrt}
Die von gmapping bereitgestellten Informationen können in \textit{rviz} als Karte visualisert werden. Hierbei kann ausgewählt werden, welche Topics genau dargestellt werden sollen, da nicht alle laufenden Topics der Kartenerstellung dienen sondern auch beispielsweise Steuerungsfunktionen haben.
Die von gmapping bereitgestellten Informationen können in \textit{rviz} als Karte visualisert werden. Hierbei kann ausgewählt werden, welche Topics genau dargestellt werden sollen, da nicht alle laufenden Topics der Kartenerstellung dienen sondern auch beispielsweise Steuerungsfunktionen haben. Diese Karte wird dann im Kapitel \ref{nachverarbeitung} weiterverwendet, um die Signalstärken darzustellen.
\subsection{WLAN-Messung}
Um die WLAN Abdeckung zu messen sollte die Signalstärke ausgelesen und auf einem neuen Topic kontinuierlich veröffentlicht werden. Dafür wurde ein WLAN-USB-Stick gekauft und am Roboter eingerichtet. Auf der Kommandozeile in Linux kann man sich die Signalstärke mithilfe des iwconfig-Befehls sehr leicht ausgeben lassen. Es wurde über die Betriebsystemoberfläche eine Verbindung mit dem zu überwachenden WLAN-Netzwerk hergestellt. So konnte schnell ein Knoten geschrieben werden, der das Ergebnis des Linux Kommandos abfängt und auf dem Topic /wlanSignal ausgibt. Hierfür wurde eine eigene Nachricht im ROS-Message-Format geschrieben.
Um die WLAN Abdeckung zu messen sollte die Signalstärke ausgelesen und auf einem neuen Topic kontinuierlich veröffentlicht werden. Dafür wurde ein WLAN-USB-Stick gekauft und am Roboter eingerichtet. Auf der Kommandozeile in Linux kann man sich die Signalstärke mithilfe des iwconfig-Befehls sehr leicht ausgeben lassen. Es wurde über die Betriebsystemoberfläche eine Verbindung mit dem zu überwachenden WLAN-Netzwerk hergestellt. So konnte schnell ein Knoten geschrieben werden, der das Ergebnis des Linux Kommandos abfängt und auf dem Topic \textit{/wlanSignal} ausgibt. Hierfür wurde eine eigene Nachricht im ROS-Message-Format geschrieben.
Da die Frequenzbänder unterschiedliche Eigenschaften haben wurde entschieden, jeweils eine Messung für das 2,4GHz-Band und das 5GHz-Band zu machen und getrennt auszugeben um später differenzierte Ergebnisse zu erhalten. Die Idee war zwei Netzwerkadapter anzusprechen und jeden über die Betriebssystemkonfiguration in ein separates Band zu hängen. Dies erwies sich aber als schwierig, da dies im WLAN-Standard so nicht vorgesehen ist. Für die neuen Modi, zum Beispiel IEEE 802.11n, müssen die WLAN-Karten auf beiden Bändern senden und empfangen können, da auch Dual-Chanel-Kommunikation möglich ist. Somit existiert keine Möglichkeit über das Betriebssystem ein Netzwerk-Interface ausschließlich auf ein Band zu konfigurieren. Außerdem war es problematisch, dass immer eine Verbindung zum Netzwerk vorhanden sein musste. Dies führte bei einem Wechsel der Basisstation, durch etwaiges Bewegen entlang der Flure, dazu, dass die kurze Aussetzer der Messung in der Messung auftraten.
Da die Frequenzbänder unterschiedliche Eigenschaften haben wurde entschieden, jeweils eine Messung für das 2,4GHz-Band und das 5GHz-Band zu machen und getrennt auszugeben um später differenzierte Ergebnisse zu erhalten. Die Idee war, zwei Netzwerkadapter anzusprechen und jeden über die Betriebssystemkonfiguration in ein separates Band zu hängen. Dies erwies sich aber als schwierig, da dies im WLAN-Standard so nicht vorgesehen ist. Für die neuen Modi, zum Beispiel IEEE 802.11n, müssen die WLAN-Karten auf beiden Bändern senden und empfangen können, da auch Dual-Chanel-Kommunikation möglich ist. Somit existiert keine Möglichkeit über das Betriebssystem ein Netzwerk-Interface ausschließlich auf ein Band zu konfigurieren. Außerdem war es problematisch, dass immer eine Verbindung zum Netzwerk vorhanden sein musste. Dies führte bei einem Wechsel der Basisstation, durch etwaiges Bewegen entlang der Flure, dazu, dass die kurzen Aussetzer der Messung in der Aufzeichnung sichtbar waren.
Um die im Vorherigen Absatz genannten Probleme zu Lösen haben wir unsere Messung auf einen passiven Scanmodus umgestellt. Das bedeutet, dass man feste Verbindung mehr zu einem Netzwerk hat. Sondern Alle WLAN-Basisstationen in Reichweite mit deren Eigenschaften ausliest. Das können auch mehre pro Netzwerk sein. Da dies nicht mehr komfortabel über die Kommandozeile zu Realisieren ist, ohne Performanceverluste hin zunehmen, nutzten wir eine C++-Bibliothek Namens wifi-scan \cite{bmegliWifiScan}. Diese macht es möglich relativ einfach WLAN-Netzwerke auf einer bestimmten Netzwerkschnittstelle zu scannen. Nachdem diese noch geringfügig angepasst war, konnte eine Liste Aller Access-Points in der Umgebung mit deren Eigenschaften (SSID, Signalstärke und Frequenz) ermittelt werden. Diese Liste konnte dann nach der gesuchten SSID gefiltert und die aktuelle und maximale Signalstärke pro Band gefunden werden. Ein kleiner Nachteil dieser Lösung ist, dass der Knoten nun Administrationsrechte benötigt um den Scan durchzuführen. Dies wurde durch die Abfrage des Root-Passwortes beim Start des Knotens erledigt.
Um die im Vorherigen Absatz genannten Probleme zu Lösen haben wir unsere Messung auf einen passiven Scanmodus umgestellt. Das bedeutet, dass man keine feste Verbindung mehr zu einem Netzwerk hat. Sondern \textit{alle} WLAN-Basisstationen in Reichweite mit deren Eigenschaften ausliest. Das können auch mehre pro Netzwerk sein. Da dies nicht mehr komfortabel über die Kommandozeile zu Realisieren ist, ohne Performanceverluste hin zunehmen, nutzten wir eine C++-Bibliothek Namens wifi-scan \cite{bmegliWifiScan}. Diese macht es möglich relativ einfach WLAN-Netzwerke auf einer bestimmten Netzwerkschnittstelle zu scannen. Nachdem diese noch geringfügig angepasst war, konnte eine Liste aller Access-Points in der Umgebung mit deren Eigenschaften (SSID, Signalstärke und Frequenz) ermittelt werden. Diese Liste konnte dann nach der gesuchten SSID gefiltert und sowohl die aktuelle als auch die maximale Signalstärke pro Band gefunden werden. Ein kleiner Nachteil dieser Lösung ist, dass der Knoten nun Administrationsrechte benötigt um den Scan durchzuführen. Dies wurde durch die Abfrage des Root-Passwortes beim Start des Knotens erledigt.
% Hier kommt noch ein Bild rein wo man den rqt_graph für einen Scan sieht.
\subsection{Nachverarbeitung}
Es wurde ein Python-Skript geschrieben, welches die aufgezeichneten Rosbag-Dateien der Mess-Fahrten durchlief. Ziel war es eine CSV-Datei zu erhalten, die man im Nachgang plotten könnte. Das mit aufgezeichnete Topic /tf lieferte unter Zuhilfenahme der Transormation-API von ROS die transformierten genaue Position des Roboters. Die Transformation war nötig, da der Topic /pose nur die Position anhand der Odemetrie liefert, welche sehr ungenau ist. Die Transformations-Vektoren von /tf alleine sind auch nicht aussagekräftig, da sie nur die relative Verschiebung und der Drehwinkel liefern und nur durch kontinuierliches Integrieren und zusammen rechnen zu /pose die aktuelle Position liefern. Nachdem die CSV erstellt war konnte mit Matlab die Heatmap erzeugt und mittels Bildbearbeitung über die Karte gelegt werden.
\label{nachverarbeitung}
Es wurde ein Python-Skript geschrieben, welches die aufgezeichneten Rosbag-Dateien der Mess-Fahrten durchlief. Ziel war es eine CSV-Datei zu erhalten, die man im Nachgang plotten könnte. Das mit aufgezeichnete Topic /tf lieferte unter Zuhilfenahme der Transormation-API von ROS die transformierten genaue Position des Roboters. Die Transformation war nötig, da der Topic /pose nur die Position anhand der Odemetrie liefert, welche sehr ungenau ist. Die Transformations-Vektoren von /tf alleine sind auch nicht aussagekräftig, da sie nur die relative Verschiebung und der Drehwinkel liefern und nur durch kontinuierliches Integrieren und zusammen rechnen zu /pose die aktuelle Position liefern. Nachdem die CSV erstellt war konnte mit Matlab die Heatmap erzeugt werden.
Für die Visualisierung wurden zwei \textit{Scatterplots} aus der CSV erstellt, jeweils mit den Koordianten als Position und der jeweiligen Signalstärke des 2,4G und 5G Netzes zur Farbgebung. So entsteht ein 2D Koordinatensystem, bei dem an jedem Punkt der CSV ein Farbpunkt gesetzt ist, dessen Farbe dem Wert der Signalstärke entspricht. Hierbei wurde als Farbskala \textit{Jet} gewählt, welche in Abbildung \ref{skala} des folgenden Kapitels zu sehen ist. Anschließend war es möglich, die Schaubilder jeweils über die Karte zu legen und so die Position der Punkte in Abhängigkeit zu der Umgebung zu setzen.
\newpage
\section{Ergebnisse}
@ -217,7 +220,7 @@ Der Pioneer-3dx Roboter konnte mit einer neuen Installation des Betriebssystems
%Zur Erstellung der Karten haben wir die Daten aus dem Map-Server von ROS exportiert und eine CSV Datei erstellt, bei der pro Zeitpunkt ein Eintrag geschrieben wird mit den aktuellen Koordinaten des Roboters und der dazugehörigen Signalstärken. Aus dieser Datei wurden dann in Matlab zwei Schaubilder erstellt, eines für die Signalstärke des 2,4G Netzes als Farbskala und eines für die 5G Signalstärke. Als Farbskala haben wir uns für die Jet Skala entschieden, die auch in Abbildung \ref{skala} dargestellt ist.
% Ab hier wieder Ergebnis
Als finale Ergebnis konnten zwei Schaubilder erstellt werden. Eines für die Signalstärke des 2,4G Netzes (Abbildung \ref{2g4}) und eines für die 5G-Signalstärke (Abbildung \ref{5g}). Diese zeigen die aufgezeichnete Fahrt des Roboters, die dabei erzeugte Karte und die Messungen der WLAN-Signalstärke im A-Gebäude der Hochschule Mannheim. Dabei entspricht die Farbgebung der Punkte der jeweiligen Signalstärke an dieser Position in der Karte. Wie in Abbildung \ref{skala} zu sehen ist, geht die Skala von Blau (-40dBm, gut) langsam über zu rot(-80dBm, schlecht).
Als finales Ergebnis konnten zwei Schaubilder erstellt werden. Eines für die Signalstärke des 2,4G Netzes (Abbildung \ref{2g4}) und eines für die 5G-Signalstärke (Abbildung \ref{5g}). Diese zeigen die aufgezeichnete Fahrt des Roboters, die dabei erzeugte Karte und die Messungen der WLAN-Signalstärke im A-Gebäude der Hochschule Mannheim. Dabei entspricht die Farbgebung der Punkte der jeweiligen Signalstärke an dieser Position in der Karte. Wie in Abbildung \ref{skala} zu sehen ist, geht die Skala von Blau (-40dBm, gut) langsam über zu rot(-80dBm, schlecht).
\begin{figure}[h!]
@ -241,10 +244,11 @@ Als finale Ergebnis konnten zwei Schaubilder erstellt werden. Eines für die Sig
\label{skala}
\end{figure}
%Warum ist dann mitten im Flur 5G besser? Sollte in der Signalstärke bei niedrigerer Reichweite und schlechterer Wanddurchdringung doch immer schlechter sein als 2,4G.
Als besonderer Punkt ist hier zu sehen, dass etwa in der Mitte des Flurs bei der Karte für das 2,4G Netz ein schlechtes Signal dargestellt wird, während es bei der 5G Karte vergleichsweise gut ist. Im Gegensatz dazu ist das Signal innerhalb des Robotik Labors oben links im Bild bei 2,4G besser ist als bei 5G. Als mögliche Erklärung kamen wir zu dem Schluss, dass 5G eine kleinere Reichweite hat und von Wänden schneller abgeschwächt wird. So ist es nachvollziehbar, dass der Roboter auf dem Flur ein stärkeres Signal zu einem entfernten Access-Point hat, jedoch in einem anderen Raum stärker abfällt, wenn das WLAN Signal durch eine Wand muss.
\subsubsection{Quellcode}
Alle Programmierten Ergebnisse unseres Projektes können in unserem öffentlichen Repository auf Github.com eingesehen werden: \href{https://github.com/fzirker/wlan_pioneer}{Link zum wlan\_pioneer}
Alle programmierten Ergebnisse unseres Projektes können in unserem öffentlichen Repository auf Github.com eingesehen werden: \href{https://github.com/fzirker/wlan_pioneer}{Link zum wlan\_pioneer}
\newpage
\section{Ausblick}