首先贴一下大佬的github链接:/williamhyin/SFND_Lidar_Obstacle_Detection
知乎专栏:/people/william.hyin
CSDN博客:/williamhyin/article/details/105159842
先呈现一个完整的视频流结果:
静置画面截图:
开始一步步分析这个代码:
第一步:首先我们需要流式载入激光点云数据(以下是要读入的数据)。
流式载入激光点云数据(疑问:每两个pcd文件之间是不是在帧上本来就是相连的,就是一帧一帧?如果不是那么如果多个pcd文件两两之间在视角方位或者时间上不存在连续性可以形成视频吗?)
原始函数声明在processPointCloud.h
原始函数定义在processPointCloud.cpp
函数调用在environment.cpp中(main函数中)
这里只是捋一下代码每一步在哪里在做什么的思路具体代码注释见下上传的完整代码版本。
本部分涉及到的知识:(1)模板:/view/2317.html
(2)Boost 智能指针。(也就是说 用了智能指针 你就不用担心 什么释放内存的问题了)
boost::shared_ptr 这句一般加在下图箭头前面其中shared_ptr 主要功能是,管理动态创建的对象的销毁。他的基本原理是记录对象被引用的次数,当引用次数为0的时候,也就是最后一个指向某对象的指针析构的时候,共享指针的析构函数就会把指向的内存区域释放掉。
上图使用new给指针指向的对象开辟一个空间,new后边的pcl::PointCloud<PointT>是指名对象的类型,并返回一个地址。
讲解链接:/p/f9eea3610637
/s/blog_1705e3fc10102xe28.html
/aishuirenjia/article/details/91986961
一般使用 ptr 定义 cloud 就是调用了boost库里面的共享指针,
(3)PCL的Ptr与非Ptr类型(点云对象的两种定义方式pcl::PointCloud::Ptr和pcl::PointCloud是可以相互转换的)
(2.1)创建与访问:
第一种,是一种vector的赋值方式,将point数据push_back到pcl::PointXYZ类型的模板中。
pcl::PointCloud<pcl::PointXYZ> pointCloud;pcl::PointXYZ point;point.x = 2.0f - y;point.y = y;point.z = z;pointCloud.points.push_back(point);
第二种,指针型类模板,采用“->points[i]”方式赋值。
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);for (int i = 0; i < cloud->points.size (); ++i){cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);}
(2.2)pcl::PointCloud::Ptr和pcl::PointCloud可以相互转换
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPtr(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ> cloud;cloud = *cloudPtr;//由Ptr转变为另一种类型cloudPtr = cloud.makeShared();//转变为Ptr类型
(2.3)pcl::PointCloud::Ptr和pcl::PointCloud两种对象,在操作是会有所不同
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile("F:\\PCL\\2.pcd",*cloud) == -1)
pcl::PointCloud<pcl::PointXYZ> cloud;pcl::io::loadPCDFile("F:\\PCL\\2.pcd",cloud) == -1)
PS:kdtree和octree类中的setInputCloud()函数只支持Ptr类型,如果点云对象不是Ptr类型,需要进行类型转换。
(4)boost文件目录操作:/milanleon/p/10756869.html
使用到的容器vector知识:
//通过存储元素类型相同的其它 vector 容器,也可以创建新的 vector 容器std::vector<char>value1(5, 'c');std::vector<char>value2(value1);//value2 容器中也具有 5 个字符 'c'....省略代码//在此基础上,如果不想复制其它容器中所有的元素,可以用一对指针或者迭代器来指定初始值的范围,例如: int array[]={1,2,3};std::vector<int>values(array, array+2);//values 将保存{1,2}std::vector<int>value1{1,2,3,4,5};std::vector<int>value2(std::begin(value1),std::begin(value1)+3);//value2保存{1,2,3}
读自动驾驶激光雷达物体检测技术(Lidar Obstacle Detection)(1):Stream PCD流式载入激光点云数据