在三维视觉、自动驾驶、机器人导航等领域,点云数据(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 提供的主要成员。
