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

本文介绍了如何使用rqt_graph和命令行工具来理解和调试ROS2系统中的主题。通过示例展示了如何列出主题、回显主题数据、查看主题信息以及发布到主题。教程强调了主题在节点间数据通信的重要性,并提供了实践操作,如使用ros2topic和rqt_graph进行系统分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

教程级别:初学者

时间: 20分钟

背景

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.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 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  linear
    Vector3  angular

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

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 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.354
  min: 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 系统中移动有了很好的了解。

ROS2编程基础课程文档 ROS 2机器人操作系统2)是用于机器人应用的开源开发套件。ROS 2之目的是为各行各业的开发人员提供标准的软件平台,从研究和原型设计再到部署和生产。 ROS 2建立在ROS 1的成功基础之上,ROS 1目前已在世界各地的无数机器人应用中得到应用。 特色 缩短上市时间 ROS 2提供了开发应用程序所需的机器人工具,库和功能,可以将时间花在对业务非常重要的工作上。因为它 是开源的,所以可以灵活地决定在何处以及如何使用ROS 2,以及根据实际的需求自由定制,使用ROS 2 可以大幅度提升产品和算法研发速度! 专为生产而设计 凭借在建立ROS 1作为机器人研发的事实上的全球标准方面的十年经验,ROS 2从一开始就被建立在工业级 基础上并可用于生产,包括高可靠性和安全关键系统。 ROS 2的设计选择、开发实践和项目管理基于行业利 益相关者的要求。 多平台支持 ROS 2在Linux,Windows和macOS上得到支持和测试,允许无缝开发和部署机器人自动化,后端管理和 用户界面。分层支持模型允许端口到新平台,例如实时和嵌入式操作系统,以便在获得兴趣和投资时引入和推 广。 丰富的应用领域 与之前的ROS 1一样,ROS 2可用于各种机器人应用,从室内到室外、从家庭到汽车、水下到太空、从消费 到工业。 没有供应商锁定 ROS 2建立在一个抽象层上,使机器人库和应用程序与通信技术隔离开来。抽象底层是通信代码的多种实现, 包括开源和专有解决方案。在抽象顶层,核心库和用户应用程序是可移植的。 建立在开放标准之上 ROS 2中的默认通信方法使用IDL、DDS和DDS-I RTPS等行业标准,这些标准已广泛应用于从工厂到航空 航天的各种工业应用中。 开源许可证 ROS 2代码在Apache 2.0许可下获得许可,在3条款(或“新”)BSD许可下使用移植的ROS 1代码。这两个 许可证允许允许使用软件,而不会影响用户的知识产权。 全球社区 超过10年的ROS项目通过发展一个由数十万开发人员和用户组成的全球社区,为机器人技术创建了一个庞大 的生态系统,他们为这些软件做出贡献并进行了改进。 ROS 2由该社区开发并为该社区开发,他们将成为未 来的管理者。 行业支持 正如ROS 2技术指导委员会成员所证明的那样,对ROS 2的行业支持很强。除了开发顶级产品外,来自世界 各地的大大小小公司都在投入资源为ROS 2做出开源贡献。 与ROS1的互操作性 ROS 2包括到ROS 1的桥接器,处理两个系统之间的双向通信。如果有一个现有的ROS 1应用程序, 可 以通过桥接器开始尝试使用ROS 2,并根据要求和可用资源逐步移植应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值