1. ROS2概述与生态:ROS2的起源、对比ROS1的优势、核心概念、发行版与安装

1.1 ROS2的起源:为什么要有ROS2?

说起ROS2的起源,得先聊聊ROS1的「历史包袱」。ROS1诞生于2007年,那时候机器人还比较简单,主要跑在PC上。我2015年刚入行时,用的就是ROS1 Indigo版本。说实话,当时觉得这东西真方便——写个话题发布,订阅一下,机器人就能动起来。

但问题很快就来了。ROS1的设计有个致命缺陷:它依赖一个叫「roscore」的中心节点。你想想看,如果这个节点挂了,整个系统就瘫痪了。我在一个工厂项目里就遇到过——机器人跑到一半,roscore莫名其妙崩溃,结果机械臂停在半空中,吓得我一身冷汗。

另外,ROS1对实时性支持很差。它基于TCP/UDP通信,延迟不稳定。做工业控制时,这简直是灾难。还有跨平台问题——ROS1基本只能跑在Linux上,Windows和macOS支持很弱。

所以2015年左右,Open Robotics团队开始酝酿ROS2。他们吸取了ROS1的教训,决定从底层重写。嗯,说白了就是:ROS1的架构已经跟不上时代了,必须推倒重来。

1.2 ROS2对比ROS1:到底强在哪?

我经常被学生问:「老师,ROS2比ROS1好在哪里?」我一般会列个表给他们看:

对比维度 ROS1 ROS2
通信架构 依赖roscore中心节点 去中心化,基于DDS
实时性 不支持实时调度 支持实时操作系统(RTOS)
跨平台 主要支持Linux 支持Linux、Windows、macOS、RTOS
安全性 无加密机制 支持DDS安全(加密、认证)
多机器人 单机为主,多机复杂 原生支持分布式系统
生命周期 节点管理简单 有节点生命周期管理

我个人觉得,最大的变化是去掉了roscore。ROS2用DDS(数据分发服务)作为底层通信,每个节点都是对等的。这意味着:一个节点挂了,其他节点还能正常工作。我在一个多机器人协同项目里测试过——故意杀掉一个导航节点,其他机器人照常运行,系统没有崩溃。

还有一个细节:ROS2的QoS(服务质量)策略。你可以控制消息的可靠性、持久性、延迟等。比如,传感器数据可以设置成「尽力传输」,控制指令设置成「可靠传输」。这在ROS1里是做不到的。

核心结论:ROS2不是ROS1的升级版,而是完全重写的下一代框架。如果你现在开始学,我建议直接学ROS2。ROS1已经进入维护模式,不会再有大更新了。

1.3 核心概念:节点、话题、服务、动作

这四个概念是ROS2的基石。我刚开始学的时候,花了整整一周才搞明白它们的关系。其实说白了,它们就是机器人程序之间通信的四种方式。

1.3.1 节点(Node)

节点就是ROS2里的一个进程。每个节点负责一个具体的功能,比如:

  • 一个节点控制电机
  • 一个节点处理激光雷达数据
  • 一个节点做路径规划

我习惯把节点想象成「乐高积木」。每个积木做一件事,拼在一起就成了完整的机器人系统。创建节点很简单:

import rclpy
from rclpy.node import Node

class MyNode(Node):
    def __init__(self):
        super().__init__('my_node')
        self.get_logger().info('节点已启动!')

def main(args=None):
    rclpy.init(args=args)
    node = MyNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

1.3.2 话题(Topic)

话题是ROS2里最常用的通信方式。它是一种「发布-订阅」模式:一个节点发布消息,其他节点订阅这个消息。就像电台广播——主播说话,听众收听。

举个例子,激光雷达节点会发布一个叫/scan的话题,里面包含距离数据。导航节点订阅这个/scan话题,就能获取环境信息。

我的经验:话题适合「持续流式」的数据,比如传感器数据、图像、点云。不适合「一次性请求-响应」的场景。

1.3.3 服务(Service)

