2、开发环境武装:Ubuntu系统配置、PCL库源码编译、Open3D Python绑定安装、VS Code调试配置

说实话,做激光雷达SLAM这几年,我踩过最多的坑反而不是算法本身,而是环境配置。你想想看,好不容易搞懂了ICP原理,结果编译PCL时报了一堆莫名其妙的错,一查是Eigen版本不对——这种挫败感,我太熟悉了。

所以这一章,咱们就把开发环境一次性搞定。我把自己这些年积累的配置经验,浓缩成一套「稳、准、快」的方案。跟着走,基本不会出幺蛾子。

2.1 Ubuntu系统配置——选对版本,少走弯路

我个人习惯用Ubuntu 20.04 LTS。为什么?因为ROS Noetic、PCL 1.12、Open3D 0.15这些主流版本,在20.04上都有官方支持。18.04太老,22.04有些库还没完全适配。

装完系统后,第一件事不是装软件,而是换源。我推荐用清华源或者中科大源,速度稳定。

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

# 替换为清华源(Ubuntu 20.04)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

# 更新
sudo apt update
sudo apt upgrade -y
我的小技巧: 换源后先装个 build-essential 和 cmake,这是编译一切C++项目的基础。我曾经因为忘了装cmake,卡在PCL编译上整整半天。

2.2 PCL库源码编译——从源码开始,掌控一切

虽然apt也能装PCL,但我强烈建议你从源码编译。为什么?因为apt装的版本往往比较旧,而且缺少一些关键模块(比如GPU加速)。源码编译虽然慢一点,但你能完全控制编译选项。

先装依赖:

sudo apt install -y libboost-all-dev libeigen3-dev libflann-dev libvtk7-dev
sudo apt install -y libqhull-dev libgtest-dev libusb-1.0-0-dev

然后下载PCL源码:

git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
git checkout pcl-1.12.1  # 我用的是这个版本,稳定

编译配置:

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_visualization=ON \
      -DBUILD_surface_on_nurbs=ON \
      -DBUILD_global_tests=OFF \
      -DCMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)
sudo make install
注意: 编译时如果报错找不到 VTK,记得检查 libvtk7-dev 是否装全了。我曾经在Ubuntu 22.04上试过,VTK版本不兼容,折腾了两天才搞定。所以还是推荐20.04。

编译完成后,验证一下:

pcl_viewer /usr/share/pcl-1.12/test/bunny.pcd

如果能看到一只兔子点云,恭喜你,PCL装好了。

2.3 Open3D Python绑定安装——点云可视化的利器

Open3D是我做点云可视化时的首选。它比PCL的visualization模块好用太多,尤其是Python绑定,写几行代码就能看到点云效果。

安装方式很简单:

pip install open3d

但这里有个坑——如果你用系统自带的Python3,可能会遇到权限问题。我建议用虚拟环境:

python3 -m venv lidar_env
source lidar_env/bin/activate
pip install open3d numpy matplotlib

测试一下:

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])

如果弹出一个窗口显示随机点云,说明Open3D安装成功。

避坑指南: 我曾经在安装Open3D时遇到libGL.so.1缺失的问题。解决方案很简单:sudo apt install libgl1-mesa-glx。另外,如果你用远程服务器,记得加上export DISPLAY=:0

2.4 VS Code调试配置——让调试像呼吸一样自然

写C++代码,没有调试器就像开车没有方向盘。VS Code配合GDB,是我目前用过最顺手的组合。

首先安装VS Code扩展:

  • C/C++(微软官方)
  • CMake Tools
  • Python
  • Code Runner(可选)

然后配置launch.json。我个人习惯这样写:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug PCL",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/your_executable",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "build",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

再配一个tasks.json,用于编译:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "cd build && cmake .. && make -j$(nproc)",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
核心要点: 调试时记得在CMakeLists.txt里加上set(CMAKE_BUILD_TYPE Debug),否则断点可能不生效。我刚开始做项目时,就因为忘了这步,调试了半天发现断点根本不停。

配置完成后,按F5就能一键编译+调试。你可以在代码里打断点,查看变量值,甚至实时修改点云数据——嗯,这种感觉,真的很爽。

2.5 环境验证——跑一个完整的点云处理流程

最后,咱们写一个简单的程序,验证整个环境是否打通:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>

int main() {
    // 创建一个点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    cloud->width = 100;
    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::visualization::PCLVisualizer viewer("Point Cloud Viewer");
    viewer.addPointCloud(cloud, "cloud");
    while (!viewer.wasStopped()) {
        viewer.spinOnce();
    }
    return 0;
}

编译运行:

mkdir build && cd build
cmake ..
make
./pcl_test

如果一切顺利,你会看到一个窗口,里面飘着一堆随机点云。虽然没什么实际意义,但至少证明你的开发环境已经武装到位了。

最后说一句: 环境配置这东西,一次搞定,后面就省心了。我当年刚入行时,每次换电脑都要折腾一遍环境,后来干脆写了个自动化脚本。如果你也嫌麻烦,可以把我上面的命令整理成一个shell脚本,一键执行。

好了,环境准备好了。下一章,咱们开始真正接触点云数据——从读取、滤波到特征提取,一步步来。