rosrunコマンドで曲を再生しようとしています:
rosrun mavros mavcmd 258 0 0 0 0 0 0 0
誰かが私が送信する必要があるパラメータを知っていますか?
ROS:メロディック
Ubuntu:16.04
[] ArduPilot
[x] PX4
バージョン:3.7.1
初心者の質問:プラグインが存在するので(このプルリクエストを参照してください-@ 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には表示されません。
ここで何が問題になっているのかを最初に把握する必要があるようです。 多分それはArduSubの問題です。
ああ、ありがとうございました:-)
考えてみると、動作してもQGCに表示されないようになっているのかもしれません。 メッセージは直接pixhawkに送られ、pixhawkはそれをQGCに渡さない可能性があります。
@mortenfyhn PLAY_TUNEはFCUリンクに
残念ながら、パケットをキャッチするためにFCUとMAVROSの間に何かを置いた場合にのみ、mavrosv1でそのメッセージをキャプチャするのは簡単ではありません。
うーん、Wiresharkプラグインを作成してデータを検査することもできます(ただし、それがまだ機能しているかどうかはわかりません)。
また、オープンソースファームウェアを扱っているので、ArduSubがそのメッセージを受け入れるかどうかを確認できます:)
と:
と:
つまり、FWはPLAY_TUNEを必要とし、プラグインはPLAY_TUNE_V2を送信します。
APタイプに基づいたメッセージ選択を追加する必要があると思います。
興味深いことに、調査していただきありがとうございます。
この問題を回避する(初心者向けの)方法はありますか?
何かを手伝うことはできますか?また、変更を加えるのに最も効果的な場所はどこですか?
プラグインを拡張して、プレーンな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:
私はあなたが提案するように大まかにやります:
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():]);
「