Um es vorweg zu nehmen: Die ersten Versuche einer Javascript/Html-basierten Windows 8-App stützten sich im wesentlichen auf die Erfahrungen von Felix Geisendörfer zur Programmierung einer AR Drone über Javascript mit Hilfe von Node.js. Er hat eine Bibliothek veröffentlicht, node-ar-drone, die wesentliche Aspekte der Drohnen-Ansteuerung abhandelt. Leider ist sie aktuell gekoppelt mit Node.js-Funktionen und -Modulen zur Netzwerkkommunikation sowie der Bildverarbeitung, deshalb ist eine direkte Übernahme der Bibliothek derzeit nicht möglich.
Aufgrund der Architektur der Bibliothek ist es aber durchaus möglich zumindest den Part zur Netzwerkkommunikation auf WindowsRT-Methoden umzubiegen.
Vorraussetzung dafür ist aber die Unterstützung von UDP und eine möglichst geringe Latenz von WindowsRT. Das sollte mit der App und einfachen Steuerungskommandos getestet werden.
Als Vorbereitung für die Steuerung der Drohne durch die App, muss der jeweilige Rechner mit dem Netzwerk der Drone verbunden werden. Das klappt unter Windows 8 per Netzwerk-Einstellung ohne Probleme. Es empfiehlt sich, das Netzwerk der Drohne als Standardnetzwerk einzustellen, zumindest während der Entwicklungszeit.
Die Kommunikation zur Steuerung der Drohne erfolgt mit standardisierten Textkommandos, die per UDP an sie übertragen werden. Ein eigenes Programm muss also eine Verbindung öffnen und kann dann die Kommandos schicken. Im Nachfolgenden werden die wesentlichen Code-Elemente gezeigt.
Vorbereitung - Globale Variablen und Verbindungsaufbau
// globale Variablen
var counter = 0, // Kommandozaehler
socket = null, // Socketverbindung
writer = null; // Schreibpuffer für Kommandos
var ip = '192.168.1.1', // feste IP-Adresse der Drohne
ports = {
AT: 5556 // Port für Steuerungskommandos
};
// Socketverbindung öffnen und bei Erfolg
socket = new Windows.Networking.Sockets.DatagramSocket();
socket.connectAsync(
new Windows.Networking.HostName(ip), ports.AT).done(function () {
// wurde die Verbindung hergestellt, erzeugen wir eine Verknüfung
// des Ausgabestreams der Verbindung mit einem Schreibpuffer,
// um die Kommandos abzusetzen
writer = new Windows.Storage.Streams.DataWriter(socket.outputStream);
...
});
Steuerkommandos
Die Steuerkommandos für die Drohne sind stets gleich aufgebaut, die Logik dafür in eine Funktion zu packen, lohnt sich also. Da im Beispiel nur REF-Kommandos benutzt werden, beschränkt sich die Parameterisierung auf den Kommandowert:
var refcmd = function(cmdvalue) {
var command =
'AT*REF=' + counter + ',' + cmdvalue + '\r'; // Kommando bauen
counter++;
writer.writeString(command); // in den Stream schreiben
writer.storeAsync(); // und abschicken
};
Der Kommandozähler counter dient dazu, jedem abgesendeten Befehl eine aufsteigende Nummer zu verpassen, anhand derer die Drohne die Abfolge der Kommandos erkennt und umsetzt.
Kommando abschicken
Mit der obigen Funktion ist der Rest ein Kinderspiel (die Steuercodes sind node-ar-drone entnommen):
refcmd(1 << 8); // Drone in den "sicheren Modus" schalten
// unbedingt als erste Kommando erforderlich
refcmd(1 << 9); // Take-off Kommando
...
refcmd(0); // 0 leitet die Landung ein.
Wichtig bei Programmende
Unbedingt die Socket-Verbindung zum Ende trennen:
socket.close();
Diesen Beitrag flattrn