PCL(Point Cloud Library),又叫做
点云库,是一个经BSD授权可用于点云处理的大型跨平台开源C++编程库,其最早是以斯坦福大学Radu博士为首进行维护与开发的开源项目,主要用于机器人领域。PCL涵盖处理点云数据的多种通用算法和数据结构,其具体实现基于第三方库Boost、Eigen、FLANN、VTK、CUDA、OpenNI和Qhull,能够支持Windows、Linux、
Mac OS和Android等多种操作系统平台。PCL包括点云获取、分割、特征描述与提取、
可视化、
曲面重建、配准、滤波和输入/输出等功能模块以及动作跟踪识别等应用,并且在不断更新的PCL版本中会加入新的算法与应用。截止至2022年,PCL已被广泛应用在立体3D影像、
激光遥感测绘学、虚拟现实/
人机交互、机器人和
逆向工程等领域。
PCL中各功能的实现依赖于多个第三方库,分别为Boost库、Eigen库、FLANN库、VTK库、CUDA库、OpenNI、Qhull。PCL的部分主要功能模块如下:I/O,输入/输出模块。该模块能够实现
点云数据/文件的获取、读入与存储等操作,通过封装OpenNI兼容的设备原始数据获取接口实现直接读取点云相关信息;kd-tree,空间
索引模块。该模块通过类与函数实现利用kd-tree
数据结构建立点云的空间拓扑关系,实现基于FLANN第三方库的快速最近邻搜索; octree,空间索引模块。该模块通过类与函数实现利用octree数据结构建立点云的空间拓扑关系,实现基于FLANN第三方库的快速最近邻搜索;
可视化,可视化模块。该模块包含了大量与可视化相关的数据结构与组件,依赖于第三方库
VTK,能够对其他模块的处理结果进行直观的展示。
PCL自2011年正式推出以来,在各行业得到广泛应用,随着算法模块的不断优化与完善,截止至2022年PCL库已经发布到1.9.1版本,并完全集成到ROS中。
内容
PCL的结构和内容
如图PCL架构图所示,对于3D
点云处理来说,PCL完全是一个的模块化的现代
C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、
特征提取、识别、追踪、
曲面重建、
可视化等。
PCL利用OpenMP、GPU、CUDA等先进
高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的构架是基于FLANN (Fast Library for Approximate Nearest Neighbors)所实现的,速度也是目前技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的,因而避免了多次复制系统中已存在的数据的需要,从0.6版本开始,PCL就已经被移入到Windows,
Mac OS和
Linux,并且在Android系统也已经开始投入使用,这使得PCL的应用容易移植与多方发布。
从算法的角度,PCL是指纳入了多种操作点云数据的三维处理算法,其中包括:过滤,特征估计,表面重建,模型拟合和分割,定位搜索等。每一套算法都是通过基类进行划分的,试图把贯穿整个
流水线处理技术的所有常见功能整合在一起,从而保持了整个算法实现过程中的紧凑和结构清晰,提高代码的重用性、简洁可读。在PCL中一个处理管道的基本接口程序是:
创建处理对象:(例如过滤、特征估计、分割等);
使用setInputCloud通过输入
点云数据,处理模块;
设置算法相关参数;
调用计算(或过滤、分割等)得到输出。
为了进一步简化和开发,PCL被分成一系列较小的代码库,使其模块化,以便能够单独编译使用提高可配置性,特别适用于嵌入式处理中:
libpcl filters:如采样、去除离群点、
特征提取、拟合估计等数据实现
过滤器;
libpcl features:实现多种三维特征,如
曲面法线、
曲率、边界
点估计、矩不变量、
主曲率,PFH和FPFH特征,旋转图像、积分图像,NARF描述子,RIFT,相对
标准差,数据强度的筛选等等;
libpcl I/O:实现数据的输入和输出操作,例如
点云数据文件(PCD)的读写;
libpcl segmentation:实现聚类提取,如通过采样一致性方法对一系列参数模型(如平面、
柱面、球面、直线等)进行模型拟合点云分割提取,提取
多边形棱镜内部点云等等;
• libpcl
surface:实现表面重建技术,如网格重建、
凸包重建、移动
最小二乘法平滑等;
libpcl register:实现点云配准方法,如ICP等;
libpclkeypoints:实现不同的关键点的提取方法,这可以用来作为预处理步骤,决定在哪儿提取特征描述符;
libpcl range :实现支持不同点云
数据集生成的范围图像。
为了保证PCL中操作的正确性,上述提到的库中的方法和类包含了单位和
回归测试。这套单元测试通常都是由专门的构建部门按需求编译和验证的。当某一部分测试失败时,这些特定部分的各自作者就会立即被告知。这彻底地保证了代码测试过程出现的任何变故,以及新功能或修改都不会破坏PCL中已经存在的代码。