Flugplanung

WICHTIG: Die bereitgestellten Funktionen sind nicht ausreichend getestet um zu
garantieren, dass sie unter allen Umständen funktionieren.


Multiwii Bodenstation

Auf unserem Quadrocopter läuft die Multiwii Software. Aus diesem Projekt existiert auch ein Konfigurationstool, mit dem sich die korrekte Funktion aller Sensoren überprüfen und die Parametrierung der Regelung einstellen lässt.
Dieses Tool verbindet sich mit über eine serielle Schnittstelle mit dem Mikrocontroller.
Wir tunneln diese Verbindung durch X-Bee Funkmodule und erreichen damit eine dauerhafte Telemetrieüberwachung. In anderen Projekten, beispielsweise Paparazzi, verfügt die Bodenstation über die Fähigkeit, Routen auf einer Karte zu planen und während des Fluges hochzuladen. Nach umfangreichen Analysen hat sich jedoch herausgestellt, dass es auch mit großem Aufwand kaum zu erreichen ist, unsere Flugsteuerung mit der Paparazzi Bodenstation kompatibel zu machen. Stattdessen schien es geschickter, die benötigten Funktionen in einer Eigenentwicklung umzusetzen, die auf dem Multiwii-Konfigurationstool basiert. Dazu wurde der komplette Quelltext zunächst von Processing zurück auf standart Java portiert, da hier sehr fortschrittliche Entwicklungsumgebungen vorhanden sind, beispielsweise Eclipse oder Netbeans.



Funktionen


-Darstellung einer Karte
-Kalibrierung der Karten Koordinaten
-speichern/laden einer kalibrierten Karte
-Planung/Editierung einer route (live), B-Splines aus Kontrollpts
-Überwachung der Route, automatische Wegpunkte
-upload des aktuellen Wegpunktes (nicht getestet)


Routenplanung
Der Quadrocopter soll später autonom einen Kurs abfliegen können, in der Routenplanung kann dieser durch Kontrollpunkte festgelegt werden.
Die Kontrollpunkte können jederzeit, auch während des Fluges, editiert werden.
Aus ihnen wird eine stetig differenzierbare B-Spline Kurve berechnet und durch kleinere
Sehnenstücke angenähert. Das Koordinatensystem ist dabei kartesisch, muss aber
weder normiert, noch orthogonal sein. Um die Kartenkoordinaten in GPS und wieder zurück
transformieren zu können, kommt eine affine Abbildung zum Einsatz, die über 3 Punkte
mit bekannten Koordinaten kalibriert werden kann. Dabei werden nur die horizontalen
Anteile berücksichtigt, vertikale Koordinaten werden nicht dargestellt und identisch
abgebildet.

Unterstützung für autonome Flüge

WARNUNG: Die Funktionen, die zu autonomen Flügen hilfreich wären konnten noch nicht
         getestet werden!! Bei einem Test sind die gesetzlichen Anforderungen an
         Modellflugzeuge (und deren Halter!) unbedingt zu beachten.
         Prinzipiell ist ein Hardware-Failsafe nötig, der einen sicheren Flug auch
         bei indeterministischem Verhalten der Steuerungssoftware gewährleisten kann.
         (Unterspannung oder Programmierfehler)
         Zum Flugzeug muss ausnahmslos und ununterbrochen Sichtkontakt bestehen und
         der Pilot muss zu jedem Zeitpunkt die volle Kontrolle über sein Flugzeug haben.

DIES IST KEINE VOLLSTÄNDIGE AUFLISTUNG DER NÖTIGEN SICHERHEITSVORKEHRUNGEN!

Auf der Routenplanung aufbauend wurde ein Modul umgesetzt, das die GPS-Telemetrie von
Multiwii mithört und zu jedem Zeitpunkt die nötigen Wegpunkte ermittelt, um der Route
zu folgen. Wenn keine Telemetriedaten zur Verfügung stehen, können auch
Positionsdaten aus einer anderen Quelle über die native Schnittstelle bezogen werden.
Sobald ein Wegpunkt erreicht wurde, wird automatisch der nächste übertragen, dabei
wird das multiwii Protokoll zwar eingehalten, allerdings setzen wir damit eine
Funktion um, die in offiziellen Version noch nicht implementiert ist, daher können wir
hier noch keine Kompatibilität garantieren.


-Telemetrieaufzeichnung
-Telemetrie playback
-Video Aufzeichnung
-Video Wiedergabe
-Live Vorschau während Aufzeichnung


Telemetrie Daten

