【Python×Tello】ドローンを遠隔制御・自律飛行させて遊ぶ方法

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 StoreGoogle 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接続が切れると、自動的にその場に着陸します。
【Python/OpenCV】ドローン「Tello」をアニメ顔を追跡するよう飛行させる
Python/OpenCVで、ドローン「Tello」をアニメ顔を追跡するよう飛行させる方法についてまとめました。

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通信の実装についての説明を省略しますが、それぞれ以下ページで説明していますので参考にしてください。

【Python超入門】使い方とサンプル集
Pythonの使い方について、基礎文法から応用例まで入門者向けに解説します。

サンプルコード

キーボード入力でコマンドを送信し、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標準モジュール)については説明を省略しますが、以下ページで説明してますので参考にしてください。

【Tkinter入門】PythonでGUIアプリケーションを簡単に作ろう
Python用モジュール「Tkinter」でGUIアプリを作成する方法についてソースコード付きでまとめました。

サンプルコード


TelloとPCをWiFiで接続し、Pythonプログラムを実行して、コントロール画面の「▲離陸」ボタンを押せばTelloが離陸し、その後は各種ボタンにしたがってTelloが動いてくれます。

【Python】TelloをSDKモードにし、コマンドを送信して自動飛行
プログラミング言語PythonでTelloにコマンドを送信して自動制御して飛行させる方法について入門者向けにまとめました。

Telloのカメラ映像を受信してPC側で表示

Telloのカメラ映像受信について学ぶために、まずは単純に映像をPC側で受信して画面表示させてみます。
受信した動画データのキャプチャと画面表示にはOpenCVモジュールを使います。ここでは、OpenCVモジュールの使い方については説明を割愛しますが、以下ページで詳細に解説していますので、良かったら参考にしてみてください。

【Python/OpenCV】cv2.VideoCaptureで動画ファイル・Webカメラ映像の読み込みと再生
Python版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となります。

実行例

実行例は以下のとおり(動画)。

サンプルコード

サンプルプログラムのソースコードです。


【Python】Telloのカメラ映像を取得して、コマンドで自動飛行
プログラミング言語PythonでTelloのカメラ映像を取得して、コマンドを送信して自動制御して飛行させる方法について入門者向けにまとめました。

アニメ顔を追跡するようドローン「Tello」を自律飛行

以下動画のような感じで、アニメ顔を追跡するようドローン「Tello」を自律飛行させてみます。

実行例

なお、PythonでTelloを遠隔操作する方法については以下ページで紹介しています(このページでは説明省略)。

【Python×Tello】ドローンを遠隔制御・自律飛行させて遊ぶ方法
Python言語でドローン「Tello」を遠隔制御したり自律飛行させて遊ぶ方法について入門者向けにまとめました。

OpenCVモジュールを用いてアニメ顔の検出方法については以下ページで紹介しています(このページでは説明省略)。

【Python版OpenCV】Haar Cascadeで顔検出、アニメ顔検出、顔にモザイク処理
Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔検出、アニメ顔検出、顔にモザイク処理する方法をソースコード付きで解説します。

今回作成するプログラムの処理の流れは、以下のとおりです。

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」を用いると、色々と楽しめます。

【Python/OpenCV】ドローン「Tello」をアニメ顔を追跡するよう飛行させる
Python/OpenCVで、ドローン「Tello」をアニメ顔を追跡するよう飛行させる方法についてまとめました。
【Python】ドローン「Tello」を遠隔制御するための環境構築【SDKのインストールなど】
ドローン「Tello」を遠隔制御するための環境構築についてソースコード付きで解説します。

コメント