2. 环境搭建与工具链:Ubuntu + ROS2环境配置、PCL库安装与编译、Open3D与Python绑定

说实话,做激光雷达感知这几年,我见过太多同学卡在环境搭建这一步。明明算法思路都通了,结果装个库装了两天,心态直接崩了。今天咱们就把这事一次性捋清楚。

我个人习惯用 Ubuntu 22.04 + ROS2 Humble 这套组合。为什么选这个?因为稳定。我在项目里踩过不少坑,比如某个库在 Ubuntu 20.04 上编译好好的,换到 22.04 就报错。所以版本锁定很重要。

2.1 Ubuntu + ROS2 环境配置

先装系统。如果你手头是 Windows 或 macOS,建议用虚拟机或者双系统。我个人推荐用 VMware 装 Ubuntu 22.04 LTS,省心。

装好系统后,第一件事换源。你想想看,默认源在国外,下载速度慢得让人抓狂。换成清华或阿里云的源,速度直接起飞。

# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 编辑源文件
sudo vim /etc/apt/sources.list

# 替换为清华源(Ubuntu 22.04)
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse

然后更新系统,装 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 $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 安装 ROS2 Humble
sudo apt update
sudo apt install ros-humble-desktop
注意: 安装过程中如果提示依赖缺失,别慌。直接 sudo apt --fix-broken install 修复一下就行。我曾经在这卡了半小时,后来发现是网络问题导致部分包没下全。

装完后配置环境变量。把下面这行加到 ~/.bashrc 里:

source /opt/ros/humble/setup.bash

然后 source ~/.bashrc 让它生效。验证一下:

ros2 run demo_nodes_cpp talker

如果看到 "Hello World" 在刷屏,恭喜你,ROS2 环境搞定了。

2.2 PCL 库安装与编译

PCL(Point Cloud Library)是做点云处理绕不开的库。我最早接触 PCL 是在 2018 年,那时候版本还是 1.8,现在都到 1.13 了。

安装方式有两种:apt 直接装,或者源码编译。我个人建议:能用 apt 就别编译。除非你需要定制某些模块。

# apt 安装(推荐)
sudo apt install libpcl-dev pcl-tools

# 验证安装
pcl_viewer --version

如果你非要源码编译,嗯,那我也拦不住你。但记住几个坑:

  • VTK 版本要匹配。PCL 1.12 以上需要 VTK 9.x,否则编译报错。
  • Eigen3 必须装。这是 PCL 的数学基础库。
  • Boost 也要装。PCL 依赖 Boost 的智能指针和线程库。
# 源码编译步骤
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)
sudo make install
小技巧: 编译时加 -j$(nproc) 参数,用满所有 CPU 核心。我当年用 4 核笔记本编译 PCL,没加这个参数,等了快一小时。加了之后 15 分钟搞定。

装好后写个简单程序测试一下:

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

int main() {
    pcl::PointCloud<pcl::PointXYZ> cloud;
    cloud.width = 5;
    cloud.height = 1;
    cloud.points.resize(cloud.width * cloud.height);

    for (size_t i = 0; i < cloud.points.size(); ++i) {
        cloud.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
        cloud.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
        cloud.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
    }

    pcl::io::savePCDFileASCII("test.pcd", cloud);
    std::cout << "Saved " << cloud.points.size() << " data points to test.pcd." << std::endl;
    return 0;
}

编译运行:

g++ -o test_pcl test_pcl.cpp -lpcl_io -lpcl_common
./test_pcl

如果生成了 test.pcd 文件,说明 PCL 装好了。

2.3 Open3D 与 Python 绑定

Open3D 是后来崛起的点云库,Python 接口特别友好。我个人觉得,做快速原型验证时,Open3D 比 PCL 顺手得多。

安装很简单,一行命令:

pip install open3d

但要注意 Python 版本。Open3D 0.17 以上需要 Python 3.8+。我建议用 Python 3.10,兼容性最好。

验证安装:

python3 -c "import open3d as o3d; print(o3d.__version__)"

如果输出版本号,比如 0.18.0,那就成了。

写个简单的点云可视化脚本:

import open3d as o3d
import numpy as np

# 生成随机点云
points = np.random.rand(1000, 3)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)

# 可视化
o3d.visualization.draw_geometries([pcd], window_name="My First Point Cloud")
核心要点: Open3D 的数据结构是 numpy 友好的。你从激光雷达拿到的原始数据,转成 numpy array 后直接塞给 Open3D 就行。这点比 PCL 方便太多。

说到 Python 绑定,其实 Open3D 本身就是 C++ 写的,Python 只是它的接口层。所以性能不用担心。我在项目里用 Open3D 处理过百万级的点云,帧率依然能到 30 FPS 以上。

最后说一句,这三个工具链的关系:ROS2 负责通信和调度,PCL 负责底层算法,Open3D 负责快速验证和可视化。各司其职,缺一不可。

避坑指南: 我曾经在同一个项目里混用 PCL 和 Open3D 的数据结构,结果内存泄漏查了两天。后来统一用 Open3D 做可视化,PCL 做算法处理,中间用 numpy 桥接,问题就解决了。

好了,环境搭建这块就到这。下一章咱们开始真正接触点云数据,聊聊怎么读取、显示和预处理。到时候我会拿实际激光雷达的数据来演示,保证比现在这些随机点云有意思得多。