Das Programm der Bodenstation klinkt sich in den downstream der seriellen Kommunikation
ein. Dabei können die Daten aufgezeichnet und in einer Datei gespeichert werden. Diese
Datei kann später wiedergegeben werden, indem multiwii die gespeicherten Daten zum
richtigen Zeitpunkt wieder präsentiert werden. Dabei wird der momentane downstream
der eigentlichen seriellen Schnittstelle komplett ausgeblendet.
Um auf diese Funktionen zugreifen zu können, muss also in der MultiwiiConfig eine
Schnittstelle ausgweählt und geöffnet werden, erst danach kann sie im Aufnahme-Panel
ausgewählt und dann zweckentfremdet werden.


Videoaufzeichnung

Über die native Schnittstelle können dem Programm Videodaten als 32bit-Integer array
übergeben werden. Das Farbformat ist ARGB, allerdings wird der Alphakanal ignoriert,
somit ergibt sich das verbreitete 24bit RGB Format.
Standartmäßig werden die übergebenen Bilder sofort im Video Panel angezeigt.
Darüber hinaus können die Bilder mit exaktem Zeitstempel im Telemetriedatenstrom
gespeichert werden. Das Bild wird dann bei der Wiedergabe eines Telemetriedatenstroms
auf dem Video Panel dargestellt. Da zuletzt noch Probleme bestanden, einen Datenstrom,
der sowohl Telemetriedaten, als auch Bilddaten enthält, wiederzugeben, werden
Bilddaten momentan nicht aufgezeichnet.


-native Schnittstelle:
    -hinzufügen/löschen der wegpunkte
    -Abfrage des aktuellen wegpunktes
    -Abfrage der GPS-position
    -überschreiben der GPS-position (concurrent)
    -übergeben eines video bildes
    -start der anwendung in einer shared lib

Native Schnittstelle

Das Programm verfügt darüber hinaus über eine native Schnittstelle, die Erweiterungen
in c/c++ erlaubt. Diese kann in zwei Modi betrieben werden, im "java modus" wird das
ganze Programm über den Java-Befehl vom Betriebssystem gestartet und zur Laufzeit
eine Bibliothek mit dem Namen "MultiwiiNative" geladen. Diese kann erweitert werden,
indem die Funktion

JNIEXPORT jint JNICALL Java_multiwiiconfig_MultiwiiConfig_updateState
  (JNIEnv *, jclass , jint );

Modifiziert oder neu implementiert wird.
Diese Funktion wird einige Sekunden nach Programmstart von einem neuen Thread
aufgerufen und dient nur dazu, den Einsprungpunkt möglicher Erweiterungen aufzurufen.
Wenn dieser (Java) Thread zurückkehrt, wird er direkt beendet, danach wird der
Einsprungpunkt nicht mehr aufgerufen. In Späteren Versionen wird sich das möglicherweise
ändern.
Die zweite Option besteht darin, die Bibliothek aus einem eigenen Programm heraus zu
laden. Dabei müssen die Bibliotheken einer aktuellen Virtual Machine vom Betriebssystem
auffindar sein, außerdem muss zuerst der classpath gesetzt werden, was mit

void API setClasspath(const char *path);

in UTF-8 codierung geschieht.
Danach kann die komplette Umgebung gestartet werden, indem

int API createMultiwiiConfig(void);

aufgerufen wird. Dieser Aufruf kehrt zurück, sobald alle Fenster initialisiert wurden,
die Anwendungslogik läuft dann in separaten Threads. Ca. zwei Sekunden später wird dennoch
der Verzögerte Aufruf von Java_multiwiiconfig_MultiwiiConfig_updateState ausgeführt.
Dieser kann genützt werden, indem vorher mit

void API setStateCallback(void (*updateState)(int) );

eine Callback-Funktion bekanntgegeben wird.
Für die Übertragung von alternativen Koordinaten über

void API setCurrentPosition(float *data);

Gilt besondere Vorsicht, da kein Mechanismus existiert, der die GPS-Koordinaten via
Telemetrie ausblendet.
Die gesamte native Schnittstelle ist absichtlich so gestaltet, dass keine C++ Objekte
oder C Strukturen verwendet werden, um mögliche Probleme mit der Einbindung in anderen
Programmiersprachen zu vermeiden.
Die Benutzung der restlichen Funktionen wird hinreichend im Headerfile erklärt.



Architektur

-Plug-In für serielle Schnittstelle
-timed stream
-multiplexing
-eigenes Fenster
-event System



Verschiedene Aspekte der Architektur sind erwähnenswert:

