Ubuntuで「Tello_Video」の環境構築

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

[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ファイルがあるなら実行すればスグじゃん」と思うでしょう．
しかし，そのまま実行すると

<!-- - pip本体のアップグレードを勝手にやるので，ディストリビューションによってはpipの不具合が生じることも -->

- OpenCVのバージョンが3.x系がインストールされない

<!-- - cmakeはaptでインストールするのか，pipでインストールするのか -->

という不具合が生じます．

・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の方を使っている

というわけで，**`linux_install.sh`を書き換えれば問題解決できます．**

#前提条件

ホームフォルダ(~)に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>**．

ですが，Linuxは多少の変更で対応できます．

#Linuxの更新

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

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

#linux_install.shの書き換え

Ubuntuの場合，<font color="blue">**linux_install.sh**</font>の中身を少し書き換えれば，自動インストールできます．

すなわち，30行目の
`sudo pip install opencv-python`
を
`sudo pip install opencv-python==3.4.5.20`
と書き換えるだけです．
3.4.5.20は，pipでインストールできる3.x系の最新バージョン(2019年9月時点)

テキストエディタ(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==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!'
```

#linux_install.shの実行 

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

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

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

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

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

##注意点

linux_install.shでのインストールで注意すべき点は，
<font color="red">**必ず`~/Tello-Python/Tello_Video/install/Linux/`へカレントディレクトリを移動させ，
そこで`linux_install.sh`を実行すること**</font>　です．

というのは，

```bash:linux_install.shの一部を抜粋
cd ..    # １つ上のディレクトリへ移動
cd ..    # １つ上のディレクトリへ移動
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 ../../      # ２階層上のフォルダへファイルをコピー
```
この様に，フォルダを２階層上がってaptやpipのインストールを行い，
h264decoderフォルダへ移動してライブラリのビルド＆コピーを行っているからです．

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

```bash:このように直接ファイルを呼んではいけない
$ ./install/Linux/linux_install.sh
```
相対パス指定してシェルを実行するとどうなるでしょうか．
`~/Tello-Python/Tello_Video/`の２階層上，すなわちホームディレクトリ`~/`まで上がって`h264decoder`へ入ろうとしてしまいます．当然ビルドできるわけがありません．


#おわりに

Linux，Raspberry Pi，Windows，Macそれぞれの環境構築方法を書きたいけど，全部終わるのは何時かなあ．．．