3. 软件环境配置

好,咱们进入第三章。这一章,说白了就是给机器人装上“大脑”和“眼睛”。

你想想看,硬件平台搭好了,就像一个人有了身体。但身体要动起来,得靠神经系统和大脑来指挥。Ubuntu就是操作系统,ROS2是神经中枢,CUDA这些是视觉皮层。缺一个,整个系统就玩不转。

我个人习惯,在开始任何联调之前,先把这三层环境理清楚。否则后面出了问题,你根本不知道是代码写错了,还是环境没配好。我在项目中遇到过太多次,花了两天查一个bug,最后发现是CUDA版本和驱动不匹配。嗯,这种坑,踩一次就够了。

3.1 Ubuntu系统安装——打好地基

ROS2 Humble官方推荐的是Ubuntu 22.04 LTS。别问我为什么不用20.04或者24.04,Humble就是为22.04量身定做的。你非要用别的版本,也能跑,但你会遇到各种奇奇怪怪的依赖问题。我建议,老老实实装22.04。

安装过程其实不复杂,但有几个关键点要注意:

  • 分区方案:我个人习惯给根目录(/)分50GB,给/home分剩下的。如果你要存大量数据集,/home可以多分点。
  • 交换分区:如果你的内存小于16GB,建议设置交换分区,大小等于内存大小。我遇到过内存不够导致编译到一半卡死的情况,很尴尬。
  • 网络配置:安装时确保网络通畅,因为安装过程中会下载语言包和驱动。我曾经在离线环境下装系统,后来补驱动补到怀疑人生。
小技巧:安装时选择“最小安装”,可以省掉很多用不上的办公软件。后面需要什么再装什么,系统更干净。

3.2 ROS2 Humble部署——神经中枢上线

ROS2 Humble的安装,官方文档写得很清楚。但我还是想说说我自己的流程,因为官方文档有时候太啰嗦了。

首先,设置语言环境。这一步很多人会跳过,但我不建议。我曾经因为语言环境没设对,导致ROS2的某些节点启动时报编码错误,查了半天才发现是locale的问题。

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
export LANG=en_US.UTF-8

然后,添加ROS2的软件源。这里要注意,ROS2的源和ROS1的源是分开的,别搞混了。

sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
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

接下来,安装ROS2 Humble。我建议安装桌面版(desktop),因为包含了常用的工具和可视化库。如果你硬盘空间紧张,可以只装基础版(ros-base)。

sudo apt install ros-humble-desktop

安装完成后,别忘了设置环境变量。我个人习惯把它写到.bashrc里,这样每次打开终端就不用重新source了。

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意:如果你同时装了ROS1和ROS2,环境变量会有冲突。我建议用别名或者单独的工作空间脚本来管理,避免source混乱。

验证安装是否成功,可以跑一个简单的talker-listener测试:

# 终端1
ros2 run demo_nodes_cpp talker

# 终端2
ros2 run demo_nodes_py listener

如果能看到“I heard: Hello World”之类的输出,说明ROS2已经跑起来了。

3.3 CUDA/cuDNN/TensorRT环境搭建——给机器装上“视觉皮层”

这部分是感知联调的核心。没有CUDA,你的深度学习模型跑在CPU上,那速度……嗯,你懂的。

3.3.1 安装NVIDIA驱动

在装CUDA之前,必须先装NVIDIA驱动。我建议用官方的.run文件安装,或者用Ubuntu的“附加驱动”工具。我个人更倾向于用.run文件,因为版本控制更灵活。

先查看你的显卡型号和推荐驱动版本:

ubuntu-drivers devices

然后安装推荐版本:

sudo apt install nvidia-driver-535  # 具体版本号根据推荐来

安装完成后,重启系统,用nvidia-smi命令验证。如果能看到显卡信息,说明驱动装好了。

避坑指南:我曾经在安装驱动时,因为nouveau开源驱动没有禁用,导致安装失败。正确的做法是在安装前先禁用nouveau:
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nvidia-nouveau.conf
然后重启,再安装NVIDIA驱动。

3.3.2 安装CUDA

