【ROS2】初级:CLI工具- 理解话题(或主题)

 理解话题

目标:使用 rqt_graph 和命令行工具来内省 ROS 2 话题。

 教程级别:初学者

 时间:20 分钟

 目录

  •  背景

  •  先决条件

  •  任务

    •  设置

    • 2 rqt_graph

    • 3 ros2 话题列表

    • 4 ros2 话题回声

    • 5 ros2 话题信息

    • 6 ros2 接口显示

    • 7 ros2 话题发布

    • 8 ros2 话题赫兹

    •  清理

  •  摘要

  •  下一步

 背景

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

e0f321b149c393510c400740b6b8350c.png

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

56d5585e955137f88c583086e5db0d6b.png

0d659d6f021c5004bcbfae13b46b1f21.png

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

 先决条件

前一教程提供了一些关于节点的有用背景信息,我们在此基础上进行了扩展。

始终不要忘记在您打开的每个新终端中获取 ROS 2 的源。

 任务

 设置

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

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

ros2 run 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 并选择插件 > 内省 > 节点图来打开 rqt_graph。

41fb0952c68840699cbfc9838e6107cb.png

您应该能看到上面的节点和话题,以及图表中的两个动作(现在我们先忽略它们)。如果您将鼠标悬停在中心的话题上,您会看到像上图中那样的颜色高亮显示。

图表展示了 /turtlesim 节点和 /teleop_turtle 节点如何通过一个话题相互通信。 /teleop_turtle 节点正在向 /turtle1/cmd_vel 话题发布数据(您输入的按键来移动乌龟),而 /turtlesim 节点订阅了该话题以接收数据。

rqt_graph 的高亮显示功能在检查许多节点和话题以多种不同方式连接的更复杂系统时非常有帮助。

rqt_graph 是一个图形化内省工具。现在我们将看一些用于内省话题的命令行工具。

3 ros2 话题列表

在新终端运行 ros2 topic list 命令将返回系统中当前所有活跃话题的列表:

cxy@ubuntu2404-cxy:~$ ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

ros2 topic list -t 将返回相同的话题列表,这次在括号中附加了话题类型:

cxy@ubuntu2404-cxy:~$ 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 中所有这些主题在哪里,您可以取消选中“隐藏”下的所有框:

24f693d12da96912e9336d650e21307d.png

现在,不过,还是保留那些选项勾选,以避免混淆。

4 ros2 主题回声 

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

ros2 topic echo <topic_name>

既然我们知道 /teleop_turtle 通过 /turtle1/cmd_vel 主题向 /turtlesim 发布数据,那么让我们使用 echo 来内省那个主题:

ros2 topic echo /turtle1/cmd_vel

最初,这个命令不会返回任何数据。那是因为它在等待 /teleop_turtle 发布一些内容。

返回运行 turtle_teleop_key 的终端,并使用箭头来移动乌龟。同时观察运行 echo 的终端,你会看到每次移动都会发布位置数据:

cxy@ubuntu2404-cxy:~$ ros2 topic echo /turtle1/cmd_vel
linear:x: 2.0y: 0.0z: 0.0
angular:x: 0.0y: 0.0z: 0.0
---
linear:x: 0.0y: 0.0z: 0.0
angular:x: 0.0y: 0.0z: 2.0
---
linear:x: 2.0y: 0.0z: 0.0
angular:x: 0.0y: 0.0z: 0.0
---

aa35c519eb88322d4a6b4b0ca98acc7f.png

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

20f368e91001c47a328cc4317c60ef34.png

/_ros2cli_8346 是我们刚刚运行的 echo 命令创建的节点(数字可能有所不同)。现在您可以看到发布者正在 cmd_vel 主题上发布数据,而有两个订阅者订阅了它。

5 ros2 话题信息

主题不仅可以是一对一的交流;它们可以是一对多、多对一,或者多对多。

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

ros2 topic info /turtle1/cmd_vel

 将返回:

cxy@ubuntu2404-cxy:~ros2 topic info /turtle1/cmd_velel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 1

6 ros2 接口显示 

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

我们之前在运行 ros2 topic list -t 后看到的主题类型让我们知道每个主题上使用的是什么消息类型。回想一下, cmd_vel 主题的类型是:

geometry_msgs/msg/Twist

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

现在我们可以在这个类型上运行 ros2 interface show <msg type> 来了解它的详细信息。具体来说,消息期望的数据结构是什么。

ros2 interface show geometry_msgs/msg/Twist

对于上面的消息类型,它产生:

cxy@ubuntu2404-cxy:~$ ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.Vector3  linearfloat64 xfloat64 yfloat64 z
Vector3  angularfloat64 xfloat64 yfloat64 z

