警告

您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.

了解主题

目标 使用 rqt_graph 和命令行工具反观 ROS 2 主题。

辅导水平: 初学者

时间 20 分钟

背景介绍

ROS 2 将复杂的系统分解成许多模块化节点。主题是 ROS 图形的重要元素,是节点交换信息的总线。

.././././_images/Topic-SinglePublisherandSingleSubscriber.gif

节点可以向任意数量的主题发布数据,并同时订阅任意数量的主题。

.././././_images/Topic-MultiplePublisherandMultipleSubscriber.gif

主题是在节点之间移动数据的主要方式之一,因此也是在系统不同部分之间移动数据的主要方式之一。

先决条件

"(《世界人权宣言》) 上一个教程 提供了一些有关节点的有用背景信息,本文将以这些信息为基础。

与往常一样,别忘了在 您打开的每个新终端.

任务

1 设置

现在,您应该可以轻松启动海龟模拟器了。

打开一个新终端并运行

ros2 运行 turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

回顾 上一个教程 这些节点的名称是 /turtlesim/teleop_turtle 默认情况下。

2 rqt_graph

在整个教程中,我们将使用 rqt_graph 以可视化不断变化的节点和主题,以及它们之间的联系。

"(《世界人权宣言》) 海龟模拟教程 告诉您如何安装 rqt 及其所有插件,包括 rqt_graph.

要运行 rqt_graph,请打开一个新终端并输入命令:

rqt_graph

您还可以通过打开 rqt 并选择 插件 >; 自省 >; 节点图.

././././_images/rqt_graph.png

你应该会看到上面的节点和主题,以及图形外围的两个操作(我们暂且忽略它们)。如果将鼠标悬停在中心的主题上,就会看到如上图所示的高亮颜色。

该图描述了 /turtlesim 节点和 /teleop_turtle 节点之间就某一主题进行交流。节点 /teleop_turtle 节点将数据(您输入的移动乌龟的按键)发布到 /turtle1/cmd_vel 主题,以及 /turtlesim 节点订阅该主题以接收数据。

rqt_graph 的高亮功能非常有助于检查以多种不同方式连接许多节点和主题的复杂系统。

rqt_graph 是一款图形化自省工具。现在我们来看看一些用于内省主题的命令行工具。

3 ROS2 专题清单

运行 玫瑰2 主题 清单 命令将返回系统中所有当前活动主题的列表:

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

玫瑰2 主题 清单 -t 将返回相同的主题列表,这次在括号中附加了主题类型:

