Help us understand the problem. What is going on with this article?

Tello-Pythonのサンプル「Tello_Video」を動かす

はじめに

このページは,

公式SDK「Tello-Python」を試そう

の1ページです.
全体を見たい場合は上記ページへお戻りください.

概要

DJI公式のTello用Pythonサンプルプログラム「Tello-Python」のうち,

 Tello_Video

を試す方法を記述します.

前提条件

ホームフォルダにTello-Pythonがインストールされているという前提で話を進めます.

Linuxマシンであれば /home/(ユーザー名)/ に,Tello-Pythonというフォルダがあることになります.

詳しくは Tello-Pythonのダウンロード を御覧ください.

ディレクトリの移動

まずはコンソール(端末)を開き,以下のコマンドを打って,フォルダを移動します.

cd(change_directory)
$ cd Tello-Python

lsコマンドでフォルダの中にあるファイルを見てみると,

Linux:lsの結果
$ ls
LICENSE.md               Tello_Video
README.md                Tello_Video_With_Pose_Recognition
Single_Tello_Test        doc
TelloPython_FAQ(CH).txt  tello_state.py
TelloPython_FAQ.txt      tello_video_dll(ForWin64).zip

Tello_Video というディレクトリがあることがわかります.
更にディレクトリ移動しましょう.

Tello_Videoへ移動
$ cd Tello_Video

lsコマンドでTello_Videoの中を見てみると,

Tello_Videoの中身
$ ls
LICENSE.md  README.md  h264decoder  img  install  main.py  tello.py  tello_control_ui.py

main.py というファイルがあることがわかります.
その他にtello.pytello_control_ui.pyというファイルもありますが,これらはmain.pyが呼び出すファイルなので,ユーザーが実行する必要はありません.

また,installh264decoderというディレクトリもあることも明記しておきます.
これらのディレクトリが,Telloのカメラ映像のストリーミングに関係しています.

全体の構成は下図の様になっています.
tello_video_system.png

システム構成のうち,tello.pyにあるTelloクラスが最も重要だと思います.
このTelloクラスを転用することで,Telloの映像を取ったり,コマンドを送信したりといった様々な発展が可能になります.

Tello-Pythonをダウンロードしただけでは,libh264decoder.soはありません.
この後の環境構築で,ビルドして作ります.

Tello_Videoのための環境構築

DJI公式SDK「Tello-Python」を使う上で最も重要な作業が,
「Tello_Video」「Tello_Video_With_Pose_Recognition」のための環境構築です.

gitのTello-Pythonのページには,インストール方法として

・Linux (Ubuntu 14.04 and above)

 Go to the "install\Linux" folder in command line, run

 chmod +x linux_install.sh
 ./linux_install.sh

と書いてあります.
すなわち,

フォルダ移動・ファイルの属性変更・シェルファイル実行
$ cd install/Linux/
$ chmod +x linux_install.sh
$ ./linux_install.sh

とコマンドを打てよ,ということです.
linux_install.shが,Linux用の環境構築を自動的に行ってくれるシェルスクリプトです.

Linuxに精通した方は「なんだ,shファイルがあるなら実行すればスグじゃん」と思うでしょう.
しかし,そのまま実行すると

  • pip本体のアップグレードを勝手にやるので,ディストリビューションによってはpipの不具合が生じる
  • OpenCVのバージョンが3.x系がインストールされない
  • cmakeはaptでインストールするのか,pipでインストールするのか

などのディストリビューションに依存した色々な問題が生じます.

特にOpenCVのバージョンが厄介です.

・Ubuntu16.04では現時点(2019年9月),
 sudo pip install opencv-pythonでバージョン指定しないと4.1.1.26が入ってしまいます.
 sudo apt install python-opencvだと2.4.9.1が入ってしまいます.

・Ubuntu18.04では現時点(2019年9月),
 sudo pip install opencv-pythonでバージョン指定しないと4.1.1.26が入ってしまいます.
 sudo apt install python-opencvだと3.2.0が入るので問題ないが,シェルファイル内ではpipの方を使っている.

・Raspberry Piでは,
 そもそもOpenCVのインストール方法が異なります.

以降,それぞれのインストール方法を解説します.

Ubuntu 16.04の場合

まずは,Linuxを最新の状態へ更新しておきます.

最新の状態へ更新
$ sudo apt update
$ sudo apt upgrade -y

Ubuntuの場合,linux_install.shの中身を少し書き換えれば,自動インストールできます.

すなわち,30行目の
sudo pip install opencv-python

