Python言語でドローン「Tello」を遠隔制御したり自律飛行させて遊ぶ方法について入門者向けにまとめました。
RYZE社製ドローン「Tello」とは
「Tello」とは、約80gの格安ドローンで、DJIとインテルの技術供与を受けたRYZE社が開発しています。
そのため、他の格安ドローンと比べても安定性が高く、コストパフォーマンスの高い機体です。
また、他のドローンと違い、最初からPythonのプログラムによる遠隔操作ができるように設計されており、Pythonで操作するためのSDKが公開されているため、自分でカスタマイズして色々な楽しみ方ができます。
Telloには、「Tello(通常版)」と「Tello EDU(教育用)」の2タイプがあります。どちらも。Pythonで簡単に遠隔操作できますが、「Tello EDU」の方が価格が高い代わりに、簡単に編隊飛行をさせることができ、より教育向けになっています。
(今回は1万円程度で入手可能な「Tello(通常版)」を使います)
参考
Tello EDUは、各機体がWi-Fi子機となって1つのネットワークに接続するため、複数の機体に同時にコマンドを送る事が可能です(編隊飛行可能)。
一方、通常のTelloは各機体がWi-Fi親機となるため、各機体が異なるネットワークに繋がり、複数の機体に同時にコマンドを送る事が難しいです(遅延発生)。
項目 | Tello | Tello EDU |
---|---|---|
GPS | 非搭載 | – |
最大飛行時間 | 13分 | – |
最大伝送距離 | 100m | – |
動画解像度 | 720p | – |
プログラミング | △ | ○ |
動画記録方法 | Wi-Fi伝送 | Wi-Fi伝送 |
センサ | ジャイロセンサ、気圧センサ搭載 | – |
重量 | 80g | 87g |
編隊飛行 | △ | ○ |
ミッションパッド | 無 | 有 |
価格 | 12,800円 | – |
今回の目標
Python言語と格安ドローン「Tello」の組み合わせだと、簡単にドローンの遠隔制御や自律飛行をさせるプログラミングができます。このページでは、最終的に以下動画のようなドローンの遠隔操作ソフトやアニメ顔を追跡して自律飛行させる方法を紹介します。
なお、本ページのコンテンツは以下それぞれの記事を要約したものになります。
目次 | 概要 |
---|---|
Telloの基本操作 | Telloの基本操作 |
Pythonの環境構築 | Pythonの開発環境を構築する方法 |
コマンドで自動制御 | Pythonの標準モジュールでTelloを自動制御 |
カメラ映像を取得 | Tello SDKとOpenCVでTelloのカメラ映像を取得 |
自律飛行(アニメ顔を追跡) | カメラ映像を使ってTelloを自律飛行させる応用例 |
アプリの初期設定から動作確認飛行までの流れ
最終的には、アプリでなくPythonでドローンを操作しますが、設定変更等でアプリが必要になりますので、ドローンの動作確認も兼ねてアプリの初期設定について紹介します。
● スマートフォンやタブレットに専用アプリ「TELLO」をインストールします。
・Apple App Store、Google Play Store
●TELLOの機体側面にある電源ボタンを長押しして、電源をONにします。
●機体正面のLEDランプが赤→緑→黄色に点滅すれば、機体準備中となります。
● スマートフォンやタブレットのWi-Fi接続設定画面を見ると、SSIDが「TELLO-〇〇〇〇」のWi-Fiスポットが出てきますので、それに接続します。
※TelloはWi-Fiスポット(親機)となります
● スマホで「TELLO」のアプリを起動し、Telloの機体にあるカメラ映像の画面が出たら成功です。これでTelloをアプリ画面で操作できます。
Telloアプリの基本操作は以下のとおり。
– | – |
---|---|
1 | 画面左上の離陸ボタンを押し、「離陸しますか?」と表示が出てきます。スライドしてONにすると、機体が離陸します。 |
2 | 離陸して0.5〜1mくらい上昇したところで機体は待機します。 |
3 | スマホアプリの画面上のコントローラーから上昇下降・前後左右移動、回転などの操作ができます。 |
4 | コントローラー画面の右上部分のボタンから撮影モード(静止画、動画)の切り替えと撮影開始・終了のボタンがあります。ボタンを押すとアプリ内に静止画や動画データが記録されます。 |
5 | コントローラー左側の上矢印は上昇、下矢印は下降、左右は右旋回と左旋回 |
6 | コントローラー右側の上矢印は前進、下矢印は後退、左右は左右への平行移動 |
7 | プリの画面左上のボタンが離陸から着陸に変わっており、これを押すと「タップして着陸」と「手のひら着陸」のどちらかを選択して、そのように着陸できます。 |
8 | Wi-Fi接続が切れると、自動的にその場に着陸します。 |
Telloを遠隔制御してみよう(コマンド入力版)
Telloの遠隔制御について学ぶために、まずはPCからキーボードを用いたコマンド入力で遠隔制御してみます。
Telloは、PCとWi-Fiで接続し、ソケット通信(UDP/IP)によりTelloへ命令(離陸、着陸、移動など)したり、Telloから機体のステータス情報(バッテリー残量など)を取得できます。
Telloへ命令を送る場合、Telloから機体のステータス情報を取得する場合、Telloからカメラ映像を取得する場合、それぞれ以下のように通信を行います。
動作 | 通信方法 |
---|---|
Telloへ命令を送る場合 | TelloのIPアドレス・ポート宛て(192.168.10.1:8889)にコマンドをUDP通信で送信 |
Telloから機体のステータス情報を取得する場合 | 操作用のPC宛て(0.0.0.0:8880)にUDP通信で送られてくるのでUDP通信で受信 |
Telloからカメラ映像を取得する場合 | Telloへビデオストリーム有効化の命令(streamon)を送ると、操作用のPC宛て(0.0.0.0:11111)にUDP通信で送られてくるのでUDP通信で受信 |
大まかな手順は以下のとおりです。
– | – |
---|---|
1 | Telloの電源を入れると、TelloはWi-Fi親機(SSID:TELLO-〇〇)となるので、PCでそこへ接続します。 |
2 | PC側でPythonプログラムを起動し、UDPソケット通信で、IPアドレスは「192.168.10.1」、ポート番号は「8889」宛に「command」というテキストを送信すると、Telloがコマンドモードになります(コマンドで制御可能な状態となる)。 |
3 | 以下のコマンドをテキストで送信すると、Telloが命令(コマンド)に従って動作します。また、機体からステータス情報やカメラ情報が一方的に送られてくるので、それらを取得できます。 |
Telloで使える主なコマンドは以下のとおりです。
説明 | 動作 | 値の範囲 |
---|---|---|
Command | SDKモードを開始(コマンドでTelloを遠隔操作する際に最初に必ず実行) | ー |
streamon | ビデオストリームを有効化(カメラ映像を送信する) | ー |
streamoff | ビデオストリームを無効化(カメラ映像を送信しない) | ー |
emergency | 緊急停止(すぐにモーターを停止させる) | ー |
wifi ssid pass | Wi-FiのSSIDとパスワードを設定(Telloアプリからでも設定可能) | ssid:SSID、pass:パスワード |
ap ssid pass | Telloをステーションモードに設定し、アクセスポイントのSSIDとパスワードを使用して新しいアクセスポイントに接続 | ssid:SSID、pass:パスワード |
takeoff | 離陸 | ー |
land | 着陸 | ー |
stop | 空中で停止(ホバリング) | ー |
speed x | 速度をx[cm/s]に設定 | 10〜100 |
left x | 左にx[cm]移動 | 20~500 |
right x | 右にx[cm]移動 | 20~500 |
forward x | 前にx[cm]移動 | 20~500 |
back x | 後ろにx[cm]移動 | 20~500 |
up x | x[cm]上昇 | 20~500 |
down x | x[cm]下降 | 20~500 |
cw x | 右回りにx[度]回転 | 1〜360 |
ccw x | 左回りにx[度]回転 | 1〜360 |
flip x | x方向に反転 | ”l”:左、”r”:右、”f”:前、”b”:後ろ |
speed? | 現在の速度[cm/s]を取得 | 0〜100 |
battery? | 現在のバッテリー残量[%]を取得 | 0〜100 |
time? | 現在の飛行時間[秒]を取得 | ー |
wifi? | 現在のWi-FiのS/N比(信号雑音比)を取得 | ー |
sdk? | Tello SDKのバージョンを取得 | ー |
sn? | Telloのシリアルナンバーを取得 | ー |
height? | 現在の高さ(cm)を取得 | 0-3000 |
temp? | 現在の温度(℃)を取得 | 0-90 |
attitude? | IMU(慣性計測装置) の姿勢情報を取得 | ー |
baro? | バロメータ(気圧計)の値(m)を取得 | ー |
acceleration? | IMU角加速度データを取得 | ー |
tof? | TOFからの距離(cm)を取得 | 30-1000 |
Pythonの基礎文法、環境構築、標準入力、UDP通信の実装についての説明を省略しますが、それぞれ以下ページで説明していますので参考にしてください。
サンプルコード
キーボード入力でコマンドを送信し、Telloを遠隔制御するサンプルコードは以下のとおりです。
上記サンプルコードを実行し、以下のコマンドを1行ずつ順に標準入力で実行すると、Telloが「SDKモード有効化→離陸→30cm上昇→30cm上昇→50cm上昇→100cm下降→着陸」します。
command takeoff up 30 up 30 up 50 down 100 land
Telloの電源を入れてPCと接続するたびに、最初に必ず「command」を実行しないと、SDK機能が有効化されないため、遠隔操作ができないので注意が必要です。
Telloを遠隔制御してみよう(コントロール画面でボタン操作版)
次のようなコントロール画面をTkinter(Python標準モジュール)で作成し、ボタン操作で簡単にTelloを遠隔制御してみます。
今回、コントロール画面を作成するためのTkinter(Python標準モジュール)については説明を省略しますが、以下ページで説明してますので参考にしてください。
サンプルコード
TelloとPCをWiFiで接続し、Pythonプログラムを実行して、コントロール画面の「▲離陸」ボタンを押せばTelloが離陸し、その後は各種ボタンにしたがってTelloが動いてくれます。
Telloのカメラ映像を受信してPC側で表示
Telloのカメラ映像受信について学ぶために、まずは単純に映像をPC側で受信して画面表示させてみます。
受信した動画データのキャプチャと画面表示にはOpenCVモジュールを使います。ここでは、OpenCVモジュールの使い方については説明を割愛しますが、以下ページで詳細に解説していますので、良かったら参考にしてみてください。
サンプルコードと実行結果
Telloからカメラ映像を受信し、PC側で画面に表示するサンプルプログラムのソースコードです。
上記サンプルコードを実行すると、画面が表示されTelloのカメラ映像が表示されます。
Telloのカメラ映像を受信してキーボードで制御
OpenCVモジュールには、キー入力操作を実装する機能「cv2.waitKey()」があります。
これを用いて、Telloのカメラ映像をPC側でリアルタイム表示しながらキー入力でドローンを操作してみます。
今回は以下の仕様にしてみます。
キー入力 | Telloの動作 |
---|---|
qキー | 終了 |
↑キー | 前進 |
↓キー | 後進 |
←キー | 左進 |
→キー | 右進 |
jキー | 離陸 |
kキー | 着陸 |
hキー | 上昇 |
lキー | 下降 |
uキー | 左回りに回転 |
iキー | 右回りに回転 |
nキー | 低速モード |
mキー | 高速モード |
また、Telloから受信した機体ステータス情報を用いて、画面左上に「キー入力で実行中の動作(Cmd)」「バッテリー残量(Battery)」「飛行時間(Time)」「ステータス(Status)」を表示させます。
「ステータス(Status)」は、正常時にドローンを操作しようとするとTrue、異常時(機体が大きく傾いて着地しているなど)にドローンを操作しようとするとFalseとなります。
実行例
実行例は以下のとおり(動画)。
サンプルコード
サンプルプログラムのソースコードです。
アニメ顔を追跡するようドローン「Tello」を自律飛行
以下動画のような感じで、アニメ顔を追跡するようドローン「Tello」を自律飛行させてみます。
実行例
なお、PythonでTelloを遠隔操作する方法については以下ページで紹介しています(このページでは説明省略)。
OpenCVモジュールを用いてアニメ顔の検出方法については以下ページで紹介しています(このページでは説明省略)。
今回作成するプログラムの処理の流れは、以下のとおりです。
– | – |
---|---|
1 | カメラ映像を取得する。jキーを押すとTelloが離陸する(離陸させないとアニメ顔を追跡するようTelloは飛行しない。 |
2 | カメラ映像のフレーム中からアニメ顔の中心位置と範囲(矩形)を検出する(検出器にはカスケード型識別器を利用)。 |
3 | アニメ顔の中心位置が、フレームの中心付近にくるように3.1〜3.6のようにTelloを動かし続けます。 |
3.1 | アニメ顔の中心位置が、フレームの中心付から左にずれていれば左旋回する。 |
3.2 | アニメ顔の中心位置が、フレームの中心から右にずれていれば右旋回する。 |
3.3 | アニメ顔の中心位置が、フレームの中心から上にずれていれば下降する。 |
3.4 | アニメ顔の中心位置が、フレームの中心から上にずれていれば上昇する。 |
3.5 | アニメ顔の中心位置が、アニメ顔の範囲(矩形)が小さければ前進する。 |
3.6 | アニメ顔の中心位置が、アニメ顔の範囲(矩形)が大きければ後進する。 |
アニメの顔を検出するために、有志が公開されている「lbpcascade_animeface.xml(https://github.com/nagadomi/lbpcascade_animeface)」を使います。
ダウンロードし、プログラム中でファイルのパスを指定してあげてください。
このように、Python言語と1万円ちょいの格安ドローン「Tello」を用いると、色々と楽しめます。
コメント