1. ROS2与机器人系统概述
大家好,我是这门课的主讲工程师。今天咱们聊聊ROS2的来龙去脉,以及它凭什么成了机器人开发的事实标准。
说实话,我刚入行那会儿,机器人开发还是个「手工作坊」时代。各家做各家的驱动,通信协议五花八门,想复用别人的代码?门儿都没有。直到ROS的出现,才真正改变了这个局面。
1.1 ROS发展历史:从实验室到工业级
ROS(Robot Operating System)最早是2007年由斯坦福大学和Willow Garage公司联合发起的项目。初衷很简单——给机器人研究社区提供一个通用的软件框架。
- ROS 1(2010年首发):开创了节点、话题、服务等核心概念。但有个硬伤——通信依赖Master节点,Master挂了整个系统就瘫了。
- ROS 2(2017年至今):采用DDS(数据分发服务)作为底层通信,去中心化设计,支持实时性、多机器人、嵌入式平台。
我2015年第一次用ROS 1做项目,调试时Master崩溃了三次,气得我差点砸键盘。后来ROS 2出来,我第一时间迁移过去——嗯,真香。
核心变化:ROS 2不再依赖中心节点,每个节点通过DDS直接通信。这意味着单点故障不会拖垮整个系统。
1.2 核心概念:节点、话题、服务、动作
这四个概念是ROS的基石。你想想看,一个机器人系统里,传感器要发数据,电机要收指令,决策模块要处理信息——它们之间怎么协作?就是靠这四样东西。
1.2.1 节点(Node)
节点是ROS中最基本的执行单元。每个节点负责一个具体的功能,比如激光雷达驱动、路径规划、电机控制。节点之间互相独立,通过通信机制交换数据。
我个人习惯把节点想象成「微服务」——每个节点只干一件事,但干得漂亮。
# 创建一个简单的发布者节点(Python示例)
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
self.publisher_ = self.create_publisher(String, 'topic', 10)
timer_period = 0.5 # 秒
self.timer = self.create_timer(timer_period, self.timer_callback)
def timer_callback(self):
msg = String()
msg.data = 'Hello, ROS2!'
self.publisher_.publish(msg)
1.2.2 话题(Topic)
话题是节点间异步通信的通道。发布者往话题上发数据,订阅者从话题上收数据。一对多、多对一、多对多都支持。
举个例子:激光雷达节点持续发布扫描数据到/scan话题,导航节点订阅这个话题获取环境信息。我曾经在AGV项目里同时让三个节点订阅同一个激光话题——完全没问题。
1.2.3 服务(Service)
服务是同步的请求-响应模式。客户端发送请求,服务端处理并返回结果。适合「问一句答一句」的场景,比如「请告诉我当前机器人位置」。
# 服务端示例
class AddTwoIntsService(Node):
def __init__(self):
super().__init__('add_two_ints_server')
self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_callback)
def add_callback(self, request, response):
response.sum = request.a + request.b
return response
1.2.4 动作(Action)
动作是ROS 2里我最喜欢的设计。它解决了「长时间任务」的问题——比如让机器人从A点走到B点,你既要能发送目标,又要能中途取消,还要能实时获取进度反馈。
动作由三部分组成:目标(Goal)、反馈(Feedback)、结果(Result)。
避坑指南:我曾经在导航任务里用服务来实现「走到目标点」,结果机器人走到一半卡住了,服务一直阻塞,整个系统都僵住了。后来改用动作,随时可以取消重来,舒服多了。
1.3 机器人操作系统选型对比
市面上不止ROS一家,但为什么ROS成了主流?咱们来做个对比。
| 特性 | ROS 2 | ROS 1 | 自定义框架 | 其他(如LCM、YARP) |
|---|---|---|---|---|
| 通信模型 | DDS(去中心化) | TCPROS/UDPROS(中心化) | 自研协议 | 各具特色 |
| 实时性 | 支持(需配置) | 不支持 | 可定制 | 部分支持 |
| 跨平台 | Linux/Windows/macOS | Linux为主 | 取决于实现 | 有限 |
| 社区生态 | 庞大活跃 | 成熟但停止更新 | 无 | 小众 |
| 学习成本 | 中等 | 较低 | 高 | 中等 |
| 工业应用 | 越来越多 | 较少 | 定制化 | 极少 |
说白了,ROS 2最大的优势在于生态。你想想看,导航有Nav2,建图有Cartographer/SLAM Toolbox,机械臂有MoveIt2——这些成熟方案直接拿来用,比自己从头造轮子省了太多时间。
注意:ROS 1已经在2020年停止更新,新项目请直接使用ROS 2。我见过有人2023年还在用ROS 1做新项目,结果发现很多新库都不支持了,最后不得不迁移——白白浪费三个月。
1.4 ROS 2知识体系总览
下面这张图是我自己整理的ROS 2知识体系,涵盖了从底层通信到上层应用的完整链路。你可以把它当作整个课程的地图。
从这张图你能看到,ROS 2是一个分层架构。上层应用(比如导航)依赖通信层提供的接口,通信层又依赖底层的DDS和操作系统。每一层各司其职,这也是ROS 2能保持灵活性和稳定性的原因。
我的建议:初学者不要一上来就扎进底层DDS的细节里。先学会用话题和服务写简单的节点,等你对整个流程有感觉了,再深入底层原理。我在带团队时一直强调「先会用,再理解」——这样学习曲线最平滑。
好了,这一章的内容就到这里。ROS 2的核心概念和选型对比,说白了就是一句话:用ROS 2,省心省力,生态好,坑少。下一章咱们会动手搭建开发环境,到时候你就能真正跑起来第一个ROS 2节点了。