/parameter_events [rcl_interfaces/msg/ParameterEvent] (参数事件)
/rosout[rcl_interfaces/msg/Log]。
/turtle1/cmd_vel [geometry_msgs/msg/Twist] (几何_msgs/msg/扭转)
/turtle1/color_sensor [turtlesim/msg/Color] (乌龟模拟/信息/颜色
/turtle1/pose [turtlesim/msg/Pose] (乌龟模拟/msg/Pose)

这些属性,尤其是类型,可以让节点知道它们谈论的是相同的主题信息。

如果您想知道这些主题在 rqt_graph 中的位置,可以取消选中以下所有复选框 藏起来

././././_images/unhide.png

不过,为了避免混淆,暂时不要勾选这些选项。

4 ros2 主题回声

要查看某个主题的发布数据,请使用

ros2 topic echo <topic_name>;

因为我们知道 /teleop_turtle/turtlesim/turtle1/cmd_vel 主题,让我们使用 回响 来反省这个问题:

ros2 topic echo /turtle1/cmd_vel

起初,这条命令不会返回任何数据。这是因为它在等待 /teleop_turtle 出版一些东西。

返回终点站 乌龟遥控钥匙 运行,并使用箭头移动乌龟。注意你的 回响 同时运行,你会看到你的每一次移动都会发布位置数据:

线性
  x: 2.0
  y:0.0
  z: 0.0

  x: 0.0
  y:0.0
  z: 0.0
  ---

现在返回 rqt_graph,取消选中 调试 盒子

././././_images/debug.png

/_ros2cli_26646 是由 回响 我们刚刚运行的数据(数字可能不同)。现在你可以看到,发布者正在通过 cmd_vel 主题,并订阅了两个用户。

5 ROS2 主题信息

主题不一定只是点对点的通信,也可以是一对多、多对一或多对多的通信。

另一种方法是跑步:

ros2 topic info /turtle1/cmd_vel

哪个会回来?

类型: geometry_msgs/msg/Twist
出版商数量1
订阅数:2

6 ros2 interface show

节点通过消息在主题上发送数据。发布者和订阅者必须发送和接收相同类型的消息才能进行通信。

运行 玫瑰2 主题 清单 -t 让我们知道每个主题使用的信息类型。请回顾 cmd_vel 主题的类型:

geometry_msgs/msg/Twist

这意味着在软件包中 几何参数信息 人称 扭转.

现在我们可以运行 玫瑰2 界面 展览 msg 类型>; 来了解该类型的详细信息,特别是信息所期望的数据结构。

ros2 interface show geometry_msgs/msg/Twist

对于上面的信息类型,它的结果是

#  表示 速度  免费的 空间 坏了  它的 线形  角度 零件

    向量 3 线性
            float64 x
            float64 y
            float64 z
    Vector3 angular
            float64 x
            float64 y
            float64 z

这说明 /turtlesim 节点正在等待一条包含两个向量的报文、 线形角度,每个元素有三个。如果你还记得我们看到的数据 /teleop_turtle 传递到 /turtlesim回响 命令,其结构相同:

线性
  x: 2.0
  y:0.0
  z: 0.0

  x: 0.0
  y:0.0
  z: 0.0
  ---

7 ROS2 主题酒吧

有了报文结构后,就可以直接从命令行向主题发布数据了:

ros2 topic pub <topic_name> <msg_type> '<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}}";

--一次 是一个可选参数,意思是 "发布一条信息然后退出"。

您将在终端收到以下信息:

出版商:初环
发布 #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))

你会看到你的乌龟像这样移动:

././././_images/pub_once.png

乌龟(通常也包括它要模拟的真实机器人)需要源源不断的指令才能持续运行。因此,要让乌龟继续前进,你可以跑步:

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}}";

这里的区别在于去掉了 --一次 选项,并增加 --率 1 选项,它告诉 玫瑰2 主题 酒吧 以 1 Hz 的频率源源不断地发布命令。

././././_images/pub_stream.png

您可以刷新 rqt_graph,以图形方式查看正在发生的情况。您将看到 玫瑰 2 主题 酒吧 ... 节点 (/_ros2cli_30358)正在通过 /turtle1/cmd_vel 该专题正由 玫瑰2 主题 回响 ... 节点 (/_ros2cli_26646)和 /turtlesim 现在节点。

.././././_images/rqt_graph2.png

最后,您可以运行 回响姿势 主题,并重新检查 rqt_graph:

ros2 topic echo /turtle1/pose
.././././_images/rqt_graph3.png

您可以看到 /turtlesim 节点也会发布到 姿势 主题,新的 回响 节点已订阅。

8 ROS2 专题赫兹

为了对这一过程进行最后一次反思,您可以通过以下方式查看数据的发布速度:

ros2 topic hz /turtle1/pose

它将返回关于 /turtlesim 节点向 姿势 主题。

平均费率59.354
  最小: 0.005s 最大: 0.027s0.027s std dev: 0.00284s window:58

回想一下,您设置 turtle1/cmd_vel 使用 玫瑰2 主题 酒吧 --率 1.如果运行上述命令时使用 turtle1/cmd_vel 而不是 乌龟1/姿势您将看到一个反映该比率的平均值。

9 清理

此时,您将有很多节点在运行。不要忘了通过输入 Ctrl+C 在每个终端。

摘要

节点通过主题发布信息,允许任意数量的其他节点订阅和访问这些信息。在本教程中,您将使用 rqt_graph 和命令行工具,通过主题查看多个节点之间的连接。现在,您应该对数据如何在 ROS 2 系统中移动有了很好的了解。

下一步工作

接下来,您将通过教程了解 ROS 图形中的另一种通信类型 了解服务