LOAM算法详解

2023-11-18

激光SLAM

帧间匹配方法:

  • Point-to-Plane ICP
  • NDT
  • Feature-based Method

回环检测方法:

  • Scan-to-Scan
  • Scan-to-Map

LOAM创新点

  • 定位和建图的分离:
    • 里程计模块:高频低质量的帧间运动估计
    • 建图模块:低频高质量的用于点云的精细匹配和配准
  • 基于特征的帧间匹配
  • 提取边缘特征点(edge)和平面特征点(plannar)

激光雷达里程计

特征点提取

第k次扫描(sweep)的点云表示为 P k \mathcal{P}_k Pk,其中一个扫描点 i ∈ P k i\in\mathcal{P}_k iPk,令 S i \mathcal{S}_i Si表示同一扫描中点i周围的点集,点i的曲率:
c i = 1 ∣ S ∣ ∥ X ( k , i ) L ∥ ∥ ∑ j ∈ S , j ≠ i ( X ( k , i ) L − X ( k , j ) L ) ∥ ( 1 ) c_i=\frac{1}{|\mathcal{S}|\lVert X_{\left( k,i \right)}^{L} \rVert}\lVert \sum_{j\in \mathcal{S},j\ne i}{\left( X_{\left( k,i \right)}^{L}-X_{\left( k,j \right)}^{L} \right)} \rVert \qquad\qquad(1) ci=SX(k,i)L1jS,j=i(X(k,i)LX(k,j)L)(1)
根据曲率值对一次扫描中的点进行排序,选取曲率最大的点为边缘特征点(edge point),选取曲率最小的点为平面特征点(plannar point)。边缘特征点的曲率需要大于某个阈值,平面特征点的曲率需要小于某个阈值。已经被选择的特征点附近的点不再考虑,选择的特征点总量也有限制。
另外,还需要排除一些异常值:
1)排除平行于激光扫描平面的点,候选点及其附近点集合拟合的平面与激光线束的夹角不能过小,对应(a);
2)排除遮挡区域边界的点,候选点附近的点集中没有与候选点在激光束方向上间距过大的点,对应(b)。
异常点

特征匹配

基于特征的Scan-to-Scan匹配方法
在开始于 t k t_k tk的第k次sweep扫描完成之后, P k \mathcal{P}_k Pk被重投影到时刻 t k + 1 t_{k+1} tk+1,记作 P ˉ k \bar{\mathcal{P}}_k Pˉk,并存储在3D KD-tree中用于快速检索,以方便之后的匹配。
重投影点云
在第k+1次sweep扫描开始后, P k + 1 \mathcal{P}_{k+1} Pk+1随着接收到更多的点而逐渐增长,按照上一章的提取方法提取边缘特征点和平面特征点。令 E k + 1 \mathcal{E}_{k+1} Ek+1 H k + 1 \mathcal{H}_{k+1} Hk+1分别表示k+1次sweep边缘特征点和平面特征点的集合。从 P ˉ k \bar{\mathcal{P}}_k Pˉk中找到边缘线作为 E k + 1 \mathcal{E}_{k+1} Ek+1中点的对应,平面块作为 H k + 1 \mathcal{H}_{k+1} Hk+1中点的对应。

激光里程计在一次扫描过程中迭代估计自身运动,在每次迭代中,使用当前估计的变换将将 E k + 1 \mathcal{E}_{k+1} Ek+1 H k + 1 \mathcal{H}_{k+1} Hk+1重投影到扫描开始时刻,记为 E ~ k + 1 \tilde{\mathcal{E}}_{k+1} E~k+1 H ~ k + 1 \tilde{\mathcal{H}}_{k+1} H~k+1