sudo pip install opencv-python==3.4.5.20
と書き換えるだけです.
テキストエディタ(vi,nano,gedit,pluma,mousepadなど)を使って書き換えてください.
3.4.5.20は,pipでインストールできる3.x系の最新バージョンです.

linux_install.sh
#!/bin/sh

echo 'Compiling and Installing the Tello Video Stream module'
echo 'You might need to enter your password'

cd .. 
cd ..
sudo apt-get update -y

# install python 2.7
sudo apt-get install python2.7 python-pip -y
sudo pip install --upgrade pip

#switch to python2.7
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 150 
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100

sudo apt-get update -y

# install cmake
#sudo apt-get install cmake -y
sudo pip install cmake

# install dependencies
sudo apt-get install libboost-all-dev -y
sudo apt-get install libavcodec-dev -y
sudo apt-get install libswscale-dev -y
sudo apt-get install python-numpy -y
sudo apt-get install python-matplotlib -y
sudo pip install opencv-python==3.4.5.20   # ここに書き加えるだけ
sudo apt-get install python-imaging-tk

# pull and build h264 decoder library
cd h264decoder
mkdir build
cd build
cmake ..
make

# copy source .so file to tello.py directory
cp libh264decoder.so ../../

echo 'Compilation and Installation Done!'

書き換えたら,シェルファイルのあるフォルダへ移動して,
chmodで実行権限を与え,実行します.

フォルダ移動・ファイルの属性変更・シェルファイル実行
$ cd ~/Tello-Python/Tello_Video/install/Linux/
$ chmod +x linux_install.sh
$ ./install/Linux/linux_install.sh

以上で自動インストールされます.

このとき注意すべき点は,
必ず~/Tello-Python/Tello_Video/install/Linux/へカレントディレクトリを移動させ,
そこでlinux_install.shを実行すること
 です.

というのは,

linux_install.shの一部を抜粋
cd ..    # 1つ上のディレクトリへ移動
cd ..    # 1つ上のディレクトリへ移動
sudo apt-get update -y

()

# pull and build h264 decoder library
cd h264decoder    # h264decoderというフォルダへ入る
mkdir build
cd build          # buildというフォルダへ入る
cmake ..
make

# copy source .so file to tello.py directory
cp libh264decoder.so ../../      # 2階層上のフォルダへファイルをコピー

この様に,フォルダを2階層上がってaptやpipのインストールを行い,
h264decoderフォルダへ移動してライブラリのビルド&コピーを行っているからです.

もしも,Tello_Videoディレクトリから以下の様に

このように直接ファイルを呼んではいけない
$ ./install/Linux/linux_install.sh

相対パス指定してシェルを実行するとどうなるでしょうか.
~/Tello-Python/Tello_Video/の2階層上,すなわちホームディレクトリ~/まで上がってh264decoderへ入ろうとしてしまいます.当然ビルドできるわけがありません.

Raspbian Stretchの場合

Raspbian Stretchでは,linux_install.shを使わずに手動でインストールします.

まずは,Linuxを最新の状態へ更新しておきましょう.

最新の状態へ更新
$ sudo apt update
$ sudo apt upgrade -y

依存ライブラリのインストール

次にlinux_install.shがやっている作業と同様に,依存ライブラリをインストールしていきます.
ただし,OpenCVのインストールは後回しです.

cmakeに関しては,pipでインストールするよりもaptでインストールするほうが確実です.

関連ライブラリのインストール
$ sudo apt install cmake -y

$ sudo apt install libboost-all-dev -y
$ sudo apt install libavcodec-dev -y
$ sudo apt install libswscale-dev -y
$ sudo apt install python-numpy -y
$ sudo apt install python-matplotlib -y
$ sudo apt install python-imaging-tk

Raspberr PiでのOpenCV導入

Raspberry PiのOpenCVインストールは,ソースをダウンロードして自分でビルドする2時間コースが主流です(泣).
しかし,このページでmt08さんがビルド&公開してくれているdebianパッケージを使ってインストールすると,非常に簡単・短時間なのでオススメです.

  ラズパイ3にOpenCV3/4を簡単に導入

(もちろん「ビルド済みはトロイの木馬とか仕込まれていそうでなんか怖い」という玄人の方は,自分でビルドしてインストールしてください)

まずは上記ページの冒頭に書かれている一連のコマンドをコピーし,テキストエディタにペーストてシェルファイルを作ります.ファイル名は何でも良いのですが,ここではcv_install.shとでもしておきましょう.
以下に,抜粋したコマンドを書いておきますが,更新があるかもしれないので本家からコピペすることを推奨します.

cv_install.shというファイルを作ろう
OPENCV_DEB=libopencv3_3.4.6-20190415.1_armhf.deb

