ROS 2基础概念#3:主题(Topic)| ROS 2学习笔记

news2024/11/17 1:35:06

在ROS(Robot Operating System)中,主题(Topics)是实现节点之间通信的主要机制之一。节点(Node)可以发布(publish)消息到话题,或者订阅(subscribe)话题以接收消息。这种基于发布/订阅的通信模型允许节点之间的松耦合交互,是ROS架构的核心特性之一。本文将详细介绍ROS2中的主题,并与ROS1中的主题进行比较。

ROS2 Topic简介

在ROS2中,Topic的工作原理基本保持不变,仍然是基于发布/订阅模式,但实现方式与ROS1有所不同,主要得益于ROS2底层使用的DDS(Data Distribution Service)通信中间件。

  • DDS中间件: ROS2使用DDS作为其底层通信机制,这为话题通信提供了一种标准化的数据交换方式。DDS提供了高性能、可靠的数据传输机制,并支持不同的服务质量(QoS)策略,如可靠性、持久性和延迟等。
  • 服务质量(QoS)策略: ROS2引入了QoS策略的概念,允许开发者根据具体的应用需求(如实时性、网络带宽限制等)来配置话题的行为。这是ROS1中不具备的功能,为ROS2的通信提供了更高的灵活性和可靠性。
  • 安全性: 借助于DDS的安全特性,ROS2在节点间的通信中增加了安全性选项,包括加密、认证和访问控制等,实现了更好的安全性。

Topic的作用

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

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

../../../_images/主题-MultiplePublisherandMultipleSubscriber.gif

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

ROS1中的话题通信同样基于发布/订阅模式,但是它依赖于自定义的通信协议和中心化的名称服务(ROS Master)来实现节点间的消息传递。

  • ROS Master: ROS1中的节点通过与ROS Master通信来发现其他节点和话题。所有的话题注册和查找都需要通过ROS Master,这可能成为系统的瓶颈或单点故障。
  • 自定义通信协议: ROS1使用自定义的TCPROS或UDPROS协议进行节点间的通信,而不是标准的中间件,这限制了与其他系统的互操作性。
  • 服务质量(QoS): ROS1中没有直接支持QoS策略的概念,虽然可以通过一些机制间接实现类似功能,但不如ROS2中直接支持的灵活和强大。

Topic的命令行工具

显示所有活动topic列表

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 中的位置,您可以取消选中“隐藏”下的所有框

显示主题

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

ros2 topic echo <topic_name>

如果我们知道节点/teleop_turtle通过/turtle1/cmd_vel主题发布数据到/turtlesim,那么让我们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 并取消选中“调试”框。

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

显示主题信息

主题不一定只是一对一的交流;它们可以是一对多、多对一或多对多。可以用如下的命令显示主题信息:

ros2 topic info /turtle1/cmd_vel

将返回:

Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

ROS 2接口显示

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

ros2 topic list -t cmd_vel

输出结果显示如下,这意味着包中geometry_msgs有一个msg名为Twist.

geometry_msgs/msg/Twist

现在我们可以运行命令来来了解它的细节。具体来说,这个消息期望什么数据结构。

ros2 interface show geometry_msgs/msg/Twist

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

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

    Vector3  linear
    Vector3  angular

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

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

ROS 2主题发布

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

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 以图形方式查看发生的情况。您将看到节点 (/_ros2cli_30358) 正在通过主题(/turtle1/cmd_vel)进行发布,该主题现在被节点(/_ros2cli_26646) 和节点(/turtlesim)接收。

最后,您可以运行对pose主题运行echo命令并重新检查 rqt_graph:

ros2 topic echo /turtle1/pose

您可以看到该/turtlesim节点也正在发布到/turtle1/pose主题而/ros2cli_1682订阅了它。

ROS 2主题发布频率

您可以使用以下命令查看数据发布的速率:

ros2 topic hz /turtle1/pose

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

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

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

总结

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

作者个人Blog:ROS 2基础概念#3:主题(Topic)| ROS 2学习笔记 - HY's Blog

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

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

相关文章

搜索回溯算法(DFS)1------递归

目录 简介&#xff1a; 递归问题解题的思路模板 例题1&#xff1a;汉诺塔 例题2&#xff1a;合并两个有序链表 例题3&#xff1a;反转链表 例题4&#xff1a;两两交换链表中的节点 例题5&#xff1a;Pow&#xff08;x,n&#xff09;-快速幂 结语&#xff1a; 简介&…

攻防世界-get_post

题目信息 相关知识 -G&#xff1a;表示GET请求&#xff0c;缺省POST -d参数用于发送 POST 请求的数据体 使用-d参数以后&#xff0c;HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法&#xff0c;因此可以省略-X PO…

Vue.js 深度解析:模板编译原理与过程

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Springboot+vue的船舶监造系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的船舶监造系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的船舶监造系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff…

山西电力市场日前价格预测【2024-02-25】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-25&#xff09;山西电力市场全天平均日前电价为386.45元/MWh。其中&#xff0c;最高日前电价为765.92元/MWh&#xff0c;预计出现在18:45。最低日前电价为203.79元/MWh&#xff0c;预计…

