Mavros: MAVCMDを介して曲を再生する

作成日 2019年06月10日  ·  15コメント  ·  ソース: mavlink/mavros

rosrunコマンドで曲を再生しようとしています:
rosrun mavros mavcmd 258 0 0 0 0 0 0 0

誰かが私が送信する必要があるパラメータを知っていますか?


MAVROSのバージョンとプラットフォーム

ROS:メロディック
Ubuntu:16.04

オートパイロットのタイプとバージョン

[] ArduPilot
[x] PX4

バージョン:3.7.1

question

全てのコメント15件

MAV_CMDにはそのようなコマンドはありません。

PLAY_TUNEを送信する場合は、プラグインを作成する必要があります。

初心者の質問:プラグインが存在するので(このプルリクエストを参照してください-@ mortenfyhnに感謝します)、mavrosを介して単純な曲を再生する最も簡単な方法は何でしょうか?

私はPixhawk1のROSnoetic、Ubuntu 20.04、ArduSub4.0.2を使用しています。 ブザーが接続され、pixhawkの起動時に何かを再生します。 しかし、その後は何も再生できません。

私が試してみました
roslaunch mavros apm.launch fcu_url:=udp://:[email protected]:14549
そして私がするとき
rostopic echo /mavros/state
定期的なメッセージが表示されるので、接続が機能したと確信しています。
しかし、私がしようとすると
rostopic pub -1 /mavros/play_tune mavros_msgs/PlayTuneV2 "format: 2 tune: '>e16e8e16r16c16e8g4<g4'"
何も起こりません。

重要な基本的なステップが欠けているような気がします。 正しい方向へのポインタをいただければ幸いです。 私はまだ学んでいます。

心配はいりません。不足しているのは、play_tuneプラグインを有効にすることだけかもしれません。 mavrosを起動すると、プラグインがロードされた/ブラックリストに登録された/類似しているというプラグインの長いリストが表示されますか? どのプラグインが有効になっているかがわかります。 apm.launchによって読み取られる構成ファイルapm_pluginlists.yaml play_tuneプラグインを追加できます。 うまくいけば、それはそれを解決します。

迅速な返信ありがとうございます!

うん、私は得る
[ INFO] [1620733606.153262125]: Plugin play_tune loaded
[ INFO] [1620733606.155413105]: Plugin play_tune initialized

apm_pluginlists.yamlは次のようになります。

plugin_blacklist:
# common
- actuator_control
- ftp
- safety_area
- hil
# extras
- altitude
- debug_value
- image_pub
- px4flow
- vibration
- vision_speed_estimate
- wheel_odometry

plugin_whitelist: []
#- 'sys_*'

それは変です。 QGroundControlまたは同様のものを実行していますか? その「mavlinkインスペクター」を使用して、mavlinkPLAY_TUNE_V2メッセージが表示されているかどうかを確認できます。 それを超えて、私は他のメンテナがこれを理解するのにより適しているかもしれないと思います。

ああ、興味深いことに、QGCには表示されません。

qgc_mavlink_messages

ここで何が問題になっているのかを最初に把握する必要があるようです。 多分それはArduSubの問題です。

ああ、ありがとうございました:-)

考えてみると、動作してもQGCに表示されないようになっているのかもしれません。 メッセージは直接pixhawkに送られ、pixhawkはそれをQGCに渡さない可能性があります。

@mortenfyhn PLAY_TUNEはFCUリンクに
残念ながら、パケットをキャッチするためにFCUとMAVROSの間に何かを置いた場合にのみ、mavrosv1でそのメッセージをキャプチャするのは簡単ではありません。

うーん、Wiresharkプラグインを作成してデータを検査することもできます(ただし、それがまだ機能しているかどうかはわかりません)。
また、オープンソースファームウェアを扱っているので、ArduSubがそのメッセージを受け入れるかどうかを確認できます:)

興味深いことに、調査していただきありがとうございます。

この問題を回避する(初心者向けの)方法はありますか?
何かを手伝うことはできますか?また、変更を加えるのに最も効果的な場所はどこですか?

プラグインを拡張して、プレーンなPLAY_TUNEメッセージをサポートできると思います。 @ vooon 、API変更のポリシーは何ですか? 新しいサブスクライバーを作成したいので、プラグインはmavros_msgs / PlayTune-> mavlink PLAY_TUNEの場合は~play_tuneを読み取り、mavros_msgs / PlayTuneV2-> mavlinkPLAY_TUNE_V2の場合は~play_tune_v2を読み取ります。 しかし、それはv2メッセージに~play_tuneを使用する古いAPIを壊します。

または、 ~play_tuneでv1またはv2メッセージを予期するかどうかを決定するパラメーターを追加して、一致するmavlinkメッセージを出力することもできます。

@mortenfyhn 1.0の段階なので、既存のAPIを保持したいと思います。
また、ユーザーはメッセージの魔女バージョンが送信されることを気にする必要がないので、パラメータと検出を追加したいと思います。

そんな感じ:

void connection_cb() {
  int new_ver = 0
  if (nh.getParam("message_version", new_ver) {
    // check 1 vs 2
  } 
  if (new_ver == 0) {
    new_ver = m_uas->is_ardupilotmega() ? 1 : 2;
  }

  message_version = new_ver;
}

@mortenfyhn 1.0の段階なので、既存のAPIを保持したいと思います。

:+1:

私はあなたが提案するように大まかにやります:

  • パラメータを追加します。
  • 設定されていない場合は、既存の動作を維持します。
  • v1 / v2を指定するように設定されている場合は、それを使用します。
  • 設定されておらず、 m_uas->is_ardupilotmega() == true場合は、v1を使用します。

はい、0 == auto(APMの場合はv1 /その他の場合はv2)を使用しても問題ないと思います。

また、PlayTuneV2.msgをPLAY_TUNEに変換するだけです。
そのフォーマット== MML(APMの実装)をチェックする必要があり、次にそのようなことをする必要があります(擬似コード):
`` `
PLAY_TUNE pt {};

mavlink :: set_string(pt.tune、tune-> tune);
mavlink :: set_string_z(pt.tune2、tune-> tune [pt.tune.size():]);

このページは役に立ちましたか?
0 / 5 - 0 評価