3D激光slam:LeGO-LOAM---地面点提取方法及代码分析

这篇具有很好参考价值的文章主要介绍了3D激光slam:LeGO-LOAM---地面点提取方法及代码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

地面点提取方法

LeGO-LOAM中前端改进中很重要的一点就是充分利用地面点,本片博客主要讲解 如何进行地面点提取

如下图所示,相邻的两个scan的同一列,打在地面上,形成两个点A和B。
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析

它们的垂直高度差为h,这个值在理想情况(雷达水平安装,地面是水平的)接近于0
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
水平距离差d
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
和水平面的夹角为
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
如果为地面点,在理想情况下,这个角点接近0.

但是雷达的安装不会完全水平,并且地面也不是平的,因此这个角度会大于0,LeGO-LOAM设置的是10°。
即小于10°被判断为地面点

这种地面点的提取算法有些过于简单,还可以结合激光雷达安装高度,等其它信息进行判断。例如下面这种情况,也会被判断为地面点:
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析

代码分析

LeGO-LOAM的地面提取的代码在 imageProjection.cppgroundRemoval 函数

    void groundRemoval(){
        size_t lowerInd, upperInd;
        float diffX, diffY, diffZ, angle;

lowerInd, upperInd 是相邻scan上点的索引值
diffX, diffY, diffZ, angle 是 dx dy dz 水平角

        for (size_t j = 0; j < Horizon_SCAN; ++j){//遍历水平方向的点 360/0.2 1800个点
            for (size_t i = 0; i < groundScanInd; ++i){//groundScanInd 为8  地面点不能在上面

嵌套两个for循环, 列要在前面,因为要计算同一列的值

第一行,遍历水平方向的点 360/0.2 1800个点
第二行,groundScanInd 为8 地面点不能在上面

                lowerInd = j + ( i )*Horizon_SCAN;//下面的点
                upperInd = j + (i+1)*Horizon_SCAN;//上面的点

计算的两个点的索引
Horizon_SCAN为1800,

                if (fullCloud->points[lowerInd].intensity == -1 ||
                    fullCloud->points[upperInd].intensity == -1){
                    // no info to check, invalid points
                    groundMat.at<int8_t>(i,j) = -1;//标志位 至-1
                    continue;
                }              

判断两个点是否有效,点无效的话intensity为-1
有一个点无效的话 标志位 至-1

                diffX = fullCloud->points[upperInd].x - fullCloud->points[lowerInd].x;//dx
                diffY = fullCloud->points[upperInd].y - fullCloud->points[lowerInd].y;//dy
                diffZ = fullCloud->points[upperInd].z - fullCloud->points[lowerInd].z;//dz

                angle = atan2(diffZ, sqrt(diffX*diffX + diffY*diffY) ) * 180 / M_PI;//计算水平角度

计算 dx dy dz 和水平角,就是这个公式
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析

                if (abs(angle - sensorMountAngle) <= 10){
                    groundMat.at<int8_t>(i,j) = 1;
                    groundMat.at<int8_t>(i+1,j) = 1;
                }
            }
        }

sensorMountAngle 是 liadr 是和水平面的倾斜角
这里就是把那两个点的水平角,和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;//labelMat 至为 -1 ,不参与后续线特征和面特征的提取
                }
            }
        }

判断完地面点后,再遍历每个点,
如过该点是 地面点或者无效点,则把 labelMat 上的该点标志位至-1 .
labelMat 至为 -1 ,不参与后续线特征和面特征的提取

        //地面点可视化 
        if (pubGroundCloud.getNumSubscribers() != 0){//如果有节点要订阅这个地面点的topic 再进行发布
            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]);//把点加在 地面点点云中  之后会发布出去
                }
            }
        }
    }

最后进行地面点得可视化
如果有节点要订阅这个地面点的topic 再进行发布
遍历0-groundScanInd 上得每个点,判断如果是地面点,则添加该点到 groundCloud 中

之后会被发布出去

发布得在这个地方

        // original dense ground cloud
        if (pubGroundCloud.getNumSubscribers() != 0){
            pcl::toROSMsg(*groundCloud, laserCloudTemp);
            laserCloudTemp.header.stamp = cloudHeader.stamp;
            laserCloudTemp.header.frame_id = "base_link";
            pubGroundCloud.publish(laserCloudTemp);
        }

topic得名称是/ground_cloud

pubGroundCloud = nh.advertise<sensor_msgs::PointCloud2> ("/ground_cloud", 1);

gazebo测试

3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
效果还是挺好得,没有出现异常点

但是由于没有加入高度得判断,在前面里说得这种情况则会出现问题
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析文章来源地址https://www.toymoban.com/news/detail-408470.html

