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 上使用 ROS noetic、Ubuntu 20.04、ArduSub 4.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 时,您是否会收到一长串插件,说插件已加载/已列入黑名单/类似? 它会告诉您启用了哪些插件。 您可以添加play_tune插件的配置文件apm_pluginlists.yaml这是由读取apm.launch 。 希望这能解决它。

感谢您的快速回复!

是的,我明白了
[ 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 检查器”来检查您是否看到了 mavlink PLAY_TUNE_V2 消息。 除此之外,我认为其他维护者可能更适合解决这个问题。

哦,有趣的是,它没有出现在 QGC 中。

qgc_mavlink_messages

看起来我首先需要弄清楚这里出了什么问题。 也许这是 ArduSub 的问题。

哦,非常感谢您的时间:-)

当我想到它时,它可能不会出现在 QGC 中,即使它有效。 消息可能会直接发送到 pixhawk,而 pixhawk 可能不会将其传递给 QGC。

@mortenfyhn PLAY_TUNE 进入 FCU 链接,因此不太可能在 GCS 上看到它,除非固件将其路由回来。
不幸的是,在 mavros v1 中捕获该消息并不容易,只有当您在 FCU 和 MAVROS 之间放置一些东西来捕获数据包时。

嗯,您可以尝试构建 Wireshark 插件来检查数据(但我真的不知道它是否仍然有效)。
由于我们正在处理开源固件,我们可以去看看 ArduSub 是否接受该消息:)

有趣的知道,感谢您的调查!

有没有(初学者友好的)方法来规避这个问题?
我能帮上什么忙吗?哪里是做出改变最有效的地方?

我可能可以扩展插件以支持普通的 PLAY_TUNE 消息。 @vooon ,API 更改的政策是什么? 我很想创建一个新订阅者,因此插件读取~play_tune表示 mavros_msgs/PlayTune -> mavlink PLAY_TUNE,以及~play_tune_v2表示 mavros_msgs/PlayTuneV2 -> mavlink PLAY_TUNE_V2。 但这会破坏旧的 API,它使用~play_tune来处理 v2 消息。

或者,我可以添加一个参数来确定它是否需要~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 (v1 用于 APM / v2 用于其他)。

啊,还有,我们应该简单地将 PlayTuneV2.msg 转换为 PLAY_TUNE。
需要检查格式 == MML(APM 的实现),然后执行类似的操作(伪代码):
```
PLAY_TUNE 点{};

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

此页面是否有帮助?
0 / 5 - 0 等级