lego-loam学习笔记(二)

news/2024/11/2 3:37:14/

前言:

对于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<int8_t>(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<int8_t>(i,j) = 1;groundMat.at<int8_t>(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<int8_t>(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<int8_t>(i,j) = 1;groundMat.at<int8_t>(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<int8_t>(i,j) == 1 || rangeMat.at<float>(i,j) == FLT_MAX){labelMat.at<int>(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<int8_t>(i,j) == 1)groundCloud->push_back(fullCloud->points[j + i*Horizon_SCAN]);}}}

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

三、总结

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


http://www.ppmy.cn/news/20156.html

相关文章

python本科毕业设计基于神经网络的虚假评论识别系统源码,含模型及数据

主要函数&#xff1a; 1.corpusprocess原始语料处理函数 2.train_word2vec生成word2vec向量 3.generate_id2wec获得索引的w2id,和嵌入权重embedding_weights 4.prepare_data 数据预处理 完整代码下载地址&#xff1a;python本科毕业设计基于神经网络的虚假评论识别系统源码 代…

MyBatis-Plus知识快速入门

文章目录1.MyBatis-Plus简介2.入门案例2.1开发环境2.2创建测试数据库和表2.3创建SpringBoot工程2.4创建实体类以及lombok的使用2.5添加mapper2.6加入日志功能3.基本的CRUD3.1BaseMapper3.2插入3.3删除3.4修改3.5查询4.通用Service4.1创建Service接口和实现类5.常用注解5.1Table…

Android OpenCV(二)主体识别 位置检测

前言 工作中遇到需要通过OpenCV找到图片主体体积占图片百分比的比例&#xff0c;这里做一个问题解决思路的记录。该方面新手小白&#xff0c;有不对的地方可以评论指出哈 。 重要API Sobel算法 Sobel 计算参考文章 索贝尔算子是计算机视觉领域的一种重要处理方法。 主要用于…

基于Java+SpringBoot+Vue前后端分离小区管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《Spring家族及…

【华为上机真题】密码要求

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

PHP反序列化新手入门学习总结

最近写了点反序列化的题&#xff0c;才疏学浅&#xff0c;希望对CTF新手有所帮助&#xff0c;有啥错误还请大师傅们批评指正。 php反序列化简单理解 首先我们需要理解什么是序列化&#xff0c;什么是反序列化&#xff1f; PHP序列化&#xff1a;serialize() 序列化是将变量…

如何炼就数据分析的思维?

目录 前言结构化思维假说演绎思维指标化思维维度分析思维 前言 面对数据异常&#xff0c;我们经常会出现“好像是A原因引起的&#xff1f;”“貌似和B原因也相关&#xff1f;““有可能是 C操作不当“的主观臆测。 或者&#xff0c;拿到一个分析议题&#xff0c;分析”11 月销售…

单板硬件设计:存储器

在单板设计中&#xff0c;无论是涉及到一个简易的CPU、MCU小系统或者是复杂的单板设计&#xff0c;都离不开存储器设计&#xff1a; 1、存储器介绍 存储器的分类大致可以划分如下&#xff1a; ROM和RAM指的都是半导体存储器&#xff0c;ROM在系统停止供电的时候仍然可以保持…