1. ROS2与自动驾驶概览

大家好,我是你们这门课的主讲。在自动驾驶这个行当摸爬滚打了快十年,从ROS1时代一路走到ROS2,踩过的坑确实不少。今天咱们先不急着写代码,把地基打牢再说。

这一章,我带你从宏观上看看自动驾驶系统到底长什么样,ROS2在这个体系里扮演什么角色。说白了,就是先搞清楚“我们在哪,要去哪”。

1.1 自动驾驶系统架构:从感知到执行的闭环

自动驾驶系统,本质上是一个“感知-决策-控制”的循环。你想想看,人开车也是这个逻辑:眼睛看路(感知),大脑判断怎么走(决策),手脚操作方向盘和油门(控制)。

在工程上,我们通常把它拆成三层:

  • 感知层:负责“看”和“理解”。包括摄像头、激光雷达、毫米波雷达、超声波雷达。输出的是障碍物位置、车道线、交通标志等信息。
  • 决策规划层:负责“想”。包括行为决策(要不要变道)、运动规划(轨迹怎么生成)。输出一条安全、平滑的路径。
  • 控制层:负责“做”。把规划好的路径转化成方向盘转角、油门开度、刹车力度。输出给线控底盘。

这里我画了一张图,帮你直观理解整个架构:

感知层 摄像头 · 激光雷达 毫米波雷达 · 超声波 输出:障碍物/车道线/标志 决策规划层 行为决策 运动规划 输出:轨迹/路径 控制层 横向控制 纵向控制 输出:方向盘/油门/刹车 反馈闭环(状态估计、控制误差) 数据流与中间件(ROS2) 节点间通信 · 数据序列化 · 时间同步 · 日志记录 TF坐标变换 · 参数服务器 · 生命周期管理 ROS2 是整个系统的“神经系统”

核心要点:ROS2 在这套架构里,扮演的是“神经系统”的角色。它负责把感知数据从传感器节点传到规划节点,再把规划结果传给控制节点。没有它,各个模块就是信息孤岛。

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

ROS2 的核心通信机制,我总结为“一节点、三模式”。咱们一个一个说。

1.2.1 节点(Node)

节点是 ROS2 中最基本的执行单元。每个节点负责一个具体的功能,比如“摄像头驱动节点”、“激光雷达处理节点”、“路径规划节点”。

我个人习惯,一个传感器对应一个节点,一个算法模块也对应一个节点。这样出了问题,定位起来特别快。我曾经在一个项目里,把所有功能写到一个节点里,结果调试时差点崩溃——改了A,B就挂了。

1.2.2 话题(Topic)

话题是 ROS2 里最常用的通信方式,属于“发布-订阅”模式。一个节点发布数据到某个话题,其他节点订阅这个话题就能收到数据。

举个例子:激光雷达节点发布 /scan 话题,感知节点订阅它来做障碍物检测。这是一种“异步、一对多”的通信,适合传感器数据这种高频、单向的数据流。

我的经验:话题的名字最好起得规范一些。比如 /sensor/lidar/points 比 /lidar_data 好得多。命名规范了,后期维护成本能降一半。

1.2.3 服务(Service)

服务是“请求-响应”模式,适合一次性的、需要确认的操作。比如“请求地图数据”、“请求保存日志”。

服务是同步的,客户端发请求后会阻塞等待响应。所以别拿它传高频数据,否则系统会卡死。

1.2.4 动作(Action)

动作是 ROS2 里最复杂的通信模式,适合“长时间执行、可反馈、可取消”的任务。比如“车辆从A点开到B点”。

动作包含三个部分:目标(Goal)、反馈(Feedback)、结果(Result)。执行过程中可以随时查询进度,也可以中途取消。

通信模式 模式 适用场景 典型例子
话题(Topic) 发布-订阅 高频、单向数据流 传感器数据、状态发布
服务(Service) 请求-响应 一次性、需确认 加载地图、保存参数
动作(Action) 目标-反馈-结果 长时间、可取消 路径跟踪、机械臂运动

1.3 ROS2与ROS1对比:为什么我们要升级?

ROS1 是前辈,功不可没。但它在工程落地时,有几个硬伤:

  • 单点故障:ROS1 依赖一个中心节点(roscore),它挂了整个系统就瘫了。我在做园区无人车时遇到过,roscore 莫名其妙崩溃,车直接停在路中间,尴尬至极。
  • 实时性差:ROS1 的通信基于 TCP,延迟不稳定,不适合控制指令这种对实时性要求高的场景。
  • 跨平台困难:ROS1 对 Windows、嵌入式系统支持很差。

ROS2 针对这些问题做了彻底重构:

  • 去中心化:基于 DDS(数据分发服务),没有中心节点,每个节点直接通信。一个节点挂了,不影响其他节点。
  • 实时性支持:DDS 提供 QoS(服务质量)配置,可以设置优先级、超时时间等,满足实时控制需求。
  • 跨平台:支持 Linux、Windows、macOS,甚至 RTOS(实时操作系统)。
  • 安全性:内置加密和认证机制,适合量产车。

注意:ROS2 不是 ROS1 的简单升级版,而是重写。很多 ROS1 的包不能直接迁移到 ROS2。不过好消息是,官方提供了 ros1_bridge 工具,可以桥接两个系统,方便过渡。

1.4 开发环境搭建:Ubuntu + ROS2 Humble

好了,理论说完了,咱们动手搭环境。我推荐使用 Ubuntu 22.04 + ROS2 Humble,这是目前最稳定的组合。

1.4.1 安装步骤

  1. 设置语言环境:确保系统支持 UTF-8。
  2. 添加 ROS2 源:把 ROS2 的 apt 源加到系统里。
  3. 安装 ROS2 Humble:推荐安装桌面版(desktop),包含常用工具和可视化库。
  4. 配置环境变量:把 ROS2 的 setup.bash 加到 .bashrc 里。

具体命令如下:

# 1. 设置 locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 2. 添加 ROS2 源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
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

# 3. 安装 ROS2 Humble
sudo apt update
sudo apt install ros-humble-desktop

# 4. 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

1.4.2 验证安装

打开两个终端,分别运行:

# 终端1:启动 talker 节点
ros2 run demo_nodes_cpp talker

# 终端2:启动 listener 节点
ros2 run demo_nodes_py listener

如果终端2能收到“Hello World”消息,说明安装成功。

避坑指南:我曾经在安装时忘了配置 locale,结果编译时一堆乱码错误。还有一次,我同时装了 ROS1 和 ROS2,环境变量冲突,导致 ros2 命令找不到。建议你只装一个版本,或者用 conda 环境隔离。

1.4.3 开发工具推荐

  • VS Code:配合 ROS 插件,代码补全、调试都很方便。
  • rviz2:ROS2 的 3D 可视化工具,看传感器数据、轨迹必备。
  • rqt:图形化调试工具,可以看话题列表、绘制曲线。
  • colcon:ROS2 的编译工具,替代了 ROS1 的 catkin。

嗯,这一章的内容就到这。环境搭好了,后面咱们才能跑代码、做联调。别急,慢慢来,基础打牢了,后面学起来才快。