ROS 和 ROS2 架构和通信
- 1. ROS 架构设计
-
- 1.1 OS 层
- 1.2 中间层
- 1.3 应用层
- 2. ROS 的通信机制
-
- 2.1 话题通信机制
-
- 2.1.1 Talker 注册
- 2.1.2 Listener 注册
- 2.1.3 ROS Master 进行信息匹配
- 2.1.4 Listener 发送连接请求
- 2.1.5 Talker 确认连接请求
- 2.1.6 Listener 尝试与 Talker 建立 络连接
- 2.1.7 Talker 向 Listener 发布数据
- 2.2 服务通信机制
-
- 2.2.1 Talker 注册
- 2.2.2 Listener 注册
- 2.2.3 ROS Master 进行信息匹配
- 2.2.4 Listener 尝试与 Talker 建立 络连接
- 2.2.5 Talker 向 Listener 发布数据
- 2.3 参数管理机制
-
- 2.3.1 Talker 设置变量
- 2.3.2 Listener 查询参数值
- 2.3.3 ROS Master 向 Listener 发送参数值
- 2.4 话题与服务的区别
- 3. ROS 2 的系统架构
-
- 3.1 OS 层
- 3.2 中间层
- 3.3 应用层
- 4. ROS 2 的关键中间件—-DDS
- 5. ROS 2 的通信模型
-
- 5.1 参与者(Participant)
- 5.2 发布者(Publisher)
- 5.3 订阅者(Subscriber)
- 5.4 数据写入器(DataWriter)
- 5.5 数据读取器(DataReader)
- 5.6 话题(Topic)
- 5.7 质量服务原则(Quality of Service)
- 6. 什么是 RPC
-
- 6.1 本地过程调用
- 6.2 远程过程调用
-
- 6.2.1 大致过程如下
- 6.3 RPC 与 TCP
Reference:
- 胡春旭 《ROS 机器人开发实践》
- What is ROS 2.0 li>
- 什么是RPCli>
- Connected: An Internet Encyclopedia — RPC Protocol Overview
1. ROS 架构设计
ROS 架构如下图所示,可以将其分为三个层次:OS 层、中间层和应用层。
2.1.1 Talker 注册
Talker 启动,通过 1234 端口使用 RPC 向 ROS Master 注册发布者的信息,包含所发布消息的话题名;ROS master 会将节点的注册信息加入注册列表中。
2.1.2 Listener 注册
Listener 启动,同样通过 RPC 像 ROS Master 注册订阅者的信息,包含需要订阅的话题名。
2.1.3 ROS Master 进行信息匹配
Master 根据 Listener 的订阅信息从注册列表中进行查找,如果没有找到匹配的发布者,则等待发布者的加入;如果找到匹配的发布者信息,则通过 RPC 向 Listener 发布 Talker 的 RPC 地址信息。
2.1.4 Listener 发送连接请求
Listener 接收到 Master 发回的 Talker 地址信息,尝试通过 RPC 向 Talker 发送连接请求,传输订阅的话题名、消息类型以及通信协议(TCP/UDP)。
2.1.5 Talker 确认连接请求
Talker 接收到 listener 发送的连接请求后,继续通过 RPC 向 Listener 确认链接信息,其中包含自身的 TCP 地址信息。
2.1.6 Listener 尝试与 Talker 建立 络连接
Listener 接收到确认信息后,使用 TCP 尝试与 Talker 建立 络连接。
2.1.7 Talker 向 Listener 发布数据
成功建立连接后,Talker 开始向 Listener 发送话题消息数据。
从上面的分析中可以发现,前五个步骤使用的通信协议都是 RPC,最后发布数据的过程才使用到 TCP。ROS Master 在节点建立连接的过程中起到了重要作用,但是并不参与节点之间最终的数据传输。
2.2 服务通信机制
服务是一种带有应答的通信机制,通信原理如下图所示,与话题的通信相比,其减少了 Listener 与 Talker 之间的 RPC 通信。
2.3.1 Talker 设置变量
Talker 使用 RPC 向 ROS Master 发送参数设置数据,包含参数名和参数值;ROS Master 会将参数名和参数值保存到参数列表中。
2.3.2 Listener 查询参数值
Listener 通过 RPC 向 ROS Master 发送参数查找请求,包含索要查找的参数名。
2.3.3 ROS Master 向 Listener 发送参数值
Master 根据 Listener 的查找请求从参数列表中进行查找,查找到参数后,使用RPC 将参数数值发送给 Listener。
这里需要注意的是,如果 Talker 向 Master 更新参数值,Listener 在不重新查询参数值的情况下是无法知晓参数值已经被更新的。所以在很多场景中,需要一种动态参数更新机制。
2.4 话题与服务的区别
话题和服务是 ROS 中最基础也是使用最多的通信方法,具体总结如下:
条目 | 话题 | 服务 |
---|---|---|
同步性 | 异步 | 同步 |
通信模型 | 发布/订阅 | 客户端/服务器 |
反馈机制 | 无 | 有 |
底层协议 | ROSTCP/ROSUDP | ROSTCP/ROSUDP |
缓冲区 | 有 | 无 |
实时性 | 弱 | 强 |
节点关系 | 多对多 | 一对多(一个Server) |
使用场景 | 弱逻辑处理,多数据传输 | 强逻辑处理,少数据传输 |
总之,话题是 ROS 中基于 发布/订阅 模型的异步通信模式,这种方式将信息的产生和使用双方解耦,常用于不断更新的、含有较少逻辑处理的通信数据;而服务多用于处理 ROS 中的同步通信,采用 客户端/服务器 模型,常用于数据量较小但有强逻辑处理的数据交换。
3. ROS 2 的系统架构
ROS 2 重新设计了系统架构,图再搬来一次。
5.1 参与者(Participant)
在 DDS 中,每一个发布者或者订阅者都成为参与者,对应于一个使用 DDS 的用户,可以使用某种定义好的数据类型来 读/写 全局数据空间。
5.2 发布者(Publisher)
数据发布的执行者,支持多种数据类型的发布,可以与多个数据写入器(DataWriter)相联,发布一种或多种主题(Topic)的消息。
5.3 订阅者(Subscriber)
数据订阅的执行者,支持多种数据类型的订阅,可以与多个数据读取器(DataReader)相联,订阅一种或多种主题(Topic)的消息。
5.4 数据写入器(DataWriter)
上层应用向发布者更新数据的对象,每个数据写入器对应一个特定的Topic,类似于ROS 1中的一个消息发布者。
5.5 数据读取器(DataReader)
上层应用从订阅者读取数据的对象,每个数据读取器对应一个特定的Topic,类似于ROS 1中的一个消息订阅者。
5.6 话题(Topic)
和 ROS 1 中的概念类似,话题需要定义一个名称和一种数据结构,但 ROS 2 中的每个话题都是一个实例,可以存储该话题中的历史消息数据。
5.7 质量服务原则(Quality of Service)
简称 QoS Policy,这是 ROS 2 中新增的、也是非常重要的一个概念,控制各方面与底层的通信机制,主要从时间限制、可靠性、持续性、历史记录这几个方面,满足用户针对不同场景的数据需求。
6.3 RPC 与 TCP
RFC 1831 中记录的远程过程调用(Remote Procedure Call, RPC) 协议旨在以与 TCP 不同的方式扩展 IP。TCP 的目标是大数据流的传输(比如文件下载),而 RPC 是为 络编程而设计的。
RPC 的关键特征有:
- Request-reply:RPC 是一个 请求-应答 协议,可以表现出此类协议的典型“乒乓”行为。这不是 RPC 设计的基础(因为多个请求可以是未完成的,应答可以以任何顺序出现),但是大多数程序将发出单个 RPC 请求,然后阻塞等待应答。
- UDP 或 TCP 传输:RPC 实际上是通过 UDP 或 TCP 进行操作的。RPC/UDP 是一种无连接、无状态的协议。RPC/TCP 较慢,但提供可靠的有状态连接。
- 标准化的数据表示:RPC 使用 eXternal Data Representation(XDR) 协议对其数据进行编码,该协议记录在RFC 1832 中,它标准化了整数、浮点数和字符串的格式,允许不同类型的计算机无缝地增强信息。
- 身份验证:RPC 支持将一台机器上的调用程序验证为另一台机器上的目标子例程。身份验证可以以几种不同的模式进行操作。在 NFS 操作过程中,身份验证通常采用将 UNIX 用户和 group IDs 传递给文件服务器进行权限检查的形式。
RPC 服务对接:
TCP 和 UDP 都依赖众所周知的 port numbers 来执行服务会合。例如,TCP TELNET 服务在 port 21 上可用,FTP 在端口 23 上可用,SMTP 在 port 25 上可用,等等。连接到 TCP 和 UDP 服务只需要连接到正确的 port number。
RPC 在这个过程中引入了另一个步骤,将服务与给定的 port number 分离。它使用一个名为 PORTMAP 或 RPCBIND 的特殊 RPC 服务来实现这一点。这些在 RFC 1833 中记录的绑定协议通常被称为 portmapper,它们在 RPC 服务中是唯一的,因为它们有自己的指定 port(port 111)。运行在任意 port number 上的其他 RPC 服务可以使用到 port 111 的 RPC 调用来注册自己。portmapper 提供其他 RPC 调用以允许服务查找。
这种设计最重要的结果是,portmapper 必须是第一个启动的 RPC 程序,并且必须保持恒定的操作。
RPC 本质上不一定是 TCP,或者说常见的 RPC 是基于 TCP 的或使用 TCP 之上的某种协议的。
文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8763 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!