第三章:软件环境配置:Ubuntu系统安装与优化、ROS/ROS2环境搭建、CUDA/cuDNN深度学习环境配置
说实话,搞自动驾驶系统集成,第一步不是写代码,而是把“厨房”收拾利索。软件环境配不好,后面全是坑。我见过太多团队,算法写得漂亮,结果一部署到实车上,驱动冲突、库版本不对,直接翻车。这一章,咱们就把地基打牢。
3.1 Ubuntu系统安装与优化
我个人习惯用Ubuntu 20.04 LTS作为主力系统。为什么?因为ROS1的Noetic版本和ROS2的Foxy版本都完美支持它,而且NVIDIA的驱动支持也最稳定。你想想看,要是装个最新版Ubuntu 22.04,虽然新潮,但很多工业级传感器驱动还没适配,那不是给自己找麻烦吗?
3.1.1 系统安装要点
安装时,我建议你注意以下几点:
- 分区方案:至少分三个区——
/(根目录)给50GB,/home给剩余空间,swap给内存大小即可。我在项目中遇到过有人不分/home,结果系统重装时所有数据全丢了,那叫一个惨。 - 软件源选择:安装时选“中国”地区,系统会自动配置阿里云或清华镜像源。如果没选对,后面
apt update能慢到你怀疑人生。 - 磁盘加密:实车调试时,车辆可能被多人接触。我建议对
/home分区启用LUKS加密。虽然每次开机要输密码,但数据安全比那几秒钟重要得多。
sudo apt update && sudo apt upgrade -y。然后安装 ubuntu-restricted-extras 包,里面包含了MP3解码、Flash插件等常用组件。别问我为什么知道——有一次在客户现场演示,车载系统播不了测试音频,场面一度非常尴尬。
3.1.2 系统优化三板斧
系统装好了,还得调优。我总结了三步:
- 关闭不必要的服务:
sudo systemctl disable bluetooth.service(车载一般用CAN总线,蓝牙用不上)。sudo systemctl disable cups.service(打印服务?自动驾驶车上哪来的打印机)。 - 调整内核参数:在
/etc/sysctl.conf里加上这几行:
# 提高网络缓冲区,处理激光雷达点云数据
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
# 降低swappiness,减少SSD磨损
vm.swappiness = 10
- 安装实时内核(可选):如果你要做底层控制,比如线控底盘驱动,我强烈建议装
linux-image-rt。普通内核的调度延迟可能达到几十毫秒,而实时内核能控制在1毫秒以内。嗯,这里要注意:实时内核会牺牲一点吞吐量,但控制系统的确定性更重要。
3.2 ROS/ROS2环境搭建
ROS(机器人操作系统)在自动驾驶圈子里,就像瑞士军刀——不一定最好用,但大家都用。我个人更推荐新项目直接上ROS2,原因很简单:ROS1的通信机制是中心化的,一旦roscore挂了,整个系统就瘫痪了。ROS2用的是DDS,去中心化,每个节点都能独立运行。
3.2.1 ROS1 Noetic安装
如果你要维护老项目,或者用一些只支持ROS1的传感器驱动,那还是得装ROS1。安装命令很简单:
# 设置软件源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
# 安装完整版(包含rviz、gazebo等)
sudo apt update
sudo apt install ros-noetic-desktop-full -y
# 初始化rosdep
sudo rosdep init
rosdep update
# 设置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
rosdep init这一步经常因为网络问题失败。我建议你手动下载rosdep的配置文件,或者用代理。实在不行,可以跳过rosdep,手动安装依赖包。虽然麻烦点,但能保证环境可用。
3.2.2 ROS2 Foxy安装
ROS2的安装比ROS1更规范一些。我推荐用Foxy版本,它和Ubuntu 20.04是官方配对:
# 设置locale(ROS2要求UTF-8)
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
# 添加ROS2源
sudo apt update && sudo apt install curl gnupg2 lsb-release
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
# 安装桌面版
sudo apt update
sudo apt install ros-foxy-desktop -y
# 设置环境变量
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
安装完成后,你可以用ros2 run demo_nodes_cpp talker和ros2 run demo_nodes_py listener测试一下。如果能看到节点在通信,那就说明环境搭好了。
3.2.3 工作空间创建
不管是ROS1还是ROS2,我都建议用colcon来构建工作空间。它比catkin_make快得多,而且支持并行编译:
# 安装colcon
sudo apt install python3-colcon-common-extensions
# 创建工作空间
mkdir -p ~/autoware_ws/src
cd ~/autoware_ws
colcon build --symlink-install
这里有个细节:--symlink-install参数会创建符号链接,这样你修改Python脚本后不需要重新编译。我在调试感知算法时,经常改几行代码就测试一下,这个参数帮我省了不少时间。
3.3 CUDA/cuDNN深度学习环境配置
自动驾驶离不开深度学习——目标检测、语义分割、路径规划,哪个环节都得用GPU。我建议你装CUDA 11.3搭配cuDNN 8.2,这个组合对TensorFlow 2.8和PyTorch 1.10的支持最好。
3.3.1 安装NVIDIA驱动
首先,你得知道自己的显卡型号。用lspci | grep -i nvidia查看。如果是Jetson系列,那驱动是定制的,不能通用。如果是桌面级显卡(比如RTX 3090),我推荐用nvidia-driver-470:
# 添加显卡驱动PPA
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
# 查看推荐版本
ubuntu-drivers devices
# 安装推荐驱动
sudo apt install nvidia-driver-470 -y
# 重启
sudo reboot
# 验证
nvidia-smi
sudo apt purge nvidia-* 清理干净。另外,如果你用的是笔记本,记得在BIOS里把显卡模式设为“独显直连”,否则CUDA可能识别不到GPU。
3.3.2 安装CUDA Toolkit
我建议用runfile方式安装,这样你可以选择安装路径,方便管理多个版本:
# 下载CUDA 11.3 runfile
wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run
# 运行安装(注意:不要安装驱动,只装toolkit)
sudo sh cuda_11.3.0_465.19.01_linux.run --toolkit --silent --override
# 设置环境变量
echo 'export PATH=/usr/local/cuda-11.3/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# 验证
nvcc --version
你可能会问:为什么不直接用apt安装?因为apt安装的CUDA版本通常比较旧,而且不方便切换版本。我在项目中经常需要在CUDA 10.2和11.3之间切换(有些老模型只支持10.2),用runfile安装后,改个环境变量就行了。
3.3.3 安装cuDNN
cuDNN是NVIDIA的深度学习加速库。你需要去NVIDIA官网注册账号才能下载。下载后,解压并复制到CUDA目录:
# 解压
tar -xzvf cudnn-11.3-linux-x64-v8.2.1.32.tgz
# 复制文件到CUDA目录
sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.3/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64/
sudo chmod a+r /usr/local/cuda-11.3/include/cudnn*.h
sudo chmod a+r /usr/local/cuda-11.3/lib64/libcudnn*
# 验证
cat /usr/local/cuda-11.3/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
dpkg -l | grep cudnn 查看已安装的cuDNN版本。如果发现版本不对,别慌——重新下载对应版本,覆盖安装就行。另外,我建议你保留cuDNN的压缩包,因为官网下载需要登录,每次重新下载很麻烦。
3.3.4 验证深度学习环境
环境配好了,得跑个测试看看。我习惯用PyTorch来验证:
# 安装PyTorch(CUDA 11.3版本)
pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 -f https://download.pytorch.org/whl/torch_stable.html
# 测试
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"
如果输出True和你的显卡型号,那就说明环境配好了。如果输出False,嗯,别急——先检查nvidia-smi能不能看到GPU,再看nvcc --version的版本对不对。我遇到过最奇葩的问题是:PyTorch默认安装的是CPU版本,因为pip源里没有CUDA版本的包。这时候你需要指定+cu113这样的tag。
3.4 环境配置检查清单
最后,我整理了一个检查清单。每次搭建新环境时,我都会按这个列表过一遍:
| 检查项 | 命令/方法 | 预期结果 |
|---|---|---|
| Ubuntu版本 | lsb_release -a |
20.04 LTS |
| NVIDIA驱动 | nvidia-smi |
显示GPU信息 |
| CUDA版本 | nvcc --version |
11.3 |
| cuDNN版本 | cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR |
8.2 |
| ROS1环境 | roscore 启动后无报错 |
正常启动 |
| ROS2环境 | ros2 run demo_nodes_cpp talker |
正常发布消息 |
| PyTorch GPU支持 | python -c "import torch; print(torch.cuda.is_available())" |
True |
说实话,环境配置这件事,看起来琐碎,但真不能马虎。我见过太多团队,算法模型在服务器上跑得飞起,一部署到实车就各种报错。原因往往就是CUDA版本不对、ROS环境没配好。所以,花点时间把这一步做扎实,后面调试的时候你会感谢自己的。
下一章,咱们开始聊传感器驱动集成——激光雷达、摄像头、毫米波雷达,这些硬件怎么跟ROS系统对接。到时候我会分享一些我在实车调试中遇到的“血泪史”,保证让你少走弯路。