【Tello】トイ・ドローンで遊んでみた♪

なんとなく最近いろいろな場面で取り上げられるドローン。。Telloならプログラミング出来そうということで、やってみた。

###一応の目標
①とにかく飛行させる
②GamePadで飛ばす
③PCで飛ばす
④Pythonで飛ばす
⑤画像入力する
⑥物体検出搭載
⑦トラッキングする
⑧物体を探して見つける
⑨...
###今回やったこと
①とにかく飛行させる
②GamePadで飛ばす
③PCで飛ばす
####①とにかく飛行させる
これ説明書があるけど、ウワンには見えないレベル。。。
つまり、ネットで見てねということらしい。
スマホ（アンドロイド）もGooglePlayからTelloで検索して、無事アプリをインストールして、飛びました。
とても安定して、狭い部屋でもコントロール出来ました。
####②GamePadで飛ばす
これアンドロイドゆえかすごく苦労しました。
うんともすんとも。。。
ググってもどうも未対応な話が多い。。飛ぶというのは一件しか見当たらず。
しかし、アマゾンの評価サイトに有力な情報「位置情報をオンにするとできるようになる」
これが正解でした。
手順は以下の通り
⓪スマホの位置情報オン、WiFiオン、Bluetoothオン
①Telloのアプリを立ち上げる
②本体電源オンして、Wifiで接続（Telloアプリが接続を表示）
③GamePadオン
④Telloアプリの「設定→Bluetoothの。。。⇒上記GamePadが接続先に表示⇒これをクリック⇒メイン画面に戻るとjoystick画像が消えている」
※ここで肝心なのは事前に位置情報オンとGamePadはTelloから接続するということ

ただし、カメラ画像の送信が遅くて、VRモードが使えませんでした。。残念
###③PCで飛ばす
まず、簡単そうなのでScratchで飛ばしました。
ほぼ参考のとおりで動きました。
一か所、Tello.jsは以下のとおり、
※警告出ていますが、。。

```
scratch0907\scratch>node Tello.js
---------------------------------------
Tello Scratch Ext running at http://127.0.0.1:8001/
---------------------------------------
(node:9300) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
server listening 0.0.0.0:8890
```
【参考】
・[【ドローンTelloプログラミング】未経験者が初めてのプログラミングに挑戦【Scratchの使い方】 ](https://www.droneskyfish.com/entry/tello-scratch)
・[TELLOダウンロード](https://www.ryzerobotics.com/jp/tello/downloads)

ということで、離陸⇒５０ｃｍ下降⇒着陸できました。
ここで何度も失敗した原因
①WiFiが切れていた
②Tello.jsがエラーした後再実行が必要

![TelloFlight.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/0f37f4bc-b7c4-00ee-7147-01783503828d.jpeg)
###まとめ
・位置情報オンで、Android＋GamePad（GameSir T1d）で飛ばせた
・ScratchでPCから飛ばせた

・カメラ画像がほぼ使えないが、機体固有のバグかもしれない？？
・Pythonもちょっと試みたがGetchで先に進まなくなった
・Scratchにはカメラ画像の処理がなさそう
###おまけ
ScratchのTello部分も日本語化しました。
※訳が不明なものは適当
![TelloJaps.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/39324c80-1152-e7f6-28cb-d8ee34ee7e08.jpeg)


```TelloJaps.js
{   "extensionName": "Tello",
    "extensionPort": 8001,
    "blockSpecs": [
// SDK 版本 >= 1.0.0.0
        [" ", "離陸", "takeoff"],
        [" ", "着陸", "land"],
        [" ", "上昇 %n cm", "up", 50],
        [" ", "下降 %n cm", "down", 50],
        [" ", "左旋回 %n cm", "left", 50],
        [" ", "右旋回 %n cm", "right", 50],
        [" ", "前方 %n cm", "forward", 50],
        [" ", "後方 %n cm", "back", 50],
        [" ", "時計回り %n 度", "cw", 90],
        [" ", "反時計回り %n 度", "ccw", 90],
        [" ", "フリップ %m.flip", "flip", "f"],
        [" ", "速度 %n cm/s", "speed", 50],
        [" ", "ゴー x %n y %n z %n 速度 %n", "go", 50, 50, 0, 100],
// SDK 版本 >= 1.3.0.0
        [" ", "曲線飛行 x1 %n y1 %n z1 %n 和 x2 %n y2 %n z2 %n 速度 %n %", "curve", 20, 20, 0, 40, 60, 0, 60],
        [" ", "緊急", "emergency"],
        ["r", "相対高度(cm)", "h"],
        ["r", "気圧計高度(cm)", "baro"],
        ["r", "TOF高度(cm)", "tof"],
        ["r", "最低温度(°C)", "templ"],
        ["r", "最高温度(°C)", "temph"],
        ["r", "アッチチュード角(°)", "pitch"],
        ["r", "横アッチチュード角(°)", "roll"],
        ["r", "偏揺れ角(°)", "yaw"],
        ["r", "X加速度(0.001g)", "agx"],
        ["r", "Y加速度(0.001g)", "agy"],
        ["r", "Z加速度(0.001g)", "agz"],
        ["r", "X速度(cm/s)", "vgx"],
        ["r", "Y速度(cm/s)", "vgy"],
        ["r", "Z速度(cm/s)", "vgz"],
        ["r", "電池容量(%)", "bat"],
    ],
    "menus": {
        "flip": ["f", "b", "l", "r"]
    },
}
```