lego-loam学习笔记(二)
创始人
2024-05-19 20:57:28
0

前言:

对于lego-loam中地面点提取部分的源码进行学习。

地面点提取在src/imageProjection.cpp中的函数groundRemoval()。内容比较少,容易理解。

        size_t lowerInd, upperInd;float diffX, diffY, diffZ, angle;

lowerInd表示低线数的点云;

upperInd表示相邻的高线数的点云;

diffX,diffY,diffZ分别表示两个点之间x,y,z之间的绝对值差值;

angle表示根据论文推导出来的两点之间的角度。

如上图所示。

一、地面点提取部分

        // groundMat// -1, no valid info to check if ground of not//  0, initial value, after validation, means not ground//  1, ground

源码部分对于属于不同种类的点云进行了分类:

-1是无效点;

0是非地面点;

1表示地面点。

        for (size_t j = 0; j < Horizon_SCAN; ++j){for (size_t i = 0; i < groundScanInd; ++i){lowerInd = j + ( i )*Horizon_SCAN;upperInd = j + (i+1)*Horizon_SCAN;if (fullCloud->points[lowerInd].intensity == -1 ||fullCloud->points[upperInd].intensity == -1){// no info to check, invalid pointsgroundMat.at(i,j) = -1;continue;}diffX = fullCloud->points[upperInd].x - fullCloud->points[lowerInd].x;diffY = fullCloud->points[upperInd].y - fullCloud->points[lowerInd].y;diffZ = fullCloud->points[upperInd].z - fullCloud->points[lowerInd].z;angle = atan2(diffZ, sqrt(diffX*diffX + diffY*diffY) ) * 180 / M_PI;if (abs(angle - sensorMountAngle) <= 10){groundMat.at(i,j) = 1;groundMat.at(i+1,j) = 1;}}}

这里的两个for循环是对于地面点的全部遍历,也是论文中提到的将一般图像处理的矩阵应用于点云。

Horizon_SCAN表示1800,因为水平分辨率是0.5,所以是1800个点;

groundScanInd应该是8(如果是16线激光lidar),表示射向地面部分的发射器。

具体表示如下图所示:

根据上图,对于lowerInd和upperInd的赋值也就一目了然。

                if (fullCloud->points[lowerInd].intensity == -1 ||fullCloud->points[upperInd].intensity == -1){// no info to check, invalid pointsgroundMat.at(i,j) = -1;continue;}

这里如果判断是无效点,就将groundMat矩阵的值赋-1。

                diffX = fullCloud->points[upperInd].x - fullCloud->points[lowerInd].x;diffY = fullCloud->points[upperInd].y - fullCloud->points[lowerInd].y;diffZ = fullCloud->points[upperInd].z - fullCloud->points[lowerInd].z;angle = atan2(diffZ, sqrt(diffX*diffX + diffY*diffY) ) * 180 / M_PI;if (abs(angle - sensorMountAngle) <= 10){groundMat.at(i,j) = 1;groundMat.at(i+1,j) = 1;}

这部分就是计算angle,如果小于10度。表明是地面点,将这两个点都赋值为1。

二、移除地面点

        for (size_t i = 0; i < N_SCAN; ++i){for (size_t j = 0; j < Horizon_SCAN; ++j){if (groundMat.at(i,j) == 1 || rangeMat.at(i,j) == FLT_MAX){labelMat.at(i,j) = -1;}}}

这部分的作用是遍历所有的点,发现是地面点和发射后没有返回的点就将它们标志为-1。

        if (pubGroundCloud.getNumSubscribers() != 0){for (size_t i = 0; i <= groundScanInd; ++i){for (size_t j = 0; j < Horizon_SCAN; ++j){if (groundMat.at(i,j) == 1)groundCloud->push_back(fullCloud->points[j + i*Horizon_SCAN]);}}}

这里是通过前面的groundMat矩阵来判断是否为地面点,如果是地面点。即标志位为1,那么就将该点push_back进groundCloud容器中。

三、总结

lego-loam中地面点提取部分比较容易理解,之后使用地面点提取,可以参考这个源码。

相关内容

热门资讯

黄豆生长观察日记 黄豆生长观察日记(通用20篇)  时间如快马般匆匆,一天又过去了,我们对人和事情也有了新的看法,何不...
胡萝卜先生的胡子童话作文 胡萝卜先生的胡子童话作文3篇  无论是身处学校还是步入社会,大家对作文都不陌生吧,写作文是培养人们的...
我家乡的杏花旅游节作文 我家乡的杏花旅游节作文  我的家乡在祖国的大西北——新疆吐鲁番市,被称为“水果之乡、旅游胜地”。每年...
改变自己的作文 改变自己的作文8篇  在生活、工作和学习中,大家总免不了要接触或使用作文吧,借助作文人们可以实现文化...
观察植物日记作文300字 观察植物日记作文300字(精选32篇)  一天将要结束了,我们一定有不少所感触的事情吧,需要进行好好...
正确认识自己作文 正确认识自己作文10篇正确认识自己作文1  是一朵花,就应该点缀春天,而不是想着结出硕果;  是一棵...
我成长的故事作文 有关我成长的故事作文九篇  在学习、工作或生活中,大家总少不了接触作文吧,通过作文可以把我们那些零零...
泡黄豆的观察日记350字 泡黄豆的观察日记350字(精选6篇)  转眼一天又过去了,我相信大家都是有收获的,请好好地记录下在日...
壁虎观察日记 壁虎观察日记(精选23篇)  转眼一天又过去了,今天我们都做了什么了呢?这时候,最关键的日记怎么能落...
蚂蚁童话作文400字 【必备】蚂蚁童话作文400字3篇  无论在学习、工作或是生活中,大家最不陌生的就是作文了吧,作文是人...
我喜欢的小动物作文 我喜欢的小动物作文(精选40篇)  在日常学习、工作或生活中,大家对作文都不陌生吧,作文是人们以书面...
蚂蚁的观察日记 蚂蚁的观察日记 (精选21篇)  一天的时间眼看就要结束了,想必有很多难忘的瞬间吧,此时此刻我们需要...
提升自己作文 提升自己作文(通用49篇)  在平时的学习、工作或生活中,大家都跟作文打过交道吧,作文根据体裁的不同...
猫和老鼠 猫和老鼠猫和老鼠1  有一只小花猫,她叫喵喵。她非常挑食,这个也不爱吃,那个也吃不下。她有个邻居,是...
我和童话人物的一天作文 我和童话人物的一天作文(精选26篇)  在日复一日的学习、工作或生活中,大家都写过作文,肯定对各类作...
战争中的孩子的作文 战争中的孩子的作文(精选35篇)  无论在学习、工作或是生活中,大家都接触过作文吧,作文可分为小学作...
我学会了煎鸡蛋作文 我学会了煎鸡蛋作文(精选104篇)  在日常学习、工作或生活中,大家或多或少都会接触过作文吧,作文要...
说说我的心里话作文500字 说说我的心里话作文500字(通用59篇)  在平平淡淡的学习、工作、生活中,大家都经常接触到作文吧,...
未来科幻作文 未来科幻作文(精选20篇)  在现实生活或工作学习中,大家一定都接触过作文吧,作文是经过人的思想考虑...
军训的感受优秀作文 军训的感受优秀作文10篇  在平平淡淡的学习、工作、生活中,大家都写过作文,肯定对各类作文都很熟悉吧...