ROS 通信机制

ROS是一个分布式框架,为用户提供多节点(进程)之间的通信服务,所有软件和功能都建立在这种分布式通信机制上,ROS的通信机制是最底层也是最核心的技术。

一、话题通信机制


话题在 ROS 中使用最为频繁,其通信模型也较为复杂。如图所示,在 ROS 中有两个节点:一个是发布者 Talker ,另一个是订阅者 Listener 。两个节点分别发布、订阅同一个话题,启动顺序没有强制要求,此处假设 Talker 首先启动,可分成图中所示的七步来分析建立通信的详细过程。

1.Talker注册
Talker启动,通过1234端口使用RPC向ROS Master注册发布者的信息,包含所发布消息的话题名;ROS Master会将节点的注册信息加入注册列表中。
2. Listener 注册
Listener启动,同样通过RPC向ROS Master注册订阅者的信息,包含需要订阅的话题名。3.ROS Master进行信息匹配
Master根据Listener的订阅信息从注册列表中进行查找,如果没有找到匹配的发布者,则等待发布者的加入;如果找到匹配的发布者信息,则通过RPC向Listener发送Talker的RPC地址信息。
4.Listener发送连接请求
Listener接收到Master发回的Talker地址信息,尝试通过RPC向Talker发送连接请求,传输订阅的话题名、消息类型以及通信协议(TCP/UDP)
5.Talker确认连接请求
Talker接收到Listener发送的连接请求后,继续通过RPC向Listener确认连接信息,其中包含自身的TCP地址信息

6. Listener 尝试与Talker 建立网络连接
Listener接收到确认信息后,使用TCP尝试与Talker建立网络连接。
7. Talker 向 Listener发布数据
成功建立连接后,Talker开始向Listener发送话题消息数据。


从上面的分析中可以发现,前五个步骤使用的通信协议都是RPC,最后发布数据的过程才使用到TCP。ROS Master在节点建立连接的过程中起到了重要作用,但是并不参与节点之间最终的数据传输。节点建立连接后,可以关掉 ROS Master,节点之间的数据传输并不会受到影响,但是其他节点也无法加入这两个节点之间的网络。

二、服务通信机制

服务是一种带有应答的通信机制,通信原理如图所示,与话题的通信相比,其减少了 Listener与Talker之间的RPC通信。

1.Talker注册
Talker启动,通过1234端口使用RPC向ROS Master 注册发布者的信息,包含所提供的服务名;ROS Master会将节点的注册信息加入注册列表中。
2. Listener注册
Listener启动,同样通过RPC 向 ROS Master注册订阅者的信息,包含需要查找的服务名。3.ROS Master进行信息匹配
Master根据 Listener的订阅信息从注册列表中进行查找,如果没有找到匹配的服务提供者,则等待该服务的提供者加入;如果找到匹配的服务提供者信息,则通过RPC向Listener 发送Talker的TCP地址信息。
4.Listener与Talker建立网络连接
Listener接收到确认信息后,使用TCP尝试与Talker建立网络连接,并且发送服务的请求数据。
5.Talker向Listener发布服务应答数据
Talker接收到服务请求和参数后,开始执行服务功能,执行完成后,向Listener发送应答数据。

 三、参数管理机制


参数类似于ROS中的全局变量,由ROS Master进行管理,其通信机制较为简单,不涉
及TCP/UDP的通信,如图所示。


1.Talker设置变量
Talker 使用RPC向 ROS Master发送参数设置数据,包含参数名和参数值;ROS Master
会将参数名和参数值保存到参数列表中。

2Listeer查询参数值
Listener 通过RPC向ROS Master发送参数查找请求,包含所要查找的参数名。


3.ROS Master向 Listener发送参数值
Master 根据 Listener 的查找请求从参数列表中进行查找,查找到参数后,使用RPC将参数值发送给 Listener。

注意:如果 Talker 向Master 更新参数值,Listener在不重新查询参数值的情况下是无法知晓参数值已经被更新的。所以在很多应用场景中,需要一种动态参数更新的机制。

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

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

相关文章

基于JavaWeb+SpringBoot+Vue房屋租赁系统微信小程序系统的设计和实现

基于JavaWebSpringBootVue房屋租赁系统微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 21世纪是信息的时代,是网络的时代,进入信息社会高速…

[Python学习笔记]Requests性能优化之Session

Requests 可是说是 Python 中最常用的库了。用法也非常简单,但是想真正的用的好并不容易。 下面介绍一个提升性能小技巧:使用 session 会话功能。 以下是 Requests 官网的介绍: 会话对象让你能够跨请求保持某些参数。它也会在同一个 Sessio…

LeetCode之二叉树

发现更多计算机知识,欢迎访问Cr不是铬的个人网站 最近数据结构学到二叉树,就刷了刷力扣,写这篇文章也是辅助记忆。 103二叉树锯齿形遍历 要解出本道题,首先要会层次遍历。层次遍历我们都知道用一个队列去实现就行。但是力扣这里…

FSOD论文阅读 - 基于卷积和注意力机制的小样本目标检测

来源:知网 标题:基于卷积和注意力机制的小样本目标检测 作者:郭永红,牛海涛,史超,郭铖 郭永红,牛海涛,史超,郭铖.基于卷积和注意力机制的小样本目标检测 [J/OL].兵工学报. https://…