下图左侧表示寻找边缘点的对应边缘线的过程,设i为 E ~ k + 1 \tilde{\mathcal{E}}_{k+1} E~k+1中的一个点, i ∈ E ~ k + 1 i\in \tilde{\mathcal{E}}_{k+1} iE~k+1,边缘线由两个点表示。设j是i在 P ˉ k \bar{\mathcal{P}}_k Pˉk中的最近邻点,l是i在j的相邻线束扫描中的最近邻点。(j,l)构成了i的对应边缘线。然后需要根据曲率式(1)验证j和l都是边缘点。这样做的考虑是单个扫描线不能包含来自同一边缘线的多个点,只有一个例外:边缘线平行于扫描平面,这种情况是异常情况不会提取特征点。
下图右侧表示寻找平面点的对应平面块,与边缘点类似,在 P ˉ k \bar{\mathcal{P}}_k Pˉk中找i的最近邻点j。然后在j的相同扫描线和相邻扫描线中分别找i的最近邻点l和m,这保证了三个点不共线。然后根据曲率公式验证是平面点。

在这里插入图片描述
点到线的距离:
d E = ∣ ( X ~ ( k + 1 , i ) L − X ˉ ( k , j ) L ) × ( X ~ ( k + 1 , i ) L − X ˉ ( k , l ) L ) ∣ ∣ X ~ ( k + 1 , i ) L − X ˉ ( k , l ) L ∣ d_{\mathcal{E}}=\dfrac{\left\lvert \left(\tilde{\boldsymbol{X}}^L_{(k+1,i)}-\bar{\boldsymbol{X}}^L_{(k,j)}\right) \times \left(\tilde{\boldsymbol{X}}^L_{(k+1,i)}-\bar{\boldsymbol{X}}^L_{(k,l)}\right)\right\rvert}{\left\lvert\tilde{\boldsymbol{X}}^L_{(k+1,i)}-\bar{\boldsymbol{X}}^L_{(k,l)}\right\rvert} dE= X~(k+1,i)LXˉ(k,l)L (X~(k+1,i)LXˉ(k,j)L)×(X~(k+1,i)LXˉ(k,l)L)
点到面的距离:
d H = ∣ ( X ~ ( k + 1 , i ) L − X ˉ ( k , j ) L ) ⋅ ( X ˉ ( k , j ) L − X ˉ ( k , l ) L ) × ( X ˉ ( k , j ) L − X ˉ ( k , m ) L ) ∣ ∣ ( X ˉ ( k , j ) L − X ˉ ( k , l ) L ) × ( X ˉ ( k , j ) L − X ˉ ( k , m ) L ) ∣ d_{\mathcal{H}}=\dfrac{\left\lvert \left(\tilde{\boldsymbol{X}}^L_{(k+1,i)}-\bar{\boldsymbol{X}}^L_{(k,j)} \right) \cdot \left(\bar{\boldsymbol{X}}^L_{(k,j)}-\bar{\boldsymbol{X}}^L_{(k,l)}\right) \times \left(\bar{\boldsymbol{X}}^L_{(k,j)}-\bar{\boldsymbol{X}}^L_{(k,m)}\right)\right\rvert}{\left\lvert \left(\bar{\boldsymbol{X}}^L_{(k,j)}-\bar{\boldsymbol{X}}^L_{(k,l)}\right) \times \left(\bar{\boldsymbol{X}}^L_{(k,j)}-\bar{\boldsymbol{X}}^L_{(k,m)}\right)\right\rvert} dH= (Xˉ(k,j)LXˉ(k,l)L)×(Xˉ(k,j)LXˉ(k,m)L) (X~(k+1,i)LXˉ(k,j)L)(Xˉ(k,j)LXˉ(k,l)L)×(Xˉ(k,j)LXˉ(k,m)L)
T k + 1 L \boldsymbol{T}^L_{k+1} Tk+1L代表 t k + 1 t_{k+1} tk+1 t t t的雷达位姿变换
点-线残差:
f E ( X ( k + 1 , i ) L , T k + 1 L ) = d E   ,   i ∈ E k + 1 f_{\mathcal{E}}(\boldsymbol{X}^L_{(k+1,i)},\boldsymbol{T}^L_{k+1})=d_{\mathcal{E}}\ ,\ i\in\mathcal{E}_{k+1} fE(X(k+1,i)L,Tk+1L)=dE , iEk+1