这告诉你 /turtlesim 节点期望收到一条消息,其中包含两个向量, linear 和 angular ,每个向量有三个元素。如果你还记得我们之前看到的数据,它是通过 echo 命令传递给 /turtlesim 的,其结构是相同的:

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 是一个可选参数,意味着“发布一条消息然后退出”。

您将在终端中看到以下输出:

cxy@ubuntu2404-cxy:~$ 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}}"
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))

6820ca642a250520d3a5473c8cd68e53.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}}"

这里的区别在于移除了 --once 选项并增加了 --rate 1 选项,这告诉 ros2 topic pub 以 1 赫兹的稳定流发布命令。

38bea7c93e481d753d80ff6aa42ab675.png

您可以刷新 rqt_graph 来图形化地查看发生了什么。您会看到 ros2 topic pub ... 节点 ( /_ros2cli_8766 ) 正在 /turtle1/cmd_vel 主题上发布,现在被 ros2 topic echo ... 节点 ( /_ros2cli_26646 ) 和 /turtlesim 节点接收。

398f94bb383c89fe60069a01af0fc157.png

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

ros2 topic echo /turtle1/pose

eccee653a9fd9b75b0ade89eaec64101.png

您可以看到 /turtlesim 节点也在发布到 pose 主题,新的 echo 节点已经订阅了该主题。

在发布带有时间戳的消息时, pub 有两种方法可以自动用当前时间填充它们。对于带有 std_msgs/msg/Header 的消息,可以将头字段设置为 auto ,以填充 stamp 字段。

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 的字段,那么可以将其设置为值 now 。

ros2 topic pub /reference sensor_msgs/msg/TimeReference '{header: "auto", time_ref: "now", source: "dumy"}'

8 ros2 主题频率

在这个过程的最后一次反思中,您可以通过以下方式查看数据发布的速率:

ros2 topic hz /turtle1/pose

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

cxy@ubuntu2404-cxy:~ros2 topic hz /turtle1/posese
average rate: 62.336min: 0.014s max: 0.018s std dev: 0.00079s window: 64
average rate: 62.403min: 0.014s max: 0.018s std dev: 0.00065s window: 127

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

清理

在这一点上,你会有很多节点在运行。不要忘记通过在每个终端输入 Ctrl+C 来停止它们。

 摘要

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

 下一步

接下来,您将通过教程“了解服务”学习 ROS 图中的另一种通信类型。https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Services/Understanding-ROS2-Services.html

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

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

相关文章

技术革新引领钢材质量智能化检测新纪元,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建钢材工业生产场景下钢材缺陷智能检测识别系统

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;其应用领域不断拓宽&#xff0c;正深刻改变着传统产业的运作模式。在钢材生产这一基础工业领域&#xff0c;AI的引入正为钢材的质量检测带来革命性的变革。 在传统的钢材生产流程中&#xff0c;质量检测是确…

基于Bootstrap Blazor开源的.NET通用后台权限管理系统

前言 今天大姚给大家分享一个基于Bootstrap Blazor开源的.NET通用后台权限管理系统&#xff0c;后台管理页面兼容所有主流浏览器&#xff0c;完全响应式布局&#xff08;支持电脑、平板、手机等所有主流设备&#xff09;&#xff0c;可切换至 Blazor 多 Tabs 模式&#xff0c;…

打破数据生产力的桎梏,打造数据分析驱动的新型组织

在当前的经济环境下&#xff0c;各行业面临着前所未有的挑战&#xff0c;降本增效成为企业普遍追求的目标。数字化转型被视为实现这一目标的关键路径。通过数字化手段&#xff0c;企业能够探索新的增长机会&#xff0c;提升运营效率&#xff0c;并有效控制成本支出。在这一转型…

纯前端低代码开发脚手架 - daelui/molecule

daelui/molecule低代码开发脚手架&#xff1a;分子组件开发、预览、打包 页面代码示例、大屏代码示例预览 可开发页面组件 可开发大屏组件 项目git地址&#xff1a;https://gitee.com/daelui/molecule 在线预览&#xff1a;http://www.daelui.com/daelui/molecule/app/index.…

探索如何赋予对象迭代魔法,轻松实现非传统解构赋值的艺术

前言 今天下午在网上冲浪过程中看到这样一个问题 面试题&#xff1a;如何让 var [a, b] {a: 1, b: 2} 解构赋值成功&#xff1f; 据说是某大厂面试题&#xff0c;于是我学习了一下这个问题&#xff0c;写下这篇文章记录一下。 学习过程 要想解决这个问题首先要知道什么是解…

概率论与数理统计_上_科学出版社

contents 前言第1章 事件与概率1.1 随机事件与样本空间1.1.1 样本空间1.1.2 随机事件1.1.3 事件之间的关系与运算 1.2 概率的三种定义及其性质1.2.1 概率的统计定义1.2.2 概率的古典定义1.2.3 概率的几何定义1.2.4 概率的性质 1.3 常用概型公式1.3.1 条件概率计算公式1.3.2 乘法…

