在使用激光雷达进行定位和导航的过程中,由于地面信息在相邻帧间几乎不怎么发生变化,所以,总是会使用地面信息来进行结果的优化。例如LeGO-LOAM中的地面优化:
yc zhang:LeGO-LOAM原理深度解析zhuanlan.zhihu.com为了能够很好的检测出激光雷达数据中的地面信息,我们使用了一种地面点云快速分割的方法,达到实时稳定且精确的地面分割的效果。
论文:Fast segmentation of 3d point clouds for ground vehicles
源代码:linefit_ground_segmentation
由于开源的代码可能运行起来会遇到些许的问题,为了方便起见,我把已经调试过的代码和论文放在了road_detecting中。
如果觉得这篇文章对您有帮助的话,希望可以点赞支持一下哈~
论文研读
我们在进行代码的阅读之前,需要先对于论文进行研读,理清整个文章的脉络。
针对于本篇文章,我们可以将其划分为以下几个方面:
1、点云获取
我们首先获取激光雷达传感器传来的数据,将其转变为欧式距离表示的3D点云数据集。这个是将激光雷达数据进行处理,获转化为自己需要的数据的方法。
数据获取的这一步有一些需要满足的条件:
- 雷达需确保能够扫描到地面,VLP-16雷达的竖直平面视角为[
],需根据这个视角,确保地面可以被扫描到;
- 地面和非地面数据最好可以有个很明显的竖直维度的落差,以便可以区分地面和非地面。
满足上面两个条件后,可以对采集的数据进行处理。
2、点云有序化处理
首先,将整个的三维笛卡尔坐标系进行另一种形式的表示,我们进行点云的划分,将其从无序的点云划分为有序的点云。划分的标准有以下两个:segment,bins。
segment:
我们将整个笛卡尔坐标系中的
则,我们可以将整个
这样的话,我们就可以将整个的
而,为了能够很好的将点进行segment的定位,我们使用以下的方式:
这样的话,我们就可以对于每一个点进行
因此,可以对于所有的点云进行如下的划分:
其中,
bins:
在前面,我们进行了segment的划分,也就是说,将整个点云划分为
我们针对于segment
我们可以设定两个距离参数
因此,我们可以对于该点在
通过该操作,就可以将一个扇面划分为多个扇环。
这样,无序点云就被有序化处理了。
3、降维
我们在前面进行了点云的有序化处理,现在需要进行最小z点的选取,来进行地面点的筛选。
其中,这里的数据处理都是在一个segment中进行的。
因为,我们前面是进行了
这样的话,我们就进行了降维的操作,将一个三维数据
经过这一步的操作后,可以将三维点云转化为二维点云,实现降维操作。但是这一步和普通的降维操作不一样,它并不是单纯的减少一个维度,而是将水平方向的平方根作为维度,实现的降维操作。该操作可以保留竖直维度的信息,同时又不损失水平维度的信息,是一种不错的降维方法。
4、直线拟合
我们在前面一步得到了
针对于这些离散点,我们设定了四个条件来进行直线拟合的判断,其中直线表示为
直线的斜率
直线的斜率的绝对值不应该超过一个设定的阈值
直线在z轴的截距
当斜率m小于最小斜率的时候,
既
因为,当斜率很小的时候,说明基本上地面是平整的,不是上下坡这种情况,而截距
直线拟合的误差
我们拟合直线的均方根误差不应该超过设定的误差阈值
这个是直线拟合,也就是最小二乘法的必要过程,我们需要对于拟合的直线进行拟合程度的判断来确保是否对于离散点拟合成功。
第一个点到直线的距离
我们找到segment中bins的第一个点,然后,判断该点到已经存在的直线的距离,这个距离不能超过设定的一个阈值,如果不超过这个距离,则我们就认为这个点时可以被拟合到直线上的,如果超过这个距离,则就以该点为基准,重新开始一条直线。这样的话,就可以进行不同直线的划分。
这一步是判别两个地面点云的距离是否比较接近。如果距离超出阈值的话,说明这两个点可能离得比较远,没有必要把这两个点拟合到一起。
地面点的筛选
在前面,我们拟合了许多条直线,其中这些直线,是在一个segment中按照bins的顺序进行处理的。我们可以看到的是一条直线可能不止一条bins,但是直线之间是不会出现重叠的。因此,我们就可以通过拟合到的直线来进行地面点的筛选。
我们根据筛选出来的直线和自己设定的参数,来进行点到直线的z轴的距离。这样的话,算出来的就是同d情况下的z的差距。这样的话,是可以进行地面点的筛选的。在阈值范围内的点就是我们挑选出来的地面点。
得到最终的地面点
我们在前面进行地面点的筛选,得到的是d-z平面的数据。因此,我们需要转化到三维笛卡尔坐标系下的距离。通过前面的点的筛选,然后再通过最开始的点云的index,我们可以从这里逆推回去点,得到属于地面点的三维数据点。
这样的话,我们就得到了最终的三维地面数据点。
在隧道上坡场景下,也可以很好的分割地面点云。这种方法和平常的降维方法相比,能够更加精确的提取地面点云,是一种在地面信息有竖直维度变化的情况下更适用的降维方法。
从图中可以看到绿色的点,蓝色的点,红色的点,白色的线段。
从图中,我们可以进行上面四种颜色的划分。这四种颜色的划分,也正好与前面论文中的内容对应。
原型点:
绿色的点为我们提取出来的原型点:prototype points
这个原型点是我们通过在d-z平面内选择最小z点所构成的。所以,我们可以看到,基本上这个点相当于一次去重的操作。如果,某个x和y所对应的z不止一个,则,选出最小z点,来作为原型点。这样的话,就可以初步的筛选出地面点。
非地面点
蓝色的点为障碍物点,这一点很好理解。从图中可以看出,障碍物点,基本上都处于最小z点的上方。不会是地面点的。
白色的线段
我们在选出原型点之后,对于其在d-z平面进行直线的拟合,会得到多条拟合后的d-z平面的线。而我们看到的白色的直线,就是所得到的对应segment中满足设定条件的直线拟合线。
地面点
在得到了d-z平面的拟合直线之后,对于所有的原型点进行点到直线的距离的判断。我们选取在z轴领域内的最小距离点作为我们认为的地面点。最终体现出来的就是红色的点。
为了能够更加明显的区分这些信息,我换了个实验场地进行了数据的处理:
图中(a)就是处理后的点云信息。其中(b)是拟合线和地面点信息,(c)是处理得到的最小Z值点,而(d)是非地面点。
本文使用的方法可以快速得到多种特征信息,在实际的定位,导航和建图中都有着一定的贡献。整理不易,希望路过的同学们可以点赞支持一下哈~