ROS 2 Iron 教程 第一章 CLI Tools 第四节 理解话题

本文介绍了如何使用ROS2的CLITools工具,如rqt_graph、ros2topiclist等,来理解和操作ROS2中的节点和话题,包括数据发布、订阅、可视化和频率监控。
摘要由CSDN通过智能技术生成

前言

本系列文章是由笔者翻译自ROS 2 官方教程。笔者水平有限,如有错误,还请读者指正。

目标

使用 rqt_graph 和 命令行工具来认识 ROS 2 话题。

背景

ROS 2将复杂的系统分解为许多模块化的节点。话题是 ROS 结构图中的关键元素,它扮演了交换信息的总线。

在这里插入图片描述

一个节点可能向多个话题发布信息,也可以订阅多个话题。

在这里插入图片描述

话题是数据在节点之间或是系统不同部分之间交换数据的主要方式之一。

先决条件

之前的教程提供了一些关于本教程中构建节点的背景信息。

一如既往,别忘记在每个新打开的终端中添加 ROS 2 启动文件。

任务

1 Setup (设置)

到目前为之,你应该对于启动 turtlesim 已经很熟悉了。

打开一个新终端,并运行:

ros2 run turtlesim turtlesim_node

再打开一个终端,并运行:

ros2 run turtlesim turtle_teleop_key

请回忆一下在先前教程之中提到的,这些节点的默认名字是turtlesim/teleop_turtle

2 rqt_graph (rqt图形化工具)

在本节教程中,我们将会使用rqt_graph来可视化节点和话题的改变,它们之间的链接也可以被展示在可视化图上。

在上节教程中,rqt 和它的插件,包括rqt_graph已经被安装。

为了运行 rqt_graph,打开一个新终端并运行:

rqt_graph

你也可以通过打开 rqt 打开 rqt_graph,在 rqt 界面中选择 Plugins > Introspection > Node Graph

在这里插入图片描述
你应该看到如图所示的节点与话题,以及两个围绕在图周围的两个动作(让我们现在暂时忽略它们)。如果你将鼠标悬停在图中央的话题上,你将会看到它被高亮显示。

这个图表描绘了/turtlesim/teleop_turtle节点是如何通过一个话题通信的。

节点/teleop_turtlesim正在向话题/turtle1_cmd_vel发布数据(你按下的来让海龟移动的键),节点/turtlesim正订阅着这个话题来接受数据。

rqt_graph 高亮的功能在检查有许多节点、节点之间链接多样的复杂系统时是十分有用的。

rqt_graph 是一个图形化的检查工具。现在我们将学习命令行的检查工具。

3 ros2 topic list (ROS 2 话题列表)

在新的终端中运行ros2 topic list命令将会返回目前系统中活跃的话题列表:

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

ros2 topic list -t将会返回同样的列表,此时在方括号中会附加上话题的类别:

/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

这些属性,尤其是类别,被节点用于判断它们是否正在话题上交换同一种信息。

假如你好奇 rqt_graph 中所有话题的样子,你可以取消勾选 Hide 下的所有勾选框:
在这里插入图片描述
不过现在还是不要勾选这些勾选框吧,以免混淆。

4 ros2 topic echo (ROS 2 话题显示)

为了显示在话题上发布的信息,运行:

ros2 topic echo <topic_name>

既然我们已经知道/teleop_turtle/turtle1/cmd_vel话题上向/turtlseim发布数据,我们可以使用echo来查看话题:

ros2 topic echo /turtle1/cmd_vel

起初,这个命令不会返回任何数据。那是因为它正在等待/teleop_turtle的数据。

回到运行turtle_teleop_key的终端,使用方向键来控制海龟的移动。于此同时,观察echo运行的窗口,你将会看到你每次按下键盘产生的位置信息:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

现在回到 rqt_graph 并取消勾选 Debug 勾选框。
在这里插入图片描述

/_roscli_26646 是我们刚刚运行的 echo 命令创建的节点(数字可能有所不同)。现在你可以看到发布者在 cmd_vel 话题上发布数据,两个订阅者正订阅它们。

