Kontroller Ryze Tello via Node.js Fly drone via terminalen

Kontroller Ryze Tello via Node.js

I 2017 slo DJI seg sammen med Intel og Ryze Technology og skapte den lille dronen Ryze Tello. Dette er en relativt rimelig drone. Denne lille dronen har mye muskler under panseret som blant annet en SDK som er tilgjengelig via Wi-Fi. I dette innlegget skal jeg presentere en av mange muligheter til å kontrollere dronen ved å bruke Node.js og noen innebygde biblioteket for å sende kommandoer til å styre dronen direkte fra terminalvinduet.

Jeg vil nok anbefale at du har litt kunnskap om bruke av terminal og JavaScript før du setter i gang. Sett bort ifra det mest åpenbare (en datamaskin og dronen) så trenger du Node og NPM installert på din datamaskin. Jeg bruker også to bibliotek som følger med Node.js som heter dgram og readline. I tillegg kan det være greit å kjenne til kommandoene man kan sende til dronen. De er listet opp i Tello sin SDK (PDF-fil).

Import

Vi trenger to av Node.js sine innebygde bibliotek. Dette gjør koden vår i stand til å sende kommandoene via UDP.

const dgram = require('dgram');
const readline = require('readline');

Tilkobling

Dronen har sitt eget Wi-Fi -nettverk. Før vi kjører koden så må datamaskinen være tilkoblet dette nettverket. Som nevnt i Tello sin SDK så har den følgende IP-adresse og port som vi kobler oss til.

const HOST = '192.168.10.1';
const PORT = 8889;
const client = dgram.createSocket('udp4');
client.bind(PORT);

Send en kommando

Vi lager oss en funksjon som lar oss sende en kommando til dronen. Funksjonen kobler seg til IP-adressen og porten. Komandoene er strenger, derfor kan vi skrive funksjonen slik:

function sendCommand(command) {
    client.send(command, 0, command.length, PORT, HOST, (err, bytes) => {
        if (err) throw err;
        console.log(`En kommando er sendt til ${HOST}:${PORT}`);
    });
}

Få svar

Når vi sender en kommando til dronen så kan den svare tilbake. F.eks. hvis man sender battery? så kan dronen svare med hvor mye strøm det er igjen på batteriet. Denne koden lytter etter meldinger fra dronen og skriver det ut i terminalen.

client.on('message', (message) => {
    console.log(message);
});

Kommando

Nå stå vi ved et veiskille. Enten kan du hardkode og sende kommandoer til dronen eller du kan lytte etter det som skrives inn i terminalvinduet for å sende det som en kommando.

F.eks. kan vi spørre om batteriet ved å legge til:

sendCommand('battery?');

Førstnevnte er kanskje en idé om man skal fly dronen helt likt hver gang. Men sistnevnte er langt mer praktisk og lar en sende kommandoer til dronen. Så vi fjerner den forrige linjen og erstatter den med følgende kode som lar oss lytte etter kommandoer skrevet inn i terminalen.

const rline = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

(function input() {
    rline.question('Skriv inn kommando:  ', (command) => {
      if (command === 'exit') {
        rline.close();
      } else {
        sendCommand(command);
        input();
      }
    });
  }());

Hele koden

Nå har jeg gått igjennom blokk for blokk i koden. Her er den endelige koden i sin helhet.

const dgram = require('dgram');
const readline = require('readline');

const PORT = 8889;
const HOST = '192.168.10.1';

const client = dgram.createSocket('udp4');
client.bind(PORT);

const rline = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});


function sendCommand(command) {
  client.send(command, 0, command.length, PORT, HOST, (err, bytes) => {
    if (err) throw err;
    console.log(`En kommando er sendt til ${HOST}:${PORT}`);
  });
}

client.on('message', (message) => {
  console.log(message);
});


(function userInput() {
  rline.question('Skriv inn kommando:  ', (command) => {
    if (command === 'exit') {
      rl.close();
    } else {
      sendCommand(command);
      userInput();
    }
  });
}());

Som du ser så krever det ikke mangel linjer kode for å koble seg til dronen. Det er kanskje ikke så veldig praktisk å skrive inn komandoer på denne måten når man normalt sett kan bruke mobiltelefonen til å kontrollere den. Men det er en proof of consept som viser hva som er mulig å få til. Enten man bruker Node.js slik som jeg har gjort her eller andre språk.