从零入门激光SLAM(十三)——LeGo-LOAM源码超详细解析3

news2024/11/19 14:29:39

大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激光SLAM,也方便想入门SLAM的同学和小白学习参考,相信看完会有一定的收获。如有不对的地方欢迎指出,欢迎各位大佬交流讨论,一起进步。博主创建了一个科研互助群Q:951026257,欢迎大家加入讨论。

Lego_Loam包括了Image projection、Feature association、MapOptmization、Transform Fusion四个部分,下面博主将按照算法的逻辑顺序对代码中的重要函数进行讲解。本节是解析Feature association文件中的特征匹配部分。
该专栏的其他章节链接如下
从零入门激光SLAM系列——总目录与更新情况_kiss icp-CSDN博客

一、Feature Extraction

经过上一节的点云特征提取,我们已经获得了稳健的角点和面点如下图所示,下面将介绍如何配准得到位姿Feature Association部分的源码解析

 1. Feature Extraction特征提取
// 1.1 点云运动补偿
        adjustDistortion();
// 1.2 计算平滑度
        calculateSmoothness();
// 1.3 标记遮挡点
        markOccludedPoints();
// 1.4 提取特征
        extractFeatures();
// 1.5 发布点云
        publishCloud();
2. Feature Association特征匹配
    if (!systemInitedLM) {
            // 2.1 检查系统初始化,点云投影到结束点
                checkSystemInitialization();
                return;}
// 2.2 更新初始猜测位置
        updateInitialGuess();
// 2.3 特征匹配,输出Transformation
        updateTransformation();
// 2.4 融合IMU坐标Transformation
        integrateTransformation();

二、函数解析

