Tomofiles Note

ドローンとインターネット、そして人との関係を考えるソフトウェアエンジニアのアウトプットブログ

トイドローン"Tello"をGolangでプログラミングしてみた

こんにちは。

最近、DJI×Intelのトイドローン、Telloを買いました。
思えば、ドローン案件にアサインされていながら、機体を触る機会が少なかったなぁと思い、
いまさらながら、ドローンプログラミングに手を出してしまいました。
いきなりPhantom4とかを買うのは、金銭的に無理なので、ちょっと調べて、
いい感じに教育用とかで使われているトイドローンを見つけて買いました。

今回は、このTelloとGolangで接続して、テレメトリ表示とコマンド飛行指示ができるとこまで、
試したのでそこまでのまとめ記事です。


Telloってなに

上にも書いちゃいましたが、Telloはドローン界のAppleと言われるDJIと、
CPU部分をIntelで共同開発し、Ryze Techから発売されている、トイドローンです。
トイドローンとは言いますが、機能は立派なドローンです。

www.ryzerobotics.com

何ができるの

スマートフォンに専用アプリがあり、コントローラ(プロポ)として操作でき、
Telloに搭載されたカメラからリアルタイムに受信した動画を映しながら飛ばしたり、
自動離着陸が出来たりと、高級機種に引けを取らない機能を搭載しています。

何よりこのTelloはSDKを提供しており、プログラミングでドローンを制御出来ます。
上の公式HPからSDK仕様書がダウンロードでき、pythonのサンプルなんかが提供されています。

今回やってみたこと

とりあえずドローンプログラミングといえば、

  • フライトコントロール
  • フライトテレメトリの取得

が、最低限必要だろうということで、これらができることを目標にしました。

ソースコードは、以下に公開しています。

GitHub - Tomofiles/tello

機器構成

Telloとの通信はUDPが使用されているということで、UDPサーバを立てたりして、
Telloと会話するようになっています。
テレメトリは1秒間に複数メッセージ受信するようなので、せっかくなのでリアルタイムに
閲覧できると面白いかなということで、ブラウザにWebsocket配信するようにしました。

機器構成は以下の通りです。

f:id:Tomofiles:20190531231023p:plain
Telloとの接続構成

基本的に、Golangコマンドラインで標準入力で飛行指示をコマンド入力するので、
ブラウザにWebsocketで配信するのはおまけみたいなものです。

ちなみに、ブラウザとサーバは上の絵では別に描かれていますが、同一ノートPC上にいます。
UDPって今回始めて使いましたが、センサー等のテレメトリを通信するには良いかもしれませんね。

ハマったこと

そんなにハマったことではないですが、Telloからテレメトリを受信しようと思ったら、
うまく受信出来なくて、小一時間くらい唸りました。
原因はなんてことなくて、ファイアウォールです。

私のノートPCはLinux(Mint)使っているので、以下のコマンドで解決です。

ufw allow 8890

やっといて便利だったこと

TelloはPCとネットワークを占有します。
よって、Telloと通信しながら、インターネットに繋いだり出来ないのです。
NICが1つしかないPCだとどうにもならなくて、これが微妙に不便で、かなり難儀しました。
私は、昔ラズパイ(2時代)用に買ったUSBタイプの無線LANアダプタがあったので、
それをノートPCに差したら、解決しました。

今回作ったやつの使い方

使い方は簡単。
Makefileにコマンドを全部用意しているので、
deps→install→runの順番で実行していけば、アプリを起動出来ます。
runする前に、Telloをネットワークに接続しておいてください。

起動すると

command? > 

という、初代ドラ○エを彷彿とさせるプロンプトが出ます笑
ここには、Tello SDKに記載されているコマンドを入力することが出来ます。
バリデーションチェックとかはしていないので、変なコマンド打つとTelloがどうにかなるかもしれません。
試してませんが。

ブラウザでlocalhost:8080にアクセスすると、テレメトリビューアが表示されます。
これは、8890ポートで受信するドローンステートを成形して表示しているだけです。
飛行させなくても、ドローンを持ち上げて傾けるだけで各種パラメータが変化するので
意外と面白いです。

今後の展望

こんなところでしょうか。
Tello SDK使ってて気になったのは、ドローンの飛行位置(なんらかの座標)が
取得できる手段が無いなぁと。商用機体とかだと、緯度経度の座標で飛行位置が
わかるようになっているはずですが、Telloは無理です。
まぁ、飛行範囲がせいぜい数10メートルなので、GPSとかは意味ないですもんね。

以下のリポジトリとか見てみると、自分で座標を計算しているようですが、
実際の飛行位置とかもセンシングできると楽しそうですけどね。

GitHub - SMerrony/tello: The tello Go (golang) package is an unofficial, easy-to-use, standalone API for the Ryze Tello® drone.

このライブラリの中で、オートパイロットを実現しているようですが、
今後はこの辺を深めてみると、Telloの使い方が広がって面白そうです。

追伸

今回作ったやつ、landコマンドが効かないのだけど、なんでだろう・・・?

2019/6/3 追記
gobotを使用しないように変更。
純粋なUDPクライアントに変更したら、landコマンドが利くようになった。