ROS2 采用分层架构设计,从底层到应用层可分为以下几个核心层次,其架构图如下:
+-------------------+
| 应用层 |
| (ROS2应用程序) |
+-------------------+
|
+-------------------+
| ROS2中间层 |
| (rcl/rclcpp/rclpy)|
+-------------------+
|
+-------------------+
| 通信中间件层 |
| (DDS) |
+-------------------+
|
+-------------------+
| 操作系统层 |
| (Linux/Windows) |
+-------------------+
各层核心功能解析:
ROS2 选择 DDS 作为底层通信中间件,其核心原因在于 DDS 具备去中心化、实时性、可靠性和可扩展性。DDS 基于发布 - 订阅模型,通过 RTPS(实时发布订阅协议)实现节点间通信,其通信模型如下:
+-------------------+ +-------------------+
| 节点A | | 节点B |
| +-------------+ | | +-------------+ |
| | 发布者 | | | | 订阅者 | |
| +------+------+ | | +------+------+ |
| | | | | |
| v | | v |
| +------+------+ | | +------+------+ |
| | 话题数据 |<---->| | 话题数据 | |
| +------+------+ | | +------+------+ |
| ^ | | ^ |
| | | | | |
| +------+------+ | | +------+------+ |
| | DDS通信层 | | | DDS通信层 | |
| +-------------+ | | +-------------+ |
+-------------------+ +-------------------+
DDS 核心概念在 ROS2 中的映射:
ROS2 节点间的通信无需中央服务器(如 ROS1 的 master),而是通过 DDS 的自动发现机制实现,其流程如下:
节点启动时:
通信建立过程:
+-----------+ +-------------------+ +-----------+
| 节点A |<--->| DDS发现服务 |<--->| 节点B |
+-----------+ +-------------------+ +-----------+
| | |
v v v
+-----------+ +-------------------+ +-----------+
| 发布者 |<--->| DDS通信网络 |<--->| 订阅者 |
+-----------+ +-------------------+ +-----------+
发现机制的核心组件:
话题基于发布 - 订阅模型,支持异步、单向数据流,其实现流程如下:
+----------------+ +-------------------+ +----------------+
| 发布者节点 | | | | 订阅者节点 |
| +-----------+ | | | | +-----------+ |
| | Publisher |-+--->| DDS数据分发网络 |<---+| | Subscriber | |
| +-----------+ | | | | +-----------+ |
+----------------+ +-------------------+ +----------------+
| | |
v v v
+----------------+ +-------------------+ +----------------+
| 数据生成 | | 数据序列化/传输 | | 数据接收处理 |
+----------------+ +-------------------+ +----------------+
关键特性:
服务基于请求 - 响应模型,实现同步通信,其流程如下:
+----------------+ +-------------------+ +----------------+
| 客户端节点 | | | | 服务端节点 |
| +-----------+ | | | | +-----------+ |
| | Client |-+--->| DDS请求-响应通道 |<---+| | Server | |
| +-----------+ | | | | +-----------+ |
+----------------+ +-------------------+ +----------------+
| | |
v v v
+----------------+ +-------------------+ +----------------+
| 请求数据生成 | | 双向可靠通信 | | 响应数据生成 |
+----------------+ +-------------------+ +----------------+
与 ROS1 的区别:
ROS2 引入组件(Component) 概念,允许在单个进程中运行多个独立节点,其架构如下:
+-------------------+
| ROS2进程 |
| + ------------- + |
| | 组件管理器 | |
| + ----+-------- + |
| | |
| v |
| + ----+-------- + |
| | 组件A | |
| + ------------- + |
| | 组件B | |
| + ------------- + |
+-------------------+
优势:
ROS2 节点支持状态机驱动的生命周期管理,状态转换图如下:
+---------+ +---------+ +---------+ +---------+ +---------+
| 未配置 |<--->| 已配置 |<--->| 初始化 |<--->| 准备好 |<--->| 活跃 |
| (Unconfigured)|(Configured)|(Inactive)|(Active)|(Finalized)|
+---------+ +---------+ +---------+ +---------+ +---------+
^ ^ ^
| | |
+---------------------------------+---------------------------------+
状态转换条件:
特性 | ROS1 | ROS2 |
---|---|---|
通信中间件 | 自定义 TCP/UDP | DDS(数据分发服务) |
架构 | 中心化(依赖 master) | 去中心化(DDS 自动发现) |
实时性 | 有限支持 | 原生支持(DDS 实时特性) |
可靠性 | 依赖上层逻辑 | 底层支持(DDS QoS 策略) |
多机通信 | 需要额外配置 | 原生支持(DDS 网络透明性) |
节点生命周期管理 | 无状态管理 | 状态机驱动(Lifecycle 节点) |
ROS2 通过 DDS 底层架构和模块化设计,实现了以下关键能力:
通过上述架构和机制,ROS2 为机器人系统提供了更健壮、灵活的开发框架,尤其适合工业自动化、自动驾驶等对实时性和可靠性要求高的场景。