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

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年历史,但在生产环境中存在局限:

特性ROS1ROS2
实时性不支持硬实时支持确定性实时调度
安全认证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-05Foxy2021-05Galactic (EOL)2022-05Humble (LTS2027-05)2023-05Iron (标准支持)2024-05Jazzy (支持中)2025-05Rolling (开发版)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》

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

Read more

一卡通核心交易平台的国产数据库实践解析:架构、迁移与高可用落地

一卡通核心交易平台的国产数据库实践解析:架构、迁移与高可用落地

文章目录 * 摘要 * 1. 业务与技术挑战拆解 * 2. 总体架构(从数据库边界看) * 3. 数据模型:以“不可变流水”为中心 * 3.1 流水表(交易事实表)建议 * 3.2 账户与余额:把“强一致”收敛到最小 * 4. 高可用与容灾:把“不可用窗口”工程化 * 4.1 同城高可用:主备切换与防脑裂 * 4.2 异地灾备:以“可恢复”为目标设计链路 * 5. 性能与稳定性:把瓶颈消灭在“写路径” * 5.1 连接治理:让资源可控 * 5.2 SQL治理:少做无谓计算

By Ne0inhk

前端检查内存泄露

前言 前端应用的内存泄露,指不再使用内存未被释放,导致页面占用内存持续增长,轻则引发页面卡顿,加载缓慢,重则导致浏览器崩溃, 尤其在单页应用SPA中,路由切换频繁但内存不回收,问题会被无限放大,比如用户长时间使用某后台管理系统,可能出现操作响应式延迟,甚至需要强制刷新才能恢复,这很可能是内存泄露在"作祟" 一. 前端常见的内存泄露场景 1. 意外的全局变量:未声明的变量(如a = 10而非let a = 10)会挂载到window上,页面不刷新就不会释放; 2. 闭包滥用:闭包会保留对外部作用域的引用,若长期持有 DOM 或大型对象,会导致内存无法回收(如未清理的事件监听回调) ; 3. 未清理的 DOM 引用:删除 DOM 节点后,仍保留其引用(如let el =       document.getElementById('test&

By Ne0inhk
【Vue3】前端Vue3最常用的 20 道面试题总结(含详细代码解析)

【Vue3】前端Vue3最常用的 20 道面试题总结(含详细代码解析)

以下是老曹关于 Vue 3 最常用的 20 道面试题总结,涵盖 Vue 3 的核心特性如 Composition API、响应式系统(ref / reactive)、生命周期钩子、组件通信、Teleport、Suspense、自定义指令等高频知识点。每道题都配有详细解释和代码示例,适合用于前端开发岗位的 Vue 3 技术面试准备,大家可以码住随时翻出来查阅背诵和练习! 1. Vue 3 和 Vue 2 的区别是什么? 问题: 解释 Vue 3 相比 Vue 2 的主要改进点。(最主要,不是全部,全部后续老曹会再扩展) 答案: 特性Vue 2Vue 3响应式系统Object.definePropertyProxy架构单一源码模块化架构(Tree-shakable)

By Ne0inhk
前端拖拽排序实现详解:从原理到实践 - 附完整代码

前端拖拽排序实现详解:从原理到实践 - 附完整代码

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战 🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解 🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用 🍎 《前端技术》专栏以实战为主介绍日常开发中前端应用的一些功能以及技巧,均附有完整的代码示例 ✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧 💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程 🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整 👍《Spring Security》专栏中我们将逐步深入Spring Security的各个

By Ne0inhk