2. 基础环境搭建
各位同学,大家好。我是你们这门课的主讲工程师。
说实话,每次带新人入职,我最头疼的就是环境搭建这一步。明明代码逻辑都写好了,结果一跑起来全是「找不到某某库」、「版本冲突」。嗯,今天这一章,咱们就把这些坑提前填上。
2.1 Python与C++开发环境配置
自动驾驶的算法栈,说白了就是Python和C++的混合体。Python负责快速原型验证,C++负责性能落地。我个人习惯是:Python写控制逻辑原型,C++写最终部署代码。
2.1.1 Python环境
我建议你直接用Anaconda来管理Python环境。为什么?因为自动驾驶项目依赖的库太多了——numpy、scipy、matplotlib、opencv-python、shapely……你想想看,如果每个项目都装到系统Python里,迟早乱成一锅粥。
我的推荐配置:
- Python 3.8 或 3.10(3.8最稳,3.10兼容性更好)
- conda create -n autodrive python=3.8
- pip install numpy scipy matplotlib opencv-python shapely
我曾经在项目里吃过一次亏:用Python 3.11跑一个老版本的轨迹优化库,结果底层C扩展编译不过去。折腾了两天才发现是Python版本太高。从那以后,我所有新项目都先用Python 3.8打底。
2.1.2 C++环境
C++这边,我推荐用CMake + GCC/G++这套组合。Ubuntu 20.04自带GCC 9,够用。如果你要跑一些最新的C++17/20特性,可以手动装GCC 11。
一个小技巧:
装完GCC后,记得检查一下版本:gcc --version。如果系统里装了多个版本,用update-alternatives来切换默认版本。我在调试一个老项目时,就因为GCC版本太高导致ABI不兼容,链接阶段报了一堆莫名其妙的错误。
另外,Eigen库是必装的——做矩阵运算、坐标变换都离不开它。安装很简单:sudo apt install libeigen3-dev。
2.2 ROS/ROS2安装与基础
ROS(Robot Operating System)在自动驾驶圈子里,几乎是事实上的标准通信框架。你想想看,一个自动驾驶系统里,感知模块、定位模块、规划模块、控制模块,它们之间怎么交换数据?总不能每个模块都自己写一套Socket通信吧?ROS就是来解决这个问题的。
2.2.1 ROS1还是ROS2?
这个问题我经常被问到。我的建议是:学ROS2,但也要懂ROS1。
| 对比项 | ROS1 (Noetic) | ROS2 (Foxy/Humble) |
|---|---|---|
| 通信机制 | 基于TCPROS/UDPROS | 基于DDS(数据分发服务) |
| 实时性 | 不支持 | 支持(通过DDS配置) |
| 多机通信 | 需要配置ROS_MASTER_URI | 天然支持,去中心化 |
| 生命周期 | 2025年停止维护 | 活跃维护中 |
我个人习惯是:新项目用ROS2,但读老代码时得懂ROS1。毕竟很多经典的规划控制算法库(比如teb_local_planner)还是基于ROS1写的。
2.2.2 ROS2安装(以Humble为例)
安装过程其实不复杂,但有几个坑要注意。
# 1. 设置locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
# 2. 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
# 3. 安装ROS2 Humble
sudo apt install ros-humble-desktop
# 4. 设置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意:
安装完成后,一定要测试一下:ros2 run demo_nodes_cpp talker。如果报错说找不到节点,八成是环境变量没生效。我曾经帮一个同事排查了半天,最后发现他忘了source setup.bash……
2.2.3 ROS2核心概念速览
ROS2里最重要的三个概念:节点(Node)、话题(Topic)、服务(Service)。
- 节点:一个可执行程序,负责某个具体功能。比如一个节点负责路径规划,另一个节点负责速度控制。
- 话题:节点之间通信的「总线」。一个节点发布消息到话题,其他节点订阅这个话题就能收到消息。说白了就是发布-订阅模式。
- 服务:请求-响应模式。适合那种「你问我答」的场景,比如请求一个路径规划结果。
举个例子:
# 发布者节点(模拟车辆位置)
ros2 topic pub /vehicle_pose geometry_msgs/msg/PoseStamped "{header: {frame_id: 'map'}, pose: {position: {x: 1.0, y: 2.0}}}"
# 订阅者节点(接收位置信息)
ros2 topic echo /vehicle_pose
你看,就这么几行命令,两个节点之间就通信起来了。这就是ROS的魅力——你不用关心底层Socket怎么建、数据怎么序列化,只管定义好消息格式就行。
2.3 常用仿真工具介绍
仿真在自动驾驶开发里有多重要?我这么说吧:没有仿真,你根本不敢把代码刷到实车上。我在项目里见过太多「仿真跑得好好的,一上车就翻车」的案例了。
2.3.1 轻量级仿真:Matlab/Simulink + Carsim
如果你主要做控制算法验证,Matlab/Simulink + Carsim这套组合非常高效。Simulink里搭一个PID控制器,Carsim提供车辆动力学模型,几分钟就能跑一个闭环仿真。
但缺点也很明显:贵。一套Carsim license好几万,而且没法做复杂的场景交互。
2.3.2 开源首选:CARLA + ROS2
CARLA是目前最流行的开源自动驾驶仿真器。它基于Unreal Engine,画面逼真,而且原生支持ROS2接口。
CARLA + ROS2的典型工作流:
- CARLA启动仿真世界,生成车辆和行人
- 通过ROS2 bridge,把CARLA里的传感器数据(相机、激光雷达、GPS)发布到ROS2话题
- 你的规划控制节点订阅这些话题,计算控制指令
- 控制指令通过ROS2 bridge发回CARLA,驱动虚拟车辆
我曾经用这套流程验证过一个Lattice Planner算法。在CARLA里跑了上千个随机场景,发现了一个在特定曲率下路径不连续的bug。要是直接上车测试,轻则颠簸,重则冲出车道。
2.3.3 轻量级替代:Webots / Gazebo
如果你的电脑配置不够跑CARLA(它确实吃显卡),可以考虑Webots或Gazebo。它们更轻量,但物理引擎和传感器仿真精度也够用。
我个人习惯是:算法原型验证用Webots,系统集成测试用CARLA。Webots启动快,改代码-跑仿真-看结果的循环非常快;CARLA场景丰富,适合做回归测试。
2.4 本章知识体系总览
下面这张图,是我自己整理的本章知识结构。你可以把它当作一个「地图」,学完本章后对照着检查一下,看看哪些地方还没掌握。
我的个人建议:
别急着把所有工具都装一遍。先装Python和ROS2,跑通一个最简单的「发布-订阅」例子。然后装CARLA,让车在仿真里动起来。每一步都验证通过,再往下走。我曾经见过有人一口气装了三天环境,结果一个都没跑通,心态直接崩了。
好了,这一章的内容就到这里。环境搭建是枯燥的,但也是最重要的基础。把这一步走扎实了,后面学规划控制算法的时候,你会感谢现在的自己。
可可精品资料库