点-面残差:
f H ( X ( k + 1 , i ) L , T k + 1 L ) = d H   ,   i ∈ H k + 1 f_{\mathcal{H}}(\boldsymbol{X}^L_{(k+1,i)},\boldsymbol{T}^L_{k+1})=d_{\mathcal{H}}\ ,\ i\in\mathcal{H}_{k+1} fH(X(k+1,i)L,Tk+1L)=dH , iHk+1
将所有点-线残差和点-面残差结合起来得到残差矢量
f ( T k + 1 L ) = d \boldsymbol{f}(\boldsymbol{T}^L_{k+1})=\boldsymbol{d} f(Tk+1L)=d
最小二乘问题:
min ⁡ T k + 1 L F ( x ) = 1 2 ∥ f ( T k + 1 L ) ∥ Ω 2 \min_{\boldsymbol{T}^L_{k+1}} F(x)=\dfrac{1}{2} \left\lVert \boldsymbol{f}(\boldsymbol{T}^L_{k+1}) \right\rVert^2_{\Omega} Tk+1LminF(x)=21 f(Tk+1L) Ω2
其中 ∥ x ∥ Ω 2 = x T Ω x \left\lVert \boldsymbol{x}\right\rVert_{\Omega}^2=\boldsymbol{x}^T\Omega \boldsymbol{x} xΩ2=xTΩx Ω \Omega Ω是权重矩阵,又叫信息矩阵。
该算法为每个特征点分配一个二方权重。与其对应的距离较大的特征点被分配较小的权重,距离大于阈值的特征点被认为是异常值并分配零权重。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LOAM算法详解 的相关文章

  • MFC读取Excel(一)

    软件 vs2013 程序功能 MFC读取Excel里的第一个单元格的值 步骤 第一步 创建基于对话框的MFC工程 第二步 添加库 添加Excel类库 在工程名上右键 选择 添加 类 或者点击菜单栏的 项目 gt 添加类 选择 TypeLib
  • Windows下常用的快捷方式

    罗列出windows下我最常用的快捷键 逐步补充 打开我的电脑 win e

