Tello eduの基礎まとめ（入門編）

##はじめに
今回は諸事情によりtelloについてまとめることになったので、簡単にまとめたいと思います。
後回しにしまくった結果、時間がかつかつになっちゃったので環境構築等の説明は適当に行きます。
ちなみにTelloはこんなやつです。
<img width="600" alt="てろー" src="https://product1.djicdn.com/uploads/photos/35575/large_9d750143-2960-4109-bff7-8b37beb9aaff.jpg">
前Verのtelloとの大きな違いは、PCと通信をする際に子機として利用できるようになったので編隊飛行が可能となりました。
今回の記事では、telloを親機として利用しますが編隊飛行に興味をお持ちの方は[こちらの記事](https://qiita.com/Tsukkey/items/883ef749f41ff603e8d4)をご覧ください。
###使用したソフト・器具
* Python3.X
* atom等のエディタ
* Tello Edu

エディタは自分が好きなのを使ってください。
ではやっていきましょう。
##手順
###Step1 Pythonインストール
プログラミングを開始するにはPCにPythonをインストールする必要があります。今回はWindowsにインストールする方法を紹介します。
[こちらのサイト](https://www.python.org/downloads/)からインストーラーをダウンロードします。
Pythonのバージョンは特に指定しませんが、昨今の流れに身を任せるのであればPython3.Xをインストールすることをお勧めします。
ここで注意したいのがWindowsのbit数によってダウンロードするファイルが違うという点です。
**64bitであれば[Windows x86-64 executable installer]** 
**32bitであれば[Windows x86 executable installer]**
ご自分のPCに合わせて環境を整えましょう。
また、socketとtimeが入っているのかわからないので確認してください。たぶんpipで入ります。
###Step2 エディタのインストール
ここは自分の好きなエディタをぶち込みましょう。私が利用しているのは[atom](https://atom.io/)です。
とくにこだわりのない人にはatomがおすすめです。(Linuxでも利用できるよ！！)（macでも利用できるよ！！）
ただダウンロードファイルがでかいので注意が必要。
###Step3 適当にPythonを勉強しよう。
頑張ってくれ。ファイトだよ！ (و'ω')و
###Step4 Telloの基礎動作を確認しよう
####TelloとPCの接続
TelloとPCをつなぐためには、Wifi接続を用います。
Telloの電源をつけるとWiFiの発信源となり、そのネットワークにPCをつなげることになります。そこで、Telloに書いてあるSSIDをキチンと確認しておきましょう。バッテリーを差し込む部分の内側に書いてあります。
Telloの電源をつけて数秒すれば、PCで利用可能なWifiのところから**TELLO-○○○○**のようなSSIDが出てくるのでつなぎます。PASSWORD等はないのでそのまま接続することができます。
####離陸（プログラム付き）
tello_address = ('192.168.10.1', 8889)はTelloを親機にする場合、例外なくこの値になります。（たぶん）
編隊飛行させようとしたら変わってくるのですが、今回はTelloを親機とした場合を考えます。

```python:fly.py
import socket
import time

socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #おまじない
tello_address = ('192.168.10.1', 8889)　#固定値

socket.sendto('command'.encode('utf-8'),tello_address)#コマンドモードに移行
time.sleep(3)
socket.sendto('takeoff'.encode('utf-8'),tello_address)#離陸
time.sleep(3)
socket.sendto('land'.encode('utf-8'),tello_address)#着陸
```

上記のプログラムは動作確認していませんので保証はしかねます。また、PC等の動作不良が起こっても自己責任でよろしくお願いします。
#####解説

まず、以下の部分でドローンと接続する処理を完了します。この部分は変化させる必要はないです。

```python:
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #おまじない
tello_address = ('192.168.10.1', 8889)　#固定値
```
次に命令部分についてです。

```python:
socket.sendto('命令'.encode('utf-8'),tello_address)
time.sleep(3)
```
この"命令"の部分に動作を入力します。
**最初に"command"と入力してTelloがプログラムで動くようにします。**
これをしないと何やっても動きません。
次になぜ、time.sleep(3)を入れ時間を空けているのかについて話します。
これは、ドローンの動作中に命令を送っても送った命令が受け付けてもらえず、正しく動作することができないからです。
3秒というのは、適当ですので自分でベストだと思うスリープ時間を見つけてみてください。
###よく使う命令

| コマンド名   | telloの動作 | Xの範囲 |
|:-:|:-:|:-:|
| command  | コマンドを受け付けるようにする  | ----  |
| takeoff  | 離陸する | ----  |
|  land | 着陸する  | ----  |
|  up X | X[cm]上昇する  | 20~500  |
| down X  | X[cm]下降する  |  20~500 |
| left X | X[cm]左に移動  | 20~500  |
| right X  | X[cm]右に移動  | 20~500  |
| forward X  | X[cm]前進  | 20~500  |
| back X  | X[cm]後退  | 20~500  |
| cw X  | X[°]時計回りへ旋回  | 1~360  |
| ccw X | X[°]反時計回りへ旋回  | 1~360  |

ここに書かれたコマンドが基礎動作に使うものとなります。このほかにもコマンドはありますが、基礎を勉強するうえで、これだけわかればそれなりに遊べると思います。

##動画プログラムについて分かったこと
###課題1　デコードできぬ
私は、いまだに動画を撮影しながらドローンを飛ばすことに成功していません。
今後時間を取れそうもないので、わかっていることだけここに書き残し皆さんに託したいと思います。
まず、Telloで動画を撮影するためにはstreamモードにする必要があります。

```python:
socket.sendto('streamon'.encode('utf-8'),tello_address)
```
このように送信するとstreamをonすることができます。
また、これを使った公式プログラムが[こちら](https://github.com/dji-sdk/Tello-Python)のTello Videoに入っています。
しかし、このプログラムを動かすためにはいくつかの課題が残されています。
まず、Windowsで動かすために、動画をデコードしなければなりません。
H.264のデコードをするためPython3のライブラリがあるのですがどうも自分では動かせそうもありません。
もしかしたらLinuxで動かすことができるかもしれませんが、まだ試していないので何とも言えません。
また、別の方法もあるようですが再現性の問題でここでは取り扱いません。
参考にさせていただいたサイトです。

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

こちらの記事のおかげでTelloに関する理解を深めることができました。皆さんもぜひご覧になってください。
###課題2　スレッド処理できぬ
これは完全に技量の問題ですね。動画を撮影しながらドローンをプログラムで動かすとなると**並列処理を行う必要**があります。
私の場合は環境構築でうまくいかず心が折れたので皆さん頑張ってください。
ここでつたえたかったのは、並列処理する必要がありますということです。
まあうまく動かなかったらWindowsのせいにして、早々にLinuxに切り替えましょう。

##最後に
ここまで読んでくださりありがとうございます。
走り書きでしたので文章も読みにくかったとおもいますが、許してください。
この記事を書いた理由としては、どうにか簡潔なプログラムで動画撮れるようになったらいいなーという思いがあったからです。今後はしばらくドローンとは無縁の生活を送りますが、この記事を読んでくださった皆さんで面白いプログラムを考えてぜひ私に教えてください。楽しいのでプログラム初心者の方もいい練習になると思います。
では次回の記事でお会いしましょう。