質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Q&A

解決済

3回答

16370閲覧

ドローン「Tello」を使った動画のストリーム表示が出来ません!

jun_taki

総合スコア9

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

0グッド

0クリップ

投稿2019/04/02 04:28

<概要>
DJI社のドローン「Tello」のSDKを用いた動画のストリーム表示がうまくできなくて困っています。

<詳細>
「tello」のSDKに従い、PCにUDPサーバーを立てて「tello」から動画を受信し、opencvでウィンドウ表示させることができない状況です。
(※UDPクライアントを使った「Tello」の離陸と着陸はできています。初心者のため、IPアドレスやポートの設定が間違っていると思うのですが、どのように直して良いのか全くわかりません…お助けいただけると非常に助かりますorz)

<参考にしているページ>
[DJI社の公式SDKガイドPDF]
https://dl-cdn.ryzerobotics.com/downloads/Tello/Tello%20SDK%202.0%20User%20Guide.pdf
[類似の開発ブログ]
http://kodamap.hatenablog.com/entry/2018/12/08/000000
https://qiita.com/mozzio369/items/8e0fb12dc30c493f5cc4
[ソケット通信の勉強]
https://qiita.com/__init__/items/5c89fa5b37b8c5ed32a4

<OSなど>
OS:Windows10
Opencvバージョン:4.0.0
Pythonバージョン:3.7

<エラー内容>
warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:901)
warning: udp://192.168.10.2:11111 (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:902)
Traceback (most recent call last):
File "tello_demo.py", line 36, in <module>
cv2.imshow('frame', frame)
cv2.error: OpenCV(4.0.0) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:350: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

<コード内容>

python

1# tello操作用 2import socket 3import time 4 5# 画像処理用 6import cv2 7 8# telloへのアクセス用 9tello_ip = '192.168.10.1' 10tello_port = 8889 11tello_address = (tello_ip, tello_port) 12 13# telloからのデータ受領用 14host = '192.168.10.2' 15port = 11111 16mypc_address = (host, port) 17 18# 通信用のソケットを作成 19# ※アドレスファミリ:AF_INET(IPv4)、ソケットタイプ:SOCK_DGRAM(UDP) 20socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 21 22# リッスン状態にする 23socket.bind(mypc_address) 24 25# コマンドモードを使うため'command'というテキストを投げる 26socket.sendto('command'.encode('utf-8'), tello_address) 27 28# ビデオストリーミングを開始させるため、'streamon'というテキストを投げる 29socket.sendto('streamon'.encode('utf-8'), tello_address) 30print("ストリーミング開始") 31 32# ビデオストリーミングを取得して、ウィンドウに表示 33capture = cv2.VideoCapture('udp://192.168.10.2:11111') 34while True: 35 ret, frame = capture.read() 36 cv2.imshow('frame', frame) 37 if cv2.waitKey(1) & 0xFF == ord('q'): 38 break 39capture.release() 40cv2.destroyAllWindows() 41 42# ビデオストリーミングを停止させるため、'streamoff'というテキストを投げる 43socket.sendto('streamoff'.encode('utf-8'), tello_address) 44

どうぞ、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

初心者のため、IPアドレスやポートの設定が間違っていると思うのですが、どのように直して良いのか全くわかりません

この問題に関しては、環境等によって異なりますので具体的なアドバイスはできません。
しかしエラー文を見ていると別の問題のようです。
どうやら、画像が取得出来ていないのか、フレームのずれが発生しているのかは分かりませんが、「size.width>0 && size.height>0」という明らか画像の出力が出来ていないような気がします。

私はドローンを使った事なんてありませんが、cv2.imshow('frame', frame)の値のframeの値をご確認ください。0以下になっている様な気がします。
こことかが参考になりそうな気がします。

それでは引き続き頑張って下さいね。

投稿2019/04/02 04:55

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun_taki

2019/04/02 05:19

ご回答ありがとうございます!frameの値など、もう少し原因を調べてみます!
guest

0

本件、自己解決しましたので、想定通りに機能したときのコードを載せておきます。

※以下、自己解決のヒントになったページも共有します。
<参考サイト>
https://tellopilots.com/threads/djitellopy-a-new-python-wrapper-for-tello.2518/
https://github.com/damiafuentes/DJITelloPy

Python

1import socket 2import threading 3import cv2 4 5# telloへのアクセス用 6tello_ip = '192.168.10.1' 7tello_port = 8889 8tello_address = (tello_ip, tello_port) 9 10# telloからの受信用 11VS_UDP_IP = '0.0.0.0' 12VS_UDP_PORT = 11111 13 14# VideoCapture用のオブジェクト準備 15cap = None 16# データ受信用のオブジェクト準備 17response = None 18 19# 通信用のソケットを作成 20# ※アドレスファミリ:AF_INET(IPv4)、ソケットタイプ:SOCK_DGRAM(UDP) 21socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 22 23# リッスン状態にする 24socket.bind(('', tello_port)) 25 26# データ受け取り用の関数 27def run_udp_receiver(): 28 while True: 29 try: 30 response, _ = socket.recvfrom(1024) 31 except Exception as e: 32 print(e) 33 break 34 35thread = threading.Thread(target=run_udp_receiver, args=()) 36thread.daemon = True 37thread.start() 38 39# コマンドモードを使うため'command'というテキストを投げる 40socket.sendto('command'.encode('utf-8'), tello_address) 41 42# 離陸 43socket.sendto('takeoff'.encode('utf-8'), tello_address) 44 45# ビデオストリーミング開始 46socket.sendto('streamon'.encode('utf-8'), tello_address) 47 48udp_video_address = 'udp://@' + VS_UDP_IP + ':' + str(VS_UDP_PORT) 49if cap is None: 50 cap = cv2.VideoCapture(udp_video_address) 51if not cap.isOpened(): 52 cap.open(udp_video_address) 53while True: 54 ret, frame = cap.read() 55 cv2.imshow('frame', frame) 56 if cv2.waitKey(1) & 0xFF == ord('q'): 57 break 58cap.release() 59cv2.destroyAllWindows() 60 61# ビデオストリーミング停止 62socket.sendto('streamoff'.encode('utf-8'), tello_address) 63 64# 着陸 65socket.sendto('land'.encode('utf-8'), tello_address) 66

投稿2019/04/05 08:20

jun_taki

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KaiganBay

2020/05/28 02:32 編集

お世話になります。 ちょうど困ってたところの ”渡りに船” でした。 助かりました。 大変ありがとうございました。
guest

0

コメント欄と間違えて記入したため 削除しました。
大変失礼いたしました。
今のところ削除方法がわかりません。
https://teratail.com/questions/1164

投稿2020/05/28 02:25

編集2020/05/28 02:31
KaiganBay

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問