TelloのAPIには、left, right, forward, back, cwm ccw 等の操作コマンドとは別に、rcというコマンドがあります。
これは、__rc 左右 前後 上下 ヨー角__という__4つの引数__をとります。
このコマンドを使うと、これまで、次の図の左側のように、Telloを操作していた世界から、右側の世界に移行することができます。
これまでの世界(左側の世界)では、右斜め前方の位置に移動するために、① 右直進 -> ② 前方直進、という2つの独立した移動を積み重ねる必要がありました。
それが、__$rcコマンド$__を使う右の世界では、「右斜め前方向への直線移動」を1回行うだけで、同じ目的地点に到達できます。
__$rcコマンド$__を使う右の世界では、さらに、この斜め前移動をしながら、同時に、上昇 or 下降方向への移動を行うこともできます。
このRCコマンドは、次のサイトでは、「ラジコン」操作コマンドと和訳しています。
__RC__は、__ラジコン・コントロール__という意味だったのか、と腹落ちしました。
しかし、英語で検索しても、__RC = Radikon Control__という言葉が見つからず、略語の由来を突き止めることはできませんでした。
####Tello SDKのラジコン操作コマンド
前回のキー入力と同様に,forward,back,left,rightなどのコマンドを使っても良いのですが,これらの移動コマンドは応答が遅いです.Tello SDKのPDFをよく見ると,ラジコンの様にスティックの状態を流し込めるコマンドがあります.
###実際に使ってみて、斜め上方移動に成功した!
__過去の記事で作成したTello_python.pyを立ち上げて、rcコマンド__を使って、次の操作がうまくできることを確認しました。(成功)
- 斜め前位置への移動(上下方向への移動なし)
- 斜め前上方位置への移動
###実行コマンド
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__のソースコードを掲載します。
縣さんのコードを一部、変更して作成しました。
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