3D is here: Point Cloud Library (PCL)随着新型,低成本的3D传感器硬件的出现(例如Kinect),以及科研人员在高级点云处理研究上的不断努力,3D感知在机器人技术以及其他领域显得愈发重要。本文,我们将介绍在点云感知领域的一项最新举措:PCL(点云库– http://pointclouds.org)。PCL为3D感知领域提供了一种先进且广泛的方法,旨在为常见的需要用到3D功能的需求提供支持。该库包含用于以下方面的最新算法:滤波,特征估计,表面重建,配准,模型拟合和分段。PCL得到了国际机器人技术和感知研究人员的支持。我们简要介绍下PCL,包括其算法功能和实现策略。一、介绍
为了使机器人在非结构化环境中工作,他们需要能够感知世界。在过去的20年中,我们走过了一段很长的路。从简单的距离传感器(基于声纳或红外线),提供几个字节的信息;到无处不在的相机;再到激光扫描仪。在过去的几年中,像DARPA Urban Challenge上用的Velodyne旋转激光雷达,和倾斜激光PR2上使用的扫描仪为我们提供了高质量的3D世界的表示形式-点云。但是很遗憾,这些系统都很昂贵,要花费数千甚至数十万美元数千美元,因此很多机器人项目都无法承担这样的开支。但是最近几年,3D传感器变得很容易获得,这改变了游戏规则。比如,用于微软XBox 360游戏系统的Kinect传感器,基于PrimeSense技术。只要150美元以下的价格就能买到。它像2D一样提供实时的点云图。因此, 我们可以预见,未来大部分机器人都能以三维的视角看这个世界。所有这些需要的,就是一种有效处理点云的机制,这就是我们介绍的开源点云库-PCL,图1是Logo.PCL是一个完全免费的,BSD许可的库,用于n维点云和3D几何处理。此外,PCL完全集成在ROS中——机器人操作系统(请参阅http://ros.org),并且已经被广泛应用于机器人社区中的各种项目。二、架构和实施
PCL完全是一个模块化的现代C++3D点云处理库。考虑到当今CPU的效率和性能,PCL中的底层数据结构大量使用了SSE优化。其大部分数学运算的实现是基于Eigen(一个开源的线性代数代数库)。此外,PCL还提供了对OpenMP(请参阅http://openmp.org)和Intel线程构建模块(TBB)库的支持,以实现多核并行化。快速k最近邻搜索算法的主干是由FLANN提供(一个执行快速近似最近邻搜索的库) 。PCL中的所有模块和算法均通过使用Boost共享指针的传递数据(参见图2),因此避免重新复制系统中已经存在的数据。从0.6版开始,PCL已被移植到Windows,MacOS和Linux,并且Android端正在开发中。从算法角度,PCL旨在集成多种3D处理算法来处理点云数据,包括:滤波,特征估计,表面重建,模型拟合,分割,配准等。每组算法都是通过基类定义的,这些基类试图集成整个流程中所有通用功能,从而使实际算法的实现紧凑而简洁。PCL中处理这种流程的基本接口是:- 使用setInputCloud传递输入点云数据集到处理模块;
图2中展示的伪代码程序显示标准特征估算过程分两步进行,首先创建NormalEstimation对象并传递输入数据集,然后结果和原始输入一起传递给FPFH 估计对象。为了进一步简化开发,将PCL分为一系列较小的代码库,可以单独编译:- libpcl filters:实现采样、去除离群点、特征提取、拟合估计等过滤器;
- libpcl features:实现多种三维特征的筛选,如:曲面法线、曲率、边界点估计等;
- libpcl surface:实现表面重建技术,如网格重建,凸包重建;
- libpcl registeration:实现点云配准方法,如ICP等;
- libpcl keypoints:实现不同的关键点提取方法;
- libpcl range image:实现支持不同点云数据集生成的范围图像。
为了确保PCL中操作的正确性,上述每个库中的方法和类包含单元测试和回归测试。单元测试套件是按需编译的,并由专门的人员频繁验证构建,以及特定组件的各自作者组件测试失败时被立即通知。这样可以确保对代码中的所有更改进行全面测试,并且任何新功能或修改都不会破坏依赖于PCL的现有代码。另外,大量的示例和教程可通过C ++源文件或按照PCL Wiki网页上一步步的操作说明获得。三、PCL和ROS
PCL设计理念中的基石之一是由感知处理图(PPG)表示。PPG背后的合理性在于,大多数点云处理的应用程序都可以表述为一组具体的构造块,并对其进行参数化以实现不同的结果。例如,墙面检测算法,门检测或桌子检测之间在算法上没有区别,它们都共享相同的构造块,即平面约束分割算法。上述提到的案例中,发生的变化是用于运行算法的一系列参数。考虑到这一点,并基于以前设计其他3D处理库的经验。在最近的ROS中,我们决定提供PCL中的每种算法作为一个独立的构造块,可以轻松连接其他块,从而与ROS生态系统中节点连接的方式相同。图3展示了一个具体的节点模型PPG示例,该示例用于识别水平面区域上的一组点集。四、可视化
PCL带有自己的可视化库,基于VTK 。VTK为渲染3D点云和表面数据提供了强大的多平台支持,包括可视化张量,纹理和体积法。PCL可视化库旨在集成PCL和VTK,通过给 n 维点云结构提供全面的可视化层。其目的是能够快速原型化并可视化在此类超维数据上运行的算法的结果。从0.2版开始,可视化库提供:- 对所有n维点云数据集渲染和设置视觉属性的方法(颜色,点大小,不透明度等);
- 用点集或参数方程式的方法在屏幕上绘制基本3D形状的方法(例如,圆柱体,球体,线,多边形等);
- 用于2D绘制的直方图可视化模块(PCLHistogramVisualizer);
- 大量的几何和颜色处理程序。在这里,用户可以指定将什么尺寸用于3D笛卡尔空间中的点位置(见图4),或者应使用什么颜色来渲染点(见图5);
处理程序交互器是描述如何计算空间中每个点的颜色和3D几何形状,在屏幕上显示以及用户如何与数据进行交互。该库还提供了一些通用工具,用于可视化PCD文件以及在ROS中实时可视化来自传感器的数据流。五、使用范例
在本节中,我们提供了两个代码段,展示了使用PCL进行滤波和分段操作的灵活性和简便性,随后是三个使用PCL解决感知问题的应用示例:i)导航和映射,ii)目标识别, iii)操纵和抓取。在将任何更高级别的运算应用于原始数据集之前,滤波是任何原始点云数据集通常都会经过的最重要的运算之一。算法2和图7给出了一个代码段,以及在该图左侧部分的点云数据集上运行该代码段后获得的结果。该滤波器基于估算给定邻域中的点的一组统计信息(此处k = 50),并使用它们选择所有离平均距离μ在距离以内的点作为内点。第二个示例使用RANSAC 模型构成平面的分割操作,如算法3所示。输入和输出结果如图8所示。在此示例中,我们使用RANSAC估计器随机选择 3个非共线点,并根据整体计算出最佳模型内点数。内部阈值标准设置为每个点到平面模型的最大距离为1cm。图9的左侧展示了一个更复杂的导航和地图应用程序的示例,其中PR2机器人必须自主识别门及其把手,以便探索房间并找到电源插座。在这里,使用的模块包括受约束的平面分割,区域增长法,凸包估计和多边形棱镜提取算法。然后将这些算法的结果用于提取有关门和把手的形状和尺寸的某些统计信息,以便唯一地识别它们并拒绝误报。图9的右侧部分显示了一个从复杂3D场景进行实时目标识别的实验。在这里,在分割和配准框架中使用了一组复杂的3D关键点和特征描述符,旨在识别真实世界中以前见过的物体。图10提供了一个抓取和操控的应用程序。首先从水平桌面上分割出对象,将它们聚类成独立单元,然后应用配准运算,该运算将语义信息附加到每个找到的聚类上。✄------------------------------------------------
双一流高校研究生团队创建,专注于计算机视觉原创并分享相关知识☞
闻道有先后,术业有专攻,如是而已╮(╯_╰)╭