经典文献阅读之--Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping(紧耦合3D激光雷达)

article/2025/9/2 22:12:52

0. 简介

传统的地图生成方法一般是依靠Lidar和IMU结合的,但是问题在于,目前Lidar和IMU的紧耦合主要集中在前端里程计,基本没有涉及到后端全局优化以及建图的融合。为此文章《Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping》提出了一种改进的地图生成方法,并设计一个在所有阶段(前端里程计+后端全局优化和建图),IMU和LIDAR都紧耦合的SLAM系统。这是作者实验室的官网,后续应该其后续工作应该会在官网中查到。

Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping

1. 文章贡献

本文的LiDAR-IMU紧耦合方法贯穿所有状态估计阶段。是目前为止第一个在全局轨迹规划上同时利用了LiDAR和IMU的约束的工作。与此前的LiDAR-IMU SLAM框架相比有以下几点不同:

  1. 不同于此前的LiDAR SLAM从点云中提取平面和边缘特征来进行匹配,本文使用体素化的GICP匹配代价因子(voxelized GICP matching cost factor),可以在GPU上并行计算;
  2. 本方法中的紧耦合里程计模块使用固定滞后平滑;
  3. 激光雷达和IMU的紧密耦合,这里的紧耦合不仅体现在前端,而且在后端的因子图优化中也大量体现了紧耦合。

2. 详细内容

系统框架如下图,主要包括4个模块,预处理模块,前端里程计模块,局部建图模块,全局建图模块,所有模块都是LIDAR-IMU紧耦合的。里程计估计(即前端)模块鲁棒地估计传感器运动,并提供最新传感器状态的初始估计。通过后续的局部映射模块对估计的传感器状态进行细化,并将多个局部帧合并为一个子地图。然后,全局映射模块优化子地图位姿,使全局配准误差最小化,同时保持地图的一致性。我们通过多线程并行运行这些模块。

在这里插入图片描述

将在估计模块中被估计的传感器状态 x t x_t xt定义为

x t = [ T t , v t , b t ] T x_t = [T_t, v_t, b_t]^T xt=[Tt,vt,bt]T

其中 T t = [ R t ∣ T t ] ∈ S E ( 3 ) T_t = [R_t| T_t]∈SE(3) Tt=[RtTt]SE(3)为传感器位姿, v t ∈ R 3 v_t∈\mathbb{R}^3 vtR3为速度, b t = [ b t a , b t ω ] ∈ R 6 b_t = [b^a_t, b^ω_t]∈\mathbb{R}^6 bt=[bta,btω]R6为IMU加速度和角速度偏差。从激光雷达点云 P t P_t Pt和IMU测量值(线性加速度 a t a_t at和角速度 ω t ω_t ωt)估计传感器状态的时间序列。请注意,我们将LiDAR点云转换为IMU坐标框架,并且为了效率和简单性,将它们视为统一的传感器坐标框架。

这部分的具体操作即为进行了一个离群点的剔除,只不过这里离群的定义是依赖于时间戳,由于激光雷达的扫描方法,落入同一个体素格子的点的时间戳应该是大差不差的,用这个时间来做剔除,从而减小噪声点对体素化的负面影响。

2.1 LIDAR匹配残差因子

匹配代价因子约束2个传感器位姿( T i \mathbf{T}_i Ti T j \mathbf{T}_j Tj),使点云( P i \mathcal{P}_i Pi P j \mathcal{P}_j Pj)之间的匹配代价最小。选择voxelized GICP (VGICP)代价[20]作为匹配代价,它是适用于GPU计算的广义ICP[21]的变体。

VGICP将每个输入点 p k ∈ P i p_k∈\mathcal{P}_i pkPi建模为高斯分布 p k = ( μ k , C k ) p_k = (μ_k, C_k) pk=(μk,Ck),根据当前点 p k p_k pk的邻近点计算协方差矩阵 C k C_k Ck,而上一帧点云 P j \mathcal{P}_j Pj,假设已经经过建图模块融合了的话,则 P j \mathcal{P}_j Pj就已经被体素化,每个体素也是通过一个高斯分布来表示的,这个高斯分布是通过该体素内的所有点的高斯分布计算出来的,当前点云的 p k p_k pk点通过位姿变换:
T i − 1 T j \mathbf{T}^{-1}_i\mathbf{T}_j Ti1Tj
上一帧点云中的某个体素也符合正态分布:
p k ′ = ( μ k ′ , C k ′ ) p'_k = (μ'_k, C'_k) pk=(μk,Ck)
构成一组数据关联。如果我们把这组数据关联对应的残差记为
d k = μ k ′ − T i − 1 T j μ k d_k=μ'_k-\mathbf{T}^{-1}_i\mathbf{T}_jμ_k dk=μkTi1Tjμk