随机推荐

  • Kubesphere部署三高商城组织架构说明

    KubeSphere部署三高商城组织架构说明 一 创建企业空间 1 使用ws manager用户登录KubeSphere web控制器 创建企业空间 2 登出控制台 然后以 ws admin 身份重新登录 在企业空间设置中 选择企业空间成员
  • uniapp开发支付宝小程序之上传小程序

    市面上很多关于微信小程序通过uinapp开发的文档 支付宝的文档较少 这里做一下补充 为后浪提供参考 一给窝里giaogiao 通过hbuilder编码小程序后不能直接在支付宝开发者工具中上传 应该先通过HBuilder编译一下在操作 步骤
  • ERP中HR模块的操作与设计--开源软件诞生26

    赤龙ERP的EHR功能讲解 第26篇 用日志记录 开源软件 的诞生 进入地址 点亮星星 祈盼着一个鼓励 博主开源地址 码云 https gitee com redragon redragon erp GitHub https github
  • 51单片机——ADC模数转换、DAC数模转换PWM C语言入门编程

    目录 ADC XPT2046 1 ADC模数转换 数码管上显示AD模块采集电位器的阻值 热敏的温度值 光敏的光值 DAC PWM 1 DAC数模转换 DAC PWM 模块上的指示灯DA1呈呼吸灯效果 由暗变亮再由亮变暗 ADC ADC an
  • 聊聊技术专家谈阿里云史诗级故障

    序言 什么是技术专家 其实也是很懂 是做的时间足够长呢 还是说经历的厂比较多 还是说纸上谈兵比较牛逼 专家嘛 大家都懂的 只会弹别人 喔 是谈别人 原来不是弹 有本事技术专家谈谈自己呗 风言风语 阿里云出现史诗级故障 处理的时间足够长 然后
  • 过去式加ed的发音_「初中英语语法大全」不规则动词过去式和过去分词巧记方法...

    动词的过去式和过去分词是初中英语教学中的重点 而有些动词的不规则变化是这些重点中的难点 但这些不规则变化也不是毫无规律可循的 现将初中英语中一些常用的不规则动词变化介绍如下 一 原形 过去式和过去分词的词形和读音都相同的单词 结尾字母一般是
  • 计算机视觉项目实战(一)、图像滤波和图像混合 Image Filtering and Hybrid Images

    图像滤波和图像混合 Image Filtering and Hybrid Images 项目要求 项目原理 主要函数 my imfilter 函数解释 输入参数 输出参数 主要实现步骤 gen hybrid image 函数解释 输入参数
  • java中JSONArray 遍历方式

    第一种 java8 遍历JSONArray 拼接字符串 public static void main String args JSONArray jSONArray new JSONArray JSONObject jb new JSON
  • Linux中退出编辑模式的命令

    vi 文件 回车后就进入进入编辑模式 按 o 进行编辑 编辑结束 shift 退出编辑模式 然后输入退出命令 1 保存不退出 w 保存文件但不退出vi 编辑 w 强制保存 不退出vi 编辑 w file 将修改另存到file中 不退出vi
  • CNN可视化技术 -- CAM & Grad-CAM详解及pytorch简洁实现

    文章目录 前言 1 CAM Class Activation Map 2 Grad CAM 3 PyTorch中的hook机制 4 Grad CAM的PyTorch简洁实现 参考资料 前言 CNN中的特征可视化大体可分为两类 细节信息 ZF
  • Redis实战篇一 (短信登录)

    Redis企业实战 黑马点评 项目整体架构 项目部署 后端部署 前端部署 短信登陆 基于Session实现登录 集群的Session共享问题 基于Redis实现共享session登录 解决状态登录刷新的问题 登录拦截器的优化 本期学习路线
  • SVN导出版本增量包

    showlog 选择一个或者多个版本 右键 Compare with previous version 选择一个或者多个文件 右键 Expore selection to 最后导出的文件会有其相应的路径
  • 全志F1C200s芯片处理器参数介绍

    F1C200s是全志的一款高度集成 低功耗的移动应用处理器 可用于多种多媒体音视频设备中 全志F1C200s基于ARM 9架构 集成了DDR 它支持高清视频解码 包括H 264 H 263 MPEG 1 2 4等 它还集成了音频编解码器和I
  • cucumber测试_延长Cucumber测试生命周期

    cucumber测试 总览 本文涉及两件事 我如何使beforeAll和AfterAll生命周期事件在Cucumber中发生 在Cucumber测试运行之前 如何使用TestContainers设置被测系统 不 您正在尝试在博客上进行SEO
  • node.js升级报错digital envelope routines unsupporte最简单解决方案

    背景 本地将nodejs 16升级成nodejs18运行时报错digital envelope routines unsupported 报错 Error error 0308010C digital envelope routines u
  • cytoscape插件下载_cytoscape五步曲之三:安装各种插件

    软件安装我就不多说了 直接去官网下载即可 请务必下载3 x版本 我讲的是 最新版教程 本次讲解如何给cytoscape安装插件 cytoscape本身是一个平台 学者可以在上面开发各种各样功能的插件实现不同的分析需求 类似于R语言这个平台
  • mysql中varbinary什么意思_MySQL中的数据类型binary和varbinary详解

    前言 BINARY和VARBINARY与 CHAR和VARCHAR类型有点类似 不同的是BINARY和VARBINARY存储的是二进制的字符串 而非字符型字符串 也就是说 BINARY和VARBINARY没有字符集的概念 对其排序和比较都是
  • 当我被酱香拿铁刷屏后......

    这两天 朋友圈刮起了酱香风 跨界里的新宠儿酱香拿铁卖爆了 不得不说瑞幸是懂跨界的 短短一天时间 酱香拿铁已售出 542 万杯 销售额超一亿元 谁能想到年轻人的第一杯茅台竟然是瑞幸卖出去的 这可能也是星巴克最无语的一天吧 瑞幸的订单长到可以直
  • python多进程cpu的占用率很低_Python 中的进程池与多进程

    封面图片来源 沙沙野 内容概览 进程池 进程池和多进程的性能测试 进程池的其他机制 进程池的回调函数 进程池 如果有多少个任务 就开启多少个进程 实际上并不划算 由于计算机的 cpu 个数是非常有限的因此开启的进程数量完全和 cpu 个数成
  • LOAM算法详解

    激光SLAM 帧间匹配方法 Point to Plane ICP NDT Feature based Method 回环检测方法 Scan to Scan Scan to Map LOAM创新点 定位和建图的分离 里程计模块 高频低质量的帧