服务是「请求-响应」模式。客户端发送请求,服务端处理并返回结果。这就像打电话——你问一句,对方答一句。

比如,你写一个服务,让机器人抓取某个物体。客户端发送「抓取物体A」的请求,服务端执行后返回「成功」或「失败」。

# 服务端示例
from example_interfaces.srv import AddTwoInts

class AddService(Node):
    def __init__(self):
        super().__init__('add_service')
        self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_callback)

    def add_callback(self, request, response):
        response.sum = request.a + request.b
        self.get_logger().info(f'收到请求: {request.a} + {request.b} = {response.sum}')
        return response

1.3.4 动作(Action)

动作是ROS2里最复杂的通信方式。它适合「长时间执行」的任务,比如:

  • 机器人从A点走到B点
  • 机械臂抓取一个物体
  • 无人机飞到指定高度

动作有三个特点:

  1. 目标(Goal):告诉机器人要做什么
  2. 反馈(Feedback):执行过程中不断报告进度
  3. 结果(Result):最终执行结果

我曾经做过一个仓储机器人项目,用动作来控制机器人搬运货物。客户端发送目标位置,机器人一边走一边反馈当前位置,到达后返回「搬运完成」。这种场景用话题或服务都不合适——话题没有反馈机制,服务不能中途取消。

注意:动作是基于话题和服务实现的,但封装了更高级的接口。初学者可以先掌握话题和服务,再学动作。

1.4 ROS2的发行版与安装

ROS2的发行版命名很有意思——全是用动物名字,按字母顺序排列。目前主流版本有:

发行版 发布时间 支持状态 推荐用途
Foxy Fitzroy 2020年6月 已停止维护 不推荐新项目使用
Galactic Geochelone 2021年5月 已停止维护 不推荐新项目使用
Humble Hawksbill 2022年5月 活跃维护(LTS) 推荐用于稳定项目
Iron Irwini 2023年5月 活跃维护 推荐用于新项目
Jazzy Jalisco 2024年5月 最新版 尝鲜用户

我个人建议:如果是做产品,选Humble(LTS版本,支持到2027年)。如果是学习,选Iron或Jazzy,功能最新。

1.4.1 安装ROS2(以Ubuntu 22.04 + Humble为例)

安装过程其实很简单,但有几个坑要注意。我曾经帮一个学生远程调试,他卡在安装步骤整整两天——最后发现是源没配好。

第一步:设置软件源

sudo apt update
sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

第二步:安装ROS2

sudo apt update
sudo apt install ros-humble-desktop

这里有个选择:ros-humble-desktop包含所有常用工具和库,大概2GB。如果你空间有限,可以装ros-humble-ros-base,只有核心功能。

第三步:配置环境变量

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

避坑指南:我曾经遇到过一个问题——每次打开新终端都要手动source。后来发现是.bashrc文件里写错了路径。记得检查一下/opt/ros/humble/setup.bash是否存在。

第四步:验证安装

ros2 run demo_nodes_cpp talker

如果看到类似「Publishing: 'Hello World'」的消息,说明安装成功了。

1.4.2 安装后的必备工具

装完ROS2后,我建议再装几个工具:

  • colcon:编译工具,替代ROS1的catkin
  • rviz2:可视化工具,看机器人模型、传感器数据
  • gazebo:仿真环境,测试算法

安装命令:

sudo apt install python3-colcon-common-extensions
sudo apt install ros-humble-rviz2
sudo apt install ros-humble-gazebo-ros-pkgs

1.5 本章小结

这一章我们聊了ROS2的起源、对比ROS1的优势、四个核心概念,以及如何安装。嗯,内容不少,但都是基础中的基础。

我个人觉得,学ROS2最重要的是理解「节点通信」的思想。你不需要一开始就记住所有API,先搞懂话题、服务、动作分别用在什么场景。后面写代码时,自然就熟练了。

下一章,我们会动手写第一个ROS2节点。到时候你会发现——原来这么简单!