前言
- 谈及ROS2的通讯机制,话题通讯作为一个最为常用的通讯手段,相信大家都不为陌生。但是即便话题通讯提供了一种跨进程的通讯方式,我们难免无法防止其在发布和订阅 的时候传递的消息被进行内存中的一次拷贝。
- 因此诞生了
零拷贝(zero_copy)
这一实现想法,也就是在进行消息传递的时候传递的是同一份地址的数据,这对于大数据量传输(例如图像或者庞大数据)的传输十分重要。 - 本人在很久以前写过一篇博客,讲述了ROS2如何实现单一进程内如何实现跨界点进行零拷贝通讯ROS2多线程C++的实现和单进程通讯零拷贝的节点设计模式。
- 但是上述的实现局限于单一进程,那本文就来讨论如何实现ROS2跨进程之间实现零拷贝的话题通讯,同时我们将进一步了解ROS2的通讯机制,学习相关ROS2中间件的相关基础知识。
1 冷知识-DDS
1-1 介绍
DDS(Data Distribution Service)
是一个用于分布式系统中的实时数据交换的开放标准。它定义了数据发布/订阅通信
模型,并提供了一种高效、可靠的方式来在分布式系统中的节点之间交换数据。DDS 的主要目标是解决在分布式系统中,特别是在实时和嵌入式系统中进行高效数据传输
的问题。
1-2 DDS 的核心特性
发布/订阅模型
:- DDS 基于
发布/订阅
模型,分为两个主要角色:发布者(Publisher)和订阅者(Subscriber)。 发布者
负责将数据发送到系统中,订阅者
负责接收数据。数据是通过话题(Topic)
来组织和传输的。- 发布者和订阅者是解耦的,即发布者不知道谁订阅它发布的数据,反之亦然。
- DDS 基于
实时性和低延迟
:- DDS 设计用于支持
实时系统
,特别是在低延迟、高吞吐量和确定性要求高的应用中(如工业控制、军事、机器人、汽车等领域)。 - DDS 提供了对
实时 QoS(Quality of Service)
的强大支持,可以根据应用需求调整数据传输的方式,例如可靠性、延迟、数据优先级等。
- DDS 设计用于支持
高可靠性
:- DDS 提供了多种
QoS 策略
,包括可靠性(Reliability)
,允许数据在传输过程中保证不丢失。 - DDS 支持
持久性(Durability)
和历史记录
,保证数据能够在系统中持久存储并在订阅者连接时提供历史数据。
- DDS 提供了多种
数据类型和序列化
:- DDS 支持
用户定义的数据类型
,使得开发者可以根据应用需求设计和交换任何类型的数据。 - DDS 提供了
数据序列化和反序列化
机制,将数据对象转化为可以在网络中传输的字节流,并确保它们能够在接收端正确恢复。
- DDS 支持
分布式系统
:- DDS 不依赖于中心化的服务器或代理,它是一个
去中心化
的通信协议。每个 DDS 节点都可以独立地在网络中进行数据交换。 - DDS 支持
动态发现
,即节点可以在不需要手动配置的情况下动态发现其他节点及其发布的主题。
- DDS 不依赖于中心化的服务器或代理,它是一个
扩展性与灵活性
- DDS 可以扩展到广泛的应用,从小型嵌入式设备到大型的企业级系统。
- 它适用于单机通信,也可以通过网络跨越不同机器、不同地点进行数据交换。
1-3 DDS 的关键组件
数据主题(Topic)
:- 数据通过
话题
在 DDS 系统中交换。每个话题有一个名称,订阅者通过话题名称来接收相应的数据。 - 话题是一个逻辑概念,它定义了要传输的数据类型。
- 数据通过
发布者(Publisher)和订阅者(Subscriber)
:发布者
:发布数据的实体,将数据发布到某个话题。订阅者
:订阅某个话题,接收从发布者发布的数据。
QoS(Quality of Service)
:QoS 策略
是 DDS 的核心特性之一,它允许用户配置数据传输的行为。常见的 QoS 策略包括:可靠性
:确保数据是否可靠地传递,例如可靠
(Reliable)或不可靠
(Best Effort)。延迟
:控制数据的最大传输延迟。优先级
:为不同类型的数据设置不同的优先级。持久性
:确定数据是否会在订阅者连接之前持久保存。
数据过滤和选择(Content-Filtered Topics)
:- DDS 支持对订阅数据的
内容过滤
,即订阅者只接收满足某些条件的数据。这对于减少不必要的数据传输和提高系统效率非常重要。
- DDS 支持对订阅数据的
动态发现
:- DDS 节点能够自动发现网络中的其他节点和它们所发布的主题。这种机制使得在一个动态变化的系统中,节点可以不依赖静态配置而自动连接和通信。’