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

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

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

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

#概要

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

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

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

#前提条件

ホームフォルダに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
```

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


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

```bash:Single_Tello_Testの中身
$ ls
README.md  command.txt  stats.py  tello.py  tello_test.py
```
**<font color="blue">tello_test.py</font>**　というファイルがあることがわかります．
その他に**tello.py**と**stats.py**というファイルもありますが，これらは**tello_test.py**が呼び出すファイルなので，ユーザーが実行する必要はありません．

また，**<font color="red">command.txt</font>**　というテキストファイルもあることがわかります．

全体の構成は下図の様になっています．
![tello_test_system.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/137729d0-1888-9a6d-b27e-3bd6eda5bfed.png)

要は**<font color="blue">tello_test.py</font>**がプログラム本体で，
**<font color="red">command.txt</font>**がTelloにさせたい飛行計画のリスト，です．

#tello_test.pyの実行

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

その際，<font color="red">**必ずコマンドライン引数を指定する必要がある**</font>ので，
`command.txt`を渡すように書きます．

```bash:コマンドライン引数に飛行計画テキストファイルを書く．
$ python tello_test.py command.txt
```


#実行結果
正しく実行されれば，

　離陸　→　５秒待つ　→　着陸

という動作が行われます．

```bash:実行結果
$ python tello_test.py command.txt
sending command: command to 192.168.10.1
from ('192.168.10.1', 8889): ok
Done!!! sent command: command to 192.168.10.1
sending command: takeoff to 192.168.10.1
from ('192.168.10.1', 8889): ok
Done!!! sent command: takeoff to 192.168.10.1
delay 5.0
sending command: land to 192.168.10.1
from ('192.168.10.1', 8889): ok
Done!!! sent command: land to 192.168.10.1
Traceback (most recent call last):
  File "tello_test.py", line 28, in <module>
    out = open('log/' + start_time + '.txt', 'w')