Das Plug-In der seriellen Schnittstelle ist minimalinvasiv gelöst, indem eine
Unterklasse der Schnittstelle aus Processing erzeugt wird, diese implementiert
dann das Aufzeichnen und Wiedergeben von anderen Datenströmen.
Dazu dienen
TimedInputStream und TimedOutputStream, jeweils mit Millisekundenpräzsion genau die
richtige Anzahl von Bytes verfügbar machen. In diesem System können auch noch alternative
Datenkanäle eingebettet werden, dies wird genutzt, um die Bilddaten in der gleichen
Datei zu speichern.
Um die Videos möglichst Transparent im Datenstrom zu verstecken, steht eine Multiplexer-
Klasse zur Verfügung. Diese liest einen Kanal als Primärdatenstrom aus, als wäre nur dieser
vorhanden. Sobald sie dabei auf Datenpakete aus weiteren, sekundären Datenströmen stößt,
werden diese Pakete solange gelesen und dann jeweils in einen passenden anschließenden
Strom geschrieben, bis wieder Pakete aus dem primären Strom gefunden werden.
MultiwiiConfig verwendet ein eigenes Grafiksystem, das jedoch zu der hier verwendeten
Swing-Architektur prinzipiell kompatibel ist. Wegen bislang nicht zu identifizierender
Probleme mit den Processing Bibliotheken ist es dennoch noch nicht gelungen, beide
Benutzeroberflächen in dasselbe Fenster zu integrieren. Möglicherweise lässt sich das
Problem beseitigen indem man die neuesten Processsing Bibliotheken zugrunde legt.
Das Programm verwendet ein eigenes Ereignissystem. Das Besondere daran ist, dass neben
reinen Aktionen und Eigenschafts-Veränderungen zusätzliche Verwaltungsaufgaben übernommen
werden. So wird für jeden Typ der Eigenschafts-Veränderungs-Ereignisse der aktuellste
Wert gespeichert und neuen Abonnenten dieses Ereignisses automatisch mitgeteilt.
Darüber hinaus können Eigenschaften endgültige Werte zugewiesen werden, die durch
nachfolgende Ereignisse nicht überschrieben werden können. Eine weitere Eigenschaft, die beim Debugging hilft sind automatische Warnungen, falls ein Ereignis keinen Abonnenten
findet.
Abonnenten können nicht nur ein Ereignis empfangen sondern durch Regular Expressions
jede beliebige Kombination von Ereignissen.


Bekannte Probleme
-getrennte Aufnahme Telemetrie und Video gehen jeweils, gemeinsam aber nicht
-upload des aktuellen Wegpunktes auf Mikrocontroller Seite nicht implementiert
-start in so-lib, nicht getestet (benötigte libs unbekannt)
-nativ übergebene Koordinaten und gps Koordinaten schließen sich nicht gegenseitig aus
-Multii ist als PApplet realisiert, das kann theoretisch in die Swing-GUI
 eingebettet werden

Geplante Funktionen

-umcodieren des Videos nach h.264
-umcodieren der Telemetrie in ein ASCII-format (matlab)



Details zum Projekt

Verwendete Compiler sind openjdk 1.6 und g++.
Das Programm verwendet zwei Netbeans Projektdateien, MultiwiiConfig und MultiwiiNative.
Die Datei
.../NetBeansProjects/MultiwiiNative/dist/Debug/GNU-Linux-x86/libMultiwiiNative.so
wird in
.../NetBeansProjects/MultiwiiConfig/
als library benötigt.
Wenn der C/C++ Code verändert wurde, muss MultiwiiNative neu kompiliert und wieder in
das andere Verzeichnis kopiert werden.


Ansatzpunkte für Erweiterungen

Möchte man beispielsweise den Winkel der Kursabweichung vom Soll berechnen, wäre die
Klasse multiwiiconfig.Navigator ein guter Anfang. Für weitere Anwendungen muss das
TelemetryInterface noch genauer ausgearbeitet werden und in multiwiiconfig.Conf
müssen noch in der Methode

public void evaluateCommand(byte cmd, int dataSize)

Die entsprechenden Daten weitergegeben werden. Die GPS- und IMU-Daten können hier als
Vorlage dienen.


Um Videodaten an das Programm zu übergeben, kann die Funktion

void API newImage(int *rgbData, int width, int height);

in der MultiwiiNative Bibliothek aufgerufen werden.

Anhänge:
Diese Datei herunterladen (dev.zip)dev.zip[ ]%2013-%04-%23 %1:%Apr%+02:00