然后,基于GICP分布到分布的距离定义 P i \mathcal{P}_i Pi P j \mathcal{P}_j Pj之间的匹配代价 e M e^M eM,点云利用体素来实现一个离散化,对落入体素内的点的分布情况进行处理,可以得到内部点的高斯分布,那么按照一般SLAM求位姿的思路,我们的流程大概率是列一个残差的式子,然后寻找一个位姿变化 T T T来最小化这个残差,在GICP里面作者使用的是下面这样一个残差的表示方法。
在这里插入图片描述
其中 p k ′ = ( µ k ′ , C k ′ ) p'_k =(µ'_k, C'_k) pk=(µk,Ck)是通过查找 P j \mathcal{P}_j Pj的体素图得到的 p k p_k pk对应体素的均值和协方差, d k = µ k ′ − T i j µ k d_k =µ'_k−T_{ij}µ_k dk=µkTijµk µ k µ_k µk µ k ′ µ'_k µk之间的残差。

从公式2的导数中,我们得到一个Hessian因子来约束 T i \mathbf{T}_i Ti T j \mathbf{T}_j Tj之间的相对姿态。值得强调的是,在每次优化迭代中,都在当前线性化点重新评估和线性化 e M e^M eM e M e^M eM就是GICP的成本因子,我们可以理解为是总的残差里面的一部分,就像VINS一样。从而得到比传统SE3相对位姿约束[4]更精确的约束。

2.2 IMU的预积分因子

利用IMU预积分技术[22]有效地将IMU约束融入因子图中。给定IMU测量值( a t a_t at ω t ω_t ωt),在给定IMU测量的情况下,传感器的未来状态可以估计为:
在这里插入图片描述

IMU预积分因子整合了 i i i j j j两个时间步间的系统演化,得到了相对的身体运动约束(详细推导参见[22]):
在这里插入图片描述
IMU预积分因子使系统能够在几何特征不足且 LiDAR 因子可能不足的环境中保持因子图的良好约束。

3. SLAM pipeline

3.1 数据预处理

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

3.2 里程计估计

里程计估计模块通过融合LiDAR和IMU测量值来补偿传感器的快速运动,并鲁棒地估计传感器状态。首先,基于IMU动力学的运动预测将点云数据转换到IMU帧,校正传感器运动引起的点云失真;然后,我们使用预先计算的邻近点来计算每个点的协方差。在点的偏移矫正完成之后,按照下图构建因子图。

…详情请参照古月居


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

相关文章

MD5加密的应用

简单介绍一下MD5加密的使用方法; MD5的全称是Message-Digest Algorithm 5(信息-摘要算法); 特点是不可逆的,一般解密不了; MD5Util工具类: package com.java.util;import java.io.UnsupportedE…

python md5加密解密_python md5加密解密

md5加密以后的字符串长度 我下了一段用JAVA实现MD5加密的算法,不管输入字符串多长,加密后的字符加密后为128位(bit),按照16进制(4位一个16进制数)编码后,就成了32个字符。MD5并不是加密算法zhidao,而是摘要算法。加密算法是可逆的,摘要算法是理专论上不可逆的,详细…

Java MD5 加密工具类

一、MD5简介 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确…

为什么md5不可逆,却还可能被md5免费解密网站解密

md5在网络安全中起到非常重要的作用,它被用于保证数据的完整性,以及数据不被篡改。同时,md5还被用来进行密码加密。一些朋友不了解为什么md5不可逆,却还可能被号称能解密md5的网站解密。因此,有人说md5不够安全&#x…

matlab中进行多行注释,取消

在MATLAB中可以在行首部加 1 %来进行注释, 2 加%%空格来进行划分不同的程序段。 但在进行多行注释时,针对单行进行操作过于麻烦,可以利用快捷键进行多行注释。 可以先选中需要注释的行,然后按“ctrlR”进行注释, 多…

