0
1

More than 3 years have passed since last update.

【 Tello 】右斜め前や、右斜め前上方への直進は、RCコマンドが吉

Last updated at Posted at 2021-07-14

TelloのAPIには、left, right, forward, back, cw*m *ccw 等の操作コマンドとは別に、rcというコマンドがあります。

これは、rc 左右 前後 上下 ヨー角という4つの引数をとります。

このコマンドを使うと、これまで、次の図の左側のように、Telloを操作していた世界から、右側の世界に移行することができます。

スクリーンショット 2021-07-14 17.59.18.png

これまでの世界(左側の世界)では、右斜め前方の位置に移動するために、① 右直進 -> ② 前方直進、という2つの独立した移動を積み重ねる必要がありました。

それが、$rcコマンド$を使う右の世界では、「右斜め前方向への直線移動」を1回行うだけで、同じ目的地点に到達できます。

$rcコマンド$を使う右の世界では、さらに、この斜め前移動をしながら、同時に、上昇 or 下降方向への移動を行うこともできます。

スクリーンショット 2021-07-14 17.59.54.png

このRCコマンドは、次のサイトでは、「ラジコン」操作コマンドと和訳しています。
RCは、ラジコン・コントロールという意味だったのか、と腹落ちしました。:airplane:

しかし、英語で検索しても、RC = Radikon Controlという言葉が見つからず、略語の由来を突き止めることはできませんでした。:frowning2:

Tello SDKのラジコン操作コマンド

前回のキー入力と同様に,forward,back,left,rightなどのコマンドを使っても良いのですが,これらの移動コマンドは応答が遅いです.

Tello SDKのPDFをよく見ると,ラジコンの様にスティックの状態を流し込めるコマンドがあります.

実際に使ってみて、斜め上方移動に成功した!

過去の記事で作成したTello_python.pyを立ち上げて、rcコマンドを使って、次の操作がうまくできることを確認しました。(成功)

  • 斜め前位置への移動(上下方向への移動なし)
  • 斜め前上方位置への移動

実行コマンド

Terminal
electron@diynoMacBook-Pro Tello % python3 Tello_python.py
Telloに送る指示コマンドを入力してください。:  takeoff
Telloに送る指示コマンドを入力してください。:  rc -20 0 0 0
Telloに送る指示コマンドを入力してください。:  rc 0 0 20 0
Telloに送る指示コマンドを入力してください。:  rc 0 0 -20 0
Telloに送る指示コマンドを入力してください。:  rc 20 20 20 0
Telloに送る指示コマンドを入力してください。:  rc -50 -50 -50 0
Telloに送る指示コマンドを入力してください。:  ^Z
zsh: suspended  python3 Tello_python.py
electron@diynoMacBook-Pro Tello % 

以下、説明を添えます。

左に20移動

rc -20 0 0 0

右に20移動

rc 20 0 0 0

真上に20上昇

rc 0 0 20 0

真下に20下降

rc 0 0 -20 0

右20, 前20, 上20の座表地点に向けて、右斜め上に移動

rc 20 20 20 0

左20 後ろ20, 下20の座表地点に向けて、左斜め下に移動

rc -50 -50 -50 0

なお、TELLO SDK 2.0 User Guideに掲載されている次の2つのコマンドは、成功しませんでした。

座標(0, 0, 0)から座標(50, 50, 50)に向けて速度10で円弧を描きながら移動

curve 0 0 0 100 100 100 10

座標(50, 50, 50)に向けて速度10で移動

go 50 50 50 10

実行したスクリプトファイル

過去の記事で作成したTello_python.pyのソースコードを掲載します。

縣さんのコードを一部、変更して作成しました。

Tello_python.py
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)
        except Exception:
            print ('\nExit . . .\n')
            break

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

while True: 
    # 最初に入力が必要な"command"命令は、ユーザが打ち込まなくて良いようにスクリプト側でTelloに送出する
    msg = str("command").encode(encoding="utf-8") 
    sent = sock.sendto(msg, tello_address)
    # "takeoff"以降の命令をユーザ入力から受け取る
    try:
        msg = input("Telloに送る指示コマンドを入力してください。:  ")
        if not msg:
            break  

        # Send data
        msg = msg.encode(encoding="utf-8") 
        sent = sock.sendto(msg, tello_address)


    except KeyboardInterrupt:
        sock.close()  
        break

0
1
0

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
0
1