1
1

More than 3 years have passed since last update.

TelloEduで2機編隊飛行 〜 両機が反対方向の行動を取るようプログラミングしてみる(成功)

Last updated at Posted at 2021-07-27

過去2本の記事の続編に続いて、いよいよ2機のドローンに対して、Macbook PCから同時に操作コマンドを送信してみます。2機とも、離陸から着陸まで、意図した通りに動作しました。

行ったこと

Wifiルータ経由で、Macbook PCのTerminalに打ち込んだ操縦コマンドを、同時に2機のTelloEduドローンに送信して、操作に成功しました。

Terminalに打ち込む操縦コマンドは、1機目に対するコマンド指令だけです。
2機目のドローンは、1機目に与えられた指令と、一部反対の行動を自動で実施します。

2機目のドローンは、次のif ~ then・・・ ロジックに従って、「1機目に与えられた指示の内容」をもとに、自分がとるべき行動を自律的に判断します。

以下、msgには、1機目のドローンが、ユーザからコンソール入力で受け取った飛行指令コマンドが格納されています。

判断ロジック@2機目のドローン
if "cw"  in msg:
    msg2 = 'ccw ' + msg[3:]
elif "up" in msg:
    msg2 = "down " + msg[3:]
elif "down"  in msg:
    msg2 = "up " + msg[5:]
elif "forward" in msg:
    msg2 = "back " + msg[8:]
elif "back" in msg:
    msg2 = "forward " + msg[5:]
else:
    msg2 = msg

実行コード

Terminal
% python3 two_drone_remote_ctl2.py -drone1_ip 192.168.0.9 -drone2_ip 192.168.0.11

実行画面

Terminal
electron@diynoMacBook-Pro TelloEduSwarm % python3 two_drone_remote_ctl2.py -drone1_ip 192.168.0.9 -drone2_ip 192.168.0.11
1機目のドローンに接続します。('192.168.0.9', 8889)
2機目のドローンに接続します。('192.168.0.11', 8889)
Tello1号機に送る指示コマンドを入力してください。:  takeoff
1号機の実施行動: takeoff
2号機の実施行動: takeoff
Tello1号機に送る指示コマンドを入力してください。:  cw 720
1号機の実施行動: cw 720
2号機の実施行動: ccw 720
Tello1号機に送る指示コマンドを入力してください。:  up 50
1号機の実施行動: up 50
2号機の実施行動: down 50
dowTello1号機に送る指示コマンドを入力してください。:  down 50
1号機の実施行動: down 50
2号機の実施行動: up 50
Tello1号機に送る指示コマンドを入力してください。:  cw 180
1号機の実施行動: cw 180
2号機の実施行動: ccw 180
Tello1号機に送る指示コマンドを入力してください。:  forward 50
1号機の実施行動: forward 50
2号機の実施行動: back 50
Tello1号機に送る指示コマンドを入力してください。:  back 50
1号機の実施行動: back 50
2号機の実施行動: forward 50
Tello1号機に送る指示コマンドを入力してください。:  land
1号機の実施行動: land
2号機の実施行動: land
Tello1号機に送る指示コマンドを入力してください。:  ^Z
zsh: suspended  python3 two_drone_remote_ctl2.py -drone1_ip 192.168.0.9 -drone2_ip 
electron@diynoMacBook-Pro TelloEduSwarm % 
electron@diynoMacBook-Pro TelloEduSwarm % python3 two_drone_remote_ctl2.py -drone1_ip 192.168.0.9 -drone2_ip 192.168.0.11
1機目のドローンに接続します。('192.168.0.9', 8889)
2機目のドローンに接続します。('192.168.0.11', 8889)
Tello1号機に送る指示コマンドを入力してください。:  takeoff
1号機の実施行動: takeoff
2号機の実施行動: takeoff
Tello1号機に送る指示コマンドを入力してください。:  up
1号機の実施行動: up
2号機の実施行動: down 
Tello1号機に送る指示コマンドを入力してください。:  down
1号機の実施行動: down
2号機の実施行動: up 
Tello1号機に送る指示コマンドを入力してください。:  up 50
1号機の実施行動: up 50
2号機の実施行動: down 50
Tello1号機に送る指示コマンドを入力してください。:  down 50
1号機の実施行動: down 50
2号機の実施行動: up 50
Tello1号機に送る指示コマンドを入力してください。:  up 100
1号機の実施行動: up 100
2号機の実施行動: down 100
Tello1号機に送る指示コマンドを入力してください。:  down 100
1号機の実施行動: down 100
2号機の実施行動: up 100
Tello1号機に送る指示コマンドを入力してください。:  land 
1号機の実施行動: land
2号機の実施行動: land
Tello1号機に送る指示コマンドを入力してください。:  ^Z
zsh: suspended  python3 two_drone_remote_ctl2.py -drone1_ip 192.168.0.9 -drone2_ip 
electron@diynoMacBook-Pro TelloEduSwarm % 

実行したスクリプト

two_drone_remote_ctl2.py
import socket, argparse, time    

# 各機体のIPアドレスを、コマンドライン引数から受け取る
parser = argparse.ArgumentParser(description='')  
parser.add_argument('-drone1_ip')  
parser.add_argument('-drone2_ip')  

args = parser.parse_args() 
fst_drone_ip = args.drone1_ip
snd_drone_ip = args.drone2_ip

#print("IPアドレス {0} 番のTelloEduドローンに操作コマンドを送ります。".format(tello_ip))

# TelloEduのポート番号は全機体、同じ定数文字列
tello_port = 8889
fst_drone_address = (fst_drone_ip, tello_port)
snd_drone_address = (snd_drone_ip, tello_port)

print("1機目のドローンに接続します。" + str(fst_drone_address))
print("2機目のドローンに接続します。" + str(snd_drone_address))

socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 両機にcommand指令を伝達
socket.sendto('command'.encode('utf-8'), fst_drone_address)
socket.sendto('command'.encode('utf-8'), snd_drone_address )

# 前の動作が終わるまで、sleepで待機
time.sleep(3)

while True: 
    # 最初に入力が必要な"command"命令は、ユーザが打ち込まなくて良いようにスクリプト側でTelloに送出する

    # "takeoff"以降の命令をユーザ入力から受け取る
    try:
        msg = input("Tello1号機に送る指示コマンドを入力してください。:  ")
        if not msg:
            break  

        if "cw"  in msg:
            msg2 = 'ccw ' + msg[3:]
        elif "up" in msg:
            msg2 = "down " + msg[3:]
        elif "down"  in msg:
            msg2 = "up " + msg[5:]
        elif "forward" in msg:
            msg2 = "back " + msg[8:]
        elif "back" in msg:
            msg2 = "forward " + msg[5:]
        else:
            msg2 = msg

        print("1号機の実施行動: " + str(msg))
        print("2号機の実施行動: " + str(msg2))
        socket.sendto(msg.encode(encoding="utf-8") , fst_drone_address)
        socket.sendto(msg2.encode(encoding="utf-8") , snd_drone_address)
        time.sleep(3)
    except KeyboardInterrupt:
        sock.close()  
        break

今後の抱負

2機のTelloEduから送信される画像データを、Macbook側で受信して、ウインドウに表示させたい。
Tello-PythonやTelloPyを使わずに、以下の記事にあるように、自分でコードを書いて動かしたい。

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