【计算机毕业设计】044学生管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

C# 不可识别数据库格式问题

C#是一种流行的编程语言&#xff0c;用于开发各种类型的应用程序&#xff0c;包括与数据库交互的应用程序。然而&#xff0c;在处理数据库时&#xff0c;有时会遇到一些错误和问题。其中之一就是数据库格式不可识别的错误。 在C#中&#xff0c;我们通常使用ADO.NET来连接和操作…

【教程】Kotlin语言学习笔记(四)——方法(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 文章目录 【…

openGauss学习笔记-235 openGauss性能调优-系统调优-资源负载管理-资源管理准备-创建资源池

文章目录 openGauss学习笔记-235 openGauss性能调优-系统调优-资源负载管理-资源管理准备-创建资源池235.1 背景信息235.2 前提条件235.3 操作过程235.3.1 创建资源池235.3.2 管理资源池235.3.3 删除资源池 235.4 查看资源池的信息 openGauss学习笔记-235 openGauss性能调优-系…

探索Ubuntu命令行:常见问题与解决方案

一、引言 Ubuntu&#xff0c;作为一款流行的Linux发行版&#xff0c;其命令行界面&#xff08;CLI&#xff09;为用户提供了丰富的功能和灵活性。然而&#xff0c;对于新手来说&#xff0c;命令行可能会带来一些挑战。本文将探讨一些在使用Ubuntu命令行时可能遇到的问题及其解决…

Python算法100例-3.1 回文数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展7.巧用字符串技巧 1&#xff0e;问题描述 打印所有不超过n&#xff08;取n<256&#xff09;的其平方具有对称性质的数&#xff08;也称回…

加密与安全_ 凯撒密码

文章目录 Pre概述Code 实现 凯撒密码字母频率分析攻击Code解密凯撒密码 小结 Pre PKI - 02 对称与非对称密钥算法 概述 凯撒密码是一种简单的替换加密技术&#xff0c;也称为移位密码。它是古典密码学中最早的密码之一&#xff0c;得名于古罗马军队领袖凯撒尤利乌斯&#xff…

VMware虚拟机安装Linux

1.新建虚拟机 2. 安装操作系统 等待 选择中文 点软件选择 选择下面的GNOME桌面 禁用KDUMP 点进安装位置&#xff0c;点完成就可以了 网络连接&#xff0c;右上角打开 开始安装&#xff0c;输入ROOT密码&#xff0c;创建用户 点击重启&#xff0c;等待 重启完成之后出现下面的界…

MATLAB环境下基于离散小波变换的心电信号伪影去除及PQRST波检测

可穿戴个人健康监护系统被广泛认为是下一代健康监护技术的核心解决方案。监护设备不断地感知、获取、分析和存储大量人体在日常活动中的生理数据&#xff0c;为人体的健康状况提供必要的、准确的、集成的和长期的评估和反馈。在心电监测领域&#xff0c;可穿戴传感器具有以下应…

镜头畸变模型及去畸变的原理

1. OpenCV去畸变undistortPoints原理解析 Opencv中镜头畸变包含了径向畸变和切向畸变&#xff0c;本章节主要阐述镜头畸变模型以及去畸变的原理。 1.1 镜头畸变模型 参考opencv文档 https://docs.opencv.org/3.1.0/d4/d94/tutorial_camera_calibration.html&#xff0c;opencv…

布隆过滤器实战

一、背景 本篇文章以解决实际需求的问题的角度进行切入&#xff0c;探讨了如果使用布隆过滤器快速丢弃无效请求&#xff0c;降低了系统的负载以及不必要的流量。 我们都知道布隆过滤器是以占用内存小&#xff0c;同时也能够实现快速的过滤从而满足我们的需求&#xff0c;本篇…

⭐每天一道leetcode:27.移除元素(简单;vector)

⭐今日份题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

更新至2023年,上市公司ESG数据合集(四份数据:盟浪、华证、商道融绿、富时罗素)

更新至2023年&#xff0c;上市公司ESG数据合集&#xff08;四份数据&#xff1a;盟浪、华证、商道融绿、富时罗素&#xff09; 1、时间&#xff1a; 富时罗素ESG评分&#xff1a;2018-2023年 华证ESG评级&#xff1a;2009-2023年 盟浪ESG评级&#xff1a;2014-2023 商道融…

【Linux】输入系统应用

# 前置知识 (1)输入子系统分为三层&#xff0c;分别是事件处理层、核心层、设备驱动层&#xff1b; (2)鼠标移动、键盘按键按下等输入事件都需要通过设备驱动层→核心层→事件处理层→用户空间&#xff0c;层层上报&#xff0c;直到应用程序; 事件处理层 (1)事情处理层主要是负…

数码管的动态显示(一)

1.原理 把每一个数码管闪烁的时间设置为1ms&#xff0c;肉眼观察不到就会认为6个数码管在同时闪烁。 实验目标&#xff1a; 使用6位8段数码管实现数码管的动态显示&#xff0c;显示的内容就是0-999_999。当计数到最大值&#xff0c;让他归零&#xff0c;然后循环显示。每0.1秒…