当前位置: 首页 > news >正文

【论文阅读】Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping

这篇论文提出了一个改进的地图生成方法,使用的传感器是激光雷达,所以这里也划分到激光SLAM的范畴下了。论文提出的框架的改进主要在两方面,一方面是使用了基于体素化的GICP匹配成本因子,采用这种方法可以让更多的点参与配准误差的计算,另一方面是激光雷达和IMU的紧密耦合,这里的紧耦合不仅体现在前端,而且在后端的因子图优化中也大量体现了紧耦合。

基于体素化的GICP匹配成本因子

对于GICP,它本身是一种ICP的改进,也可以叫VGICP,而ICP本身是一种点云配准的方法,个人感觉点云配准就是激光SLAM里面求位姿变化的叫法,NDT和ICP本身都是一种配准的方法。GICP的输入是两帧的点云,将点云利用体素来实现一个离散化,对落入体素内的点的分布情况进行处理,可以得到内部点的高斯分布,那么按照一般SLAM求位姿的思路,我们的流程大概率是列一个残差的式子,然后寻找一个位姿变化T来最小化这个残差,在GICP里面作者使用的是下面这样一个残差的表示方法:
在这里插入图片描述
所以这个eM就是GICP的成本因子,我们可以理解为是总的残差里面的一部分,就像VINS一样,当然这篇论文也使用了IMU,所以自然而然也会涉及到IMU的预积分,它也会作为总的残差中的一部分参与优化,关于预积分的内容这里就不提了,额外提一嘴,论文中喜欢用factor这个单词来表示因子图中的联系,或者说是残差项里面的一部分。

激光雷达和IMU的紧密耦合

紧密耦合主要是体现在论文所设计的框架中,这个框架包括四部分,下面简单理顺一下框架。
在这里插入图片描述
首先是预处理的部分,在这部分中论文作者提到了一个偏移校正的方法,采用时间戳来进行校正。原文的意思个人感觉是给点和体素格子都赋一个时间戳,如果点的时间戳和体素格子的时间戳的偏差超过了一定的范围,就将点移动到另一个体素格子里面去,从而避免在体素进行整合的时候出现明显的偏差。但是论文并没有对这个体素格子的时间戳做说明,个人感觉应该就是进行了一个离群点的剔除,只不过这里离群的定义是依赖于时间戳,由于激光雷达的扫描方法,落入同一个体素格子的点的时间戳应该是大差不差的,用这个时间来做剔除,从而减小噪声点对体素化的负面影响。

论文中对于每一帧都采用了三个量来记录:
在这里插入图片描述
在里程计的部分论文并没有重点记录前端的细节,而是着重讲了后端因子图的部分,关于因子图的维护,论文划分了一个类似滑动窗口的窗口,叫做fixed-lag,在窗口内的帧和关键帧以及窗口外的使用的残差是不一样的,采用这种方法主要是为了限制计算的开销,已经被边缘化掉的帧就当做不需要处理的内容,只为当前帧提供辅助信息。IMU的约束则只放在了最新的两帧之间。
在这里插入图片描述

除此之外,在区分关键帧的时候,论文采用了一种重合率的方法,如果重合率小于阈值,就认为是一个新的关键帧,关键帧也存在被剔除的情况,当重合率过小或者关键帧过多的时候,就会剔除冗余的关键帧,关键帧过多的情况是用了一个评分机制,剔除得分最低的关键帧。
在这里插入图片描述
局部建图的部分,只要有帧被边缘化掉,就会进入局部建图模块,进入之后会根据重合率,将这一帧划分到一个子图的结构中,这样做是为了减小优化变量的数量。一旦子图中的帧数达到阈值或第一帧和最后一帧之间的重叠小于阈值,使用LM优化器执行因子图优化并根据优化结果将帧合并为一个子图。个人的理解就是将几帧整合为了一个子图,然后让子图作为一个建图的基本单位,但是不太明白的地方在于为什么这里是对所有帧的处理,是不是说激光SLAM里面不存在关键帧这个概念,论文用这种整合为子图的方法很像是在用子图来作为关键帧。
在这里插入图片描述
最后全局建图模块对位姿进行校正以获得全局一致的建图结果。因为论文使用的这种因子图的连接方法,会产生一个很密集的因子图,而且存在隐式闭环的可能性,而且可能会丢失信息,因此论文在子图的两边,加了两帧,叫做端点,它们保存子图中第一帧和最后一帧相对于子图位姿的状态的传感器状态,所以,子图的两个端点关于子图的变化可以用下面公式描述:
在这里插入图片描述
所以总的来说,这篇论文的中心就在于这个因子图的组织形式,采用的连接方法以及子图、端点的设计,都是服务于因子图优化,但个人没怎么了解过因子图优化,一些论文的内容看的不是很清楚,后面有机会等补一下因子图的内容之后再回来修改。

参考链接:
论文讲解及翻译
GICP算法

相关文章:

  • Java8 特性(二):Optional 相关操作
  • y119.第七章 服务网格与治理-Istio从入门到精通 -- Istio流量治理快速入门(五)
  • 以字符串的形式返回文件名扩展名
  • 机械硬盘数据拷贝
  • 计算机毕业设计java毕设项目之ssm中医药配方小程序
  • 【C++】内存管理 + 初识模板
  • 猿创征文|我的技术成长之路,一名Python学者在CSDN的蜕变
  • java基于ssm的高校人事员工工资管理系统
  • QML初学者教程
  • 速卖通详情接口接口调用示例
  • 记录Kettle连不上mysql8
  • 远程Debug远端服务器JVM配置
  • Java中的内部类,你真的理解吗
  • Home Depot 使用 SUSE Rancher 和 K3s 升级 2300 个零售边缘位置
  • 处方识别 易语言代码
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Android系统模拟器绘制实现概述
  • C语言笔记(第一章:C语言编程)
  • java8 Stream Pipelines 浅析
  • JavaScript-Array类型
  • JavaScript设计模式系列一:工厂模式
  • jdbc就是这么简单
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MYSQL 的 IF 函数
  • Nacos系列:Nacos的Java SDK使用
  • oldjun 检测网站的经验
  • PAT A1017 优先队列
  • pdf文件如何在线转换为jpg图片
  • SQL 难点解决:记录的引用
  • Vue实战(四)登录/注册页的实现
  • vue--为什么data属性必须是一个函数
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 从输入URL到页面加载发生了什么
  • 规范化安全开发 KOA 手脚架
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于HAProxy的高性能缓存服务器nuster
  • 简单实现一个textarea自适应高度
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 以太坊客户端Geth命令参数详解
  • 运行时添加log4j2的appender
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ###STL(标准模板库)
  • #define,static,const,三种常量的区别
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $().each和$.each的区别
  • (C++20) consteval立即函数
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验