HTTPリクエストでドローンを自動飛行させるサンプル


## Telloって？

Telloはドローンの一種なのですが、SDKがあるのでプログラミングで自由に操作できるものなのです。

![スクリーンショット 2018-11-05 16.11.19.png](https://qiita-image-store.s3.amazonaws.com/0/117147/1c29be4d-3980-59c5-146d-26f642777482.png)

Scratch/Pythonなどで操作が可能です。

今回はこれを使って自動操縦をやってみます。

## TelloをカスタマイズしてHTTPリクエストで自動飛行させるサンプル


ここにサンプルがあります。
https://dl-cdn.ryzerobotics.com/downloads/tello/20180222/Tello3.py

このPythonをダウンロードして実行すると、対話形式のプロンプトになり、そこでマニュアルで操作できます。

```python:python
# コマンド入力モードへ移行
$ command

# 離陸
$ takeoff

# 着陸
$ land
```

こんな感じですね。


今回、これをもとに、HTTPリクエストで自動飛行するモジュールをつくってみました。



## サンプルコード

まずサンプルコードを見ていきましょう。

```python:python
#
# Tello Python3 Control Demo 
#
# http://www.ryzerobotics.com/
#
# 1/1/2018

import threading 
import socket
import sys
import time


host = ''
port = 9000
locaddr = (host,port) 


# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

tello_address = ('192.168.10.1', 8889)

sock.bind(locaddr)

def recv():
    count = 0
    while True: 
        try:
            data, server = sock.recvfrom(1518)
            print(data.decode(encoding="utf-8"))
        except Exception:
            print ('\nExit . . .\n')
            break


print ('\r\n\r\nTello Python3 Demo.\r\n')

print ('Tello: command takeoff land flip forward back left right \r\n       up down cw ccw speed speed?\r\n')

print ('end -- quit demo.\r\n')


#recvThread create
recvThread = threading.Thread(target=recv)
recvThread.start()

while True: 

    try:
        msg = input("");

        if not msg:
            break  

        if 'end' in msg:
            print ('...')
            sock.close()  
            break

        # Send data
        msg = msg.encode(encoding="utf-8") 
        sent = sock.sendto(msg, tello_address)
    except KeyboardInterrupt:
        print ('\n . . .\n')
        sock.close()  
        break
```

while True:  以降で対話形式のプロンプトになります。

今回は対話ではなく、あらかじめ決めておいた動作をさせたいので、ここはコメントアウトします。

```python:python
'''
recvThread = threading.Thread(target=recv)
recvThread.start()

while True: 

    try:
        msg = input("");

        if not msg:
            break  

        if 'end' in msg:
            print ('...')
            sock.close()  
            break

        # Send data
        msg = msg.encode(encoding="utf-8") 
        print (msg)
        #sent = sock.sendto(msg, tello_address)
    except KeyboardInterrupt:
        print ('\n . . .\n')
        sock.close()  
        break
'''
```

## 自動飛行のコーディング

自動で操縦すると言ってもすごくシンプルで、さきほどコメントアウトした行の前にアクションを書いていけばOKです。

```python:python
sent = sock.sendto(b'command', tello_address)
print ("command")
sent = sock.sendto(b'takeoff', tello_address)
print ("takeoff")
sleep(5)
sent = sock.sendto(b'forward 100', tello_address)
print ("forward 200")
sleep(5)
sent = sock.sendto(b'flip f', tello_address)
print ("flip f")
sleep(5)
sent = sock.sendto(b'back 100', tello_address)
print ("back 200")
sleep(5)
sent = sock.sendto(b'land', tello_address)
```

例えばこのコードだとこのようになります。
- 離陸する
- 前に200センチ進む
- 前方にFlip（回転）する
- 後方に200センチ進む
- 着陸する

これだけでもう完了です。とても楽ですね。

その他の操作は公式ページにあるのでいろいろ試すことができます。

https://dl-cdn.ryzerobotics.com/downloads/tello/0228/Tello+SDK+Readme.pdf

## HTTPリクエストで実行する

Pythonのスクリプトを実行して飛行させてもいいのですが、あまり利用しやすいとは言えません。
そこでHTTPリクエストで実行できるようにします。

そうすることで、より多くのOSSやツールから飛行させることができるようになります。

サンプルコードです。

```php:php
<!DOCTYPE html>
<html class='stripe_base'>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>tello</title>
</head>
<body class='stripe_base'>
<h1>tello</h1>
<?php
$exec_cmd = "python ./Tello3_custom.py";
exec($exec_cmd,$out,$ret);
?>
</body>
</html>

```

以上です。このコードを実行すればTelloが飛びます！

phpで実装していますが、他の言語でも良いと思います。



HTTPリクエストのGETやPOSTに引数を与えて飛行パターンを変更するのも面白いかもですね。


## サンプルコード

サンプルコードや今回紹介したコードはこちら。

Github
https://github.com/octocatz/telloCanFly