您正在阅读的是开发版本的文档。有关最新发布的版本,请访问 Jazzy.
了解主题
目标 使用 rqt_graph 和命令行工具反观 ROS 2 主题。
辅导水平: 初学者
时间 20 分钟
背景介绍
ROS 2 将复杂的系统分解成许多模块化节点。主题是 ROS 图形的重要元素,是节点交换信息的总线。

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

主题是在节点之间移动数据的主要方式之一,因此也是在系统不同部分之间移动数据的主要方式之一。
先决条件
"(《世界人权宣言》) 上一个教程 提供了一些有关节点的有用背景信息,本文将以这些信息为基础。
与往常一样,别忘了在 您打开的每个新终端.
任务
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
并选择 插件 >; 自省 >; 节点图.

你应该会看到上面的节点和主题,以及图形外围的两个操作(我们暂且忽略它们)。如果将鼠标悬停在中心的主题上,就会看到如上图所示的高亮颜色。
该图描述了 /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 中的位置,可以取消选中以下所有复选框 藏起来

不过,为了避免混淆,暂时不要勾选这些选项。
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,取消选中 调试 盒子

/_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))
你会看到你的乌龟像这样移动:

乌龟(通常也包括它要模拟的真实机器人)需要源源不断的指令才能持续运行。因此,要让乌龟继续前进,你可以跑步:
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 的频率源源不断地发布命令。

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

最后,您可以运行 回响
在 姿势
主题,并重新检查 rqt_graph:
ros2 topic echo /turtle1/pose

您可以看到 /turtlesim
节点也会发布到 姿势
主题,新的 回响
节点已订阅。
发布带有时间戳的信息时、 酒吧
有两种自动填写当前时间的方法。对于带有 std_msgs/msg/Header
,标头字段可设置为 汽车
填写 盖章
field.
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
可以设置为 现在
.
ros2 topic pub /reference sensor_msgs/msg/TimeReference '{header: "auto", time_ref: "now", source: "dumy"}';
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 图形中的另一种通信类型 了解服务.