【Python】TelloをSDKモードにし、コマンドを送信して自動飛行

プログラミング言語Pythonで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からステータス情報やカメラ映像(streamonで有効化した場合)がPCに送られてくるので、それらを取得できます。

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の標準入力についての説明を省略しますが、以下ページで説明していますので参考にしてください。

【Python】標準入力でキーボードからデータを受け取り(sys.stdin.readlines、input関数)
Python言語のsys.stdin.readlines、input関数などを用いて標準入力を実装する方法をソースコード付きで解説します。

ソケット通信するためのsocketモジュールについても、以下ページで説明しています。

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

コメント