ROS 2从入门到精通系列(一):什么是ROS2 - 核心概念和架构

本文是ROS2系列的第一篇,帮助你快速理解ROS2的核心概念和系统架构。

引言

如果你即将学习ROS2或者对机器人开发感兴趣,首先需要理解:什么是ROS2?

ROS(Robot Operating System)是一个灵活的框架,用于编写机器人软件。ROS2是其第二代版本,相比ROS1有重大改进。本文将从零开始,帮你建立起对ROS2的全面认识。


一、什么是ROS2?

1.1 ROS2的定义

ROS2 是一个分布式计算框架,专门为机器人应用设计。它提供了:

  • 硬件抽象 - 屏蔽各类传感器和执行器的底层差异
  • 中间件 - 实现进程间通信(IPC)和跨机器通信
  • 工具链 - 调试、可视化、模拟等开发工具
  • 库和算法 - 常用机器人算法的参考实现

1.2 为什么是ROS2而不是ROS1?

ROS1已有15年历史,但在生产环境中存在局限:

特性 ROS1 ROS2
实时性 不支持硬实时 支持确定性实时调度
安全认证 DDS安全插件支持
通信中间件 定制TCPROS/UDPROS 标准DDS
跨平台 Linux主导 Linux/Windows/macOS
API稳定性 不稳定 向后兼容性承诺
生态维护 逐步停止 积极维护(至2025+)

二、ROS2核心概念

2.1 节点(Node)

节点是ROS2中最小的计算单元,类似于一个独立的进程。

  • 一个节点通常负责一项专门功能(如图像处理、电机控制等)
  • 多个节点通过通信机制协调工作
  • 节点可以用Python、C++、C#等多种语言编写
示例:
├── 图像采集节点 (camera_node)
├── 图像处理节点 (image_processor)
├── 目标检测节点 (detection_node)
└── 决策节点 (decision_node)

2.2 话题(Topic)

话题是节点间的异步通信通道,采用发布-订阅(Pub-Sub)模式

数学表示:一个话题在时间 t t t 上的消息流为:

M ( t ) = { m 1 ( t ) , m 2 ( t ) , . . . , m n ( t ) } M(t) = \{m_1(t), m_2(t), ..., m_n(t)\} M(t)={m1(t),m2(t),...,mn(t)}

其中 m i ( t ) m_i(t) mi(t) 是第 i i i 个发布者在时间 t t t 发送的消息

特点:

  • 发布者和订阅者解耦,互不知道对方存在
  • 支持一对多、多对一的通信关系
  • 消息传输是异步的(非阻塞)

2.3 服务(Service)

服务是节点间的同步通信机制,采用请求-响应(Request-Response)模式

通信公式:

Response = f ( Request ) \text{Response} = f(\text{Request}) Response=f(Request)

一个服务调用的完整周期为:

T s e r v i c e = T s e n d _ r e q + T p r o c e s s + T s e n d _ r e s p T_{service} = T_{send\_req} + T_{process} + T_{send\_resp} Tservice=Tsend_req+Tprocess+Tsend_resp

特点:

  • 客户端发送请求,等待服务器响应(阻塞式)
  • 一对一的同步通信
  • 适合需要立即反馈的操作(如设置参数、查询状态)

2.4 动作(Action)

动作用于需要长时间执行的任务,提供目标、反馈和结果

动作的数据结构:

Action = { Goal , Feedback , Result } \text{Action} = \{\text{Goal}, \text{Feedback}, \text{Result}\} Action={Goal,Feedback,Result}

时间关系:

T t o t a l = T g o a l _ s e n d + T e x e c u t i o n + T r e s u l t _ s e n d T_{total} = T_{goal\_send} + T_{execution} + T_{result\_send} Ttotal=Tgoal_send+Texecution+Tresult_send

特点:

  • 客户端发送目标,服务器周期性发送反馈,最后返回结果
  • 支持中途取消任务
  • 适合机械臂移动、导航等长时间任务

2.5 消息(Message)

消息是节点间通信的数据载体

消息由字段组成,每个字段有类型和名称:

# 示例消息定义 (sensor_msgs/Image.msg)
std_msgs/Header header
uint32 height
uint32 width
string encoding
uint8 is_bigendian
uint32 step
uint8[] data

三、ROS2系统架构

3.1 整体架构图

硬件层

传输层

中间件层 DDS

节点通信层

应用层

用户应用

节点1

节点2

节点3

话题发布/订阅

服务请求/响应

动作通信

UDP/TCP网络

本地进程间通信

传感器

执行器

计算设备

3.2 通信模式对比

请求-响应模式 Service

同步请求

阻塞等待

返回响应

客户端\nClient

服务器\nServer

发布-订阅模式 Topic

异步

消息推送

消息推送

发布者\nPublisher

话题总线

订阅者1

订阅者2

3.3 ROS2的DDS中间件

ROS2使用 DDS(Data Distribution Service) 作为通信中间件。

DDS的通信模型:

数据 = 话题 + 发布者 + 订阅者 + QoS策略 \text{数据} = \text{话题} + \text{发布者} + \text{订阅者} + \text{QoS策略} 数据=话题+发布者+订阅者+QoS策略

QoS关键参数:

  • 可靠性: P d e l i v e r y ∈ { BEST_EFFORT , RELIABLE } P_{delivery} \in \{\text{BEST\_EFFORT}, \text{RELIABLE}\} Pdelivery{BEST_EFFORT,RELIABLE}
  • 持久性: D p e r s i s t e n c e ∈ { VOLATILE , TRANSIENT_LOCAL , TRANSIENT , PERSISTENT } D_{persistence} \in \{\text{VOLATILE}, \text{TRANSIENT\_LOCAL}, \text{TRANSIENT}, \text{PERSISTENT}\} Dpersistence{VOLATILE,TRANSIENT_LOCAL,TRANSIENT,PERSISTENT}
  • 历史深度: H d e p t h ∈ [ 1 , ∞ ) H_{depth} \in [1, \infty) Hdepth[1,)

