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.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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s 1.28.x node资源预留

当前NOde的配置 默认位置如下: vim /var/lib/kubelet/config.yaml #再最后添加如下&#xff0c;参加应该大家一看就明白什么意思&#xff0c;不做多解释了 #max-pods: 230 evictionHard:memory.available: 100Minodefs.available: 10%nodefs.inodesFree: 5% kubeReserved:cpu:…

centos7升级openssl_3

1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…

C++ 之LeetCode刷题记录(三十七)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表…

MSCKF5讲:后端代码分析

MSCKF5讲&#xff1a;后端代码分析 文章目录 MSCKF5讲&#xff1a;后端代码分析1 初始化initialize()1.1 加载参数1.2 初始化IMU连续噪声协方差矩阵1.3 卡方检验1.4 接收与订阅话题createRosIO() 2 IMU静止初始化3 重置resetCallback()4 featureCallback4.1 IMU初始化判断4.2 I…

其他组件分析

对于数据大屏&#xff0c;基于网络安全大赛来看的话主要有 团队队伍的分析界面&#xff1a;分为两类&#xff1a; 一类是对队伍的解题所考虑的知识点画一个5星图&#xff0c;每个方面占一角&#xff0c;可以更直观看到队伍的擅长方面&#xff1a;&#xff08;这部分可能用不到…

EI论文部分复现:含VSC-HVDC的交直流系统内点法最优潮流计算Simulink模型!

适用平台&#xff1a;MatlabSimulink&#xff1b;复现内容&#xff1a;VSC-HVDC模型 简介 高压直流传输系统主要包括换流站、输电线路和终端设备&#xff0c;其中换流站起着关键作用&#xff0c;他可以实现交流整流和直流逆变。常见的HVDC系统有全桥式、半桥式和两水平VSC等。…

聊聊国内「类Sora模型」发展现状,和 Sora 的差距到底有多大?

2024 年 2 月 16 日。 就在谷歌发布他新一代的多模态大模型 Gemini 1.5 Pro 的同一天&#xff0c;OpenAI 带着新一代的文生视频模型 Sora 再次抓住了全世界人们的眼球。 “颠覆”、“炸裂”、“变天”、“疯狂”&#xff0c;类似的形容词一夜之间簇拥在 Sora 周围&#xff0c;…

计算机网络实验 基于ENSP的协议分析

实验二 基于eNSP的协议分析 一、实验目的&#xff1a; 1&#xff09;熟悉VRP的基本操作命令 2&#xff09;掌握ARP协议的基本工作原理 3&#xff09;掌握IP协议的基本工作原理 4&#xff09;掌握ICMP协议的基本工作原理 二、实验内容&#xff1a; 1、场景1&#xff1a;两台PC机…

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】链表—双向链表

目录 往期 1 -> 带头双向循环链表(双链表) 1.1 -> 接口声明 1.2 -> 接口实现 1.2.1 -> 双向链表初始化 1.2.2 -> 动态申请一个结点 1.2.3 -> 双向链表销毁 1.2.4 -> 双向链表打印 1.2.5 -> 双向链表判空 1.2.6 -> 双向链表尾插 1.2.7 -&…

前端CSS常考问题总结

目录 CSS盒模型 CSS选择器的优先级 隐藏元素的方法 px和rem的区别是什么? 重绘重排有什么区别? 重排&#xff08;回流&#xff09;&#xff1a; 重绘&#xff1a; 浏览器的渲染机制: 浏览器如何解析CSS&#xff1f; 元素水平垂直居中的方式 CSS的哪些属性哪些可以…

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机(完整图文详细步骤教程)

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机&#xff08;完整图文详细步骤教程&#xff09; 一、PcDos20001.PcDos2000简介2.PcDos2000下载 二、创建PcDos2000虚拟机1.新建虚拟机2.类型配置3.类型配置4.选择版本5.命名、存位置6.磁盘容量7.调整虚拟配置7.1 调整虚拟配…

嵌入式学习 Day 29

函数: 1.函数的定义 2.函数的调用 3.函数的声明 1.函数传参: 1.赋值传递&#xff08;复制传递&#xff09; 函数体内部想要使用函数体外部变量值的时候使用复制传递 2.全局变量传递 3.地址传递 函数体内部想要修改函数体外部变量值的时候使用地址传递 函数…

Java多态性的作用及解析

多态性是 Java 面向对象编程的一个重要特性,它的主要作用包括以下几个方面: 提高代码的可扩展性:多态性使得我们可以在不修改现有代码的情况下,通过继承和重写方法来添加新的行为。这意味着我们可以在不影响现有功能的前提下,对代码进行扩展和修改。 增强代码的可读性:使…

STM32F103--基于正点原子的 FreeRTOS 移植(完整教程)附测试代码

前言 在看正点原子的FreeRTOS开发手册移植的时候&#xff0c;发现开发手册的描述并不全面&#xff0c;有几处遗漏。下面我展示出完整的教程&#xff0c;希望大家在学习的时候能够轻松点。 一、准备工作 1、正点原子的FreeRTOS官方资料 大家可自行到官方下载&#xff0c;或者在…

基于springboot+vue的健身房管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

FPGA之加法逻辑运算

由于FPGA需要被反复烧写&#xff0c;它实现组合逻辑的基本结构不可能像ASIC 那样通过固定的与非门来完成&#xff0c;而只能采用一种易于反复配置的结构。查找表可以很好地满足这一要求&#xff0c;目前主流FPGA都采用了基于SRAM 工艺的查找表结构。LUT本质上就是一个RAM。它把…

leetcode 热题 100_找到字符串中所有字母异位词

题解一&#xff1a; 滑动窗口&#xff1a;类似于字符串匹配&#xff0c;但匹配异位词需要包含相同的字母及个数&#xff0c;可以分别用两个数组存储字符串s滑动窗口和字符串p的字母及个数&#xff0c;再用Array.equals()进行比对。对于s.length()<p.length()的情况需要特判。…

【Linux】线程概念|线程理解|线程控制

文章目录 线程概念Linux中线程是否存在的讨论线程创建和线程控制线程的终止和等待&#xff08;三种终止方式 pthread_join()的void**retval&#xff09; 线程概念 线程就是进程内部的一个执行流&#xff0c;线程在进程内运行&#xff0c;线程在进程的地址空间内运行&#xff0…

Redis集群(主从)

1.主从集群 集群结构: 一.单机安装redis 1.上传压缩包并解压&#xff0c;编译 tar -xzf redis-6.2.4.tar.gz cd redis-6.2.4 make && make install 2.修改redis.config的配置并启动redis # 绑定地址&#xff0c;默认是127.0.0.1&#xff0c;会导致只能在本地访问。…

SpringBoot源码解读与原理分析(四十)基于jar/war包的运行机制

文章目录 前言第14章 运行SpringBoot应用14.1 部署打包的两种方式14.1.1 以可独立运行jar包的方式14.1.2 以war包的方式 14.2 基于jar包的独立运行机制14.2.1 可独立运行jar包的相关知识14.2.2 SpringBoot的可独立运行jar包结构14.2.3 JarLauncher的设计及工作原理14.2.3.1 Jar…