ROS通信机制

点对点的分布式通信机制是ROS的核心,使用了基于TCP/IP的通信方式,实现模块间点对点的松耦合连接,可以执行若干种类型的通信,包括基于话题(Topic)的异步数据流通信,基于服务(Service)的同步数据流通信,还有参数服务器上的数据存储等。

ROS 最常用的通信方式有三种:
话题通信
服务通信
共享参数
其他通信方式: 例如 节点之间的 Nodelet 通信(为了保证数据实时性)

[查阅]
nodelet是为了减少ros node之间的消息传输(进程间通讯), 将多个算法"结点(nodelet)"跑到一个进程中, 这样避免了数据传输, (因为进程内部内存是共享的, 传数据的话传个指针就行了), 从而实现的零拷贝(zero copy).

nodelet和node很大程度上保持一致, 对外来说, nodelet几乎可以视为node, nodelet之间仍然是消息传输(只是内部实现由原始数据的传输改成了指针传输), 将node转换为nodelet只需要少量的改动.

基于话题(Topic)的异步数据流通信

查阅
主要角色: Publisher, Subscriber, Master

ROS通信机制

主要阶段:

  1. 连接前的准备(Master 起到了 牵线搭桥的作用)

发布者启动, 通过 RPC 向 ROS Master 注册发布者的信息(发布者节点信息, 话题名, 话题缓存大小等), Master 会将这些信息加入到注册列表中;
订阅者启动, 通过 RPC 向 ROS Master 注册订阅者的信息, 包括 订阅者节点信息, 话题名字等, Master 会将这些信息加入到注册列表;

Master 进行节点匹配: Master 会根据订阅者提供的信息, 在注册列表中查找匹配的发布者; 如果没有发布者, 则等待发布者的加入; 如果找到匹配的发布者, 则会主动把发布者(一个或者多个)的地址通过 RPC 传送给订阅者节点

订阅者接收到 Master 发出的 发布者 的地址信息, 尝试通过 RPC 向 发布者 发出连接请求(
信息包括: 话题名, 消息类型, 通讯协议(TCP/UDP)
)

发布者接收到 订阅者 发出的连接请求后, 通过 RPC 向 订阅者 确认连接请求(包含的信息为自身TCP地址信息)

  1. 连接和通信
    主要的解决 : 发布者 如何发布信息传递给 订阅者 的过程
    Master 全程没有介入; 只是 订阅者 和 发布者 之间的数据单向传递

订阅者 接收到 发布者 的确认消息之后, 使用 TCP 尝试与 发布者 建立网络连接
成功连接之后, 发布者 开始向订阅者发布话题消息数据

注意: 发布者 和 订阅者 之间的关系可能是 一对一, 一对多.

RPC 框架

[查阅]
Remote Procedure Call 远程过程调用, 计算机通信协议, 分布式

个人理解: 任务分工员

厨师就要依赖很多外人来参与炒菜工作。而他在通知备菜师帮他洗菜,通知切菜师傅帮他切菜的时候,这个过程就是远程过程调用。

如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行orderService.buy(“HHKB键盘”)时,实质上调用的是远端的服务。这种方式其实就是RPC。而提供了这种功能的工具我们称之为RPC框架。

RPC 框架中主要有三种角色: Provider, Consumer, Registry.
ROS通信机制
RPC Client: 调用远程服务的服务消费方
RPC Server: 暴露服务的服务提供方
Registry: 服务注册与发现的注册中心(进行主要任务分配的核心机构)(负载均衡)。

ROS通信机制
服务提供者启动后主动向注册中心***器ip、port以及提供的服务列表; 服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和Failover。

基于服务(Service)的同步数据流通信

ROS通信机制

基于RPC(远程过程调用)的参数服务器上的数据存储

parameter 可以看作为ros系统运行时中定义的全局变量,而master node 中有 parameter server 来维护这些变量。

ROS1 和 ROS2

查阅

ROS1 ROS2
主要构建在 Linux 系统上 Linux, windows Mac OS, RTOS, 甚至是没有操作系统的裸机
通讯系统基于TCP ROS/UDP ROS 通讯系统基于DDS
架构中Nodelet和TCPROS/UDPROS是并列的层次,为同一个进程中的多个节点提供一种更优化的数据传输方式 保留了这种数据传输方式,只不过换了一个名字,叫做“Intra-process”,同样也是独立于DDS。
强依赖于ROS Master 节点之间使用一种称为“Discovery”的发现机制来获取彼此的信息。

目前ROS2的功能尚不完善,需要依赖部分ROS1中的功能包。
DDS是一种分布式实时系统中数据发布/订阅的标准解决方案。ROS2内部提供了DDS的抽象层实现,用户不需要关注底层DDS的提供厂家。