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

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

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

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

DJI SDK

DJI SDKはドローン関連のアプリケーションを開発するために設計された開発キットです。アプリのUIなどをカスタマイズできるUXSDK、積載物をコントロールするPSDK、機体情報をカスタマイズするOSDKやMSDKなどがあり、様々な用途に合わせてカスタマイズが可能です。

UDP

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

4126閲覧

[python] UDP/IP での Socket通信によるコマンドが通らないときの対処法

momokoko

総合スコア38

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

DJI SDK

DJI SDKはドローン関連のアプリケーションを開発するために設計された開発キットです。アプリのUIなどをカスタマイズできるUXSDK、積載物をコントロールするPSDK、機体情報をカスタマイズするOSDKやMSDKなどがあり、様々な用途に合わせてカスタマイズが可能です。

UDP

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/28 15:24

編集2022/01/12 10:55

ドローンへのコマンドが通らないときの対処法を知りたいです。

この記事
を参考にコマンドラインでドローンを操作しています。

エラーコード
・通信が通らずタイムアウトしてしまっています。

$ ./tello_test3.py write command:command sending command: command to 192.168.10.1 Max timeout exceeded... command command

ターミナルからのcommandを受けるコード

def send_command(self, command): """ Send a command to the ip address. Will be blocked until the last command receives an 'OK'. If the command fails (either b/c time out or error), will try to resend the command :param command: (str) the command to send :param ip: (str) the ip of Tello :return: The latest command response """ self.log.append(Stats(command, len(self.log))) self.socket.sendto(command.encode('utf-8'), self.tello_adderss) print ('sending command: %s to %s' % (command, self.tello_ip)) start = time.time() while not self.log[-1].got_response(): now = time.time() diff = now - start if diff > self.MAX_TIME_OUT: print( 'Max timeout exceeded... command %s' % command) # TODO: is timeout considered failure or next command still get executed # now, next one got executed return print ('Done!!! sent command: %s to %s' % (command, self.tello_ip))

ドローン自体を再起動や機体を変えてもずっと直らないときがあります。

macとドローン自体の通信は別のコマンド確認できています。
リンク内容
上記の記事の$ python tello_state.pyが正しく実行されます。

特別なエラーが出ているわけでもないので検索ワードすらわかない状態です。

ご教授いただけると嬉しいです。

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

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

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

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

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

guest

回答1

0

実機を持っていないので外しているかも知れません。

回線について

macとドローン自体の通信は別のコマンド確認できています。

と書かれているため問題ない可能性もありますが、念のため以下を試してください。

疎通確認

下記の結果はどうなるでしょうか?

terminal

1ping 192.168.10.1

ドローン側でICMPの応答を返さない場合は何も返って来ない可能性もありますが、まず最初にやる確認方法です。

コマンドによるUDPパケットの送信

ユーザガイドによると最初にUDPで接続して"command"と送れと書いてありますので、netcatを使ってターミナルから次のように打ってください。macOSには標準でncが含まれています。

terminal

1echo "command" | nc -u 192.168.10.1 8889

もしかしたら"command"は"Command"と先頭を大文字にする必要があるかも知れません。ユーザガイドのTello Commandsのセクションでは先頭が大文字ですが、マニュアル内の記述は小文字になっていますので、どちらでも良いかも知れません。

プログラムについて

気になるのはやはり

python

1self.socket.sendto(command.encode('utf-8'), self.tello_adderss)

の行になります。ユーザガイドを見るとTello側はIP 192.168.10.1, UDP port:8889で待ち受けています。
したがってself.tello_addressは

python

1("192.168.10.1", 8889)

となっているはずです。通信できることもある、ということですのでこの部分は大丈夫かも知れませんが、念のためこのようになっているか確認して下さい。

参考文献

投稿2020/06/29 04:20

yymmt

総合スコア1615

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

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

momokoko

2020/06/29 12:13

回答ありがとうございます! 本日実機がないので、検証できないのですが先に返信だけさせていただきます。 ping 192.168.10.1については昨日試していて、返ってきました。 ncコマンドにつきましてまた試させていただきます。 self.tello_addressの確認の仕方についてなのですが、 self.socket.sendto(command.encode('utf-8'), self.tello_adderss) の下に print('log: %s' %(self.tello_adderss)) で良かったでしょうか?
yymmt

2020/06/29 13:54

print('log:', self.tello_address)で良いと思います。
momokoko

2020/07/03 14:22 編集

遅くなりすみません。 $ ./tello_test3.py write command:command sending command: command to 192.168.10.1 from ('192.168.10.1', 8889): b'ok' Done!!! sent command: command to 192.168.10.1 と表示されました。
yymmt

2020/07/03 14:26

通信できてそうです。まだ状況変わらずコマンドは通らないということでしょうか?
momokoko

2020/07/05 15:02

すみません。 実機がないと諸々検証できず返信遅くなってます。 通信は相変わらず不安定です。 pingは通るのにcommandが通らないときがあります。
yymmt

2020/07/06 03:50

ドローン側のコマンド認識が厳格な可能性はあります。そのルールが明確になると良いですが、メーカー問い合わせは不可能でしょうか?通らない可能性の例をあげると - 改行が入っているとNG(あるいは入っていないNG): 例 "Command"はOKだが"Command\n"はNG - 前のコマンドの一部が残っているとNG: 例 前回の改行が残っていてNG という感じでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問