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

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

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

linear:x: 2.0y: 0.0z: 0.0
angular:x: 0.0y: 0.0z: 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.354min: 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.mzph.cn/news/719720.shtml

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

相关文章

市场复盘总结 20240304

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 20% 最常用的…

格两例12345

osu/Lucky Roll gaming 周末osu有道题&#xff1a;lcg已知低位 def lcg(s, a, b, p):return (a * s b) % pp getPrime(floor(72.7)) a randrange(0, p) b randrange(0, p) seed randrange(0, p) print(f"{p }") print(f"{a }") print(f"{b …

幂等性设计

目录 前言 幂等性设计 幂等性设计处理流程 HTTP 幂等性 消息队列幂等性 基于kafka 前言 幂等性设计&#xff0c;就是说&#xff0c;一次和多次请求某一个资源应该具有同样的副作用。为什么我们要有幂等性操作&#xff1f;说白了&#xff0c;就两点&#xff1a;1、网络的…

LeetCode第125场双周赛个人题解

目录 100231. 超过阈值的最少操作数 I 原题链接 思路分析 AC代码 100232. 超过阈值的最少操作数 II 原题链接 思路分析 AC代码 100226. 在带权树网络中统计可连接服务器对数目 原题链接 思路分析 AC代码 100210. 最大节点价值之和 原题链接 思路分析 AC代码 10023…

大话C++之:对象内存模型

一般继承(无虚函数覆盖) 只有一个虚指针&#xff0c;指向一个虚表&#xff0c;虚函数按顺序从祖先节点开始插入到虚表上。字段按顺序从祖先节点开始插入到对象内存上 一般继承(有虚函数覆盖) 只有一个虚指针&#xff0c;指向一个虚表&#xff0c;虚函数按顺序从祖先节点开始&a…

桂院校园导航 静态项目 二次开发教程 2.0

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Campus-Guide 静态项目 2.0版本 升级日志 序号 板块 详情 1 首页 重做了首页&#xff0c;界面更加高效和美观 2 校园页 新增了 “校园指南” 功能&#xff0c;可以搜索和浏览校园生活指南…

【金三银四】每日一点面试题(Java--JVM篇)

1、说一下 JVM 的主要组成部分及其作用&#xff1f; JVM&#xff08;Java虚拟机&#xff09;是Java程序运行的核心组件&#xff0c;它负责将Java字节码翻译成底层操作系统能够执行的指令。JVM由以下几个主要组成部分构成&#xff1a; 类加载器&#xff08;Class Loader&#…

spring boot概述

SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 通过这种方式&#xff0c;SpringBoot致力于在蓬勃发展的快速应用开发…

实时抓取SKU商品属性详细信息API数据接口(淘宝,某音)

item_sku-获取sku详细信息 taobao.item_sku详细信息 API公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_sku 名称类型必须描述keyString是调用key&#xff08;演示示例&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地…

python-分享篇-生成仿微信公众号推广的个性二维码(支持动态)

代码 生成仿微信公众号推广的个性二维码&#xff08;支持动态&#xff09;from MyQR import myqr # 要生成动态二维码&#xff0c;只需要将piture参数和save_name参数设置gif动图即可 myqr.run(wordshttps://blog.csdn.net/stqer/article/details/135553200, # 指定二维码包含…

JVM(内存区域划分)

JVM JVM - Java虚拟机 我们编写的 Java 程序, 是不能够被 OS 直接识别的 JVM 充当翻译官的角色, 负责把我们写的的 Java 程序 ,翻译给 OS “听”, 让 OS 能够识别我们所写的 Java 代码 JVM 内存区域划分 JVM 是一个应用程序, 在启动的时候, 会从 操作系统 申请到一整块很大的内…

AI-RAN联盟在MWC24上正式启动

AI-RAN联盟在MWC24上正式启动。它的logo是这个样的&#xff1a; 2月26日&#xff0c;AI-RAN联盟&#xff08;AI-RAN Alliance&#xff09;在2024年世界移动通信大会&#xff08;MWC 2024&#xff09;上成立。创始成员包括亚马逊云科技、Arm、DeepSig、爱立信、微软、诺基亚、美…

【LeetCode】升级打怪之路 Day 11:栈的应用、单调栈

今日题目&#xff1a; Problem 1: 栈的应用 155. 最小栈 | LeetCode20. 有效的括号 | LeetCode150. 逆波兰表达式求值 | LeetCode Problem 2: 单调栈 496. 下一个更大元素 I739. 每日温度503. 下一个更大元素 II 目录 Problem 1&#xff1a;栈 - “先进后出”的应用LC 155. 最…

【Java设计模式】五、建造者模式

文章目录 1、建造者模式2、案例&#xff1a;共享单车的创建3、其他用途 1、建造者模式 某个对象的构建复杂将复杂的对象的创建 和 属性赋值所分离&#xff0c;使得同样的构建过程可以创建不同的表示建造的过程和细节调用者不需要知道&#xff0c;只需要通过构建者去进行操作 …

力扣刷题记录--463. 岛屿的周长

题目链接&#xff1a;463. 岛屿的周长 - 力扣&#xff08;LeetCode&#xff09; 题目描述 我的代码实现 class Solution {public int islandPerimeter(int[][] grid) { int result0; int rowgrid.length; int colgrid[0].length; for(int i0;i<row;i){for(int j0;j<col…

【EI会议征稿通知】2024年图像处理与人工智能国际学术会议(ICIPAI2024)

2024年图像处理与人工智能国际学术会议&#xff08;ICIPAI2024&#xff09; 2024 International Conference on Image Processing and Artificial Intelligence&#xff08;ICIPAI2024&#xff09; 2024年图像处理与人工智能国际学术会议&#xff08;ICIPAI2024&#xff09;将…

返回静态数据

在Java项目中&#xff0c;往往不会一直返回某某数据&#xff0c;而是会返回一个静态页面&#xff0c;那么&#xff0c;如何正确返回一个静态页面呢&#xff1f;&#xff1f; 要想成功的返回一个静态页面前提是必须要有一个静态页面&#xff1a; <!DOCTYPE html> <ht…

如何让 JOIN 跑得更快?

JOIN 一直是数据库性能优化的老大难问题&#xff0c;本来挺快的查询&#xff0c;一旦涉及了几个 JOIN&#xff0c;性能就会陡降。而且&#xff0c;参与 JOIN 的表越大越多&#xff0c;性能就越难提上来。 其实&#xff0c;让 JOIN 跑得快的关键是要对 JOIN 分类&#xff0c;分…

第三百八十一回

文章目录 1. 概念介绍2. 修改方法 015buttonStyle.png2.1 修改形状2.2 修改颜色2.3 修改位置 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何创建以图片为背景的页面"相关的内容&#xff0c;本章回中将介绍如何修改按钮的形状.闲话休提&#xff0c;让我们一起T…

06. Nginx进阶-Nginx代理服务

proxy代理功能 正向代理 什么是正向代理&#xff1f; 正向代理&#xff08;forward proxy&#xff09;&#xff0c;一个位于客户端和原始服务器之间的服务器。 工作原理 为了从原始服务器获取内容&#xff0c;客户端向代理发送一个请求并指定目标&#xff08;即原始服务器…