2.1 publishCloudsLast

  • 作用:将当前帧点云投影到结束点并发布,作为下一帧匹配的对象,(匹配之前需要有一个匹配对象点云)
  • 输入:
     cornerPointsSharp角特征  
     cornerPointsLessSharp缓角特征  
     surfPointsFlat面特征  
     surfPointsLessFlat缓面特征 
     adjustCloud修正点云              
    
  • 输出:
     /laser_cloud_corner_last
     /laser_cloud_surf_last
     /outlier_cloud_last
     /laser_odom_to_init
    
  • 代码:
    void publishCloudsLast(){
    //把特征点云投影到每帧的结尾时刻
    updateImuRollPitchYawStartSinCos();
    int cornerPointsLessSharpNum = cornerPointsLessSharp->points.size();
    for (int i = 0; i < cornerPointsLessSharpNum; i++) {
      TransformToEnd(&cornerPointsLessSharp->points[i], &cornerPointsLessSharp->points[i]); }
      int surfPointsLessFlatNum = surfPointsLessFlat->points.size();
    for (int i = 0; i < surfPointsLessFlatNum; i++) {
      TransformToEnd(&surfPointsLessFlat->points[i], &surfPointsLessFlat->points[i]);}
    //用KD树存储当前帧点云,为后续匹配做准备
    pcl::PointCloud<PointType>::Ptr laserCloudTemp = cornerPointsLessSharp;
    cornerPointsLessSharp = laserCloudCornerLast;
    laserCloudCornerLast = laserCloudTemp;
    laserCloudTemp = surfPointsLessFlat;
    surfPointsLessFlat = laserCloudSurfLast;
    laserCloudSurfLast = laserCloudTemp;
    laserCloudCornerLastNum = laserCloudCornerLast->points.size();
    laserCloudSurfLastNum = laserCloudSurfLast->points.size();
    if (frameCount >= skipFrameNum + 1) {
              frameCount = 0;
    //发布上一帧outlier
    pubOutlierCloudLast.publish(outlierCloudLast2);
    //发布上一帧线特征
    pubLaserCloudCornerLast.publish(laserCloudCornerLast2);
    //发布上一帧面特征
    pubLaserCloudSurfLast.publish(laserCloudSurfLast2);}
    
    下图中红色为前一帧,绿色为当前帧

    2.2 updateInitialGuess

  • 作用:把当前IMU数值作为位姿先验
  • 输入:IMU数值
  • 输出:transformCur位姿矩阵
    // 如果IMU有旋转,则更新变换矩阵以反映新的旋
    void updateInitialGuess(){
    if (imuAngularFromStartX != 0 || imuAngularFromStartY != 0 || imuAngularFromStartZ != 0){transformCur[0] = - imuAngularFromStartY;  // 根据Y轴旋转更新变换矩阵的第一个元素
    transformCur[1] = - imuAngularFromStartZ;  // 根据Z轴旋转更新变换矩阵的第二个元素
    transformCur[2] = - imuAngularFromStartX;  // 根据X轴旋转更新变换矩阵的第三个元素}
    // 如果IMU有移动,则更新变换矩阵以反映新的平移
    if (imuVeloFromStartX != 0 || imuVeloFromStartY != 0 || imuVeloFromStartZ != 0)
    {transformCur[3] -= imuVeloFromStartX * scanPeriod;  // 根据X轴移动更新变换矩阵的第四个元素
    transformCur[4] -= imuVeloFromStartY * scanPeriod;  // 根据Y轴移动更新变换矩阵的第五个元素
    transformCur[5] -= imuVeloFromStartZ * scanPeriod;  // 根据Z轴移动更新变换矩阵的第六个元素 }   }
    

    2.3 updateTransformation

  • 作用:匹配角和面特征点,计算位姿
  • 输入:
     laserCloudSurfLast
     surfPointsFlat
     laserCloudCornerLast
     cornerPointsSharp
    
  • 输出:transformCur位姿矩阵
  • 代码

    void updateTransformation(){
         //检查特征点
         if (laserCloudCornerLastNum < 10 || laserCloudSurfLastNum < 100)
             return;
    //  面特征匹配
         for (int iterCount1 = 0; iterCount1 < 25; iterCount1++) {
             laserCloudOri->clear(); 
             coeffSel->clear(); 
             findCorrespondingSurfFeatures(iterCount1); 
          if (laserCloudOri->points.size() < 10)
                 continue;
             // 通过面特征的匹配,计算变换矩阵
             if (calculateTransformationSurf(iterCount1) == false)
                 break;
         }
    // 线特征匹配
         for (int iterCount2 = 0; iterCount2 < 25; iterCount2++) {
    
             laserCloudOri->clear();
             coeffSel->clear();
    
             findCorrespondingCornerFeatures(iterCount2); 
             if (laserCloudOri->points.size() < 10)
                 continue;
             if (calculateTransformationCorner(iterCount2) == false) 
                 break;
         }
     }

详情请见...
从零入门激光SLAM(十三)——LeGo-LOAM源码超详细解析3 - 古月居 (guyuehome.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1867236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

grpc学习golang版( 四、多服务示例)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写Client客户端五、测试六、示例代码 一、前言 多服务&#xff0c;即一个rpc提供多个服务给外界调用…

js+php 上传文件到服务器

https://andi.cn/page/621473.html

沙盒在数据防泄密领域意义

在信息化快速发展的今天&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;数据泄密事件频发&#xff0c;给企业的安全和发展带来了巨大威胁。SDC沙盒防泄密系统&#xff0c;作为一种创新的数据防泄密解决方案&#xff0c;正逐渐在数据防泄密领域发挥着越来越重要的…

计算机网络期末复习(大题+小题)

计算机网络期末复习 一、计算机网络概述 Point 1 计算机网络就是以传输信息为基本目的&#xff0c;用通信线路和通信设备将多个计算机连接起来的计算机系统的集合。由自治的计算机互联起来的结合体。 Point 2 按网络的覆盖范围进行分类 &#xff08;1&#xff09;局域网*…

[leetcode]k-th-smallest-in-lexicographical-order 字典序的第K小数字

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int getSteps(int curr, long n) {int steps 0;long first curr;long last curr;while (first < n) {steps min(last, n) - first 1;first first * 10;last last * 10 9;}return steps;}int find…

深度学习11-20

1.神经元的个数对结果的影响&#xff1a; &#xff08;http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html&#xff09; &#xff08;1&#xff09;神经元3个的时候 &#xff08;2&#xff09;神经元是10个的时候 神经元个数越多&#xff0c;可能会产生…

海南云亿商务咨询有限公司解锁抖音电商新纪元

在数字时代的浪潮中&#xff0c;电商行业如日中天&#xff0c;其中抖音电商更是异军突起&#xff0c;成为无数商家和创业者关注的焦点。而在这股汹涌的电商洪流中&#xff0c;海南云亿商务咨询有限公司凭借其专业的服务、深厚的行业背景和独特的创新理念&#xff0c;成为了抖音…

【Python机器学习】分享、离散化、线性模型与树

数据表示的最佳方法不仅取决于数据的语义&#xff0c;还取决于所使用的模型种类。线性模型与基于树的模型&#xff08;比如决策树、梯形提升树、随机森林&#xff09;是两种成员很多同时又非常常用的模型&#xff0c;他们在处理不同的特征表示时就具有非常不同的性质。 下面是…

数据结构与算法笔记:高级篇 - 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?

概述 上篇文章我们讲到&#xff0c;如何用位图、布隆过滤器&#xff0c;来过滤重复数据。本章&#xff0c;我们再讲一个跟过滤相关的问题&#xff0c;如果过滤垃圾短信&#xff1f; 垃圾短信和骚扰电话&#xff0c;我想每个人都收到过吧&#xff1f;买房、贷款、投资理财、开…

【JavaScript】流程控制和函数

目录 一、分支语句 1、if语句&#xff1a; 2、switch语句&#xff1a; 二、循环语句 1、while循环语句 2、for循环语句 三、函数声明 1、function 函数名(形参列表){ 函数体 } 2、var 函数名function(形参列表){函数体} 一、分支语句 1、if语句&#xff1a; if(表达式){ }else …

20240626每日AI-----------创建你的第一个文心智能体平台Agent

载体 文心智能体平台Agent 注册 统一使用百度账户登录即可 创建智能体 登录后即可在左边菜单进行点击&#xff0c;创建智能体。 创建官方智能体 编写你的智能体名称等等信息

MCU复位时GPIO是什么状态?

大家一定遇到过上电或者复位时外部的MOS电路或者芯片使能信号意外开启&#xff0c;至此有经验的工程师就会经常关心一个问题&#xff0c;MCU复位时GPIO是什么状态&#xff1f;什么电路需要外部加上下拉&#xff1f; MCU从上电到启动&#xff0c;实际可分为复位前和复位后、初始…

0X JavaSE-- 并发编程(ThreadGroup、JMM、volatile、synchronized、线程池)

ThreadGroup 线程组可以对线程进行批量控制。 每个 Thread 必然存在于一个 ThreadGroup 中&#xff0c;Thread 不能独立于 ThreadGroup 存在。执行 main()方法的线程名字是 main。如果在 new Thread 时没有显式指定&#xff0c;那么默认将父线程&#xff08;当前执行 new Thr…

Win11 恢复快捷方式箭头

Win11 恢复快捷方式箭头 前言步骤 前言 本作者习惯了当文件类型是快捷方式时左下角有个小箭头。但无语的是&#xff0c;我重装了 Win 11 系统后&#xff0c;快捷方式中没有了小箭头&#xff0c;当真抓狂。啊&#xff01;&#xff01;&#xff01;查了那么多资料&#xff0c;很多…

Spring Cloud Gateway 与 Nacos 的完美结合

在现代微服务架构中&#xff0c;服务网关扮演着至关重要的角色。它不仅负责路由请求到相应的服务&#xff0c;还承担着诸如负载均衡、安全认证、限流熔断等重要功能。Spring Cloud Gateway 作为 Spring Cloud 生态系统中的一员&#xff0c;以其强大的功能和灵活的配置&#xff…

浏览器扩展V3开发系列之 chrome.commands 快捷键的用法和案例

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 chrome.commands API 允许开发者使用快捷键来执行特定的命令。 在使用 chrome.commands API 之前必须…

明星周边物品交易购物系统

摘 要 随着明星文化的兴起和粉丝经济的蓬勃发展&#xff0c;明星周边产品的市场需求日益增长。明星周边物品包括各种与明星相关的商品&#xff0c;如T恤、海报、手办、签名照等&#xff0c;它们成为粉丝们表达对明星喜爱和支持的方式之一。通过“星光璀璨”来形象化地表达明星…

基于PHP的酒店管理系统(改进版)

有需要请加文章底部Q哦 可远程调试 基于PHP的酒店管理系统(改进版) 一 介绍 此酒店管理系统(改进版)基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端jquery插件美化。系统角色分为用户和管理员。系统在原有基础上增加了注册登录注销功能&#xff0c;增加预订房间图片…

植物大战僵尸杂交版v2.1最新整合版,附PC端+安卓端+iOS端安装包+修改器+安装教程!

嘿&#xff0c;大家好&#xff0c;我是阿星&#xff0c;今天要跟大家聊聊一款游戏&#xff0c;它不是那种让人眼花缭乱的大制作&#xff0c;也不是那种能让人回味无穷的艺术作品&#xff0c;但它在阿星心里&#xff0c;绝对是神作中的佼佼者。没错&#xff0c;它就是《植物大战…

6.22套题

B. Dark 题意&#xff1a;每次能在数列中能使相邻两个数-1&#xff0c;求当数列没有连续非0值的最小贡献 解法:设表示前i个数中前i-1个数是否为0&#xff0c;当前数是j的最小贡献。表示i1以后减掉d的最小贡献。 C. 幸运值 D. 凤凰院真凶