1. 课程导论与预备知识

大家好,我是你们这门课的主讲。在自动驾驶这行摸爬滚打了快十年,从最早的激光雷达点云拼接,到后来做多传感器融合定位,再到用 ROS2 重构整个控制链路,踩过的坑确实不少。今天咱们开始第一讲,先把地基打牢。

说白了,自动驾驶不是玄学,它是一套严谨的工程系统。你想想看,一辆车要在路上跑,得先知道「我在哪」(定位),然后决定「要去哪」(规划),最后控制「怎么去」(控制)。这三件事环环相扣,而 ROS2 就是把这些环节串起来的「通信总线」。

1.1 自动驾驶分级标准

先聊聊分级。很多人觉得 L2 和 L3 就差一个字母,其实差得远了去了。我当年刚入行时,也以为 L3 就是 L2 加个自动变道,结果第一次在高速上测试 L3 系统,差点因为系统降级不及时出事——嗯,从那以后我对分级有了刻骨铭心的理解。

目前行业公认的是 SAE J3016 标准,从 L0 到 L5:

等级 名称 核心特征 典型场景
L0 无自动化 人类全权驾驶 传统手动挡车
L1 驾驶辅助 单一功能辅助(如定速巡航) 高速巡航
L2 部分自动化 同时控制转向+加减速 车道居中+ACC
L3 有条件自动化 系统全权驾驶,但需人类接管 高速领航
L4 高度自动化 限定区域内无需人类干预 Robotaxi 园区
L5 完全自动化 全场景、全工况 任何道路

关键点:L3 是个分水岭。L2 出事故责任在驾驶员,L3 出事故责任在系统。所以很多车厂直接跳过 L3 做 L2+,或者直接冲 L4。我个人建议,做工程时别纠结于「我这是 L 几」,而是关注「ODD(运行设计域)是什么」——这才是真正决定系统边界的东西。

1.2 ROS2 核心概念

ROS2 不是 ROS1 的简单升级。我最早用 ROS1 做项目时,最头疼的就是节点挂了整个系统就崩,而且实时性完全没法保证。ROS2 用 DDS 做底层通信,说白了就是给每个节点配了个「独立对讲机」,而不是 ROS1 那种「总机转接」模式。

四个核心概念,我一个个说:

节点(Node)

节点就是 ROS2 里的最小执行单元。你可以把它理解成一个「独立的小程序」。每个节点只干一件事,比如「激光雷达驱动节点」只管发点云,「定位节点」只管算位置。我在项目中遇到过最典型的错误,就是有人把定位、规划、控制全写在一个节点里——调试时改一行代码要重启整个系统,太痛苦了。

话题(Topic)

话题是异步通信的通道。发布者往话题里扔数据,订阅者从话题里拿数据。比如定位节点发布 /odometry 话题,控制节点订阅它。这里有个坑:话题的数据类型必须匹配。我曾经因为把 nav_msgs/Odometry 和 geometry_msgs/PoseStamped 搞混,定位数据一直对不上,查了整整两天。

服务(Service)

服务是同步通信,一问一答。比如「请给我当前地图」——请求发出去,必须等到响应回来才能继续。适合那些需要确认的场景,比如启动某个传感器。

动作(Action)

动作是服务的升级版。它支持「长时间任务 + 中途反馈」。比如「导航到 B 点」,你可以一边执行一边汇报「已走 30%」「已走 60%」。这在自动驾驶里太常用了——规划路径、执行变道,都需要这种机制。

我的习惯:高频数据用话题(比如定位 100Hz),低频确认用服务(比如启动传感器),长时间任务用动作(比如路径规划)。别混用,否则系统会变得很难调试。

1.3 开发环境搭建与验证

环境搭建这块,我建议直接用 Ubuntu 22.04 + ROS2 Humble。为什么选 Humble?因为它是 LTS 版本,稳定,而且社区支持好。我之前用 Rolling 版本踩过坑——今天装的包,明天 API 就变了,太折腾。

安装步骤其实很简单,但有几个细节要注意:

  1. 设置 locale:确保系统支持 UTF-8,否则中文路径会出问题
  2. 添加 ROS2 源:别用 apt 默认源,版本太旧
  3. 安装桌面版:ros-humble-desktop 包含了所有常用工具
  4. 配置环境变量:每次开终端都要 source,建议写到 .bashrc 里

装完之后怎么验证?我一般跑两个命令:

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

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

如果能看到 talker 在发「Hello World」,listener 在收,说明环境没问题。嗯,这里要注意:如果收不到消息,八成是 DDS 配置问题。检查一下 ROS_DOMAIN_ID 是不是一致,或者防火墙有没有关。

避坑指南:我曾经在一台新电脑上装完 ROS2,怎么都跑不通 talker-listener。查了半天,发现是虚拟机网络设置成了 NAT 模式,DDS 的组播通信被挡住了。改成桥接模式,瞬间就好了。所以如果你用虚拟机,记得检查网络模式。

知识体系总览

下面这张图,是我自己梳理的本章知识结构。你可以把它当成一张「地图」,后面每讲一个知识点,都能在这张图上找到位置:

第1章:课程导论与预备知识 自动驾驶分级 • L0:无自动化 • L1:驾驶辅助 • L2:部分自动化 • L3:有条件自动化 • L4:高度自动化 • L5:完全自动化 核心:ODD 决定等级 ROS2 核心概念 • 节点:最小执行单元 • 话题:异步通信 • 服务:同步通信 • 动作:长任务+反馈 高频→话题 低频→服务 长任务→动作 环境搭建与验证 • Ubuntu 22.04 • ROS2 Humble • 设置 locale • 添加 ROS2 源 • 安装桌面版 • 配置环境变量 验证:talker-listener 三者关系:分级定义目标 → ROS2 提供工具 → 环境支撑实现

这张图把本章三个核心模块串起来了。你想想看,自动驾驶分级告诉我们「要做什么」,ROS2 核心概念告诉我们「用什么做」,环境搭建告诉我们「在哪做」。三者缺一不可。

好,第一讲就到这里。内容不多,但都是后面实战的基础。尤其是 ROS2 的四个通信方式,后面每一章都会用到。如果你在搭建环境时遇到问题,别急——大概率是 DDS 网络配置或者 locale 设置的问题,翻回去看看避坑指南。

可可精品资料库