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 知识体系总览 应用层 导航(Nav2) | 建图(SLAM) | 机械臂控制(MoveIt2) | 感知(Vision) 通信层 话题(Topic) | 服务(Service) | 动作(Action) | 参数(Parameter) 底层:DDS(Data Distribution Service) 中间件层 rcl(ROS Client Library) | rclcpp(C++) | rclpy(Python) 系统层 Linux(Ubuntu) | 实时内核 | 硬件驱动 | 嵌入式系统 自顶向下

从这张图你能看到,ROS 2是一个分层架构。上层应用(比如导航)依赖通信层提供的接口,通信层又依赖底层的DDS和操作系统。每一层各司其职,这也是ROS 2能保持灵活性和稳定性的原因。

我的建议:初学者不要一上来就扎进底层DDS的细节里。先学会用话题和服务写简单的节点,等你对整个流程有感觉了,再深入底层原理。我在带团队时一直强调「先会用,再理解」——这样学习曲线最平滑。

好了,这一章的内容就到这里。ROS 2的核心概念和选型对比,说白了就是一句话:用ROS 2,省心省力,生态好,坑少。下一章咱们会动手搭建开发环境,到时候你就能真正跑起来第一个ROS 2节点了。