激光雷达】认识点云库PCL

网友投稿 1624 2022-05-30

前言

激光雷达生成的点云数据通过可视化显示,是下图中的效果:

能看到激光雷达发射多线激光束(蓝色圆圈形纹),通过接收器进行处理加工,最好可视化展示出来。从图能看到车、行人、路灯杆、周围的建筑物等。

那么通过什么来处理这些点云数据呢?

答案是:PCL点云库

目录

简介

特征

PCL的代码库图

PCL项目由哪些开发的?

以下适合纯使用者,快速入门

以下适合开发者,快速入门

安装PCL

开发实践

简介

PCL全称 Point Cloud Library,中文简称:点云库;这个库包含丰富的点云处理函数。点云库(PCL)是一个独立的,大规模的,开放的项目,用于2D / 3D图像和点云处理。

特征

PCL是ROS(机器人操作系统)的3D处理主干。

点云库(PCL)可在许多操作系统上运行,并且预构建的二进制文件可用于Linux,Windows和Mac OSX。

PCL是根据BSD许可条款发布的,可免费用于商业和研究用途。

为了简化开发,将PCL分为一系列较小的代码库,可以分别进行编译。

【激光雷达】认识点云库PCL

PCL分为一系列模块化库,包含:filters、features、keypoints、registration、kdtree、segmentation、sample、consensus surface、recognition、visualization。

图中标注了常用的模块函数;

PCL库主要包括:点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化

PCL的代码库图

类似于Boost of C ++库。这是一个例子:

PCL项目由哪些开发的?

PCL开源项目,由来自许多不同组织的众多工程师和科学家开发的,分布在世界各地,包括:

以下适合纯使用者,快速入门

(如果开发者可以跳过,后面介绍)

API文档:http://docs.pointclouds.org/trunk/

如何找到不同版本的API呢??

点击我来查找不同版本的API

用户论坛:http://www.pcl-users.org

以下适合开发者,快速入门

PCL开发者论坛:http://www.pcl-developers.org

PCL开源库地址:https://github.com/PointCloudLibrary/pcl

如果开发过程中遇到问题,可以在下面提问交流:

开发者教程:http://www.pointclouds.org/documentation/tutorials/

其他

PCL点云库的标志

PCL官方博客文章:http://www.pointclouds.org/blog/

安装PCL

Ubuntu系统

sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl sudo apt-get update sudo apt-get install libpcl-all

Linux系统

wget https://aur.archlinux.org/packages/pc/pcl/pcl.tar.gz tar -xzf pcl.tar.gz cd pcl makepkg sudo pacman -U pcl*.xz

安装好后,需要进行配置。参考官网:在自己的项目中使用PCL

开发实践

1)PCL点云读取和显示

dmeo1 基本的读取与显示

PCL中点云的显示主要有两个类:1. pcl::visualization::CloudViewer;  2. pcl::visualization::PCLVisualizer。

下面代码采用CloudViewer,读取点云数据的pcd文件:

#include //标准输入输出流 #include //PCL的PCD格式文件的输入输出头文件 #include //PCL对各种格式的点的支持头文件 #include //引入cloud_viewer相关文件 int main(int argc, char** argv) { pcl::PointCloud::Ptr cloud(new pcl::PointCloud); // 创建点云(指针) //读入PCD格式的文件,如果文件不存在,返回-1 if (pcl::io::loadPCDFile("D:/PCL_TEST/velodyn_1.pcd", *cloud) == -1) { PCL_ERROR("Couldn't read file test_pcd.pcd \n"); //文件不存在时,返回错误,终止程序。 return (-1); } std::cout << "Loaded " << cloud->width * cloud->height << " data points from test_file.pcd with the following fields: " << std::endl; for (size_t i = 0; i < cloud->points.size (); ++i) //通过for循环,显示所有的点 效率偏慢 std::cout << " " << cloud->points[i].x << " " << cloud->points[i].y << " " << cloud->points[i].z << std::endl; pcl::visualization::CloudViewer viewer("pcd viewer"); //建立CloudViewer 对象 viewer.showCloud(cloud); //窗口可视化显示 system("pause"); return (0); }

pcl  是一个命名空间,跟std类似;PointCloud是类模板,是模板类实例化的类型。

其中PointXYZ可以替换为PointXYZRGB,、PointXYZRGBA等多种点云的格式。

D:/PCL_TEST/velodyn_1.pcd具有写自己文件放置的位置路径

demo2 基本读取与丰富地显示

pcl::visualization::PCLVisualizer

如果想要更加丰富的点云显示,如给点云添加颜色、显示点云中的法矢、在窗口中自己画图案、自定义视角的位置,可以采用pcl::visualization::PCLVisualizer

官网案例参考:http://www.pointclouds.org/documentation/tutorials/pcl_visualizer.php#pcl-visualizer

下面代码采用PCLVisualizer,读取点云数据的pcd文件:

#include #include #include #include //前面是导入OpenCV的函数文件 #include //导入点云可视化的文件 using namespace pcl; //申明命名空间 boost::shared_ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer")); //创建PCLVisualizer对象 int main() { //定义点云数据 pcl::PointCloud::Ptr cloud (new pcl::PointCloud); // 定义读取对象 pcl::PCDReader reader; // 读取点云文件 reader.read ("D:/PCL_TEST/velodyn_1.pcd", *cloud); // D:/PCL_TEST/velodyn_1.pcd具有写自己文件放置的位置路径 while(true) { viewer1->removeAllPointClouds(); // 移除当前所有点云 viewer1->addPointCloud(cloud, "test"); viewer1->updatePointCloud(cloud, "test"); viewer1->spinOnce(0.0000000000001); } }

同样其中PointXYZ可以替换为PointXYZRGB,、PointXYZRGBA等多种点云的格式。

D:/PCL_TEST/velodyn_1.pcd具有写自己文件放置的位置路径

参考:https://blog.csdn.net/lizhengze1117/article/details/89154028?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13

2)点云库对滤波算法的实现

其原理及算法:直通滤波器、体素滤波器、统计滤波器、半径滤波器  参考:https://www.cnblogs.com/ironstark/p/4991232.html

参考:https://blog.csdn.net/qq_30815237/article/details/86294496

VexelGrid滤波器对点云下采样;参考:https://blog.csdn.net/LimitOut/article/details/102888615

希望对你有帮助。( •̀ ω •́ )y

开发者 自动驾驶

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Ansible】ad-hoc与常用模块
下一篇:Go入门很简单:解析 XML文件的 Unmarshal 函数
相关文章