LoginSignup
7
5

More than 5 years have passed since last update.

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

Posted at

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センチ進む
- 着陸する

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

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

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

7
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5