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

大家好呀,我是一个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 特征匹配,输出TransformationupdateTransformation();
// 2.4 融合IMU坐标TransformationintegrateTransformation();

二、函数解析

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

  • 作用:匹配角和面特征点,计算位姿
  • 输入:
     laserCloudSurfLastsurfPointsFlatlaserCloudCornerLastcornerPointsSharp
    
  • 输出: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.mzph.cn/pingmian/35910.shtml

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

相关文章

秒的单位换算(秒,毫秒,微秒,纳秒,皮秒)

时间单位英文换算秒&#xff08;s&#xff09;second1s【秒】毫秒&#xff08;ms&#xff09;millisecond1s【秒】 1000ms【毫秒】微秒&#xff08;μs&#xff09;microsecond1ms【毫秒】 1000μs【微秒】纳秒&#xff08;ns&#xff09;nanosecond1μs【微秒】 1000ns【纳…

【Linux】进程信号_2

文章目录 八、进程信号1. 信号 未完待续 八、进程信号 1. 信号 除了可以使用 kill 命令和键盘来生成信号&#xff0c;我们也可以使用系统调用来生成信号。 kill函数可以对指定进程发送指定信号。 使用方法&#xff1a; int main(int argc, char *argv[]) {if (argc ! 3) {c…

Python数据分析之-Oracle数据库连接

文章目录 cx_Oracle 介绍cx_Oracle运行原理cx_Oracle 安装linux环境安装windows环境安装 cx_Oracle 使用单独使用结合Pandas使用 参考资料 cx_Oracle 介绍 cx_Oracle 8是一个Python扩展模块&#xff0c;它提供了对Oracle数据库的访问能力。以下是cx_Oracle 8的一些关键特性和功…

【华为OD机试|01】最远足迹(Java/C/Py/JS)

目录 一、题目介绍 1.1 题目描述 1.2 备注&#xff1a; 1.3 输入描述 1.4 输出描述 1.5 用例 二、Java代码实现 2.1 实现思路 2.2 详细代码 2.3 代码讲解&#xff1a; 三、C语言实现 3.1实现步骤 3.2 实现代码 3.3 代码详解 四、Python实现 4.1 实现步骤 4.2 …

项目实战系列三: 家居购项目 第六部分

文章目录 &#x1f308;Ajax检验注册名&#x1f308;Ajax添加购物车&#x1f308;上传与更新家居图片&#x1f308;作业布置&#x1f34d;会员登陆后不能访问后台管理&#x1f34d;解决图片冗余问题&#x1f34d;分页导航完善 &#x1f308;Ajax检验注册名 需求分析 注册会员时…

推动多模态智能模型发展:大型视觉语言模型综合多模态评测基准

随着人工智能技术的飞速发展&#xff0c;大型视觉语言模型&#xff08;LVLMs&#xff09;在多模态应用领域取得了显著进展。然而&#xff0c;现有的多模态评估基准测试在跟踪LVLMs发展方面存在不足。为了填补这一空白&#xff0c;本文介绍了MMT-Bench&#xff0c;这是一个全面的…

js获取字符串中超链接,并加样式跳转页面

效果图 主要代码&#xff1a;js this.$nextTick(() > {// 给循环出来的div标签加个id为let container document.getElementById("linkTo");container.innerHTML container.textContent.replace(/(https?:\/\/[^\s])/g, function (match) {var link documen…

【微前端-Single-SPA、qiankun的基本原理和使用】

背景 在实际项目中&#xff0c;随着日常跌倒导致的必然墒增&#xff0c;项目会越来越冗余不好维护&#xff0c;而且有时候一个项目会使用的其他团队的功能&#xff0c;这种跨团队不好维护和管理等等问题&#xff0c;所以基于解决这些问题&#xff0c;出现了微前端的解决方案。…

蚁群算法求解TSP问题

一、基本原理 一只蚂蚁从一个城市出发&#xff0c;在访问其他城市时留下信息素踪迹。其他蚂蚁沿着这些踪迹并开辟自己的路径。信息素在访问频率较高的路径上积累得更密集&#xff0c;这种密度增加了其他蚂蚁选择该路径的可能性。 import randomdistances [[0, 2, 5, 7],[2, 0…

