MacBookのTerminalに、Telloの操縦コマンドを手入力して遠隔操作してみた


###参考にしたサイト

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

###全体の構成

![スクリーンショット 2021-07-12 14.53.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/b43ae4ad-6908-6217-eaec-d37f571d0ca0.png)


####（ ① TelloとMacbookとのWifi疎通確認 ）

- Wifi親機（Host）： Tello本体 （※）
※ Tello本体内には、Wifiルータが標準仕様として内蔵されている

- Wifi子機（Client）： MacBook
- MacBookのWifi接続先一覧から、Telloのアクセスポイント（AP ※)を探して、選択。
※ Tello内蔵のWifi APの（local) IPアドレスは、$192.168.10.1$。

- 接続後、TelloのAPのローカルIPアドレス（$192.168.10.1$）に対して、MacBookからpingを飛ばして、TelloとMacBookとの疎通を確認。

```shell:Terminal
electron@diynoMacBook-Pro Tello % ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1): 56 data bytes
64 bytes from 192.168.10.1: icmp_seq=0 ttl=255 time=1.624 ms
64 bytes from 192.168.10.1: icmp_seq=1 ttl=255 time=2.079 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=255 time=1.979 ms
^Z
zsh: suspended  ping 192.168.10.1
```

####Pythonスクリプトファイルの存在を確認

（ 結果 ）
カレント・ディレクトリにある。
（ カレントディレクトリ： Desktop直下のTelloディレクトリ ）

```shell:Terminal
electron@diynoMacBook-Pro Tello % ls
ello_python.py
electron@diynoMacBook-Pro Tello %
```

####Python3が使えることの確認

- 今回、実行するスクリプトファイルは、Python3の利用を前提とします。

```shell:Terminal
electron@diynoMacBook-Pro Tello % python3 --version
Python 3.9.6
electron@diynoMacBook-Pro Tello % 
electron@diynoMacBook-Pro Tello % python --version
Python 2.7.16
electron@diynoMacBook-Pro Tello % 
```

##Teminalのコマンド入力画面（の例）

- 着陸命令（"command"）の実行終了後、Ctrl-Zで、スクリプトを抜けて終了。
- 今回は、以下の順に、命令を送出しました。

```text:コマンド送出順序
① 離陸（takeoff） 
② 時計回り90度回頭（cw 90） 
③ 50(cm）前進（forward 50） 
④ 着陸（land） 
```

```unix:Terminal
electron@diynoMacBook-Pro Tello % python3 Tello_python.py
Telloに送る指示コマンドを入力してください。：  takeoff
Telloに送る指示コマンドを入力してください。：  cw 90
Telloに送る指示コマンドを入力してください。：  forward 50
Telloに送る指示コマンドを入力してください。：  land
Telloに送る指示コマンドを入力してください。：  ^Z
zsh: suspended  python3 Tello_python.py
electron@diynoMacBook-Pro Tello % 
```

###実行したスクリプト

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

- [縣 佳男 （株式会社日本システム技研） 「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

```

###Telloコマンドの一覧

Tello SDKマニュアルに掲載されています。
- https://dl-cdn.ryzerobotics.com/downloads/tello/0228/Tello+SDK+Readme.pdf

なお、コマンド一覧を、和文の表形式にまとめたものは、以下のウェブページに掲載されています。
- [合同会社ミドリアイティ 『Pythonによるドローン「Tello」の制御』](https://midoriit.com/2018/05/python%e3%81%ab%e3%82%88%e3%82%8b%e3%83%89%e3%83%ad%e3%83%bc%e3%83%b3%e3%80%8ctello%e3%80%8d%e3%81%ae%e5%88%b6%e5%be%a1.html)