ROS2 Humble对CUDA版本没有硬性要求,但TensorRT对CUDA版本有要求。我建议安装CUDA 11.8或12.1,这两个版本对TensorRT 8.x和9.x支持都很好。

从NVIDIA官网下载.run文件,或者用deb包安装。我习惯用deb包,因为卸载方便。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt update
sudo apt install cuda-11-8  # 或者 cuda-12-1

安装完成后,设置环境变量:

echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

验证CUDA是否安装成功:

nvcc --version

3.3.3 安装cuDNN

cuDNN是深度神经网络的加速库。安装cuDNN需要先注册NVIDIA开发者账号,然后下载对应的deb包。

下载完成后,安装:

sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb
sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
sudo apt update
sudo apt install libcudnn8 libcudnn8-dev libcudnn8-samples

验证cuDNN:

cp -r /usr/src/cudnn_samples_v8/ $HOME
cd $HOME/cudnn_samples_v8/mnistCUDNN
make clean && make
./mnistCUDNN

如果看到“Test passed!”,说明cuDNN安装成功。

3.3.4 安装TensorRT

TensorRT是NVIDIA的推理优化引擎。对于感知联调来说,TensorRT可以把训练好的模型优化成推理引擎,大幅提升推理速度。

我建议用deb包安装TensorRT,因为依赖管理更方便。

sudo dpkg -i nv-tensorrt-local-repo-ubuntu2204-8.6.1-cuda-11.8_1.0-1_amd64.deb
sudo cp /var/nv-tensorrt-local-repo-*/nv-tensorrt-local-*-keyring.gpg /usr/share/keyrings/
sudo apt update
sudo apt install tensorrt

验证TensorRT:

dpkg -l | grep TensorRT

如果能列出TensorRT的版本信息,说明安装成功。

经验之谈:TensorRT的版本一定要和CUDA版本匹配。我见过有人装了TensorRT 8.6,但CUDA是12.0,结果死活跑不起来。后来换成CUDA 11.8就一切正常了。所以,装之前先查一下兼容性矩阵。

3.4 环境验证——确保一切就绪

所有环境都装好了,怎么确认它们能协同工作?我一般会写一个简单的测试脚本,同时调用ROS2和CUDA。

比如,创建一个ROS2节点,里面调用一个简单的CUDA核函数,计算两个向量的和。如果节点能正常启动,并且计算结果正确,说明环境是通的。

# 伪代码示例
import rclpy
from rclpy.node import Node
import numpy as np
import ctypes

# 加载CUDA库
cuda_lib = ctypes.CDLL("./libcuda_test.so")

class EnvTestNode(Node):
    def __init__(self):
        super().__init__('env_test_node')
        self.timer = self.create_timer(1.0, self.timer_callback)
    
    def timer_callback(self):
        # 调用CUDA函数
        result = cuda_lib.vector_add(ctypes.c_int(10))
        self.get_logger().info(f'CUDA test result: {result}')

def main(args=None):
    rclpy.init(args=args)
    node = EnvTestNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

如果这个节点能正常运行,并且输出结果正确,那恭喜你,环境配置基本没问题了。

3.5 本章小结

这一章我们走完了Ubuntu安装、ROS2 Humble部署、CUDA/cuDNN/TensorRT环境搭建的全流程。说实话,这部分工作很繁琐,但非常重要。环境配好了,后面的联调工作才能顺利进行。

我记得第一次配这个环境的时候,花了整整两天。不是因为难,而是因为各种版本不匹配、依赖缺失。后来我把每一步都记录下来,形成了自己的checklist。现在再配,基本上一个小时就能搞定。

嗯,环境配置就到这里。接下来,你可以开始真正接触感知联调的核心内容了。

核心要点回顾:
  • Ubuntu 22.04 LTS是ROS2 Humble的最佳搭档
  • ROS2安装后一定要验证talker-listener通信
  • CUDA版本和TensorRT版本必须匹配
  • 环境验证脚本是检验配置是否正确的唯一标准
软件环境配置知识体系 Ubuntu 22.04 LTS ROS2 Humble CUDA 11.8 / 12.1 cuDNN 8.9 TensorRT 8.6 环境验证(ROS2 + CUDA 联合测试) 依赖关系:底层 → 上层,版本必须匹配