权限字符串的结构

权限字符串在Unix和Linux文件系统中用于表示文件和目录的访问权限,通常由ls -l命令生成的输出中看到,权限字符串由10个字符组成 ,其结构如下: 文件类型字符 用户权限 组权限 其他用户权限 [1] [2-4] [5-7] [8-10]1. 文件类型字符 -&#xff1a;普通文件 (R…

FFmpeg 系列

&#x1f4da; 此篇文章是先引入ffmpeg的概念以及主要的功能&#xff0c;后面会根据每一个特点进行详解&#xff0c;喜欢ffmpeg的可以持续关注。 ffmpeg是什么&#xff1f; FFmpeg 是一个开源的跨平台音视频处理工具&#xff0c;它可以用来录制、转换以及流化音视频内容。具体…

Trex测试仪使用

公司测试仪器紧张&#xff0c;打算安装Trex做简单的测试。如下下载最新的trex工程。 rztrex:~$ sudo mkdir /opt/trex rztrex:~$ cd /opt/trex/ rztrex:/opt/trex$ rztrex:/opt/trex$ sudo wget --no-cache https://trex-tgn.cisco.com/trex/release/latest --no-check-certif…

antd内容超过固定长度就显示...,鼠标移入则显示提示

结合antd的Tooltip组件&#xff0c;如果内容超过固定长度就显示…&#xff0c;鼠标移入则显示提示 /*** 结合antd的Tooltip组件&#xff0c;如果内容超过固定长度就显示...&#xff0c;鼠标移入则显示提示* param param0* returns*/ const EllipsisText ({ text }) > {con…

前端项目vue3/React使用pako库解压缩后端返回gzip数据

pako仓库地址&#xff1a;https://github.com/nodeca/pako 文档地址&#xff1a;pako 2.1.0 API documentation 外部接口返回一个直播消息或者图片数据是经过zip压缩的&#xff0c;前端需要把这个数据解压缩之后才可以使用&#xff0c;这样可以大大降低网络数据传输的内容&…

解决qiankun项目与子应用样式混乱问题

背景 qiankun项目用的是Vue2Antdesign2&#xff0c;但其中一个子应用用的是Vue3Antdesign4。集成之后发现子应用的样式混乱&#xff0c;渲染的是Antdesign2的样式。 解决 以下步骤在子应用里操作 1. 在main.js引入ConfigProvider &#xff0c;在app全局注册ConfigProvider …

【异常错误】归一化导致的图像生成颜色偏差

由于归一化的问题&#xff0c;会导致生成的图像颜色偏差严重&#xff0c;例如会导致生成的颜色偏红黑色、淡色、青色.. 如果你生成的图像整体感官上没有问题&#xff0c;但是却在颜色上有很大偏差&#xff0c;那么很大可能就是你训练的时候归一化的程序不对 ImageFolder的实现…

Depth Anything V1,V2论文解读

Depth Anything 引言Depth Anything V1标注方法学习标注图像发挥未标注图像的潜力语义辅助感知 Depth Anything V2总体框架流程 引言 在深度估计领域&#xff0c;单目深度估计&#xff08;Monocular Depth Estimation&#xff0c;MDE&#xff09;是指利用单个摄像头拍摄的图像…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十八)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 28 节&#xff09; P28《27.网络连接-Http请求数据》 案例&#xff1a; 这里不懂后端假设服务器的前端小伙伴就需要课程源码资料了…

深度之眼(二十五)——研究生学习计划安排

文章目录 一、前言二、结构安排和规划2.1 夯实基础2.2 分方向训练&#xff08;待&#xff09;2.3 进阶训练 三、其他 一、前言 课题组这边是需要对机器视觉有所要求吧&#xff0c;也就是CV方向。这一届研三师兄也都是在大厂拿到30W的年薪了&#xff0c;也是需要拥抱深度学习这…

java收徒 java辅导 java试用期辅导 java零基础学习

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末报名辅导&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家…