百日筑基第十一天-看看SpringBoot

百日筑基第十一天-看看SpringBoot 创建项目 Spring 官方提供了 Spring Initializr 的方式来创建 Spring Boot 项目。网址如下&#xff1a; https://start.spring.io/ 打开后的界面如下&#xff1a; 可以将 Spring Initializr 看作是 Spring Boot 项目的初始化向导&#xff…

【数智化人物展】数势科技创始人兼CEO黎科峰:数智化时代To B软件行业面临颠覆与重塑...

黎科峰 本文由数势科技创始人兼CEO黎科峰投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 2020年&#xff0c;对我而言&#xff0c;是职业生涯中的一个重大转折点。在全球新…

频域信号通过逆傅里叶变换恢复成时域信号

频域信号通过逆傅里叶变换恢复成时域信号 flyfish import numpy as np import matplotlib.pyplot as plt from scipy.fftpack import fft, ifft plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False# 设置参数 t np.linspace(0, 1, 1000, en…

Simulink中示波器连续运行的方法

1.在Simulink中,经常要使用到示波器,默认示波器是定时运行的,只能观察到一小部分运行的波形;实际调试过程中,经常要连续运行,因此,需要设置示波器为连续运行模式,下面将介绍示波器连续运行的方法。 打开Simulink仿真软件,找到仿真设置按钮,点击设置: 2.将其停止时间…

音频流格式启用数据流

音频流格式启用数据流 音频流格式启用数据流使用 AudioStreamBasicDescription 结构在哪里以及如何设置流格式 音频流格式启用数据流 在单个样本帧级别处理音频数据时&#xff0c;就像使用音频单元一样&#xff0c;仅仅指定正确的数据类型来表示音频是不够的。单个音频样本值中…

HandlerMethodArgumentResolver :深入spring mvc参数解析机制

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; 搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到三十…

编程新纪元:AI辅助工具豆包Marscode体验

自从ChatGPT带动全球AI热潮&#xff0c;AI席卷着各行各业。编程界也不例外&#xff0c;早期做过了Github Copilot、阿里的通义灵码等AI编程插件的体验 p.s.以上的下载量与评分均只是plugins.jetbrains的marketplace数据&#xff0c;仅供参考 基本AI编程工具的功能都差不多&…

自然语言处理学习(3)RNN 模型学习---NLP领域的第一个模型

一 基本定义 视频链接 1.小案例理解–语义理解 目的&#xff1a;输入一句话&#xff0c;机器需要理解这句话的语义 二. RNN模型分类 1. 按照输入输出分类 (1) N Vs N (2) N Vs 1 (3) 1 VsN (4) seq2seq 三 传统RNN模型 1. 内部结构分析 &#xff08;a) 总体外…

基于单片机的多功能电子时钟的设计

摘要&#xff1a;提出了一种基于单片机的多功能电子时钟的设计方法&#xff0c;以 AT89C52单片机作为系统的主控芯片&#xff0c;采用DS1302作为时钟控制芯片&#xff0c;实现日期时钟显示并且提供精准定时的功能。此外&#xff0c;还可经由DHT22所构成的温湿度传感电路&#x…

Kafka集群部署(手把手部署图文详细版)

1.1.1 部署zookpeer 在node02下载并解压zookeeper软件包 cd /usr/local wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 或者&#xff1a;scp cat192.168.28.100:/home/cat/zookeeper-3.4.6.tar.gz /tmp&#xff08;注意目录&#xf…

vue属性绑定v-bind

属性绑定v-bind 双大括号不能在HTML attributes 中使用。想要响应式地绑定一个attribute&#xff0c;应该使用v-bind指令。 v-bind 指令指示Vue将元素id attribute 与组件的dyid属性保持一致。如果绑定值是null或者undefined&#xff0c;那么该attribute将会从渲染的元素上移…

昇思第9天

LSTMCRF序列标注 序列标注&#xff1a;对序列进行标注&#xff0c;实际上是对序列中每个Token进行标签预测&#xff0c;可以直接视作简单的多分类问题。但是序列标注不仅仅需要对单个Token进行分类预测&#xff0c;同时相邻Token直接有关联关系&#xff0c;需要引入一种能够学…

docker介绍与详细安装

1 docker 介绍 1.1 虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打破实…

【BUUCTF-PWN】12-get_started_3dsctf_2016

32位&#xff0c;开启了NX保护 执行效果&#xff1a; main函数&#xff1a; 其中gets()函数存在栈溢出&#xff0c;溢出距离为0x38&#xff0c;这里是使用的esp寻址&#xff0c;属于外平栈&#xff0c;不需要覆盖ebp的四个字节。而之前做的题一般都是ebp寻址&#xff0c;…