Matlab多行注释单行程序分行写

2019独角兽企业重金招聘Python工程师标准>>> 一、Matlab注释 1)、单行注释:当然是行首加‘%’了。 2)、多行注释: a、选中你要加注释的内容,然后选择工具菜单“text|comment”就可以了, 快捷键是…

funcode游戏实训,java及C/C++,网上整理

软件,常见错误都有。 所有资源可到公众号获取(源码也是),不再直接分享

funcode环境配置(亲测有效)

vmware 虚拟机版本是15.5.1 虚拟机版本链接 win7专业版镜像文件 迅雷(打开迅雷复制即可) ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/ 过程可供参考 vc2012任何版本均可 设置过程: 打…

funcode实验--海底世界(c++实现)

C语言课程设计一海底世界 一、实验内容 海底有若干条鱼,其中若干条相同的鱼向一个方向游动,另一条来回随机游动,由玩家用键盘W A S D控制另外一条游动。 要求如下: 1、 来回游动的鱼,从屏幕左边游进来,…

FunCode太空战机C++实现

仅供交流学习使用,因博主水平有限,有错误欢迎批评指正 作者(即博主本人): Akame Qixisi / Excel Bloonow IDE:Code::Blocks 17.12 编译器需要支持C14或以上标准(Code::Blocks如何设置见附录Ⅰ&…

基于funcode的闯关小游戏(山东省齐鲁软件设计大赛三等奖)给自己留个纪念

背景: (链接文档在最后) 19年的暑假,同学喊我参加山东省齐鲁软件设计大赛,报上名之后有这个funcode课题。d但是从来没有接触过funcode,网上的参考资料也不多,靠着自己摸索和同学交流半懂半做了这…

基于Funcode设计C语言游戏–迷你高尔夫

Funcode设计 文章目录 Funcode设计前言一、Funcode下载地址二、C语言课程设计--迷你高尔夫1.效果图2.部分代码 总结 前言 基于Funcode设计的C语言游戏。 提示:以下是本篇文章正文内容,下面案例可供参考 一、Funcode下载地址 Win10版本 提取码&#xf…

2021年Funcode游戏制作二等奖作品

之前发的有关funcode游戏更多的则是对游戏流程有一个大概的了解,以及如何编写游戏循环,判定游戏的各种触发条件,较为简陋。 这一次看到有人问funcode游戏的制作,就把搁置了许久的 项目拿给大家作为参考建议。 素材来源&#xff1a…

【致敬童年】Funcode实现坦克大战

【2023年5月26日】 带10个需求的资源已上传至Funcode实现坦克大战(十个需求) 【效果图】 【写在前面的话】 1、虚函数哪里很难受,最后在Commclass里面加了一个无参构造才搞定 2、bug很多,比如世界边界,子弹都有问题。…

Funcode游戏设计C语言小飞虫

Funcode游戏制作 文章目录 Funcode游戏制作前言一、基于Funcode的小飞虫二、使用步骤1.游戏效果图2.游戏代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要&…

【C++FunCode】基于Funcode使用C++语言编写小游戏(小鲨鱼历险记)

一、前言 大一暑假参加了山东省软件设计大赛,基于FunCode平台使用C语言编写了大鱼吃小鱼游戏,其美名曰小鲨鱼历险记,哈哈。比赛成绩惨烈,只拿了一个省三,赛后也进行了分析总结,主要还是太不重视比赛&#…

Funcode实现坦克大战(十个需求)

【写在前言】 1、操作 先按数字(1~0)10个 表示选择某一需求(对应文件的需求) 再按K 表示执行该需求(控制台有输出) 2、写此文为方便大家的学习,希望不要一抄了事,真心希望&#xff0…

Funcode海底世界c++(vc6)

海底有五条鱼,其中四条来回随机游动,由玩家用键盘W A S D控制另外一条游动。 要求如下: 游戏初始界面如下图。来回游动的四条鱼,从屏幕左边游进来,均已一个随机速度水平游动。从屏幕右侧游出去,很快又从屏…

Funcode实现打飞虫1

简介: “拍飞蝇”是一款非常受欢迎的小游戏,这个游戏的玩法非常简单,玩家需要控制一个拍子来打飞来的苍蝇。每次打死一只苍蝇,就能够获得一定的分数。同时,也会有不同种类的苍蝇出现,它们的移动速度和得分也…