loam 框架流程描述

article/2025/8/30 20:06:20

前端流程(scanRegistration.cpp)

多线激光雷达即有多个激光发射器同时工作,如常见的 Velodyne16,就是共有 16 个激光发射器,一般这些发射器竖排排列,然后一起水平旋转。
激光雷达在一定的时间内旋转一圈,即一帧的点云数据。值得注意的是,在一帧时间内激光雷达的载体也会运动,因此,一帧数据内会包括不同时间的点云,这也就是激光雷达的运动畸变。
下图是kitti数据集的坐标系表示
在这里插入图片描述

loam论文中的框图

在这里插入图片描述

1.scanRegistration.cpp

main函数:

  1. 建立scanRegistration节点
  2. 设置雷达线束(64),最小范围(5m)
  3. 订阅雷达原始点云信息,发布的信息包括有效点云、大曲率角点、稍微大曲率角点、小曲率面点,稍微小曲率面点,主要处理过程在原始点云信息的回调函数

laserCloudHandler回调函数

  1. ros格式转pcl点云,移除空点及车体范围内的点
  2. 角度补偿, 计算起始角度和结束角度,确保相差2 PAI
  3. 遍历点云,根据俯仰角计算对应的扫描线,根据水平角计算当前角度距离起始角度的差值,根据差值计算时间戳,用于后面进行运动补偿,将点云存储进对应的扫描线。这里注意intensity属性整数部分存储的是扫描线的索引,小数部分是相对于起始时刻的时间
  4. 提取特征并均匀化。首先计算所有点云曲率,将每个扫描线分为6等分,将角点曲率从小到大排序,每段取最大的两个作为大曲率角点,次大的20个作为稍微大曲率的角点,取曲率最小的4个作为面点,对面点进行下采样滤波
  5. 发布点云信息,包括包括有效点云、大曲率角点、稍微大曲率角点、小曲率面点,稍微小曲率面点

2.异常点筛选

这一步其实是需要放在特征提取之前做的
但是这块A-loam中没有,借助lio-sam中featureExtraction.cpp讲解

首先遍历所有点云,取出相邻两点的距离信息,计算两个点的列数id差。由于在筛选时会去除空点,因此防止两个有效点云虽然相邻但是间隔很远。
根据深度信息筛选下图中b的情况,根据相邻点的距离差,筛选下图中a的情况。
在这里插入图片描述

3.激光运动畸变及补偿