5 ros2 topic info (ROS 2 话题信息)

话题不一定得是一对一的通信;它们可以是一对多,多对一,或是多对多。

另一种查看方式是运行:

ros2 topic info /turtle1/cmd_vel

它将会返回:

Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

6 ros2 interface show (ROS 2 接口信息)

节点在话题上使用消息发送数据。订阅者和发布者必须通过发送或是接受同类型的信息来通信。

在上方我们通过运行ros2 topic list -t来查看话题类型,返回的信息让我们知道话题上使用了哪种消息。

话题cmd_vel的类型是:

geometry_msgs/msg/Twist

这表明,在gemoetry_msgs包中有一个名为Twist的消息。
现在我们可以运行ros2 interface show <msg type>来得到它的具体信息。具体来说,是消息的结构。

ros2 interface show geometry_msgs/msg/Twist

上方的命令返回:

# This expresses velocity in free space broken into its linear and angular parts.

    Vector3  linear
            float64 x
            float64 y
            float64 z
    Vector3  angular
            float64 x
            float64 y
            float64 z

这告诉你/turtlesim节点所需要的消息含有两个向量,linearangular,每个向量含有三个元素。如果你回忆一下通过 echo命令看到的/teleop_turtle/turtlesim传递的数据,它们有相同的结构:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

7 ros2 topic pub (ROS 2 话题发布)

既然你知道了消息的结构,你可以在话题上直接发布消息。使用如下命令:

ros2 topic pub <topic_name> <msg_type> '<args>'

参数 '<args>'是你将在话题上直接发布的实际数据,它的结构和你在上部分你发现的一样。
需要重点注意的是参数需要使用 YAML 语法输入。使用如下命令输入:

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

可选参数 --once 表明“发布一条消息后退出”
你将会在终端中看到如下输出:

publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

此外,你将会看到海龟像这样移动:
在这里插入图片描述
海龟(或是真正的机器人)需要一个稳定的命令流来连续操控。让海龟持续运动,运行:

ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

与上面的命令的不同之处是移除了--once参数并添加--rate 1参数,它使得ros2 topic pub命令以频率为 1HZ 的稳定流来发布命令。
在这里插入图片描述
你可以刷新 rqt_graph 来查看发生了什么。你将会看到ros2 topic hub节点(/_ros2cli_30358)正在/turtle/cmd_vel话题上发布,ros2 topic echo节点(/_ros2cli_26646)和/turtlesim都在接收。
在这里插入图片描述
最后,你可以在pose话题上运行echo命令,然后再次查看 rqt_graph

ros2 topic echo /turtle1/pose

在这里插入图片描述
你可以看到/turtlesim节点也在pose话题上发布, 新的echo节点订阅了这个话题。
当发布带有时间戳的消息时,pub有两个该方法来使用当前时间填充。对于有/std_msgs/msg/Header的消息,消息头可以被设置为auto来填充stamp字段。

ros2 topic pub /pose geometry_msgs/msg/PoseStamped '{header: "auto", pose: {position: {x: 1.0, y: 2.0, z: 3.0}}}'

假如消息没有使用完全的头,但使用builtin_interfaces/msg/Time字段,它可以被设置为now

ros2 topic pub /reference sensor_msgs/msg/TimeReference '{header: "auto", time_ref: "now", source: "dumy"}'

8 ros2 topic hz (ROS 2 话题频率)

为了查看数据的发布频率,你可以使用:

ros2 topic hz /turtle1/pose

它将会返回/turtlesim节点在pose话题上发布数据的频率:

average rate: 59.354
  min: 0.005s max: 0.027s std dev: 0.00284s window: 58

请回忆一下,你在上面使用ros2 topic pub --rate 1turtle1/cmd_vel的发布频率设置为稳定的 1HZ。如果你在turtle1/cmd_vel 上运行上面的命令,你将会看到反映频率的平均数。

总结

节点在话题上发布信息,这可以让许多其他节点订阅它并访问信息。在本节教程中你使用 rqt_graph 和命令行工具查看了多个节点在话题上的链接。你应该对于 ROS 2 系统上数据的移动方式有了清晰的概念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值