Autoware开发环境搭建实战 - 第3节
一、ROS2 到底是什么?
说实话,我第一次接触 ROS2 的时候,心里是有点抵触的。ROS1 用了好多年,顺手得很,干嘛要换?但后来在 Autoware 项目里踩了不少坑,才明白——嗯,时代变了。
ROS2 的全称是 Robot Operating System 2,但它其实不是一个真正的操作系统。它更像一个分布式通信框架,专门为机器人软件开发设计的。你可以把它理解成机器人世界的「消息总线」,各个模块通过它来收发数据。
我个人习惯把 ROS2 比作一个快递系统:节点就是快递员,话题就是运输线路,服务就是加急件。这么一想,整个架构就清晰多了。
二、ROS2 架构与核心概念
2.1 架构分层
ROS2 的架构分为三层,我画了一张图帮你快速理解:
最底层是系统层,说白了就是操作系统。中间是 DDS 中间件,这是 ROS2 和 ROS1 最大的区别所在。最上面才是我们开发者打交道的应用层。
2.2 六大核心概念
我在带团队的时候,发现新人最容易搞混的就是这几个概念。我一个个给你讲清楚:
| 概念 | 一句话解释 | 类比 |
|---|---|---|
| 节点 | 一个可执行程序的最小单元 | 快递站里的一个员工 |
| 话题 | 节点间发布/订阅的通信通道 | 快递运输线路 |
| 服务 | 请求-响应的通信方式 | 打客服电话问问题 |
| 动作 | 带反馈的长时间任务 | 叫外卖(下单→等待→送达) |
| 参数 | 节点的配置项 | 员工的工作参数 |
| 包 | 代码的组织单元 | 快递包裹 |
重点记住:话题是 ROS2 最常用的通信方式。一个节点发布数据到话题,其他节点订阅这个话题就能收到数据。这是典型的发布-订阅模式。
三、ROS2 与 ROS1 的区别
这个问题我经常被问到。说实话,ROS1 在学术圈用了十几年,积累深厚。但 ROS2 是面向产品化设计的。我挑几个关键区别说说:
3.1 通信中间件
ROS1 用自研的 TCPROS/UDPROS,ROS2 改用 DDS。这意味着什么?DDS 是工业级标准,支持实时通信、QoS 质量服务。我在做自动驾驶项目时,DDS 的可靠性机制帮了大忙——丢包自动重传,延迟可控。
3.2 去中心化
ROS1 需要 roscore 这个中心节点,一旦挂了整个系统就瘫痪。ROS2 没有中心节点,每个节点直接通过 DDS 发现彼此。你想想看,这在自动驾驶场景下有多重要——一个模块挂了,其他模块还能继续工作。
3.3 跨平台支持
ROS1 主要支持 Linux(Ubuntu)。ROS2 支持 Windows、macOS、RTOS。我记得有一次需要在嵌入式 Linux 上跑 Autoware,ROS2 的跨平台特性让我省了不少事。
3.4 实时性
ROS2 从底层就支持实时调度。ROS1 想做到实时,得自己打补丁。我曾经在 ROS1 上做过实时控制,那叫一个折腾。
| 对比项 | ROS1 | ROS2 |
|---|---|---|
| 通信中间件 | TCPROS/UDPROS | DDS |
| 中心节点 | 需要 roscore | 去中心化 |
| 实时性 | 不支持 | 原生支持 |
| 跨平台 | Linux 为主 | Linux/Windows/macOS |
| 安全性 | 无 | 支持加密和认证 |
| Python 支持 | Python 2 | Python 3 |
注意:ROS2 和 ROS1 的包不兼容。你不能直接把 ROS1 的代码复制到 ROS2 里用。迁移需要修改代码,尤其是通信相关的部分。
四、ROS2 安装与验证
4.1 安装前的准备
我建议你使用 Ubuntu 22.04 LTS,搭配 ROS2 Humble。这个组合最稳定,也是 Autoware 官方推荐的。
先确保系统是 UTF-8 编码:
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
4.2 添加 ROS2 源
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
4.3 安装 ROS2
我个人习惯安装桌面版,包含了常用的工具和可视化库:
sudo apt update
sudo apt install ros-humble-desktop
如果你空间有限,可以只装基础版:
sudo apt install ros-humble-ros-base
小技巧:安装完成后,记得把 ROS2 加到 bashrc 里,这样每次打开终端就不用手动 source 了:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
4.4 验证安装
装好了怎么知道对不对?跑个简单的例子试试:
打开第一个终端,启动一个 C++ 的发布节点:
ros2 run demo_nodes_cpp talker
打开第二个终端,启动一个 Python 的订阅节点:
ros2 run demo_nodes_py listener
如果看到 talker 在发 "Hello World",listener 在收消息,那就说明安装成功了。
验证清单:
- ros2 node list —— 查看当前所有节点
- ros2 topic list —— 查看当前所有话题
- ros2 topic echo /chatter —— 查看话题内容
- ros2 node info /talker —— 查看节点详细信息
4.5 常见问题
我曾经遇到过一个问题:安装完成后 ros2 命令找不到。后来发现是环境变量没 source。如果你也遇到类似情况,检查一下 .bashrc 里有没有 source 命令。
还有一个坑:如果你同时装了 ROS1 和 ROS2,环境变量会冲突。我建议用 Docker 隔离,或者每次只 source 一个版本。
五、写在后面
ROS2 的学习曲线确实比 ROS1 陡一些,但一旦上手,你会发现它的设计更合理。尤其是 DDS 带来的可靠性和去中心化特性,在自动驾驶这种高要求的场景下,优势非常明显。
下一节我们会动手写第一个 ROS2 节点,到时候你就知道这些概念怎么用了。
可可精品资料库