第一课:课程导论与环境搭建
1.1 规划控制模块在自动驾驶中的角色
说实话,很多人一上来就问我:“规划控制到底干点啥?”
我习惯这么解释:如果把自动驾驶汽车比作一个人,那感知模块是眼睛和耳朵,定位模块是大脑里的地图,而规划控制就是手和脚。眼睛看到了障碍物,大脑知道自己在哪,但最终能不能安全地开过去,全靠规划控制。
规划控制模块内部又分三层:
- 全局规划(Route Planning):从A点到B点的宏观路径。说白了就是导航,告诉你走哪条路、哪个路口转弯。
- 行为规划(Behavior Planning):决定“下一步该干什么”。是跟车?是变道?还是停车让行?我在项目中见过最头疼的就是这里——行为决策一旦出错,后面的控制再精准也没用。
- 运动规划(Motion Planning):生成具体的轨迹。包括路径(去哪里)和速度(多快去)。嗯,这里要特别注意,轨迹不仅要平滑,还得满足车辆的运动学约束。
- 控制(Control):把规划好的轨迹变成油门、刹车、方向盘的实际指令。我常用的就是PID和MPC,后面会详细讲。
核心观点:规划控制是自动驾驶的“最后一公里”。感知再准、定位再精,如果规划控制拉胯,车照样开不了。
1.2 联合调试的意义
你想想看,每个模块单独跑都没问题,一合起来就崩。这种事我遇到过太多次了。
为什么会这样?因为模块之间有接口依赖和时序耦合。比如:
- 规划模块需要感知模块的障碍物列表,但感知延迟了200ms,规划还在用旧数据——结果就是轨迹跟障碍物“撞上了”。
- 控制模块收到的轨迹频率是20Hz,但控制指令输出频率是50Hz——中间差了30次插值,处理不好车就会抖。
联合调试的意义就在于:提前暴露这些接口和时序问题。我曾经在一个项目里,单模块测试跑了两个月,一联调就发现规划输出的坐标系跟控制模块用的坐标系差了90度。嗯,这种低级错误,单测根本发现不了。
我的建议:不要等到所有模块都开发完了再联调。每完成一个子模块,就尽早跟上下游做一次“小联调”。哪怕只是发个假数据,也能提前踩坑。
1.3 ROS2与仿真环境搭建
工欲善其事,必先利其器。我们这门课主要用ROS2(Humble版本) + Carla模拟器 + Autoware(基于ROS2的版本)。
为什么选这套组合?
- ROS2:相比ROS1,它解决了实时性、多机通信、安全性等问题。说白了,ROS1是玩具,ROS2才是能上车的。
- Carla:开源模拟器里最成熟的之一。支持传感器仿真、天气变化、交通流。我习惯用它来做感知和规划的联合测试。
- Autoware:开源的自动驾驶软件栈。它把感知、规划、控制都集成好了,我们可以直接拿它的规划模块来改,省去从零造轮子的时间。
环境搭建步骤(快速版)
- 安装ROS2 Humble:按照官方文档走,注意选Ubuntu 22.04。我踩过的坑:一定要先装好依赖库,否则编译到一半报错很烦人。
- 安装Carla:下载预编译包即可。记得把Python API路径加到环境变量里。
- 安装Autoware:用vcs工具拉取所有依赖包。编译时间比较长,建议用ccache加速。
- 验证联调:启动Carla服务端,再启动Autoware的规划模块,看能否收到Carla发来的车辆状态信息。
注意:ROS2的DDS配置可能会跟Carla的通信冲突。我曾经遇到过话题收不到的问题,最后发现是DDS的Domain ID没设置一致。解决办法:在启动脚本里显式设置ROS_DOMAIN_ID环境变量。
知识体系结构图
下面这张图展示了本章的核心逻辑:从感知到控制的完整链路,以及联合调试的切入点。
1.4 环境验证与常见问题
搭建完环境后,我建议你跑一个最简单的测试:让Carla里的一辆车直行,同时用Autoware的规划模块订阅它的位置信息。
验证步骤:
- 启动Carla服务端:
./CarlaUE4.sh - 启动Autoware的规划模块:
ros2 launch autoware_launch planning_simulator.launch.xml - 用
ros2 topic list查看是否有/carla/ego_vehicle/vehicle_status和/planning/trajectory话题 - 用
ros2 topic echo /planning/trajectory查看轨迹数据是否正常输出
常见问题速查表:
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| Carla启动后黑屏 | 显卡驱动或Vulkan未安装 | 安装NVIDIA驱动,并验证vulkaninfo命令可用 |
| ROS2收不到Carla话题 | DDS Domain ID不一致 | 在启动脚本中设置export ROS_DOMAIN_ID=0 |
| Autoware编译报错 | 依赖包版本不匹配 | 使用vcs工具重新拉取依赖,确保所有包版本与Humble兼容 |
| 规划轨迹不更新 | Carla时间步长与ROS2时间不同步 | 设置Carla的fixed_delta_seconds为0.05(20Hz) |
避坑指南:我曾经在搭建环境时,因为Carla和Autoware用了不同版本的Boost库,导致编译通过但运行时崩溃。后来我统一用系统包管理器安装所有依赖,再也没出过类似问题。嗯,有时候“偷懒”用系统包反而更稳。
好了,环境搭好之后,下一章我们就要开始真正动手了——从最简单的直行控制开始,一步步把规划控制模块跑起来。