四、ROS2生态体系

4.1 发行版本线

2020-05 Foxy 2021-05 Galactic (EOL) 2022-05 Humble (LTS 2027-05) 2023-05 Iron (标准支持) 2024-05 Jazzy (支持中) 2025-05 Rolling (开发版) ROS 2 发行版本支持时间线
  • LTS版本(如Humble):5年长期支持,生产环境推荐
  • 标准版本(如Iron、Jazzy):约3年支持期

4.2 常用工具链

ROS2核心

构建工具

colcon

CMake

Ament构建系统

调试工具

rqt GUI框架

RViz3D可视化

ros2 CLI命令

模拟工具

Gazebo

Webots


五、ROS2节点的生命周期

5.1 节点状态转移图

configure

activate

deactivate

cleanup

error

error

error

error_recovery

shutdown

shutdown

shutdown

Unconfigured
未配置

Inactive
不活跃

Active
活跃

Finalized
终结

ErrorProcessing
错误处理

5.2 状态转移的数学模型

节点的状态可表示为:

State ( t + 1 ) = f ( State ( t ) , Event ) \text{State}(t+1) = f(\text{State}(t), \text{Event}) State(t+1)=f(State(t),Event)

其中:

  • State ( t ) ∈ { Unconfigured, Inactive, Active, ErrorProcessing, Finalized } \text{State}(t) \in \{\text{Unconfigured, Inactive, Active, ErrorProcessing, Finalized}\} State(t){Unconfigured, Inactive, Active, ErrorProcessing, Finalized}
  • Event ∈ { configure, activate, deactivate, cleanup, error_recovery, shutdown } \text{Event} \in \{\text{configure, activate, deactivate, cleanup, error\_recovery, shutdown}\} Event{configure, activate, deactivate, cleanup, error_recovery, shutdown}

六、一个简单的例子

6.1 系统架构图

执行层

控制层

处理层

传感器层

USB

Topic: /raw_points

Topic: /filtered_points

Topic: /obstacles

Service: plan_path

指令

激光雷达 LIDAR

驱动节点
lidar_driver

数据滤波节点
point_filter

障碍物检测
obstacle_detector

路径规划
motion_planner

运动控制
motor_controller

电机

6.2 核心概念映射

在这个移动机器人例子中:

组件 ROS2概念 说明
lidar_driver 节点 独立进程,负责LIDAR驱动
/raw_points 话题 LIDAR原始点云数据流
/filtered_points 话题 滤波后的点云数据
/obstacles 话题 检测到的障碍物信息
plan_path服务 服务 规划器提供的路径规划服务

七、ROS2 vs ROS1:核心差异总结

ROS 1 & ROS 2 核心差异

通信中间件

ROS1: 自研TCPROS/UDPROS

ROS2: 标准DDS

实时性

ROS1: 无硬实时保证

ROS2: 确定性实时支持

安全性

ROS1: 无原生安全机制

ROS2: DDS-Security支持

跨平台

ROS1: 主要是Linux

ROS2: Linux/Windows/macOS

API成熟度

ROS1: 频繁变化

ROS2: 稳定API承诺


八、关键概念速记表

概念 定义 特点
节点 ROS2中最小的可执行单元 独立进程,可用多种语言编写
话题 异步通信通道 发布-订阅,一对多/多对一
服务 同步通信机制 请求-响应,一对一
动作 长时间任务通信 目标-反馈-结果,可取消
消息 通信数据载体 结构化数据,类型定义
DDS 通信中间件 标准化、跨平台、支持QoS
包(Package) 代码组织单位 包含节点、消息定义、配置

九、学习路线提示

基于本文知识,你接下来应该学习:

理解核心概念
本文

搭建开发环境
第2篇

创建第一个节点
第3-4篇

实现通信机制
第5篇

掌握开发工具
第6篇

项目实战
第三阶段


十、本文要点总结

ROS2是什么:一个为机器人开发设计的分布式计算框架

5大核心概念:节点、话题、服务、动作、消息

通信机制:发布-订阅(异步)和请求-响应(同步)

技术优势:DDS中间件、实时支持、跨平台、安全认证

系统设计:分层架构、模块化、高度可扩展


常见新手问题

Q1: ROS2相比ROS1,我应该学哪个?

A: 如果你是初学者,强烈推荐ROS2。ROS1已进入维护阶段,新项目应使用ROS2。

Q2: ROS2对硬件有什么要求?

A: ROS2本身很轻量,对硬件要求低。但具体应用(如SLAM、深度学习)可能需要更强硬件。

Q3: ROS2支持实时系统吗?

A: ROS2的DDS支持实时调度,但需要使用PREEMPT_RT实时Linux内核和配置合适的QoS策略。

Q4: 节点、话题、服务我应该怎么选择?

A:

  • 话题:数据流、传感器数据 → 发布-订阅
  • 服务:一次性请求、参数设置 → 请求-响应
  • 动作:长时间任务、需要反馈和取消 → 目标-反馈-结果

推荐资源

  • 官方文档:https://docs.ros.org/en/humble/
  • GitHub生态:https://github.com/ros2
  • 中文社区:https://acolabs.org/

下一篇预告《ROS2从入门到精通系列(二):环境搭建 - Ubuntu系统安装ROS2》

喜欢本文?点个赞和关注,不迷路!📌

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