词 分割算法 word segmentation_地面点云快速分割算法---linefit_ground_segmentation

6218793fbfabeb8b6f357c321b687866.png

在使用激光雷达进行定位和导航的过程中,由于地面信息在相邻帧间几乎不怎么发生变化,所以,总是会使用地面信息来进行结果的优化。例如LeGO-LOAM中的地面优化:

yc zhang:LeGO-LOAM原理深度解析​zhuanlan.zhihu.com
3708a0131bc03a009cf44c69c1a84fa7.png

为了能够很好的检测出激光雷达数据中的地面信息,我们使用了一种地面点云快速分割的方法,达到实时稳定且精确的地面分割的效果。

论文:Fast segmentation of 3d point clouds for ground vehicles

源代码:linefit_ground_segmentation

由于开源的代码可能运行起来会遇到些许的问题,为了方便起见,我把已经调试过的代码和论文放在了road_detecting中。

如果觉得这篇文章对您有帮助的话,希望可以点赞支持一下哈~

论文研读

我们在进行代码的阅读之前,需要先对于论文进行研读,理清整个文章的脉络。

针对于本篇文章,我们可以将其划分为以下几个方面:

1、点云获取

我们首先获取激光雷达传感器传来的数据,将其转变为欧式距离表示的3D点云数据集。这个是将激光雷达数据进行处理,获转化为自己需要的数据的方法。

数据获取的这一步有一些需要满足的条件:

  • 雷达需确保能够扫描到地面,VLP-16雷达的竖直平面视角为[
    ],需根据这个视角,确保地面可以被扫描到;
  • 地面和非地面数据最好可以有个很明显的竖直维度的落差,以便可以区分地面和非地面。

满足上面两个条件后,可以对采集的数据进行处理。

2、点云有序化处理

首先,将整个的三维笛卡尔坐标系进行另一种形式的表示,我们进行点云的划分,将其从无序的点云划分为有序的点云。划分的标准有以下两个:segmentbins

segment:

我们将整个笛卡尔坐标系中的

平面转变为一个无穷长半径的圆面。设定一个弧度参数

则,我们可以将整个

平面转变为一个被弧度参数
划分为
份扇面的圆面。

这样的话,我们就可以将整个的

平面进行划分,划分为
个segment。

而,为了能够很好的将点进行segment的定位,我们使用以下的方式:

这样的话,我们就可以对于每一个点进行

平面的有序化处理。

因此,可以对于所有的点云进行如下的划分:

其中,

是代表segment
代表所有的点云;
代表的是点云
代表的是属于segment
的点云集合。这样的话,我们就将整个的无序点云转化为有segment划分的有序点云了。

2128012f917e25c2b6020aeab0881735.png
x-y平面下的segment划分

bins:

在前面,我们进行了segment的划分,也就是说,将整个点云划分为

个segment,然而,为了能够进一步的进行点云的有序化划分,我们这里使用了bins的划分:

我们针对于segment

中的点云
来处理。

我们可以设定两个距离参数

来进行第
个bins,
的限制。所以,对于每一个点通过以下的条件进行划分:

因此,我们可以对于该点在

平面上的投影来进行
的判断。

通过该操作,就可以将一个扇面划分为多个扇环。

这样,无序点云就被有序化处理了。

6dd6df8464e423a9d417814f24e0d757.png
对segment进行bins的划分

3、降维

我们在前面进行了点云的有序化处理,现在需要进行最小z点的选取,来进行地面点的筛选。

其中,这里的数据处理都是在一个segment中进行的。

因为,我们前面是进行了

平面的投影,但是,却保留了该点的
坐标,也就是将一个三维坐标点,转变为一个二维坐标点,外加一个
平面的角度信息。

这样的话,我们就进行了降维的操作,将一个三维数据

转化为了二维数据
.与此同时,其下标是连接三维坐标和二维坐标的桥梁,这为后面得到对应的二维地面点转化为三维地面点,提供了理论支撑。

经过这一步的操作后,可以将三维点云转化为二维点云,实现降维操作。但是这一步和普通的降维操作不一样,它并不是单纯的减少一个维度,而是将水平方向的平方根作为维度,实现的降维操作。该操作可以保留竖直维度的信息,同时又不损失水平维度的信息,是一种不错的降维方法。

4、直线拟合

我们在前面一步得到了

的数据,可以构建出
平面的离散点。

针对于这些离散点,我们设定了四个条件来进行直线拟合的判断,其中直线表示为