curl -SL https://github.com/mt08xx/files/raw/master/opencv-rpi/${OPENCV_DEB} -o ${OPENCV_DEB}
sudo apt autoremove -y libopencv{3,4}
sudo apt install -y ./${OPENCV_DEB}

#
sudo ldconfig
python2 -c 'import cv2; print(cv2.__version__)'
python3 -c 'import cv2; print(cv2.__version__)'

ホームディレクトリにcv_install.shを保存し,
実行権限を与えてから,実行します.

ビルド済みパッケージでのインストール
$ chmod +x cv_install.sh
$ ./cv_install.sh

ホームディレクトリにはlibopencv3_3.4.6-20190415.1_armhf.debというファイルがダウンロードされますが,インストール後は削除してしまってもかまいません.

cv_install.shの最後に書かれている様に,

PythonによるOpenCVの動作確認(バージョン表示)
python2 -c 'import cv2; print(cv2.__version__)'
python3 -c 'import cv2; print(cv2.__version__)'

Pythonでimportして,きちんと動くかどうか試してくれます.
OpenCVバージョン3.4.6が2回表示されたら成功です.
ここでエラーが出たら何か環境に問題があるという事になります.

H.264デコーダのビルド

最後にh264decoderディレクトリへ移動し,H.264デコーダのライブラリを作成します.

H264デコーダのビルドとファイルコピー
cd h264decoder
mkdir build
cd build
cmake ..
make

cp libh264decoder.so ../../

最終的に出来上がったlibh264decoder.soは,main.pyやtello.pyと同じ場所に置く必要があるので,cpコマンドで2階層上にコピーしていますね.

以上で環境構築は完了です.

(よく考えたら,一連の作業をラズパイ専用のシェルファイルとして記述できるなあ.今後作ります)

main.pyの実行

それでは,Telloの電源を入れて,WiFi接続を確認したら,
main.pyを実行してみましょう.

Tello_Videoの実行
$ python main.py

実行結果

Telloとうまく接続できていれば,下の写真のような画面が表示されます.
tello_video_default.png

「TELLO Controller」というタイトルの新しいウィンドウが作成され,そこにTelloのビデオ映像が表示されます.映像の下にはボタンが3つ並んでいます.
コマンドを打ち込んだ端末画面は,h.264ビデオのデコードに関するメッセージと,送信したSDKコマンドが表示されます.

実際にウィンドウを表示させてみると分かりますが,TelloはHD画質なので720pの映像が表示されます.
ちょっとウィンドウが大きすぎる,という感想を持ちました.
TELLO Controllerウィンドウのサイズを変更しても,サイズに合わせて映像もストレッチして表示されるのではなく,右側の映像が欠けるだけです(笑

映像サイズの調整などの改造は,別途記事を執筆しようと思います.

GUIの操作方法

TELLO Controllerのウィンドウには,
open_command_panel.png

  • Open Command Panel
  • Pause
  • Snapshot

の3つのボタンがあります.
それぞれの役割を解説します.

Open Command Panel

Open Command Panelボタンは,クリックするとCommand Panelという新しいウィンドウが開きます.
※Raspberry Piでは,このボタンを押さないと受信映像が表示されないことがあります.

command_panel.png

このウィンドウをアクティブにした状態で,

  • キーボードの'w','s','a','d'および矢印キーで,前後左右上下移動や旋回ができます.
  • Flip,Takeoff,Landボタンで宙返り,離着陸ができます.
  • スライダーを動かすと移動と旋回の移動量を変えることができます.デフォルトは20cmと30度.

要はこのウィンドウを使うと,簡易的にtakeoffとかleft 20とかのコマンドを送信できるので,スマートフォンのTelloアプリの様に遠隔操縦することができる,ということです.

Pause

Pauseボタンは,クリックするとTelloの映像をポーズして,望みの画像を表示し続けるボタンです.
再度クリックすればリアルタイムの映像に戻ります.

ポイントとしては,
「映像受信のUDPサーバを止めてパケットの受信を中止する」とか
「H.264のデコードを中止してCPU負荷を下げる」とか
などの工夫はまったくされていません(爆

停止時の画像でウィンドウを再描画し続けていますし,裏でTelloからの映像受信とデコードは続いているので,負荷軽減にはまったく寄与しません...

Snapshot

Snapshotボタンは,クリックした時のビデオ画像を(年月日_時分秒).jpgという名前でimgディレクトリの中に保存します.

おわりに

今回は「Tello_Video」の環境構築,使用法を解説しました.

Tello_Videoは,以降様々な画像処理プログラムを作る上で重要なサンプルなので,プログラム解説は別途 記事を執筆する予定です.

 

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away