3. 软件环境配置:Ubuntu系统安装、ROS2 Humble部署、CUDA/cuDNN/TensorRT环境搭建
好,咱们进入第三章。这一章,说白了就是给机器人装上“大脑”和“眼睛”。
你想想看,硬件平台搭好了,就像一个人有了身体。但身体要动起来,得靠神经系统和大脑来指挥。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
验证安装是否成功,可以跑一个简单的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命令验证。如果能看到显卡信息,说明驱动装好了。
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的版本信息,说明安装成功。
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版本必须匹配
- 环境验证脚本是检验配置是否正确的唯一标准