技術応用演習


Unity



Drone


ドローンでJ、Nを書いた。

Jの移動式



  # write "J"
# 必要なモジュールのインポート
import socket
import threading
import time
import sys

# telloのIPアドレスとポート
tello_address = ('192.168.10.1', 8889)

# ローカルコンピュータのIPアドレスとポート
local_address = ('', 9000)

# コマンドを送るためのUDP接続のの実体化
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# ローカルアドレスとポートのバインディング
sock.bind(local_address)

# telloへのコマンドの送信とディレイタイム(秒)生成関数
def send(message, delay):
    # 例外が表示されなかった場合,telloにエンコードされたコマンドを送信する
    try:
        sock.sendto(message.encode(), tello_address)
        print("Sending message: " + message)
    except Exception as e:
        print("Error sending: " + str(e))

    # ユーザーが定義した移動待ち時間(秒)
    time.sleep(delay)

# telloからのメッセージ受信関数
def receive():
    # telloからのメッセージ受信を常態化
    while True:
        # 例外が表示されなかった場合,受信状態を保つ
        try:
            response, ip_address = sock.recvfrom(128)
            print("Received message: " + response.decode(encoding='utf-8'))
        except Exception as e:
            # もしエラー検出された場合,ソケットを閉じ,ループを終了する
            sock.close()
            print("Error receiving: " + str(e))
            break


# シークエンス関数
def sequence():
    # ここにシークエンスを書き込む. 引数は2つで第一引数は"コマンド 移動距離(cm)”,第二引数はディレイタイム
#############################################################################################
    send("up 250", 4)
    send("down 190", 4)
    send("left 40", 4)
    send("down 40", 4)
    send("left 20", 4)
    send("down 20", 4)
    send("left 20", 4)
    send("up 30", 4)
    send("left 40", 4)
    send("up 40", 4)
#############################################################################################
    # ここまでは追記・削除おk.あとはいじらないこと!


# ここからがメインの実行処理
# バックグラウンド実行されるスレッドを作り,スタートする
# これはreceive関数を利用して,telloから送信されたメッセージを常態的に受信する
receiveThread = threading.Thread(target=receive)
receiveThread.daemon = True
receiveThread.start()

# telloをコマンドモードにセット
send("command", 3)
# 離陸コマンドの送信
send("takeoff", 5)

# ユーザーのコマンド入力のヘルプを表示
print('Type in a Tello SDK command and press the enter key. Enter "start" to start sequence. Enter "quit" to exit this program.')

# ユーザーが”quit”もしくは"start"をタイプするか,ctrl+cを押すまで,コマンド入力待ちをループ実行する
while True:

    try:
        # ユーザーのキーボード入力を読み込み
        message = input('')
        # もしユーザーが”quit”を入力したら,ソケットを閉じアプリケーション終了
        if 'quit' in message:
            # Land
            send("land", 5)
            print("Program exited sucessfully")
            sock.close()
            break
        # もしユーザーが”start”を入力したら,シークエンス開始
        elif 'start' in message:
            sequence()
            message = ''

        # telloにコマンドを送信
        send(message, 3)

    # ctrl+cの入力があった場合の制御
    except KeyboardInterrupt as e:
        send("land", 5)
        sock.close()
        break
        

Nの移動式



# write "N"
# 必要なモジュールのインポート
import socket
import threading
import time
import sys

# telloのIPアドレスとポート
tello_address = ('192.168.10.1', 8889)

# ローカルコンピュータのIPアドレスとポート
local_address = ('', 9000)

# コマンドを送るためのUDP接続のの実体化
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# ローカルアドレスとポートのバインディング
sock.bind(local_address)

# telloへのコマンドの送信とディレイタイム(秒)生成関数
def send(message, delay):
    # 例外が表示されなかった場合,telloにエンコードされたコマンドを送信する
    try:
        sock.sendto(message.encode(), tello_address)
        print("Sending message: " + message)
    except Exception as e:
        print("Error sending: " + str(e))

    # ユーザーが定義した移動待ち時間(秒)
    time.sleep(delay)

# telloからのメッセージ受信関数
def receive():
    # telloからのメッセージ受信を常態化
    while True:
        # 例外が表示されなかった場合,受信状態を保つ
        try:
            response, ip_address = sock.recvfrom(128)
            print("Received message: " + response.decode(encoding='utf-8'))
        except Exception as e:
            # もしエラー検出された場合,ソケットを閉じ,ループを終了する
            sock.close()
            print("Error receiving: " + str(e))
            break


# シークエンス関数
def sequence():
    # ここにシークエンスを書き込む. 引数は2つで第一引数は"コマンド 移動距離(cm)”,第二引数はディレイタイム
#############################################################################################
    send("up 200", 4)
    send("left 80", 4)
    send("down 80", 4)
    send("left 80", 4)
    send("down 80", 4)
    send("left 50", 4)
    send("down 80", 4)
    send("up 200", 4)
#############################################################################################
    # ここまでは追記・削除おk.あとはいじらないこと!


# ここからがメインの実行処理
# バックグラウンド実行されるスレッドを作り,スタートする
# これはreceive関数を利用して,telloから送信されたメッセージを常態的に受信する
receiveThread = threading.Thread(target=receive)
receiveThread.daemon = True
receiveThread.start()

# telloをコマンドモードにセット
send("command", 3)
# 離陸コマンドの送信
send("takeoff", 5)

# ユーザーのコマンド入力のヘルプを表示
print('Type in a Tello SDK command and press the enter key. Enter "start" to start sequence. Enter "quit" to exit this program.')

# ユーザーが”quit”もしくは"start"をタイプするか,ctrl+cを押すまで,コマンド入力待ちをループ実行する
while True:

    try:
        # ユーザーのキーボード入力を読み込み
        message = input('')
        # もしユーザーが”quit”を入力したら,ソケットを閉じアプリケーション終了
        if 'quit' in message:
            # Land
            send("land", 5)
            print("Program exited sucessfully")
            sock.close()
            break
        # もしユーザーが”start”を入力したら,シークエンス開始
        elif 'start' in message:
            sequence()
            message = ''

        # telloにコマンドを送信
        send(message, 3)

    # ctrl+cの入力があった場合の制御
    except KeyboardInterrupt as e:
        send("land", 5)
        sock.close()
        break