centOs 6.10 编译 qt 5.15.11

安装依赖库 xcb 依赖库 qt xcb 需要的依赖 如何要用 x11, 就要在编译的时候加上 -xcb 选项,就要安装 xcb 相关的库。 到时可以在 config.log 文件查看,缺少哪个库就安装哪个。 下面是我手动安装的库和对应版本: xcb-proto-1.14.tar.gz x…

部署ChatGLW-6B出现的问题

库问题 版本匹配 cuda 11.1 对应的torch 1.10 版本过高导致编译问题,目前已测试一下版本可以 typing_extensions4.8 transformers4.26.1 gradio3.50.0

AH8691-60V降压至3.3V电源芯片:ESOP8封装解决方案

AH8691-60V降压至3.3V电源芯片:ESOP8封装解决方案 随着电子设备的日益普及,电源管理芯片的重要性也日益凸显。一款高效率、低功耗的电源芯片可以大大提高电子设备的性能和可靠性。今天,我们将介绍一款60V降压至3.3V电源芯片,采用…

【React】React-Redux基本使用

容器组件和 UI 组件 所有的 UI 组件都需要有一个容器组件包裹 容器组件来负责和 Redux 打交道,可以随意使用 Redux 的API UI 组件无任何 Redux API 容器组件用于处理逻辑,UI 组件只会负责渲染和交互,不处理逻辑 在我们的生产当中&#xff0…

技术分享 | JMeter性能测试实现与分析

导语 JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具,它即能测试动态服务(WebService),也能测试静态资源,包括Servlet服务、CGI脚本等,还能测试动态语言服务(PHP、Java、ASP…

Vue向pdf文件中添加二维码

🚀 场景一:利用vue向pdf文件中写入二维码图片或其他图片 🚀 场景二:向pdf中添加水印 思路: 1、先通过url链接生成二维码,二维码存在于dom中 2、使用html2canvas库将二维码的dom转为一个canvas对象 3、根据c…

V100 配置 Scanpy + Scvi + Pytorch

V100配置 Scanpy Scvi Pytorch 创建虚拟环境安装基础包安装 Scanpy安装 Scvi安装 GPU 版本 Pytorch 创建虚拟环境 conda create -n name python3.8 conda activate name安装基础包 conda install numpy安装 Scanpy conda install scanpy安装 Scvi conda install scvi-too…

画图时使用的函数和一些错误处理

1. 关于 画图时后的数据量匹配错误(应该是) 然后这块还有个问题: import pynvml import matplotlib.pyplot as plt import matplotlib.animation as animationdef get_gpu_memory_usage(handle):gpu_mem pynvml.nvmlDeviceGetMemoryInfo(h…

网络营销|如何利用line拓展东南亚市场

Line在亚洲地区非常流行,特别是在日本、台湾、泰国等地,是当地最受欢迎的即时通讯应用之一。 除了基本的聊天功能外,Line还提供了各种各样的贴图、表情包和游戏等娱乐功能,吸引了大量的用户。 一、选择利用line进行海外营销的原…

浅谈OAuth 2.0与JWT

OAuth 2.0 OAuth 2.0是一个关于授权的开放网络标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。其最终目的是颁发一个有时效性的令牌(access_token&a…

debian/ubuntu/linux如何快速安装vscode

前言 这里写一篇简短的文字用来记录如何在Linux发行版上快速安装VScode,主要使用的一个软件snap,做一个简单介绍: Snap Store 是 Ubuntu、Debian、Fedora 和其他几个 Linux 发行版中的一个应用商店,提供了数千个应用程序和工具的…

.net core中前端vue HTML5 History 刷新页面404问题

放到启动的应用程序的最后面 app.Run(async (context) > {context.Response.ContentType "text/html";await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); });https://blog.csdn.net/lee576/article/details/88355…

Nas搭建webdav服务器并同步Zotero科研文献

无需云盘,不限流量实现Zotero跨平台同步:内网穿透私有WebDAV服务器 文章目录 无需云盘,不限流量实现Zotero跨平台同步:内网穿透私有WebDAV服务器一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zote…

OpenAI chatGPT又又又出bug!强制开通plus

自奥特曼宣布暂时停止plus用户的注册后,plus账号的价格水涨船高! 现在教大家如何强制开通plus,体验gpt4等各种功能! 如图: 打开官网进入后,按F12打开控制台,在控制台上输入代码 即可强制跳转至付…

SpringBoot如何自定义注解

SpringBoot如何自定义注解 ​ 在Java中,我们可以创建自定义注解,这是一种应用于类、方法、变量、参数和包等元素的元数据。自定义注解可以帮助我们更好地组织和处理代码。需要注意的是,自定义注解本身不会改变代码的行为。它们只是一种元数据…

使用Ant Design Pro开发时的一个快速开发接口请求的技巧

使用Ant Design Pro开发时的一个快速开发接口的技巧 当我们的后端在写好接口以后,我们通过swagger knife4j可以生成一个接口文档,后端启动以后,可以生成一个接口文档,当输入地址 localhost:8101/api/v3/api-docs (这…