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

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

ただいまの
回答率

89.12%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 4,923

jun_taki

score 9

<概要>
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'

<コード内容>

# tello操作用
import socket
import time

# 画像処理用
import cv2

# telloへのアクセス用
tello_ip = '192.168.10.1'
tello_port = 8889
tello_address = (tello_ip, tello_port)

# telloからのデータ受領用
host = '192.168.10.2'
port = 11111
mypc_address = (host, port)

# 通信用のソケットを作成
# ※アドレスファミリ:AF_INET(IPv4)、ソケットタイプ:SOCK_DGRAM(UDP)
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# リッスン状態にする
socket.bind(mypc_address)

# コマンドモードを使うため'command'というテキストを投げる
socket.sendto('command'.encode('utf-8'), tello_address)

# ビデオストリーミングを開始させるため、'streamon'というテキストを投げる
socket.sendto('streamon'.encode('utf-8'), tello_address)
print("ストリーミング開始")

# ビデオストリーミングを取得して、ウィンドウに表示
capture = cv2.VideoCapture('udp://192.168.10.2:11111')
while True:
    ret, frame = capture.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
capture.release()
cv2.destroyAllWindows()

# ビデオストリーミングを停止させるため、'streamoff'というテキストを投げる
socket.sendto('streamoff'.encode('utf-8'), tello_address)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/02 14:19

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

    キャンセル

+1

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

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

import socket
import threading
import cv2

# telloへのアクセス用
tello_ip = '192.168.10.1'
tello_port = 8889
tello_address = (tello_ip, tello_port)

# telloからの受信用
VS_UDP_IP = '0.0.0.0'
VS_UDP_PORT = 11111

# VideoCapture用のオブジェクト準備
cap = None
# データ受信用のオブジェクト準備
response = None

# 通信用のソケットを作成
# ※アドレスファミリ:AF_INET(IPv4)、ソケットタイプ:SOCK_DGRAM(UDP)
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# リッスン状態にする
socket.bind(('', tello_port))

# データ受け取り用の関数
def run_udp_receiver():
    while True:
        try:
            response, _ = socket.recvfrom(1024)
        except Exception as e:
            print(e)
            break

thread = threading.Thread(target=run_udp_receiver, args=())
thread.daemon = True
thread.start()

# コマンドモードを使うため'command'というテキストを投げる
socket.sendto('command'.encode('utf-8'), tello_address)

# 離陸
socket.sendto('takeoff'.encode('utf-8'), tello_address)

# ビデオストリーミング開始
socket.sendto('streamon'.encode('utf-8'), tello_address)

udp_video_address = 'udp://@' + VS_UDP_IP + ':' + str(VS_UDP_PORT)
if cap is None:
    cap = cv2.VideoCapture(udp_video_address)
if not cap.isOpened():
    cap.open(udp_video_address)
while True:
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

# ビデオストリーミング停止
socket.sendto('streamoff'.encode('utf-8'), tello_address)

# 着陸
socket.sendto('land'.encode('utf-8'), tello_address)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/28 11:25 編集

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

    キャンセル

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる