【Python】Telloのカメラ映像を取得して、コマンドで自動飛行

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

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

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で有効化した場合)が送られてくるので、それらを取得できます。

以下記事では、機体の遠隔制御について解説しました。

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

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

【Python/OpenCV】動画ファイル・カメラの読み込み・再生
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」を遠隔制御したり自律飛行させて遊ぶ方法について入門者向けにまとめました。

コメント

  1. ogishin より:

    はじめまして。こちらのページを参考にPython環境を整え、サンプルコードでの動作を確認しました。
    一点お聞かせください。
    ご利用ノートパソコンは「Mac」と思いますが、Windows10環境でも動作しますがアルファベットキーは問題ないのですが、カーソルキー(上下左右矢印)キーのみ反応しません。
    なにか確認する内容などあればお聞かせください。
    よろしくお願いいたします。

    • 管理人 より:

      コメントありがとうございます。Windowsでも矢印キーを扱えるかわかりませんが、

      key = cv2.waitKey(1)
      print(key)

      などで、矢印キーを入力したときに、どのような値がkeyに格納されているか確認されてみるのはどうでしょうか。

タイトルとURLをコピーしました