#目的
pythonを使ったドローン(tello)の操作。操作内容はPCへドローンのライブ画像を表示し、pc側からコマンド操作にてドローンを制御する。
#できていること
①ライブ画像を表示すること
②コマンドにてドローンを操作すること
#問題
①②を組み合わせるとライブ画像がフリーズしてしまう。(コマンド操作は可能)
whileのループにてドローンの映像を更新しているのですが、2周目でフリーズしてしまいます。
#エラーメッセージ
なし
#環境
windows10 64bit
python 3.8.3
visual studio code 1.49.3
opencv-python 4.4.0.42
import socket import threading import cv2 import time #オブジェクト準備 sock = None #通信ソケット用 cap = None #VideoCapture用 # telloのコマンドの送信&応答の受信 tello_ip = '192.168.10.1' tello_port = 8889 tello_address = (tello_ip, tello_port) #UDP通信のリッスンで使用するがどういう意味? host = '0.0.0.0' port = 9000 locaddr = (host,port) # telloからのビデオストリーミングの受信用 VS_UDP_IP = '0.0.0.0' VS_UDP_PORT = 11111 udp_video_address = 'udp://@' + VS_UDP_IP + ':' + str(VS_UDP_PORT) # 通信用のソケットを作成 #アドレスファミリ:AF_INET(IPv4)、ソケットタイプ:SOCK_DGRAM(UDP) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(locaddr) ##以下からメインプログラム #プログラムの起動メッセージ print ('Tello プログラム開始') def recvtello(): #recv関数が以下のように定義される data, server = sock.recvfrom(1518) #ポート番号1518のサーバと繋ぐ print(data.decode(encoding="utf-8")) #サーバからの返答を書き込む→Telloからの返答 print('a') #Telloがコマンドモードへ突入 sock.sendto('command'.encode('utf-8'), tello_address) #コマンドモードへ切り替える print ('command OK?') time.sleep(1) sock.sendto('streamon'.encode('utf-8'), tello_address) #ストリーミングのON print ('streamon OK?') #データ送信用関数の定義。ここでは定義のみで実行はまだ def sendtello(): msg = input(""); #キーボードからの入力をmsgとする msg = msg.encode(encoding="utf-8") #msgをutf-8形式で書き換える sent = sock.sendto(msg, tello_address) #Telloアドレスへ変換したmsgを送る #画像受信用関数の定義。ここでは定義のみで実行はまだ def livetello(): ret, frame = cap.read() #フレーム画像の読み込み #cv2.imshow('tello', frame) cv2.imshow('tello', cv2.resize(frame, (360, 240))) cv2.waitKey(100) #キー入力を1msだけ待つ cap = cv2.VideoCapture(udp_video_address) #capをTelloアドレスとアクセスしたVideocaputureのコントラクタと定義する while True: #以下の処理がtrueの間は繰り返す try: #以下の処理を実施する livetello() #sendtello() #recvtello() except KeyboardInterrupt: #Ctrl+cが押されたら以下の処理を実行する print('Cntl+c') sock.sendto('land'.encode('utf-8'), tello_address) #着陸 print ('land OK?') time.sleep(3) sock.sendto('streamoff'.encode('utf-8'), tello_address) #ストリーミングOFF print ('streamoff OK?') sock.close() print ('sock close') cv2.destroyAllWindows() #すべてのウィンドウを閉じる cap.release() #cap.readで読み込んだフレーム画像を閉じる break
あなたの回答
tips
プレビュー