激光雷达的一帧数据是过去一段时间而非某个时刻的数据,在这一帧时
间内的激光雷达或者其载体通常会发生运动,因此,这一帧数据的原点都不一致,运动补偿的目的就是把所有的点云补偿到某一个时刻,这样就可以把本身在过去100ms 内收集的点云统一到一个时间点上去
P s t a r t = T s t a r t c u r r e n t ∗ P c u r r e n t P_{start}=T_{start_current} * P_{current} Pstart=TstartcurrentPcurrent
运动补偿需要知道每个点该时刻对应的位姿$ T_{start_current $,通常有几种做法:

  1. 如果有高频里程记,可以比较方便的获取每个点相对起始扫描时刻的位姿
  2. 如果有 imu,可以方便的求出每个点相对起始点的旋转
  3. 如果没有其他传感器,可以使用匀速模型假设,使用上一个帧间里程记的结果作为当前两帧之间的运动,同时假设当前帧也是匀速运动,也可以估计出每个点相对起始时刻的位姿

代码对应laserOdometry.cpp
去畸变
TransformToStart()函数 将输入的点云坐标转到起始时刻

  1. 输入点云信息
  2. 对于旋转,使用Eigen的四元数插值得到当前时刻的四元数
  3. 对于平移,使用根据时间占当前周期的比例直接相乘
  4. 由于kitti里面是补偿过的,因此这里比例都设置为1
  5. 输出去畸变后的点云

TransformToEnd()函数 将输入的点云坐标转到结束时刻

  1. 先调用TransformToStart()将输入点云转到起始时刻
  2. 根据帧到起始时刻到结束时刻的位姿信息,将点云转到结束时刻

主函数

  1. 定义节点laserOdometry
  2. 设置参数
  3. 订阅scanRegistration发布的角点、面点、有效点云5个topic,每个回调函数只负责把输入存入数组
  4. 发布5个topic,分别是
  5. while循环实现激光里程计

while循环

  1. 触发一次回调函数(spinOnce)
  2. ros消息转为pcl格式
  3. 第一帧的点云信息不处理,只加入kd tree。对第二帧开始构建约束求解,对于点线约束,构建当前点和上一帧两点的距离约束,两个点分别是kd tree中最近的点和不同扫描线上较近的点;对于点面约束,找的三个面点分别是kd tree最近的点、相同扫描线较近的点、不同扫描线较近的点。
  4. 根据约束构建ceres优化器,迭代4次进行优化
  5. 递推更新相对世界系的位姿
  6. 将当前帧点云加入kd tree,发布雷达里程计信息、路径、将较平坦的面点、曲率较大的角点、有效角点转为ros发布,用于后端

后端流程

laserMapping.cpp

main()函数

建立laserMapping节点,加载体素滤波参数,订阅前端点云和里程计信息,回调函数就是把信息存进队列。将后端数组复位,建立process线程进行处理

process()函数

  1. 里程计、点云、面点队列的首个元素时间戳都和角点队列的首个元素时间戳对齐,然后将首个元素都转为ros格式并弹出,清空角点数组以保证每次处理的实时性
  2. 将前端得到的位姿转到后端地图下 T m a p _ c u r = T m a p _ o d o m ∗ T o d o m _ c u r T_{map\_cur}=T_{map\_odom} * T_{odom\_cur} Tmap_cur=Tmap_odomTodom_cur
    得到当前帧在地图中的初始估计
  3. 根据初始估计确定在栅格中的索引,每个栅格是505050的正方体,宽21个(x)、高21个(y)、深11个(z),一共4851个。如果当前点的栅格太靠左,就将整体右移,将第i-1个栅格点云放到第i个,靠近右边界就左移,其他两个轴也这样操作,这样移动完后会空出一列。经过这个步骤保证当前的位姿步骤栅格地图的边缘。
  4. 取出当前栅格附近 250250150的局部小地图做当前帧的配准,取出小地图的栅格id以及点云信息。
  5. 对当前帧的角、面特征下采样。下采样后如果还有足够的特征,进行优化。对于点线约束,先将角点点云投影到当前坐标系下,使用kd tree从小地图找到5个最近的角点,最远的必须小于1m,然后计算这个五个点的协方差矩阵,使用eigen进行特征值分解,如果最大特征值大于次大特征值的3倍,就认为是线特征,可以添加到ceres优化器。对于点面约束,同样kd tree搜索5个最近面点,计算其法向量,然后判断每个点到平面的距离,都小于0.2则将当前点和法向量送入优化器,开始优化。
  6. 进行位姿更新
    T m a p _ o d o m = T m a p _ c u r ∗ T o d o m _ c u r − 1 T_{map\_odom}=T_{map\_cur} * T_{odom\_cur}^{-1} Tmap_odom=Tmap_curTodom_cur1
  7. 将当前帧优化后的点云加到局部地图,将特征投影到地图坐标系,计算其在栅格中的位置,得到索引后加入一维数组。
  8. 对局部地图进行体素滤波,然后发布位姿、轨迹、tf、点云信息。

http://chatgpt.dhexx.cn/article/jY7FKiTI.shtml

相关文章

LOAM 梳理

LOAM 梳理 本篇文章对 LOAM 框架进行宏观的解析,暂不涉及内部具体的实现原理。 整个流程 整个 LOAM 框架分为三个主要部分,分别为 Registration(特征提取)、Odometry(特征匹配)和 Mapping(建…

LOAM 原理及代码实现介绍

文章目录 LOAM 原理及代码实现介绍LOAM技术点LOAM整体框架退化问题代码结构 LOAM 原理及代码实现介绍 paper:《Lidar Odometry and Mapping in Real-time》 LOAM的参考代码链接: A-LOAM A-LOAM-Notes LOAM-notes 使用传感器介绍: 如果没有电机旋转&am…

学习LOAM笔记——特征点提取与匹配

学习LOAM笔记——特征点提取与匹配 学习LOAM笔记——特征点提取与匹配1. 特征点提取1.1 对激光点按线束分类1.2 计算激光点曲率1.3 根据曲率提取特征点 2. 特征点匹配2.1 scan-to-scan中的特征点匹配2.2 scan-to-map中特征点匹配 3. 补充 学习LOAM笔记——特征点提取与匹配 兜…

Loam算法详解(配合开源代码aloam)

参考论文:LOAM: Lidar Odometry and Mapping in Real-time 代码:A-LOAM Ubuntu 18.04 ROS Melodic eigen 3.3.4 PCL 1.8.1 ceres 2.0 A-LOAM 配置 LOAM算法是激光slam中一个经典的开源框架,结合qin tong 博士的开源代码a-loam&#xff…

无人驾驶学习笔记 - LOAM 算法论文核心关键点总结

目录 1、框架 2、特征点提取 3、点云去畸变 4、帧间匹配 特征关联与损失函数计算 a 线特征 b 面特征 5、运动估计 6、建图 7、姿态融合 8、LOAM 优劣势 9、参考连接 1、框架 loam框架核心是两部分,高频率的里程计和低频率的建图。两种算法处理。里程计通…

LOAM简介

LOAM 文章目录 LOAMLOAM系统流程1、特征提取(1)按线数分割(2)计算曲率(3)删除异常点(4)按曲率大小筛选特征点 2、帧间匹配(1)特征关联与损失函数计算&#xf…

SLAM算法 -LOAM框架分析(一)

LOAM框架分析 算法简介1 激光里程计(高频率)1.1 计算曲率1.2 筛选特征1.3 问题建模1.3.1 损失函数1.3.2 运动补偿 1.4 优化求解1.5 定位输出 2 环境建图(低频率)2.1 问题模型2.2 PCA特征 参考文献 算法简介 LOAM的整体思想就是将复杂的SLAM问题分为:1. 高频的运动估…

顶级高手常用的16个思维模型

“养成一个掌握多元思维模型的习惯是你能做的最有用的事情”,投资家、巴菲特的黄金拍档查理 芒格认为:“思维模型是你大脑中做决策的工具箱。你的工具箱越多,你就越能做出最正确的决策。”与您分享查理芒格的12种思维模型,对做决…

100种思维模型之大脑系统思维模型-52

上世纪60年代,美国神经学家保罗 D 麦克莱恩(Paul D. MacLean)首次提出“三脑一体”假说,他认为人的大脑是蜥蜴-松鼠-猴子合体的隐喻,代表了进化发展不同阶段的遗传。 复旦大学管理学院的项保华教授对此有一个精彩的总结…

思维模型 SWOT分析

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知 1 模型故事 一个技术岗位想转产品经理(个人职业规划SWOT的应用),做的SWOT分析,进而可以量化自己转型的成本: 小王想在自己的居住小…

【转载】100个思维模型(不一定都适用,各取所需)

世界上最有智慧的人是怎样理性思考的?他们在商业活动和个人生活中是如何做决策的? 95岁的智慧老人查理芒格的“多元思维模型”,相信大家都不陌生。 他提倡要学习在所有学科中真正重要的理论,并在此基础上形成所谓的“普世智慧”&…

思维模型 GROW

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知 1 模型故事 推广故事:近期A公司开发一个产品活动的 促销方案,进行了简单的业务流程梳理后便开始了小范围的推广。首先让公司里的同事每人每天拉取20个新人。经过10天…

100种思维模型之细节效率思维模型-74

提及细节效率?也许很多人会有疑问,“效率”怎么跟“细节”挂上钩,注重“细节”了,还能有“高率”? 是的,细节能提高效率,注意某些细节,效率事半功倍。 01、何谓细节效率思维模型 一…

100种思维模型之长远思考思维模型-63

古语有云:“人无远虑,必有近忧!” 任正非说:不谋长远者,不足以谋一时! 长远思考思维,一个提醒我们要运用长远眼光,树立宏大目标,关注长期利益的思维模型 01何谓长远思考…

提升自己的认知-思维模型

之前写过有关思维的博客思维方式与认知,关于思维方式与做事方式有所思考。最近看到如何判断一个人是杰出的聪明人还是平庸的普通人?的文章,感触颇深。现摘录有所感触的思维方式。 一、思维模型 1、每周“5小时”学习法则 参考:https://36kr.com/p/5130501.html?from=aut…

100种思维模型之坏模因思维模型-44

啥是模因? 简单说,就是 文化基因, 也就是别人传输给我们的 观念。 我们生活中到处都是 模因, 比如,“跟我不一致的观点都是错的”,属于敌对型模因,让别的观念没办法进入你的大脑&#xf…

40个经典思维模型(附下载)

导读: 思维模型可以称之为知识背后的知识,道理背后的道理,现象背后的真相。可以指导我们以一当百,更加本质的看透事物和现象,并更加本质的解决问题。 如果我们要学习的东西有限,那么我会推荐每个人优先去学…

100种分析思维模型(1)

公众号后台回复“图书“,了解更多号主新书内容 作者:林骥 来源:林骥 最近,我在读《穷查理宝典》这本书,其中提到查理芒格应用大约 100 种多元思维模型,他孜孜不倦地对投资问题进行充分的准备、广泛的研究和…

常见思维模型汇总(一)

文章目录 一、SWOT模型1、简介 2、SWOT模型的拆解二、波士顿5力模型1、简介2、缺陷3、分解3.1.供应商的议价能力(Bargaining Power of Suppliers)3.2.购买者的议价能力 (Bargaining Power of Buyers)3.3.新进入者的威胁&#xff0…

12个顶级思维模型,非常值得一看!

“思维模型是你大脑中做决策的工具箱。你的工具箱越多,你就越能做出最正确的决策。”不管你是领导团队,还是制定市场战略,思维模型都能够在其中发挥至关重要的作用。 打造多元思维模型的想法来自查理芒格:“思维模型是你大脑中做决策的工具箱。你的工具箱越多,你就越能做…