第三章 环境搭建:Ubuntu系统下PCL库安装、Open3D库安装、VS Code与CMake配置、第一个点云可视化程序

说实话,环境搭建这件事,我见过太多同学卡在这一步了。

明明代码逻辑都懂,结果装个库装了两天,心态直接崩了。我自己刚入行那会儿,也曾在PCL的依赖地狱里挣扎过。所以这一章,我尽量把坑都给你指出来。

3.1 为什么选Ubuntu?

做点云处理,Ubuntu几乎是标配。Windows当然也能用,但很多底层库的编译、调试,在Linux下要顺畅得多。我个人习惯用Ubuntu 20.04或22.04 LTS版本,稳定,社区支持也好。

你想想看,如果装个库都要折腾半天,哪还有心思学算法?

3.2 PCL库安装(Point Cloud Library)

PCL是点云处理的老牌库。滤波、分割、配准,样样都行。安装方式有两种:apt直接装,或者源码编译。

3.2.1 方法一:apt安装(推荐新手)

最简单,但版本可能不是最新的。不过对于咱们课程来说,完全够用。

sudo apt update
sudo apt install libpcl-dev pcl-tools

装完验证一下:

pcl_viewer --help

如果能看到帮助信息,说明装好了。

我的经验:apt安装的PCL默认在/usr/include/pcl-1.x,头文件路径别搞错了。我曾经帮一个同学排查了半天,结果发现他include路径写成了pcl-1.10,系统里装的是1.12。

3.2.2 方法二:源码编译(进阶推荐)

如果你需要最新特性,或者想定制某些模块,那就源码编译。步骤稍微多一点,但也不难。

# 安装依赖
sudo apt install cmake g++ libboost-all-dev libeigen3-dev libflann-dev libvtk7-dev

# 下载源码
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
mkdir build && cd build

# 编译(-j4表示用4个核心,根据你电脑配置调整)
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
sudo make install

编译时间大概10-20分钟,去泡杯咖啡吧。

注意:源码编译时,VTK版本容易出问题。Ubuntu 20.04默认VTK 7,Ubuntu 22.04是VTK 9。如果你遇到VTK相关的编译错误,先检查一下版本匹配。我曾经在Ubuntu 22.04上硬装VTK 7,结果折腾了一下午——后来发现直接装VTK 9就没事了。

3.3 Open3D库安装

Open3D是后起之秀,API设计更现代,可视化效果也漂亮。我个人很喜欢用它做快速原型验证。

3.3.1 pip安装(最简单)

pip install open3d

装完测试一下:

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

3.3.2 源码编译(如果需要C++接口)

如果你要用C++调用Open3D,那就得编译了。

git clone https://github.com/isl-org/Open3D.git
cd Open3D
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
sudo make install
小建议:Python做快速验证,C++做性能优化。我一般先用Open3D的Python接口调通算法,再用PCL的C++接口做工程化。两者互补,效率很高。

3.4 VS Code与CMake配置

编辑器我推荐VS Code,插件生态好,调试方便。CMake是C++项目的标配,没有之一。

3.4.1 VS Code安装

sudo snap install --classic code

或者去官网下载.deb包安装。装完后必装插件:

  • C/C++(微软官方)
  • CMake Tools
  • Python

3.4.2 CMake配置示例

创建一个项目文件夹,里面放一个CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(PointCloudDemo)

set(CMAKE_CXX_STANDARD 14)

# 找PCL
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

# 找Open3D
find_package(Open3D REQUIRED)

add_executable(demo main.cpp)
target_link_libraries(demo ${PCL_LIBRARIES} Open3D::Open3D)

这个配置同时链接了PCL和Open3D,方便你后续切换使用。

关键点:find_package的顺序有讲究。我习惯先找PCL再找Open3D,因为PCL的宏定义可能会影响Open3D的编译。如果你遇到奇怪的链接错误,试试调换顺序。

3.5 第一个点云可视化程序

环境搭好了,咱们写个程序验证一下。用PCL读取一个点云文件并显示。

3.5.1 准备测试数据

PCL官方提供了示例点云文件,下载一个:

wget https://raw.githubusercontent.com/PointCloudLibrary/pcl/master/test/bunny.pcd

这是经典的斯坦福兔子点云,大概几万个点。

3.5.2 编写代码

创建main.cpp:

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

int main(int argc, char** argv) {
    // 创建点云对象
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    // 读取PCD文件
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("bunny.pcd", *cloud) == -1) {
        PCL_ERROR("Couldn't read file bunny.pcd\n");
        return -1;
    }

    std::cout << "Loaded " << cloud->points.size() << " points." << std::endl;

    // 可视化
    pcl::visualization::PCLVisualizer viewer("PCL Bunny Viewer");
    viewer.setBackgroundColor(0, 0, 0);
    viewer.addPointCloud<pcl::PointXYZ>(cloud, "bunny cloud");
    viewer.setPointCloudRenderingProperties(
        pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "bunny cloud");

    while (!viewer.wasStopped()) {
        viewer.spinOnce(100);
    }

    return 0;
}

3.5.3 编译运行

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

如果一切顺利,你会看到一个黑色的窗口,里面有一只白色的兔子点云。可以用鼠标拖拽旋转视角。

避坑指南:我第一次运行时,窗口一闪就没了。后来发现是忘了加while循环。PCL的可视化需要持续刷新,否则窗口会立即关闭。嗯,这个坑我踩过。

3.6 常见问题与解决

问题 原因 解决方法
找不到PCL头文件 CMake未正确找到PCL路径 检查find_package(PCL REQUIRED)是否成功,手动设置PCL_DIR
链接错误:undefined reference 库版本不匹配或链接顺序不对 调整target_link_libraries中的库顺序,PCL的库放在前面
Open3D导入失败 Python环境问题 检查pip list,确认open3d已安装;尝试在虚拟环境中重装
可视化窗口卡死 spinOnce调用频率太低 减小spinOnce的参数值,比如spinOnce(10)

好了,环境搭好了,第一个程序也跑通了。接下来咱们就可以正式进入点云处理的核心内容了。下一章,我会带你手写一个点云降噪滤波器——不是调库,是从原理到实现,一步步来。