第二章:开发环境搭建——Ubuntu+ROS2环境配置、PCL库安装与编译、Python绑定与可视化工具对比
说实话,做激光雷达车道线检测,环境搭建这一步最容易被忽视。很多人一上来就急着跑算法,结果编译报错、库版本冲突、可视化工具打不开……折腾一整天,心态直接崩了。
我个人习惯是,先把开发环境当成一个「系统」来搭建。每个组件就像齿轮,咬合好了,后面才能跑得顺。这一章,我就带你一步步把 Ubuntu、ROS2、PCL、Python 绑定和可视化工具全部搞定。
核心要点:本章所有操作基于 Ubuntu 22.04 + ROS2 Humble + PCL 1.13。如果你用其他版本,可能会遇到兼容性问题,我会在避坑指南里说明。
2.1 Ubuntu + ROS2 环境配置
先说说为什么选 ROS2。ROS1 虽然经典,但实时性差、跨平台支持弱。ROS2 基于 DDS 通信,延迟更低,更适合自动驾驶这种实时场景。我在项目中遇到过,ROS1 的点云数据在高速场景下偶尔丢帧,换成 ROS2 后这个问题基本消失了。
2.1.1 安装 Ubuntu 22.04
如果你已经有 Ubuntu 系统,跳过这一步。没有的话,建议用双系统或虚拟机。我个人推荐双系统,性能损耗小。虚拟机跑点云数据,尤其是实时可视化,会卡得你怀疑人生。
- 下载 Ubuntu 22.04 LTS 镜像(官网直接下)
- 用 Rufus 或 balenaEtcher 制作启动盘
- 安装时选择「最小安装」,省去不必要的软件包
- 安装完成后,先执行
sudo apt update && sudo apt upgrade -y
小技巧:安装时给 /home 分区多留点空间。激光雷达数据动辄几十 GB,后面你会感谢我的。
2.1.2 安装 ROS2 Humble
ROS2 的版本和 Ubuntu 版本是绑定的。Ubuntu 22.04 对应 ROS2 Humble。别乱装,否则依赖会打架。
# 设置 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
# 添加 ROS2 源
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 $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 安装 ROS2 Humble
sudo apt update
sudo apt install ros-humble-desktop -y
# 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
装完后,跑一下 ros2 run demo_nodes_cpp talker,如果能看到输出,说明 ROS2 装好了。嗯,这里要注意,如果报错说找不到包,八成是环境变量没 source 成功。
避坑指南:我曾经在安装 ROS2 时,因为之前装过 ROS1,导致环境变量冲突。两个版本的 setup.bash 互相覆盖,ros2 命令死活找不到。解决办法是:在 ~/.bashrc 里只保留 ROS2 的 source 行,ROS1 的注释掉。
2.2 PCL 库安装与编译
PCL(Point Cloud Library)是激光雷达算法的基石。车道线检测中,地面分割、聚类、拟合都离不开它。我建议你从源码编译,虽然耗时,但能保证所有模块都可用。
2.2.1 安装依赖
PCL 依赖很多,缺一个编译就报错。我整理了一份清单,你照着装就行。
sudo apt install -y \
cmake g++ libboost-all-dev libeigen3-dev \
libflann-dev libvtk7-dev libvtk7-qt-dev \
libqhull-dev libusb-1.0-0-dev \
libopenni2-dev libpcap-dev \
libproj-dev libcairo2-dev
小技巧:Eigen 库是头文件库,不需要编译。但版本要 >= 3.3,否则某些函数会报错。用 dpkg -l | grep eigen 可以查版本。
2.2.2 编译 PCL
从 GitHub 拉取源码,建议用 1.13 版本,稳定且兼容性好。
git clone https://github.com/PointCloudLibrary/pcl.git -b pcl-1.13.0
cd pcl
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release \
-DBUILD_visualization=ON \
-DBUILD_surface_on_nurbs=ON \
-DBUILD_global_tests=OFF ..
make -j$(nproc)
sudo make install
编译时间取决于你的 CPU 核心数。我笔记本是 8 核,大概跑了 20 分钟。期间可以去喝杯咖啡,别盯着终端看,会焦虑。
避坑指南:我曾经在编译时加了 -DBUILD_visualization=OFF,结果后面用 CloudCompare 对比时,发现 PCL 的可视化模块缺失。如果你需要可视化,一定要把这个选项打开。
2.3 Python 绑定(python-pcl)
Python 绑定让我们能在 Python 里直接调用 PCL 的函数。对于快速原型验证来说,太方便了。但说实话,python-pcl 的安装有点坑,依赖关系复杂。
2.3.1 安装 python-pcl
我推荐用 pip 安装,但需要先确保 PCL 的库路径正确。
# 安装依赖
sudo apt install python3-dev python3-pip cython3
# 设置环境变量
export PCL_ROOT=/usr/local
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
# 安装 python-pcl
pip3 install python-pcl
如果 pip 安装失败,可以试试从源码编译:
git clone https://github.com/strawlab/python-pcl.git
cd python-pcl
python3 setup.py build_ext -i
python3 setup.py install
验证安装:在 Python 里执行 import pcl,如果不报错,说明绑定成功。如果报错说找不到库,检查 LD_LIBRARY_PATH 是否包含 PCL 的 lib 目录。
2.3.2 简单测试
写个简单的测试脚本,读取一个点云文件并打印点数:
import pcl
cloud = pcl.load("test.pcd")
print(f"点云点数: {cloud.size}")
print(f"点云宽度: {cloud.width}")
print(f"点云高度: {cloud.height}")
如果一切正常,你会看到类似 点云点数: 123456 的输出。嗯,这里要注意,PCD 文件路径要用绝对路径,否则容易找不到文件。
2.4 可视化工具对比:rviz2 vs CloudCompare
做激光雷达算法,可视化工具是刚需。你总不能每次都写代码打印坐标吧?我常用两个工具:rviz2 和 CloudCompare。它们各有千秋,我对比一下。
| 特性 | rviz2 | CloudCompare |
|---|---|---|
| 实时性 | 强,支持 ROS2 话题实时订阅 | 弱,主要用于离线分析 |
| 点云渲染 | 基础,支持颜色、大小调整 | 强大,支持多种渲染模式、截面、距离测量 |
| 插件扩展 | 丰富,可自定义显示插件 | 有限,主要靠内置功能 |
| 学习曲线 | 中等,需要了解 ROS2 概念 | 低,开箱即用 |
| 适用场景 | 在线调试、算法验证 | 离线分析、数据标注、效果对比 |
我个人习惯是:在线调试用 rviz2,离线分析用 CloudCompare。比如车道线检测中,我要实时看分割效果,就用 rviz2 订阅点云话题。如果要对检测结果做定量分析,比如测量车道线宽度,就用 CloudCompare 加载 PCD 文件。
2.4.1 rviz2 配置要点
rviz2 是 ROS2 自带的可视化工具。启动方式很简单:
ros2 run rviz2 rviz2
然后添加一个 PointCloud2 显示,选择对应的话题。我建议把点云大小调成 2,颜色选 Intensity,这样车道线的反射强度差异一目了然。
小技巧:rviz2 支持保存配置文件。调好显示参数后,点击 File -> Save Config,下次直接加载,省得每次重新调。
2.4.2 CloudCompare 使用技巧
CloudCompare 是独立软件,需要单独安装:
sudo snap install cloudcompare
或者从官网下载 AppImage 版本。我推荐 AppImage,免安装,解压即用。
在 CloudCompare 里,你可以做很多 rviz2 做不到的事:
- 截面切割:看车道线的横截面形状
- 距离测量:精确测量车道线宽度
- 颜色映射:根据高度或强度着色
- 点云滤波:快速去除离群点
避坑指南:CloudCompare 默认不支持直接读取 ROS2 的 bag 文件。你需要先把 bag 里的点云话题转成 PCD 文件。我写过一个脚本,用 ros2 bag play 配合 pcl_ros 的 bag_to_pcd 节点来转换。后面章节会详细讲。
2.5 本章知识体系总览
为了让你更直观地理解本章内容,我画了一张流程图,展示各个组件之间的关系。
从这张图你可以看到,整个环境是分层搭建的。底层是操作系统,中间是 ROS2 通信框架,上层是算法库和工具。每一层都依赖下一层,所以搭建顺序不能乱。
好了,环境搭建就讲到这里。你跟着步骤走,应该不会出大问题。如果遇到报错,先看错误信息,八成是依赖没装全或者路径没配好。别慌,慢慢排查。
总结一下:这一章我们完成了 Ubuntu + ROS2 的安装,编译了 PCL 库,配置了 Python 绑定,还对比了 rviz2 和 CloudCompare 的适用场景。这些工具就像你的工具箱,后面做车道线检测时,你会频繁用到它们。