> 文章列表 > 【ROS2指南-4】理解ROS2话题

【ROS2指南-4】理解ROS2话题

【ROS2指南-4】理解ROS2话题

目标:使用 rqt_graph 和命令行工具来反思 ROS 2 主题

教程级别:初学者

时间: 20分钟

内容

  • 背景

  • 先决条件

  • 任务

    • 1 设置

    • 2 rqt_graph

    • 3 ros2主题列表

    • 4 ros2主题回显

    • 5 ros2 主题信息

    • 6 ros2界面展示

    • 7 ros2主题发布

    • 8 ros2 主题赫兹

    • 9 清理

  • 概括

  • 下一步

背景

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

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

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

先决条件

上一教程提供了一些关于此处构建的节点的有用背景信息。

任务

1 设置

到目前为止,您应该可以轻松启动 turtlesim。

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

ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

回想一下之前的教程,这些节点的名称默认为/turtlesim/teleop_turtle

2 rqt_graph

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

turtlesim教程告诉您如何安装 rqt 及其所有插件,包括rqt_graph.

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

rqt_graph

您还可以通过打开 rqt 并选择Plugins > Introspection > Nodes Graph来打开 rqt_graph 。

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

该图描述了/turtlesim节点和/teleop_turtle节点如何通过主题相互通信。该/teleop_turtle节点将数据(您输入的用于移动海龟的击键)发布到主题/turtle1/cmd_vel,并且该/turtlesim节点订阅该主题以接收数据。

rqt_graph 的突出显示功能在检查具有许多节点和以许多不同方式连接的主题的更复杂系统时非常有用。

rqt_graph 是一个图形自省工具。现在我们将了解一些用于自省主题的命令行工具。

3 ros2主题列表

在新终端中运行该命令将返回系统中当前活动的所有主题的列表: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 中的什么位置,您可以取消选中隐藏下的所有框

不过现在,请选中这些选项以避免混淆。

4 ros2主题回显

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

ros2 topic echo <topic_name>

由于我们知道将/teleop_turtle数据发布到主题/turtlesim之上/turtle1/cmd_vel,让我们使用echo该主题进行反思:

ros2 topic echo /turtle1/cmd_vel

起初,此命令不会返回任何数据。那是因为它正在等待/teleop_turtle发布一些东西。

返回正在运行的终端turtle_teleop_key并使用箭头移动乌龟。echo同时观察你正在运行的终端,你会看到你所做的每一个动作都发布了位置数据:

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

现在返回 rqt_graph 并取消选中Debug框。

/_ros2cli_26646是我们刚刚运行的创建的节点echo(数字会改变)。现在您可以看到发布者正在通过该cmd_vel主题发布数据,并且订阅了两个订阅者。

5 ros2 主题信息

话题不必只是点对点的交流;它可以是一对多、多对一或多对多。

另一种看待这个问题的方法是运行:

ros2 topic info /turtle1/cmd_vel

将返回:

Topic: /turtle1/cmd_vel
Publisher count: 1
Subscription count: 2

6 ros2界面展示

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

我们之前在运行后看到的主题类型让我们知道每个主题可以发送什么类型的消息。回想一下,该主题具有以下类型:ros2 topic list -t cmd_vel

geometry_msgs/msg/Twist

这意味着在包中geometry_msgs有一个msg名为Twist.

现在我们可以运行这个类型来了解它的细节,特别是消息期望的数据结构。

ros2 interface show <type>.msg

ros2 msg show geometry_msgs/msg/Twist

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

这告诉您该/turtlesim节点正在等待一条消息,其中包含两个向量linearangular,每个向量包含三个元素。如果您还记得我们看到的通过命令/teleop_turtle传递给的数据,它具有相同的结构:/turtlesim echo

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

7 ros2主题发布

现在您有了消息结构,您可以使用以下命令直接从命令行将数据发布到主题上:

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和添加了选项,它告诉以 1 Hz 的稳定流发布命令

--rate 1ros2 topic pub

您可以刷新 rqt_graph 以图形方式查看发生了什么。您将看到节点 ( ) 正在通过主题发布,并且现在正在被节点( ) 和节点接收。ros 2 topic pub .../_ros2cli_30358/turtle1/cmd_velros2 topic echo .../_ros2cli_26646/turtlesim

echo最后,您可以在主题上运行pose并重新检查 rqt_graph:

ros2 topic echo /turtle1/pose

在这种情况下,/turtlesim现在发布到pose主题,并echo订阅了一个新节点。

8 ros2 主题赫兹

对于此过程的最后一次反省,您可以使用以下方法报告数据发布的速度:

ros2 topic hz /turtle1/pose

/turtlesim它将返回有关节点向主题发布数据的速率的数据pose

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

回想一下,您使用 将发布的速率设置turtle1/cmd_vel为稳定的 1 Hz 。如果您使用而不是运行上述命令,您将看到反映该速率的平均值。ros2 topic pub --rate 1turtle1/cmd_velturtle1/pose

9 清理

此时,您将有很多节点在运行。不要忘记进入Ctrl+C每个终端来阻止他们。

概括

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

下一步

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