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

news2025/2/26 22:27:34

目标:使用 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.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 系统中移动有了很好的了解。

下一步

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光纤能取代网线吗?

光纤与铜缆之间的较量已持续了十多年。现如今随着云计算、5G 等新型业务的不断涌现&#xff0c;数据中心规模不断的扩大&#xff0c;其架构与布线也越来越复杂&#xff0c;而光纤的轻量化及逐渐降低的成本&#xff0c;使得主干网设备对光纤的需求也越来越旺盛&#xff0c;在大型…

pikachu靶场-xss

XSS漏洞攻击原理跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从而达到恶意攻击用户的目的。一般XSS可以分为如下几种常见类型&#xff1a;1.反射性XSS;2.存储型XSS;3.…

成为钢铁侠!只需一块RTX3090,微软开源贾维斯(J.A.R.V.I.S.)人工智能AI助理系统

梦想照进现实&#xff0c;微软果然不愧是微软&#xff0c;开源了贾维斯(J.A.R.V.I.S.)人工智能助理系统&#xff0c;贾维斯(jarvis)全称为Just A Rather Very Intelligent System&#xff08;只是一个相当聪明的人工智能系统&#xff09;&#xff0c;它可以帮助钢铁侠托尼斯塔克…

何为智能驾驶的「摩尔定律」?这家芯片方案商给出自己的答案

“我觉得&#xff08;高速NOA&#xff09;价格下降的速度可能会是非常快的&#xff0c;”4月6日&#xff0c;地平线技术开放日上&#xff0c;地平线副总裁、软件平台产品线总裁余轶南在与高工智能汽车沟通中称&#xff0c;“到2024年底&#xff0c;约100TOPS的高速NOA&#xff…

Lottie加载的一些坑

Lottie是一个非常强大的动画库&#xff0c;可以渲染一些非常绚丽的动画。然而在使用的过程中&#xff0c;会遇到一些诡异的问题。通常&#xff0c;这不是使用方式上有什么问题&#xff0c;大都是UE产出的lottie本身存在问题。本来之前的UE小哥还不错的&#xff0c;跳槽后来了个…

【详解 进程通信】之 System V 共享内存

简介大致操作步骤介绍结果展示key值的获取创建 | 获取共享内存使用共享内存段解除共享内存段销毁共享内存段&#xff08;重点&#xff09;命令行方式销毁共享内存段系统调用销毁共享内存使用共享内存进行进程间通信简介 共享内存可以让多个进程共享同一块内存&#xff0c;也就…

如何实现Chatgpt写文章(附chatgpt3.5免费接口)

申明&#xff1a;本次只是说一下实现思路&#xff0c;官方的接口以及如何实现方式&#xff0c;本文没有提及&#xff0c;这次只是一个思路&#xff0c;若想代替人工完成质量还差的很远&#xff0c;请审核大大放行 今天再次优化了代码&#xff0c;修复了一些bug&#xff0c;考虑…

单片机程序是如何运行起来

多年前在学习计算机原理的时候曾经问过老师一个问题&#xff0c;就是我们编写的程序是怎么在计算机中运行起来的&#xff0c;希望有个完整的思路&#xff0c;现在通过网络收集和整理了这个问题&#xff0c;相当于对这个问题又做了一个认识&#xff0c;有了新的体会。以stm32单片…

Go 语言切片是如何扩容的?

原文链接&#xff1a; Go 语言切片是如何扩容的&#xff1f; 在 Go 语言中&#xff0c;有一个很常用的数据结构&#xff0c;那就是切片&#xff08;Slice&#xff09;。 切片是一个拥有相同类型元素的可变长度的序列&#xff0c;它是基于数组类型做的一层封装。它非常灵活&am…

VCS4 debug with DVE

1、重点讲解&#xff1a; 在verilog源代码中嵌入VCD 系统函数&#xff0c;重点如testbench文件中。VCD文件是VCS产生的仿真波形文件&#xff0c;未经压缩&#xff0c;占用空间较大。VCD是压缩后的波形文件。 编译、仿真以生成VCD文件。 在后处理模式中使用激活DVElog对产生的…

【Javaee】SpringMVC_day01

文章目录1&#xff0c;SpringMVC简介1.1 SpringMVC概述2&#xff0c;SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目&#xff0c;并导入对应的jar包步骤2:创建控制器类步骤3:创建配置类步骤4:创建Tomcat的Servlet容器配置类步骤5:配置Tomcat环境步骤6:启动运行…

JS字符串对象

、 JS字符串对象 1.1 内置对象简介 在 JavaScript 中&#xff0c;对象是非常重要的知识点。对象可以分为两种:一种是“自定义对象”外一种是“内置对象”。自定义对象&#xff0c;指的是需要我们自己定义的对象&#xff0c;和“自定义函数”是一些道理;内置对象&#xff0c;…

力扣刷题笔记26——最小的k个数/快速排序学习/快排与冒泡的时间复杂度

最小的k个数/快速排序学习/快排与冒泡的时间复杂度问题我的代码示例代码快速排序代码问题 来自力扣&#xff1a; 输入整数数组 arr &#xff0c;找出其中最小的 k 个数。例如&#xff0c;输入4、5、1、6、2、7、3、8这8个数字&#xff0c;则最小的4个数字是1、2、3、4。示例 …

1672_MIT 6.828 xv6中如何通过构建环境让系统中增加一个可执行调用文件

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 前面已经分析了如何实现一个系统调用&#xff0c;这个过程的梳理也已经整理成了一份学习笔记。这一次看一下&#xff0c;如何让OS的系统中增加这样的一个可执行的文…

10.网络爬虫—MongoDB详讲与实战

网络爬虫—MongoDB详讲与实战MongoDBMongoDB安装创建数据目录1.数据库操作2.集合操作3.文档操作4.索引操作5.聚合操作6.备份与恢复MongoDB增删改查mongodb集合的增删改查数据插入到表数据的查看删除数据更新数据PyMongo连接数据库第二步 选择需要使用的数据库和集合PyMongo增删…

公司分布式锁加锁错误原因

目录一、问题二、问题复现三、为什么产生这个错误四、解决方案一、问题 第一次设置锁成功, 但是返回false, 后续在循环获取的时候, 因为已经设置成功, 调用setIfAbsent不会返回true, 导致等锁3s失败 private boolean lockWait(String key, long wait, long expire) { long tot…

【CV】Latent diffusion model 扩散模型体验

note 文章目录note一、diffusion模型1.1 Stable Diffusion简介1.2 和GAN对比的优势二、Latent diffusion model原理2.1 潜在空间(Lantent Space)2.2 自动编码器和U-Net2.3 文本编码器三、代码实践3.1 模型权重checkpoints3.2 Stable Diffusion v1模型推理3.3 安装Stable Diffus…

再见了,我的C!

本人的第一篇博客发布于1月份&#xff0c;现在已经4月份了&#xff0c;历时3个月&#xff0c;&#xff0c;已经将C语言涵盖的大多数C语言知识点系统性的整理了出来&#xff0c;在这个期间自己收获了很多&#xff0c;这是C语言的最后一篇文章&#xff0c;接下来我们来回顾一下我…

13.Java面向对象----嵌套类

Java面向对象—嵌套类、内部类、匿名类 一、static静态 在《Java编程思想》有这样一段话&#xff1a;   “static方法就是没有this的方法。在static方法内部不能调用非静态方法&#xff0c;反过来是可以的。而且可以在没有创建任何对象的前提下&#xff0c;仅仅通过类本身来…

计及需求侧响应日前、日内两阶段鲁棒备用优化【IEEE6节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…