PCL通过八叉数获取直线线段附近的点

需要在点云中所有点中到线段距离小于某个值的所有点,也就是点云中到线段距离小于某个值的所有点,可以称做直线半径内近邻搜索,直接法就是计算点云中每个点到这条线段的距离,方法见https://blog.youkuaiyun.com/qq_34122731/article/details/97616112
不过这种计算方法耗时较多,我想到的两种方法去加速
第一,通过kdtree的方法
把线段分成合适的多个小段,每段取一个代表点然后对这个点求取半径近邻搜索,假设一条线段被分成500段,然后对没电进行半径近邻搜索。
-----时间性能
随机分布在棱长为4的正方体内的20000个点,进行500次的半径近邻搜索,时间基本稳定在1.6ms左右,而我的项目中需要进行上万次这样的搜索,需要消耗数十秒的时间,没有实时性能。
因此,虽然这样计算的准确度较高,但是考虑到时间性能,我不使用这种方法

第二,通过八叉数的方法
pcl的八叉数自带函数
int getIntersectedVoxelIndices (Eigen::Vector3f origin, Eigen::Vector3f direction, std::vector< int > &k_indices, int max_voxel_count=0) const,这个函数可以获取以origin为起点,direction为方向的射线通过的所有体素,得到了射线经过的点,再设置下范围,就可以获得线段通过的体积元素了
-----时间性能
点运同样是随机分布在棱长为4的正方体内的20000个点,从点云建立八叉数耗时约为5ms左右,进行20000次的随机线段临近点计算耗时约为40ms,时间性能得到了很不错的提升
-----缺点
需要注意到的是,并不是在线段附近的所有点都会在线段经过的体素里,很有可能会漏掉部分的近邻点,因此直线半径内近邻搜索的半径(需要考虑到点云的尺度,不妨范围化),八叉数的分辨率,正确率(这种方法搜索到的点占应该搜索到的点的比例)这三者的关系需要加以探究
使用八叉数获取线段近邻点的准确性探究实验
线段近邻点:点云中离线段的距离不超过某个距离的点,这个距离简称为近邻半径
实验条件:一个分布在长宽高分别为2,3,4(m)的长方体内的20万个随机点组成的点云近邻半径为0.05
实验一
直接法与八叉数法耗时随点云的点数的增长情况
八叉数点云的分别率设置为近邻半径的三倍(能获取90%以上的近邻点),点云数量从10开始变化,每个数量的点云进行100次的直接法和八叉数法计算近邻点,然后计算它们这10次的平均耗时作为该数量下点云的计算耗时,然后点云的数量变为两倍,直到327 680,共有16组点云;
实验对象:两个端点随机分布在长方体内部
试验结果横坐标为点云的数量
第一张图体现了随着点云数目的增长,两种方法耗时的情况,第二张图反映了随着点运输目的变化,直接法耗时与八叉数法耗时的比值,第三张图(纵坐标是时间/ms)是八叉数方法耗时随着点云数目的变化,发现他不是一个近似的线性增长关系,而直接法是近似的一个线性关系,这就解释了第二张图比值的变化。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

实验二八叉数分辨率对实验结果的影响
八叉数把点云空间分成一个个的小格子,但是线段的近邻点不一定都分布在线段经过的格子里,比如说点云数量为500000时,近邻搜索半径为0.05时,如果八分辨率设置为与半径相等也就是0.05,一次实验中,直接法搜索到的近邻点数为404个,而八叉数搜索到的符合条件的点由183个,只有45%的准确率。所以需要一些技巧去提高这个准确率,我准备采取两种方法来做:一.增加分辨率,这样八叉数搜索到的点就会增加,不过搜索到的错误点也会增加,筛选的工作量也会增加;二,不改变分辨率,而是在八叉数搜索到的点进行半径内近邻搜索,以期望获得更多的正确点,易得,这种方法在线段近邻的点较少时可能会获得不错的结果,但是当点量增加时,与kd树的操作无异。
方法一:在500000个随机点云的条件下,随机线段的近邻搜索半径为0.05,那么分辨率从0.01开始每次增加0.2个半径,直到20倍的半径值,在每个半径值下进行100次的实验,计算每次实验的准确率与错误率,通过八叉数搜索到的点的个数这三个值随着八叉数分辨率的变化情况, 相应的得到三张图。第一张是准确率和错误率随着分辨率的增加的变化情况,可以发现分辨率越高,正确率越高,相应的错误率也越高,正确率当然越高越好,但是相应的错误率也会随之攀升,第三图可以说明这个情况;第二张显示的是正确点随着分辨率的变化情况(这两个变量是无关的,曲线的波动原因是每次实验下的线段都是随机的,不过仍然能看出来是在一个稳定值下进行的波动),第三图显示的是八叉数的搜索方法得到的点的总数除以正确点的比值,随着分辨率的增加,点的总数相应的增加,这回给筛选得到的点增加计算负担。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值