Gdy recenzowałem drona Tello, to zwróciłem szczególną uwagę na to, że tego drona można zaprogramować. Obiecałem wtedy, że stworzę oddzielny wpis na temat programowania tego drona. W końcu udało mi się znaleźć trochę czasu i opisać dokładnie jak można zaprogramować drona Tello w NodeJS (czyli w JavaScript).

W tym wpisie zakładam, że masz podstawowe pojęcie o programowaniu. Jeżeli nie znasz JavaScript i Node.js to zrobiłem proste wprowadzenie do tematu.

Co to jest Node.js?!

NodeJS to środowisko programistyczne działające po stronie serwera, którego sercem jest JavaScript. Dzięki niemu można tworzyć różnego rodzaju aplikacje internetowego. To taka szybka definicja. Jeżeli ktoś z Was kojarzy czym jest i jak działa JavaScript, to może być zaskoczony serwerową wersją tego języka. Można powiedzieć, że temat jest w miarę „świeży”, bo wszystko zaczęło się raptem 10 lat temu. Dobra wiadomość jest taka, że Node.js szybko zyskał na popularności przez co dynamicznie się rozwija. Node.js jest używany między innymi przez takie firmy jak Google, Microsoft, Amazon czy Netflix.

Aby zainstalować sobie środowisko Nodej.js należy:

  1. Wejść na stronę projektu – nodejs.org.
  2. Pobrać najnowszą wersję w zależności od systemu operacyjnego.
  3. Zainstalować.

Od tego momentu możemy pisać skrypty JavaScript po stronie serwera. Aby uruchomić skrypt JavaScript w Node.js wystarczy, że zrobisz to na jeden z dwóch sposobów:

  1. Tworzysz prosty kod JavaScript np. console.log(1 + 1); i uruchamiasz to poleceniem node moj-plik.js. W tym konkretnym przypadku na ekranie pojawi się cyfra 2.
  2. Możesz też uruchomić środowisko Node.js komendą node (bez podawania ścieżki do pliku) i wykonywać kod na żywo.
    node
    > const FOO = 2;
    undefined
    > console.log(FOO);
    2
    undefined
    >

W tym poradniku docelowo będziemy korzystać z drugiego sposobu. Oczywiście będzie można wykorzystać też pierwszy sposób, ale o tym w dalszej części wpisu.

To co wyróżnia drona Tello na tle innych jest fakt, że ma swoje API (polecam zapoznać się z całym dokumentem) czyli zestaw komend, które można mu wystać a on je posłusznie wykona. A jak to zrobić, to zapraszam do dalszej lektury.

Zanim zaprogramujesz drona musisz wiedzieć jak się komunikować z dronem.

Kluczem do udanego zaprogramowania drona Tello jest zrozumienie komunikacji pomiędzy komputerem a urządzeniem. W naszym przypadku wszystko dzieje po WiFi. Dobra wiadomość jest taka, że nie jest to bardzo skomplikowane.

User Datagram Protocol czyli protokół pakietów użytkownika

Wydawanie poleceń odbywa się za pomocą protokołu UDP. Co to jest ten protokół UDP? Cytując za Wikipedią:

Jest to protokół bezpołączeniowy, więc nie ma narzutu na nawiązywanie połączenia […]. Korzyścią […] jest szybsza transmisja danych i brak dodatkowych zadań, którymi musi zajmować się host posługujący się tym protokołem. Z tych względów UDP jest często używany w takich zastosowaniach jak wideokonferencje, strumienie dźwięku w Internecie i gry sieciowe, gdzie dane muszą być przesyłane możliwie szybko.

Czyli już wiemy, że będziemy wysyłać proste wiadomości tekstowe do drona.

W praktyce oznacza to tyle, że użyjemy gotowej biblioteki Node.js dgram, odpowiednio ją skonfigurujemy by używała poznanego przed chwilą protokołu UDP a następnie użyjemy dostępnej metody send by wysyłać wiadomość pod adres IP i port drona Tello.

Minusem takiej komunikacji jest fakt, że dron „nie powie” nam że wykonał zadanie. Utrudni nam to stworzenie zaprogramowania sekwencji poleceń.

Kod wraz z komentarzem wygląda następująco:

Jak używać tego kodu by sterować dronem?

  1. Otwieramy terminal.
  2. Wchodzimy do node.
  3. Importujemy powyższy moduł.
  4. Tworzymy instancję.
  5. Łaczymy się z dronem.
  6. Wchodzimy w tryb poleceń.
  7. Startujemy.
  8. Lądujemy.
  9. Kończymy połączenie.

W praktyce wygląda to następująco:

node // 2
> var TelloController = require('./index').default; // 3
undefined
> var Tello = new TelloController(); // 4
undefined
> Tello.connect() // 5
undefined
> Tello.send('command'); // 6
undefined
> Response from Tello: OK
> Tello.send('takeoff'); // 7
undefined
> Response from Tello: OK
Tello.send('land'); // 8
undefined
> Response from Tello: OK
> Tello.closeConnection() // 9
undefined
> Connection closed

Z racji tego, że Tello powstał głównie po to by zachęcać do interesowania się programowaniem też nie chcę podawać wszystkiego na tacy. Zachęcam wszystkich do dopisania brakujących funkcji do wykonywania takich poleceń jak lot w bok, górę czy dół.

Na zachętę pokażę Wam metodę do wydania polecenia do zrobienia fikołka (flipa).

Analogicznie możecie zrobić z pozostałymi komendami (wszystko jest opisane w dokumentacji).

Jak widać programowanie nie jest takie trudne jak się mogło na początku wydawać. Mam nadzieję, że zachęciłem was w jakimś stopniu do zabawy z Nodem, JavaScriptem i dronem Tello. Jeżeli macie jakieś pytania, uwagi, to zapraszam do komentowania.

Link do repo na githubie.

Bonus: Jeżeli, przypadkiem, ktoś z czytelników mieszka w USA lub w Kanadzie, to może próbować swoich sił w programowaniu drona w zabawie IBM. Firma rozda 2000 dronów Tello :).

Bonus 2: Dosłownie wczoraj, Wes Bos (znany ze szkoleń JS) opublikować na YT dwa filmy w których tworzy kod JS do sterowania dronem Tello z poziomu przeglądarki. Wszystko z użyciem Node.js, websocketów a nawet wciągnął w to React.

Część pierwsza:

Część druga: