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的典型工作流:

  1. CARLA启动仿真世界,生成车辆和行人
  2. 通过ROS2 bridge,把CARLA里的传感器数据(相机、激光雷达、GPS)发布到ROS2话题
  3. 你的规划控制节点订阅这些话题,计算控制指令
  4. 控制指令通过ROS2 bridge发回CARLA,驱动虚拟车辆

我曾经用这套流程验证过一个Lattice Planner算法。在CARLA里跑了上千个随机场景,发现了一个在特定曲率下路径不连续的bug。要是直接上车测试,轻则颠簸,重则冲出车道。

2.3.3 轻量级替代:Webots / Gazebo

如果你的电脑配置不够跑CARLA(它确实吃显卡),可以考虑Webots或Gazebo。它们更轻量,但物理引擎和传感器仿真精度也够用。

我个人习惯是:算法原型验证用Webots,系统集成测试用CARLA。Webots启动快,改代码-跑仿真-看结果的循环非常快;CARLA场景丰富,适合做回归测试。

2.4 本章知识体系总览

下面这张图,是我自己整理的本章知识结构。你可以把它当作一个「地图」,学完本章后对照着检查一下,看看哪些地方还没掌握。

第二章:基础环境搭建知识体系 Python & C++ 环境 • Python 3.8/3.10 + Anaconda • 核心库:numpy, scipy, matplotlib, opencv • C++:CMake + GCC/G++ • Eigen库(矩阵运算) • 版本管理:update-alternatives ROS/ROS2 通信框架 • ROS1 vs ROS2 对比 • ROS2 Humble 安装 • 核心概念:节点/话题/服务 • 发布-订阅模式 • 请求-响应模式 • 环境变量与source 常用仿真工具 • 轻量级:Matlab+Simulink • 开源首选:CARLA+ROS2 • 轻量替代:Webots/Gazebo • 场景生成与传感器仿真 • 闭环仿真验证流程 核心目标:搭建一套可用的「代码编写 → 通信调试 → 仿真验证」闭环环境

我的个人建议:

别急着把所有工具都装一遍。先装Python和ROS2,跑通一个最简单的「发布-订阅」例子。然后装CARLA,让车在仿真里动起来。每一步都验证通过,再往下走。我曾经见过有人一口气装了三天环境,结果一个都没跑通,心态直接崩了。

好了,这一章的内容就到这里。环境搭建是枯燥的,但也是最重要的基础。把这一步走扎实了,后面学规划控制算法的时候,你会感谢现在的自己。

可可精品资料库