Raspbianで「Tello_Video」の環境構築

(2020年3月6日追記)
メモリ4GBのRaspberry Pi 4，Raspbian Busterで試しました．
ラズパイ3, Stretchの時よりもスムーズに動いています．


#はじめに
このページは，

[Tello-Pythonのサンプル「Tello_Video」を動かす](https://qiita.com/hsgucci/items/c9082690c6d0695b722f)

の補足ページです．


#概要

DJI公式のTello用Pythonサンプルプログラム「Tello-Python」のうち，
　[Tello_Video](https://github.com/dji-sdk/Tello-Python/tree/master/Tello_Video)
を試すためには、あらかじめ

- 様々な依存ライブラリのインストール
- H.264ビデオのデコードライブラリのビルド

を行う必要があります。

gitの[Tello-Pythonのページ](https://github.com/dji-sdk/Tello-Python/tree/master/Tello_Video#installation)には，インストール方法として

```
・Linux (Ubuntu 14.04 and above)

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

　chmod +x linux_install.sh
　./linux_install.sh
```

と書いてあります．
すなわち，

```bash:フォルダ移動・ファイルの属性変更・シェルファイル実行
$ cd install/Linux/
$ chmod +x linux_install.sh
$ ./linux_install.sh
```
とコマンドを打てよ，ということです．
<font color="blue">**linux_install.sh**</font>が，Linux用の環境構築を自動的に行ってくれるシェルスクリプトです．

Linuxに精通した方は「なんだ，shファイルがあるなら実行すればスグじゃん」と思うでしょう．
しかし，Raspberry Piでは手順どおり実行してもうまく行きません．
原因は以下の２点です．

- cmakeのインストールはデフォルトのpipではダメ．aptでインストールすべき
- OpenCVのインストールがIntel系Ubuntuの様に簡単ではない

cmakeの方は，`linux_install.sh`の書き換えで対応できますが，OpenCVが厄介です．今回は少々手抜きの方法で行います．

#前提条件

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

#ディレクトリの移動
まずはコンソール(端末)を開き，以下のコマンドを打って，Tello-Videoのフォルダへ移動します．

```bash:cd(change_directory)
$ cd ~/Tello-Python/Tello-Video
```

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

```bash:Tello_Videoの中身
$ ls
LICENSE.md  README.md  h264decoder  img  install  main.py  tello.py  tello_control_ui.py
```
`install`というディレクトリがあることが分かります．
このディレクトリの中身は，

```bash:installディレクトリの中
$ ls install/
Linux  Mac  Windows
```
この様になっていて，Linux，Mac，Windowsそれぞれのディレクトリにインストール用のファイルが置いてあるのですが，**<font color=red>どれも古くて使い物になりません</font>**．

Raspberry Piの場合，OpenCVのインストールがaptやpipで簡単にいかないのが問題です．

#Raspbianの更新

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

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

#最初にOpenCVの導入

Raspberry PiのOpenCVインストールは，ソースをダウンロードして自分でビルドする２時間コースが主流です（泣）．
しかし，以下の参考ページでmt08さんがビルド＆公開してくれているdebianパッケージを使ってインストールすると，非常に簡単・短時間なのでオススメです．

- Stretchの場合　[ラズパイ3にOpenCV3/4を簡単に導入](https://qiita.com/mt08/items/e8e8e728cf106ac83218)
- Busterの場合　[ラズパイ: Buster向け OpenCV4](https://qiita.com/mt08/items/4e8c36ee398fea5ed8d9)

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

##Raspbian Stretchの場合

　[ラズパイ3にOpenCV3/4を簡単に導入](https://qiita.com/mt08/items/e8e8e728cf106ac83218)

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

```bash: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`を保存し，
実行権限を与えてから，実行します．

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

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

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

```bash:PythonによるOpenCVの動作確認(バージョン表示)
python2 -c 'import cv2; print(cv2.__version__)'
python3 -c 'import cv2; print(cv2.__version__)'
```
Pythonでimportして，きちんと動くかどうか試してくれます．
OpenCVバージョン`3.4.6`が２回表示されたら成功です．
ここでエラーが出たら何か環境に問題があるという事になります．

##Raspbian Busterの場合

　[ラズパイ: Buster向け OpenCV4](https://qiita.com/mt08/items/4e8c36ee398fea5ed8d9)

上記ページは，BusterでのOpenCV3のインストールのヒントに使いました．
Stretchの時のようにコピー＆ペーストできるシェルのソースが無いので，自分で作ります．

Buster用の最新のdebパッケージファイルは
https://github.com/mt08xx/files/tree/master/opencv-rpi/raspbian-buster
ここにあります．
ラズパイ２,３,４用のパッケージにはファイル名に`armv7l`が含まれています．
2020年3月現在では`libopencv3_3.4.9-20191223.1_armv7l.deb`が最新でした．

下記のコマンドをコピーし，テキストエディタにペーストしてシェルファイルを作ります．ファイル名は`cv_install_buster.sh`とでもしておきましょう．

```bash:cv_install_buster.shというファイルを作ろう
curl -SLO https://github.com/mt08xx/files/raw/master/opencv-rpi/raspbian-buster/libopencv3_3.4.9-20191223.1_armv7l.deb
sudo apt autoremove -y libopencv{3,4}
sudo apt install -y ./libopencv3_3.4.9-20191223.1_armv7l.deb

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

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

```bash:ビルド済みパッケージでのインストール
$ chmod +x cv_install_buster.sh
$ ./cv_install_buster.sh
```
ホームディレクトリには`libopencv3_3.4.9-20191223.1_armv7l.deb`というファイルがダウンロードされますが，インストール後は削除してしまってもかまいません．

OpenCVバージョン`3.4.9`が２回表示されたら成功です．
ここでエラーが出たら何か環境に問題があるという事になります．

#linux_install.shの書き換え

次に`linux_install.sh`をRaspberry Pi用に書き換えます．

1. cmakeをpipインストールからaptインストールに変更
2. OpenCVのインストールは既に終わっているのでコメントアウトして無効化

以上の２つの作業を行います．

すなわち，21,22行目の

```bash:変更前
# install cmake
#sudo apt-get install cmake -y
sudo pip install cmake
```
を

```bash:変更後
# install cmake
sudo apt-get install cmake -y
#sudo pip install cmake
```
へと書き換えるだけです．
また，30行目のOpenCVのインストールは

```bash:OpenCVのインストールはコメント化
#sudo pip install opencv-python
```
の様に無効化します．

 
テキストエディタ(vi,nano,gedit,pluma,mousepadなど)を使ってlinux_install.shを書き換えてください．
以下にnanoで書き換える例を記載しておきます．

```bash:nanoで書き換える例
$ nano install/Linux/linux_install.sh
```
nanoで編集する場合はctrl+oでファイルを保存，ctrl+xでエディタ終了です．


```shell: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   # ここをコメントアウト
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!'
```

#linux_install.shの実行 

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

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

以上で自動インストールされます．
aptやpipのためのファイルダウンロードに失敗している時は，
Ctrl+cで一旦終了して，再度実行してください．
3回ぐらいやれば無事インストールされるはずです．(-_-;;;

インストールが完了したら，`Tello-Video`のディレクトリに戻っておきましょう．

```bash:２つ上の階層へもどる
$ cd ../../
```
**<font color=blue>これで作業は完了です．</font>**


#おわりに

Raspberry Piでもインストールはできるのですが，
**デコードエラーが頻発**したり，
**Tello_Videoプログラムを終了させようとしてもゾンビ化して死なない現象が発生**したりと，
トラブル頻発します．とにかく重いです．

メモリ4GBのRaspberry Pi 4なら大丈夫なのかなあ．．．4とBusterでも試してみます．

次はWindowsでの環境構築方法を書きます．