Indoor Positioning System

Positionsbestimmung basierend auf Ultraschallsignaldetektion

View the Project on GitHub Daedalus-TUM/ips-indoor-navigation

Überblick Mitmachen Entwicklung Hardware Software Python C++ Arduino Anwendung Team

Software: Python

Die auf Python3 basierende Softwarelösung ist in fünf Teile gespalten, die die den Anforderungen entsprechenden Funktionen bedienen.
Die Funktion des Programmes lässt sich am einfachsten am Beispiel eines eingehenden Datenpaketes erklären. Ein Datenpaket besteht aus einem Array der Länge 12 Bytes, wovon die ersten 5 Bytes die Identifikation des Senders, Empfängers, sowie Typ und Nummer der Nachricht enthalten. Die letzten 7 Byte enthalten die von der Bodenstation gemessene Zeitdifferenz der Signale. Trifft ein solches Paket bei der Basisstation ein, wird es an den Rechner weitergeleitet und von der Klasse Arduino über einen Aufruf der Main-Funktion an den in multilat.c implementierten Trilaterationsalgorithmus weitergeleitet. Zugleich wird der Eventhandler aufgerufen, welcher es einem in Team.py implementierten Autopiloten ermöglicht auf neue Messdaten zu reagieren.
Steuerbefehle an das Flugobjekt können durch manuelle Eingabe im GUI von Eventhandler.py oder von einem in Team.py beschriebenen Autopiloten stammen. In beiden Fällen werden die Anweisungen von Arduino.py wieder in ein 12-Byte-Datenpaket umgewandelt.
Um aktuelle Messdaten, und Zustandsbeschreibungen in der graphischen Benutzeroberfläche als Tabellen oder Karten darstellen zu lassen, können Eventhandler.py und Team.py Gui.py aufrufen . Der Aufbau der Benutzeroberfläche selbst ist in daedalus.glade beschrieben.

Die Main-Funktion befindet sich in der Datei ips.py. Hier werden die Klassen aufgerufen und die Navigationssoftware der Team.py-Dateien in das System integriert. Weiterhin können hier die Positionen der Wegpunkte und Bodenstationen manuell bestimmt werden. Um einen Autopiloten mit IPS-Unterstützung zu erstellen, muss der entsprechende Programmcode in der Datei ips.py importiert werden. Hier am Beispiel 'TeamX.py':

import TeamX

In der Main-Funktion:

if self.team and self.ttyport:
if self.team == "TeamX":
self.team = TeamX.TeamX(self);

Zur Installation ist zu beachten, dass das Programm die folgenden Python-Pakete benötigt: python3-gi python3-gi python3-gi-cairo python3-all python3-regex python3-serial python3-gobject.
Um die Software verwenden zu können, muss die Basisstation oder ein Arduino-Board an den PC angeschlossen sein.
Zum Start des Programmes wird die Datei run.sh ausgeführt. Im erscheinenden Fenster kann die zu verwendende Navigationssoftware ausgewählt werden. Ist die Basisstation angeschlossen, so öffnet sich nun die Karte.

Zur weiteren Konfiguration befinden sich drei Register am linken Fensterrand. Im Register Navigation können die Positionen neuer Wegpunkte oder Bodenstationen eingefügt werden oder bereits vorhandene bearbeitet werden. Das Register Command erlaubt es dem Zeppelin diverse Befehle zu erteilen sowie zur Veranschaulichung der laufenden Berechnungen die Entfernungsradien zu den Wegpunkten in der Karte einzuzeichnen. Das Register Infos gibt die aktuelle Position, Geschwindigkeit und Akkuladung des Zeppelins an.

Auf der Karte, die den rechten Teil des Fensters einnimmt, sind die Wegpunkte, die Bodenstationen, die aktuelle Position des Zeppelins sowie dessen Pfad eingezeichnet. Die Größe der Karte richtet sich nach der Größe des Feldes das die Bodenstationen aufspannen. Eine Bodenstation, die keine Signale an Basisstation sendet (defekt oder nicht im Versuchsaufbau enthalten), wird sie auf der Karte rot eingezeichnet. Ist die Bodenstation erreichbar und funktionsfähig, so ist sie grün eingezeichnet und die gemessene Distanz zum Zeppelin kann als Kreis um die Bodenstation eingezeichnet werden.
Die Position des Zeppelins kann nur dann aktualisiert werden, wenn mindestens drei Bodenstationen grün eingezeichnet sind. Während des Fluges wird der Pfad der Gondel zur Flughöhendarstellung farbig in die Karte eingezeichnet. Die hierzu verwendete Farbskala passt sich dynamisch an die während dem Flug vorkommenden Höhenwerte an.