直线的斜率

直线的斜率的绝对值不应该超过一个设定的阈值

。因为,这个是一个
的平面,所以,直线的斜率代表的是z轴到
平面的值。斜率不能过大。因为过大的斜率会呈现出垂直结构。而我们进行的是地面点的拟合,所以,需要对斜率进行某种程度的阈值设定。

直线在z轴的截距

当斜率m小于最小斜率的时候,

不应该超过一个一个特定的阈值

因为,当斜率很小的时候,说明基本上地面是平整的,不是上下坡这种情况,而截距

则表明了其距离地面的值,而前面也说明了时一个平整的路面,所以,我们应该设定其不大于一个设定的竖直维度阈值
。这样的话,我们就不会把高出地面的点云认为是地面了。

直线拟合的误差

我们拟合直线的均方根误差不应该超过设定的误差阈值

这个是直线拟合,也就是最小二乘法的必要过程,我们需要对于拟合的直线进行拟合程度的判断来确保是否对于离散点拟合成功。

第一个点到直线的距离

我们找到segment中bins的第一个点,然后,判断该点到已经存在的直线的距离,这个距离不能超过设定的一个阈值,如果不超过这个距离,则我们就认为这个点时可以被拟合到直线上的,如果超过这个距离,则就以该点为基准,重新开始一条直线。这样的话,就可以进行不同直线的划分。

这一步是判别两个地面点云的距离是否比较接近。如果距离超出阈值的话,说明这两个点可能离得比较远,没有必要把这两个点拟合到一起。

地面点的筛选

在前面,我们拟合了许多条直线,其中这些直线,是在一个segment中按照bins的顺序进行处理的。我们可以看到的是一条直线可能不止一条bins,但是直线之间是不会出现重叠的。因此,我们就可以通过拟合到的直线来进行地面点的筛选。

我们根据筛选出来的直线和自己设定的参数,来进行点到直线的z轴的距离。这样的话,算出来的就是同d情况下的z的差距。这样的话,是可以进行地面点的筛选的。在阈值范围内的点就是我们挑选出来的地面点。

得到最终的地面点

我们在前面进行地面点的筛选,得到的是d-z平面的数据。因此,我们需要转化到三维笛卡尔坐标系下的距离。通过前面的点的筛选,然后再通过最开始的点云的index,我们可以从这里逆推回去点,得到属于地面点的三维数据点。

这样的话,我们就得到了最终的三维地面数据点。

9dc2d07780f178c28968111fc2f82181.png
隧道上坡场景下的地面点云分割

在隧道上坡场景下,也可以很好的分割地面点云。这种方法和平常的降维方法相比,能够更加精确的提取地面点云,是一种在地面信息有竖直维度变化的情况下更适用的降维方法。

从图中可以看到绿色的点蓝色的点红色的点白色的线段

从图中,我们可以进行上面四种颜色的划分。这四种颜色的划分,也正好与前面论文中的内容对应。

原型点:

绿色的点为我们提取出来的原型点:prototype points

这个原型点是我们通过在d-z平面内选择最小z点所构成的。所以,我们可以看到,基本上这个点相当于一次去重的操作。如果,某个x和y所对应的z不止一个,则,选出最小z点,来作为原型点。这样的话,就可以初步的筛选出地面点。

非地面点

蓝色的点为障碍物点,这一点很好理解。从图中可以看出,障碍物点,基本上都处于最小z点的上方。不会是地面点的。

白色的线段

我们在选出原型点之后,对于其在d-z平面进行直线的拟合,会得到多条拟合后的d-z平面的线。而我们看到的白色的直线,就是所得到的对应segment中满足设定条件的直线拟合线。

地面点

在得到了d-z平面的拟合直线之后,对于所有的原型点进行点到直线的距离的判断。我们选取在z轴领域内的最小距离点作为我们认为的地面点。最终体现出来的就是红色的点。

为了能够更加明显的区分这些信息,我换了个实验场地进行了数据的处理:

422e55fcbb317162c208ca9886707113.png
在实际场景下的划分后的点云信息

图中(a)就是处理后的点云信息。其中(b)是拟合线和地面点信息,(c)是处理得到的最小Z值点,而(d)是非地面点。

本文使用的方法可以快速得到多种特征信息,在实际的定位,导航和建图中都有着一定的贡献。整理不易,希望路过的同学们可以点赞支持一下哈~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值