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

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

[公式SDK「Tello-Python」を試そう](https://qiita.com/hsgucci/items/3327cc29ddf10a321f3c)

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

#概要

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

　[Tello_Video_With_Pose_Recognition](https://github.com/dji-sdk/Tello-Python/tree/master/Tello_Video_With_Pose_Recognition)

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

「Tello_Video」に対してPose_Recognitionという名前が付いている通り，GUIはほぼTello_Videoと同じです．
異なるのは，<font color="green">**Telloのカメラに写った人物の手足のポーズを機械学習で認識します**</font>．そのポーズに応じて着陸や前後移動を行います．

DJI製品で言うところの「ジェスチャー コントロール」みたいなプログラムですね．

マシンパワーが無い非力なＰＣではハングアップするので気をつけてください．
Raspberry Piでは無理です．．．
かなりハイエンドでメモリが潤沢なＰＣでないと快適動作はしない様です．


#前提条件

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

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

詳しくは　[Tello-Pythonのダウンロード](https://qiita.com/hsgucci/items/3327cc29ddf10a321f3c#tello-python%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)　を御覧ください．

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

```bash:cd(change_directory)
$ cd Tello-Python
```
lsコマンドでフォルダの中にあるファイルを見てみると,

```bash: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_With_Pose_Recognition**　というディレクトリがあることがわかります．
更にディレクトリ移動しましょう.


```bash:Tello_Videoへ移動
$ cd Tello_Video_With_Pose_Recognition
```
lsコマンドでTello_Video_With_Pose_Recognitionの中を見てみると，

```bash:Tello_Video_With_Pose_Recognitionの中身
$ ls
LICENSE.md  h264decoder  install  model     tello_control_ui.py
README.md   img          main.py  tello.py  tello_pose.py
```
「Tello_Video」とほぼ同じファイル構成になっていますが，２箇所異なるのは**<font color="blue">tello_pose.py</font>**というファイル，**<font color="blue">model</font>**　というディレクトリがある点です．

このpyファイルとディレクトリは，カメラ映像に写った人物のポーズを計算する機械学習に使用します．
pyファイルでOpenCVの機械学習ライブラリを使用した画像処理が書かれています．
modelディレクトリには学習済みモデルを格納します．
Tello-Pythonをダウンロードしただけでは学習済みモデルファイルはありませんので，次項でダウンロード作業を行います．

また，今回も**<font color="red">install</font>**と**<font color="red">h264decoder</font>**というディレクトリがありますが，「Tello_Video」で必要な環境構築は終わっています．
したがって「Tello_Video」でビルドした<font color="LightSeaGreen">**libh264decoder.so**</font>をコピーしてくるだけで済みます．

全体の構成は下図の様になっています．
![tello_pose_system.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/e21ad7e4-fb08-fa88-d465-820636f18eed.png)

#Tello_Video_With_Pose_Recognitionの準備

プログラムを動かすために，以下の２つの作業が必要です．

- Tello_Videoから`libh264decoder.so`をコピー
- ポーズ認識用の学習済みファイルのダウンロード

##libh264decoder.soをコピー

Tello_Video_With_Pose_Recognitionにも`install/Linux/linux_install.sh`はありますが，<font color="LightSeaGreen">**libh264decoder.so**</font>は既に「Tello_Video」でビルドしましたから，再度ビルドする必要はありません．コピーしてきましょう．

```bash:Tello_Videoからlibh264decoder.soをコピー
$ cp ../Tello_Video/libh264decoder.so ./
```
##機械学習ファイルのダウンロード

`model`ディレクトリに入り，lsでファイルを確認すると，

```bash:modelディレクトリの中
$ cd model
$ ls 
getModels.bat  getModels.sh  pose
```
<font color="green">**getModels.sh**</font>というファイルがあることが分かります．
これに実行権限を与えて，実行することで，必要な学習済みモデルをダウンロードするることができます．

```bash:getModels.shに実行権限を与えて，実行する
$ chmod +x getModels.sh
$ ./getModels.sh
--2019-09-25 16:01:27--  http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/mpi/pose_iter_160000.caffemodel
posefs1.perception.cs.cmu.edu (posefs1.perception.cs.cmu.edu) をDNSに問いあわせています... 128.2.176.37
posefs1.perception.cs.cmu.edu (posefs1.perception.cs.cmu.edu)|128.2.176.37|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 205950363 (196M) [text/plain]
`pose/mpi/pose_iter_160000.caffemodel' に保存中

pose_iter_160000.caffemodel     8%[==>              ]  16.14M   456KB/s    残り7m 26s
```
学習済みモデルのファイル`pose_iter_160000.caffemodel`は200MBあるので時間がかかります．ゆっくり待つと良いでしょう．ダウンロード途中でＰＣがサスペンドしないよう気をつけましょう．

ダウンロードしているのはファイル名が示す通り，機械学習ライブラリ「Caffe」のファイルです．

#main.pyの実行

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

```bash:Tello_Videoの実行
$ python main.py
```

#実行結果

Telloとうまく接続できていれば，下の写真のような画面が表示されます．
![tello_pose_main.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/4b91c8e5-14a9-171b-8724-77d477af1045.png)
「Tello_Video」の時のウィンドウに似ていますが，<font color="blue">**Pose Recognition Status: Off**</font>というボタンが増えているのが分かります．
このボタンが，機械学習で人物のポーズ認識をする機能のON/OFFスイッチになっています．

それ以外の使い方は「Tello_Video」と同じです．

#ポーズ認識機能を使う

離陸は手動で行います．「Command Panel」をオープンして「Takeoff」ボタンを押してください．

「**Pose Recognition Status: <font color="blue">Off</font>**」のボタンを押し，ボタンのテキストが
「**Pose Recognition Status: <font color="red">On</font>**」となれば，動作中です．

ポーズ認識が機能すると，下図の様に人物に合わせて骨格モデルが表示されます．
![pose_recog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/91699a18-f569-540a-c2c2-219f8fda1e91.png)

認識したポーズが，プログラム中の条件と一致すると，Telloが動作するようになっています．

有効なポーズは３パターンあります．

- 腕を下ろしたポーズ「ダウン45度」　-　後進
- 腕を水平に広げたポーズ「フラット」　- 前進
- 肘を曲げたポーズ「Ｖ」　-　着陸　

`tello_pose.py`の中に記述されたものを以下に示します．

```text:ダウン45度
腕をホールド
こんな風:
        | 
      / | \
       / \
```

```text:フラット
腕を水平に
こんな風:
      _ _|_ _
         |
        / \
```

```text:Ｖ
肩と肘を正しい角度に
こんな風:
        |
      \/|\/
       / \
```

という事は，全身が映る距離でなければならないので，少し離れる必要がありますね．

#おわりに

今回は「Tello_Video_With_Pose_Recognition」の使用法を解説しました．

機械学習の部分以外はTello_Videoと同じなので，特筆すべき事はありません．
`tello_pose.py`の中身を読み解けば，他のポーズを追加することもできそうですが，
筆者のＰＣでは重すぎて全然試せません．．．