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点
- 机械臂抓取一个物体
- 无人机飞到指定高度
动作有三个特点:
- 目标(Goal):告诉机器人要做什么
- 反馈(Feedback):执行过程中不断报告进度
- 结果(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节点。到时候你会发现——原来这么简单!