Ubuntu 20.04 安装 PCL 点云库并验证安装(C++)

在三维视觉、自动驾驶、机器人导航等领域,点云数据(Point Cloud)是感知环境的核心数据之一。而 PCL(Point Cloud Library) 是目前最强大、最广泛使用的开源点云处理库。

本文将手把手教你:

复制代码
✅ 在 Ubuntu 20.04 上安装 PCL 开发库
✅ 编写一个简单的 C++ 程序创建并打印一个点云
✅ 使用 CMake 编译程序
✅ 验证 PCL 是否安装成功

🧰 1. 什么是 PCL?

复制代码
官网:https://pointclouds.org/
功能:提供点云滤波、分割、配准、特征提取、可视化等丰富算法
语言:C++ 为主,支持 Python 绑定
用途:3D重建、SLAM、目标识别、自动驾驶感知等

🔽 2. 安装 PCL 开发库

打开终端,执行以下命令:

cpp 复制代码
# 更新软件包列表
sudo apt update

# 安装 PCL 及其开发文件(头文件、静态库等)
sudo apt install libpcl-dev

# 安装可视化工具(可选,用于显示点云)
sudo apt install pcl-tools
复制代码
✅ libpcl-dev 包含了编译程序所需的头文件和库文件。

✅ pcl-tools 提供了命令行工具如 pcl_viewer,可用于查看 .pcd 文件。

✅ 验证安装(命令行)

cpp 复制代码
# 查看 PCL 版本
dpkg -s libpcl-dev | grep Version

# 查看是否安装了 pcl_viewer(可视化工具)
which pcl_viewer

如果输出类似:

cpp 复制代码
Version: 1.10.0-6
/usr/bin/pcl_viewer

说明 PCL 已成功安装!

📂 3. 创建测试项目

我们来写一个最简单的程序:创建一个包含 3 个点的点云,并打印出来。

3.1 创建项目目录

mkdir pcl_test && cd pcl_test

3.2 创建源文件 main.cpp

cpp 复制代码
// main.cpp
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

int main() {
    // 创建一个点云对象
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    /*
    上边代码等价于:
    // 1. 定义一个智能指针类型
    using PointCloudPtr = std::shared_ptr<pcl::PointCloud<pcl::PointXYZ>>;
    // 2. 创建智能指针,管理 new 出来的对象
    PointCloudPtr cloud = std::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
    或者:
    pcl::PointCloud<pcl::PointXYZ>* raw_ptr = new pcl::PointCloud<pcl::PointXYZ>();
    std::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> cloud(raw_ptr);

    */

    // 设置点云的宽度和高度
    // 宽度 = 点的数量,高度 = 1 表示非组织化点云
    cloud->width    = 3;
    cloud->height   = 1;
    cloud->is_dense = false;  // 是否为密集点云

    // 为点云分配空间
    cloud->points.resize(cloud->width * cloud->height);

    // 添加 3 个点
    cloud->points[0].x = 1.0;
    cloud->points[0].y = 2.0;
    cloud->points[0].z = 3.0;

    cloud->points[1].x = 4.0;
    cloud->points[1].y = 5.0;
    cloud->points[1].z = 6.0;

    cloud->points[2].x = 7.0;
    cloud->points[2].y = 8.0;
    cloud->points[2].z = 9.0;

    // 打印点云信息
    std::cout << "点云大小: " << cloud->points.size() << std::endl;
    std::cout << "点云数据:" << std::endl;
    for (const auto& point : cloud->points) {
        std::cout << "    (" << point.x << ", " << point.y << ", " << point.z << ")" << std::endl;
    }

    std::cout << "🎉 PCL 安装成功!" << std::endl;

    return 0;
}

3.3 创建 CMakeLists.txt

cpp 复制代码
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(pcl_test)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)

# 查找 PCL 包 根据自己版本修改
find_package(PCL 1.10 REQUIRED)

# 包含 PCL 头文件
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

# 添加可执行文件
add_executable(pcl_test main.cpp)

# 链接 PCL 库
target_link_libraries(pcl_test ${PCL_LIBRARIES})
cpp 复制代码
# 1. 创建构建目录
mkdir build && cd build

# 2. 生成 Makefile
cmake ..

# 3. 编译
make

# 4. 运行程序
./pcl_test

✅ 5. 预期输出

如果一切顺利,你将看到:

cpp 复制代码
点云大小: 3
点云数据:
    (1, 2, 3)
    (4, 5, 6)
    (7, 8, 9)
🎉 PCL 安装成功!

pcl::PointCloudpcl::PointXYZ

这是 PCL 中的点云模板类。

复制代码
pcl:::命名空间,表示这是 PCL 库里的东西
PointCloud:点云类,表示一个点的集合
<pcl::PointXYZ>:模板参数,表示这个点云中每个点的类型是 PointXYZ

pcl::PointXYZ 是什么?

它是一个结构体,表示一个三维点,包含:

cpp 复制代码
struct PointXYZ {
    float x, y, z;  // 三维坐标
};

所以:pcl::PointCloudpcl::PointXYZ 表示:一个由 PointXYZ 类型的点组成的点云。

我们来看看 pcl::PointCloud 提供的主要成员。