IOError: [Errno 2] No such file or directory: 'log/2019-09-23 15:25:53.379159.txt'
```
また，最後にI/Oエラーを起こしているのが分かります．
<font color="blue">**このエラーの解消法については，本記事のメインストーリーとは別なので，ページ末尾に記載しておきます．**</font>

エラーが出ていても問題なく飛行できるので，今はこのままでかまいません．

#実行後の感想

実行結果の感想としては

・5秒待つのは長い
・離陸して着陸ではつまらない

だと思います．

command.txtを編集して様々な動きをさせてみましょう．

#command.txtの内容

[command.txt](https://github.com/dji-sdk/Tello-Python/blob/master/Single_Tello_Test/command.txt)を開いて見てみると，中身は以下のように書かれています．

```command.txt
command
takeoff
delay 5
land
```

冒頭には，SDKを有効にするための`command`が書いてあることが分かりますね．

これをメモ帳やテキストエディタで編集することで，望みの動作をさせることができます．

例えば，`delay 5` すなわち`5秒間待つ`は長過ぎるので，
`delay 2`に変えて上書き保存してみましょう． 

```command.txt(変更後)
command
takeoff
delay 2
land
```

新しい`command.txt`でTelloを飛ばしてみると，待ち時間が短くなるのが分かります．

```bash:2秒待ちのcommand.txtで実験
$ python tello_test.py command.txt
```

この様に，<font color="red">**command.txtの中身を書き換えることで，様々な飛行を実現できます．**</font>

では，どんなコマンドを書くことができるのでしょうか？
それを次項で見ていきます．

#コマンドの確認

Tello SDKのPDFを見ると，command.txtに書くことのできるコマンドのリストがあります．


・[Tello SDK 1.3](https://terra-1-g.djicdn.com/2d4dce68897a46b19fc717f3576b7c6a/Tello%20%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/For%20Tello/Tello%20SDK%20Documentation%20EN_1.3_1122.pdf)
・[Tello SDK 2.0](https://dl-cdn.ryzerobotics.com/downloads/Tello/Tello%20SDK%202.0%20User%20Guide.pdf)

代表的なものを以下に紹介します．

|コマンド名|解説|備考|
|:------------------|:------------------:|:------------------:|
| command |  SDKのコマンドモードに移行     |    最初に1回送信        |
| takeoff |            離陸 |              |
| land             |            着陸 |              |
| up x             |  上昇 xには20～500を入れる| up 50 で50cm上昇         |
| down x           |             下降  xには20～500を入れる|              |
| left x           |           左移動 xには20～500を入れる | left 20 で20cm左移動            |
| right x          |           右移動 xには20～500を入れる |            |
| forward x        |           前進 xには20～500を入れる |             |
| back x           |           後進 xには20～500を入れる |           |
| cw x             |           時計回り xには1～360を入れる | cw 30で右へ30度旋回 |
| ccw x            |           反時計回り xには1～360を入れる  |     |

前後左右上下の移動の単位はセンチメートル(cm)、旋回は度(degree)です．

また，delayについてはSDKコマンドとは別です．Pythonのtime.sleepを使って実現しています．

| python側コマンド  |   解説  | 
|:-----------------|:------------------:|
| delay x          |   x秒間停止  | 

#新しい飛行計画ファイルで実験

例えば，`command.txt`とは別に`flight_test.txt`を作り，
こんな風に書いてみます．

```flight_test.txt
command
takeoff
delay 2
left 50
delay 2
back 50
delay 2
right 50
delay 2
forward 50
delay 2
land
```

左に50センチの四角を描くように飛行して着陸します．

この新しいファイル`flight_test.txt`で，
コマンドライン引数を変更してプログラムを実行すれば，新しい飛行が行われます．

```bash:コマンドライン引数には飛ばしたいファイルを指定する
$ python tello_test.py flight_test.txt
```

このように，自分で様々な飛行計画テキストを作って，色々飛ばして遊んでみましょう．
これだけでも結構面白いですよ．

#Single_Tello_Testを使った「ドローンのプログラミング体験」

イベントネタやSTEM教育の１つとして，「Telloを使ったプログラミング」というのがよくあります．

まあScratchで操作するのがこれ系イベントの主流なのですが，
「<font color="red">ブロック並べだけじゃちょっと．．．もう少しプログラムを書いてる雰囲気を体験させたい</font>」
という意見をいただくこともあります．

とは言え，ガチでPythonのプログラムを書かせるなんてことはできません．．．
キーボード配列もわからない段階の人に，importだのクラスだのを教えるのは無茶です．

そんな時に便利なのが，この「Single_Tello_Test」です．

- テキストファイルを編集するだけなので難しくない
- コマンドの英単語は簡単
- 産業用ロボットのプログラミング(教示/再生)と同じ，と意義を強調できる(笑

テキストファイルを書くだけなのでPythonの体験とは言えませんが，簡単なテキストプログラミングを味わってもらうことができます．

(Windows機にして`python tello_test.py command.txt`とだけ書いたBATファイルをダブルクリックしてもらうのが，初心者用には簡単です)

#おわりに

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

本当は`tello_test.py`のプログラム解説もしようと思いましたが，今回は割愛しました．
「Single_Tello_Test」と「Tello_Video」とで`tello.py`のTelloクラスが異なるので，
変に解説して混乱を招くよりも，さっさと「Tello_Video」へ行った方が良いと思いました．

次回は，その本命の「Tello_Video」について解説します．

#I/Oエラーの解消法

エラーメッセージには，このように書かれています．

```python:エラーメッセージ
  File "tello_test.py", line 28, in <module>
    out = open('log/' + start_time + '.txt', 'w')
IOError: [Errno 2] No such file or directory: 'log/2019-09-23 
```
これは，<font color="red">**飛行ログを保存するファイルを作ろうとしたけど，"log"なんていうディレクトリがなかったので保存できなかったよ**</font>，と言っています．

なので，`Single_Tello_Test`ディレクトリの下に`log`ディレクトリを作っておきましょう．

```bash:logフォルダが無いので作っておく
$ mkdir log
```

これで今後はI/Oエラーが出なくなり，飛行ログが保存されます．
再度実行して試してみましょう．

```bash:logフォルダを作ってから実行
$ python tello_test.py command.txt
```

すると，logの直下に飛行させた **[年月日 時刻].txt**　というファイルができているので，適当なエディタで表示してみましょう．

```bash:とりあえずcatで表示
$ cd log
$ ls
2019-09-23 15:34:12.138149.txt  2019-09-23 15:35:23.141152.txt
$ cat 2019-09-23 15:34:12.138149.txt

id: 0
command: command
response: ok
start time: 2019-09-23 15:34:12.138473
end_time: 2019-09-23 15:34:12.160175
duration: 0.021702

id: 1
command: takeoff
response: ok
start time: 2019-09-23 15:34:12.160224
end_time: 2019-09-23 15:34:19.749133
duration: 7.588909

id: 2
command: land
response: ok
start time: 2019-09-23 15:34:24.752201
end_time: 2019-09-23 15:34:28.163136
duration: 3.410935
```

SDKで定義されている３つのコマンド

- command
- takeoff
- land

を使った事が分かります．
また，durationに，そのコマンドを実行するのにかかった時間が入っています．