DJI の教育用トイドローン TELLO EDU で編隊飛行に挑戦(2)

前回の記事では、Tello EDUで編隊飛行をするためのWiFi設定の方法について解説しました。

DJI の教育用トイドローン Tello EDU で編隊飛行に挑戦(1)

この記事では、実際に複数のTelloを使用して編隊飛行を行うための方法について紹介します。

Telloの公式ドキュメントによるとTelloをプログラムで操作するにはUDPでコマンドを送信するだけなので、どんなプログラミング言語でも同じ要領でできますが、今回は Node.js を使用します。

準備

適当にプロジェクトを作ってください。

$ mkdir tello-swarm && cd tello-swarm
$ npm init

次に必要なモジュールをインストールします。

$ npm install node-tello-edu --save

このモジュールは僕が npm モジュールとして公開したものでリポジトリは以下のURLです。

https://github.com/miya0001/node-tello-edu

このモジュールは CLI コマンドも内蔵していて、以下のような感じでそのコマンドを実行することができます。

$ $(npm bin)/tello --help
Usage: tello [options] [command]

Options:
  -V, --version                   output the version number
  -h, --help                      output usage information

Commands:
  ap <ssid> <password> [options]  Set the Tello to station mode, and connect to the access point with ssid and password.
  shell                           Launch shell to control Tello.
  state                           Launch UDP server to recieve Tello state on 0.0.0.0:8890.
  help [cmd]

WiFi設定を行う

実際にコードを書く前にこのコマンドを使用してTelloを皆さんの環境のWiFiルーターに接続できるように設定しましょう。

Telloの電源を入れたあとでパソコンをTelloのWiFiに接続して以下のコマンドを実行してください。

$ $(npm bin)/tello ap <SSID> <PASSWORD>

<SSID> <PASSWORD> の部分は皆さんのWiFi環境の正しい値に置き換えてください。

コマンドをTelloが受け付けるとランプの色が変わるはずです。

WiFiルーターに接続したあと、ルーターから割り当てられた IP アドレスをTelloから知ることはできないので、ルーターの管理画面等でTelloに割り当てられたIPアドレスをメモってください。

このルーターに接続するための作業は、編隊飛行で使用するすべてのTelloに対して行う必要があります。

飛ばしてみる

以下のソースコードは、上述のモジュールを使用して2台のTelloで編隊飛行を行うサンプルです。

コードの中に含まれるIPアドレスは皆さんの環境のものに置き換えてください。

#!/usr/bin/env node

'use strict'

const tello = require('node-tello-edu')

const drone1 = new tello({
  ip: "192.168.43.208",
})

const drone2 = new tello({
  ip: "192.168.43.19",
})

// 離陸
drone1.takeoff()
drone2.takeoff()

// 1m上昇
setTimeout(() => {
  drone1.sendCommand('up 100')
  drone2.sendCommand('up 100')
}, 5000);

// 前に宙返り
setTimeout(() => {
  drone1.sendCommand('flip f')
  drone2.sendCommand('flip f')
}, 8000);

// 後ろに宙返り
setTimeout(() => {
  drone1.sendCommand('flip b')
  drone2.sendCommand('flip b')
}, 11000);

// 左右に宙返り
setTimeout(() => {
  drone1.sendCommand('flip l')
  drone2.sendCommand('flip r')
}, 14000);

// 内側に宙返り
setTimeout(() => {
  drone1.sendCommand('flip r')
  drone2.sendCommand('flip l')
}, 17000);

// 着陸
setTimeout(() => {
  drone1.land()
  drone2.land()
}, 20000);

いちいちsetTimeout()していますが、これがないとNode.jsが非同期でだだっとコマンドを送ってしまうからです。

どうもそれぞれの動作が終わる前にコマンドを送っても無視されるようなので、意図した動作が行われない場合は時間をうまく調整してください。

余談

さてさて、この一連のもろもろをやっていて気がついたのですが、Tello EDUはPC側のUDP 8890ポートに対して、Tello内部のセンサー情報(たとえば本体の傾きとか方向とか!)をひっきりなしに送ってきていることに気が付きました。

2万円弱のおもちゃドローンのくせになんというハイテク!

そんなわけで以下のリポジトリには上述した編隊飛行のサンプルとは別に、Telloを手で持って回したり傾けたりすると、別のもう一台のTelloがそれに反応して動作するというサンプルもあります。

https://github.com/miya0001/tello-example

以上、ややかいつまんだ説明となりましたがご参考になれば幸いです。