到了这里,关于3D激光slam:LeGO-LOAM---地面点提取方法及代码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeGO-Loam代码解析(一) 项目介绍、论文解读、配置安装

    目录 1.项目介绍 2. 论文解读  LeGO-LOAM:轻量级且地面优化的可变地形激光里程计与建图 2.1 摘要 2.2 介绍 2.3 正文部分1 --- System Review 2.4 正文部分2 --- Segmatation(地面点角面点分离) 2.5  Feature Extraction 正文部分3 --- 特征提取 2.6 Lidar Odom 正文部分4 --- 前端里程计 2.7 Liadr Mapping 

    2024年02月12日
    浏览(25)
  • 从零入门激光SLAM(五)——手把手带你编译运行Lego_loam

    大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激光SLAM,也方便想入门SLAM的同学和小白学习参考,相信看

    2024年01月17日
    浏览(37)
  • 【3D激光SLAM】LOAM源代码解析--laserOdometry.cpp

    ·【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp ·【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp ·【3D激光SLAM】LOAM源代码解析–laserMapping.cpp ·【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 本系列文章将对LOAM源代码进行讲解,在讲解过程中,涉及到论文中提到的部分, 会结

    2024年02月11日
    浏览(56)
  • 【3D激光SLAM】LOAM源代码解析--transformMaintenance.cpp

    ·【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp ·【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp ·【3D激光SLAM】LOAM源代码解析–laserMapping.cpp ·【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 本系列文章将对LOAM源代码进行讲解,在讲解过程中,涉及到论文中提到的部分, 会结

    2024年02月11日
    浏览(28)
  • 【3D激光SLAM】LOAM源代码解析--scanRegistration.cpp

    ·【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp ·【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp ·【3D激光SLAM】LOAM源代码解析–laserMapping.cpp ·【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 本系列文章将对LOAM源代码进行讲解,在讲解过程中,涉及到论文中提到的部分, 会结

    2024年02月11日
    浏览(20)
  • LeGO-LOAM(1):运行LeGO-LOAM

    目录 # 1 安装与编译 ## 1.1 依赖项 ### 1.1.1 ros ### 1.1.2 gtsam ## 1.2 编译 # 2 系统介绍 # 3 运行demo ### 3.1 数据下载 ### 3.2 数据描述 ### 3.3 demo运行 ####(1)运行launch文件 ####(2)播放数据文件 #### (3)demo运行效果 # 4 Stevens data-set ## 4.1 数据下载 ## 4.2 数据说明与播放数据包方式 ## 4.

    2023年04月26日
    浏览(28)
  • LeGo-LOAM 源码解析

    A lightweight and ground optimized lidar odometry and mapping (LeGO-LOAM) system for ROS compatible UGVs. The system takes in point cloud from a Velodyne VLP-16 Lidar (placed horizontal) and optional IMU data as inputs. It outputs 6D pose estimation in real-time. LeGO-LOAM(激光SLAM,IMU+LiDAR),以LOAM为基础,实现与其同等的精度同时大大

    2024年02月09日
    浏览(30)
  • Ubuntu20.04下运行LOAM系列:A-LOAM、LeGO-LOAM、SC-LeGO-LOAM、LIO-SAM 和 LVI-SAM

    在我第一篇博文Ubuntu 20.04配置ORB-SLAM2和ORB-SLAM3运行环境+ROS实时运行ORB-SLAM2+Gazebo仿真运行ORB-SLAM2+各种相关库的安装的基础环境下跑通LOAM系列 首先按照上一篇文章已经安装好了ROS noetic、Eigen3.4.0、OpenCV4.2.0和PCL1.10等三方库,它们的安装不再赘述,另外文章中 使用的数据 已经在

    2024年02月06日
    浏览(49)
  • Ubuntu20.04安装LeGO-LOAM和LIO-SAM

    Ubuntu20.04安装LIO-SAM真是挺折磨人的,填了一路的坑,在此记录分享一下,为大家安装编译算法提供一个全面的参考。 目录 1. GTSAM安装 1.1 GTSAM安装准备 1.1.1 目录/usr/local/lib下清理gatsam 1.1.2 目录/opt/ros/noetic/lib/下清理gtsam 1.2 GTSAM安装过程 2. LIO-SAM算法依赖项安装 3. LeGO-LOAM算法编

    2024年04月28日
    浏览(45)
  • 基于深度学习的人工林地面激光扫描点云立木特征参数提取方法

    Paper题目:A Deep Learning-Based Method for Extracting Standing Wood Feature Parameters from Terrestrial Laser Scanning Point Clouds of Artificially Planted Forest 利用基于三维点云的技术量化立木和立木参数,可以在林业生态效益评估和立木培育和利用中发挥关键作用。随着光探测与测距(LiDAR)扫描等三维信

    2024年02月05日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包