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


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

- [（参考） Tello操作コマンド 日本語版 「Drone an どろね庵」](https://drone-an.pro/tellosdk_trans/04_tello_commands/)
- [TELLO SDK 2.0 User Guide](https://dl-cdn.ryzerobotics.com/downloads/Tello/Tello%20SDK%202.0%20User%20Guide.pdf)

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

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

![スクリーンショット 2021-07-14 17.59.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/f96d1102-1925-10c6-aec9-e4bbbee0af9e.png)


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

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

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

![スクリーンショット 2021-07-14 17.59.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/d308ae16-3c32-fcea-32b1-340f2d5a7b94.png)


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

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

- [「ジョイスティック操縦プログラム」](https://qiita.com/hsgucci/items/a5926dd396b319e6ccaf#tello-sdk%E3%81%AE%E3%83%A9%E3%82%B8%E3%82%B3%E3%83%B3%E6%93%8D%E4%BD%9C%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)  

> ####Tello SDKのラジコン操作コマンド
前回のキー入力と同様に，forward,back,left,rightなどのコマンドを使っても良いのですが，これらの移動コマンドは応答が遅いです．
>
> Tello SDKのPDFをよく見ると，ラジコンの様にスティックの状態を流し込めるコマンドがあります．

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

__[過去の記事](https://qiita.com/electronics_diy721/items/f9f4b1f87e83801154e9)__で作成した__*Tello_python.py*__を立ち上げて、__*rc*コマンド__を使って、次の操作がうまくできることを確認しました。（成功）

- 斜め前位置への移動（上下方向への移動なし）
- 斜め前上方位置への移動


###実行コマンド

```bash: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](https://dl-cdn.ryzerobotics.com/downloads/Tello/Tello%20SDK%202.0%20User%20Guide.pdf)に掲載されている次の２つのコマンドは、成功しませんでした。

__座標（0, 0, 0）から座標（50, 50, 50）に向けて速度10で円弧を描きながら移動__
> curve 0 0 0 100 100 100 10

__座標（50, 50, 50）に向けて速度10で移動__
> go 50 50 50 10

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

__[過去の記事](https://qiita.com/electronics_diy721/items/f9f4b1f87e83801154e9)__で作成した__*Tello_python.py*__のソースコードを掲載します。

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

- [縣 佳男 （株式会社日本システム技研） 「Pythonからドローンを操作してみる話。」](https://www.wantedly.com/companies/jsl2/post_articles/184669#_=_)

```Python3: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

```