Posted at

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


Telloって?

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

スクリーンショット 2018-11-05 16.11.19.png

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

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


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

ここにサンプルがあります。

https://dl-cdn.ryzerobotics.com/downloads/tello/20180222/Tello3.py

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


python

# コマンド入力モードへ移行

$ command

# 離陸
$ takeoff

# 着陸
$ land


こんな感じですね。

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


サンプルコード

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


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

'''

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

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

<!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