SLAM文献之-Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping

一、简介

该论《Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping》是日本先进工业科学技术研究所(AIST)的Koide等人于2022年在IEEE国际机器人与自动化会议(ICRA)上发表的一篇论文。该研究提出了一种基于全局匹配代价最小化和LiDAR-IMU紧耦合的实时三维建图框架,旨在提高在特征稀缺或动态环境中的定位与建图精度。
文由 Koide 等人在 2022 年发表,提出了一种全局一致且紧耦合的三维 LiDAR-IMU 建图方法。其核心目标是提升在特征稀缺或动态环境下的三维定位与建图精度,并保持实时性。与传统基于位姿图优化的方法不同,本文方法直接最小化全局匹配代价,并在前端和后端紧耦合 LiDAR 与 IMU 数据,实现全局一致性和高鲁棒性。
在这里插入图片描述


二、文章贡献(创新点)

  1. 全局匹配代价最小化:不依赖传统位姿图优化,直接优化全局匹配代价以保证地图全局一致性。
  2. LiDAR-IMU 紧耦合:前端和后端均融合 IMU 数据,增强系统在特征稀缺环境下的鲁棒性和精度。
  3. GPU 加速体素化 GICP 匹配:利用 GPU 提升匹配代价计算速度,实现实时建图。
  4. 适应特征稀缺环境:可在缺乏明显几何特征的环境中仍保持高精度定位和地图生成。

三、详细内容

1. 算法背景

  • 传统方法问题:基于位姿图优化的 LiDAR-SLAM 在特征丰富环境中表现良好,但在特征稀缺或动态环境中容易漂移。
  • LiDAR-IMU 融合:通过将 IMU 数据引入前端与后端优化,提供额外约束,减少漂移,提高精度。
  • 全局一致性需求:单纯局部优化容易累积误差,影响整体地图质量。

2. 需解决的关键问题

  1. 特征稀缺环境下定位漂移:在空旷或重复结构场景中,LiDAR 匹配不稳定。
  2. 高效融合 LiDAR 与 IMU 数据:前端与后端均需充分利用 IMU 信息,同时保证计算效率。
  3. 实时性与计算效率:全局优化和匹配代价计算需高效以支持实时运行。

3. 算法流程

  1. 预处理

    • 点云去畸变、滤波、体素化。
  2. 前端估计

    • 关键帧选择 + 固定滞后平滑(Fixed-Lag Smoother)
    • GPU 加速的体素化 GICP 匹配代价因子
    • IMU 预积分因子约束
  3. 局部建图

    • 构建局部因子图
    • 优化局部匹配代价 + IMU 约束
  4. 全局建图

    • 构建全局因子图
    • 最小化全局匹配代价,保证全局一致性

4. 具体实现步骤

图 1 展示了提出的整体框架。整个系统由一个预处理模块和三个估计模块组成:里程计估计、本地建图和全局建图。这些模块都基于紧耦合的 LiDAR-IMU 融合。里程计估计模块(即前端)负责鲁棒地追踪传感器的运动,并提供最新状态的初始估计。随后,本地建图模块会进一步优化这些状态,并将若干局部帧整合成一个子图。全局建图模块则对这些子图的位姿进行整体优化,以确保地图全局一致性。整个流程通过多线程并行运行,提高效率。
在这里插入图片描述
图1

x_tx\_tx_t 来表示需要估计的传感器状态:

xt=[Tt,vt,bt]T,x_t = [T_t, v_t, b_t]^T, xt=[Tt,vt,bt]T,

其中 KaTeX parse error: Undefined control sequence: \[ at position 8: T\_t = \̲[̲R\_t | t\_t] \i… 表示位姿,v_t∈R3v\_t \in \mathbb{R}^3v_tR3 为速度,KaTeX parse error: Undefined control sequence: \[ at position 8: b\_t = \̲[̲b^a\_t, b^\omeg… 是 IMU 的加速度和角速度偏置。状态估计依赖 LiDAR 点云 P_tP\_tP_t 以及 IMU 测量(线加速度 a_ta\_ta_t 和角速度 ω_t\omega\_tω_t)。为了简化处理, 将 LiDAR 点云统一映射到 IMU 坐标系下。

接下来,将介绍两个核心因子:LiDAR 匹配代价因子和 IMU 预积分因子,这些因子是框架中因子图的主要组成部分,然后再详细说明每个模块的实现。


4.1、 LiDAR 匹配代价因子

匹配代价因子用来约束两个位姿 T_iT\_iT_iT_jT\_jT_j,目标是让它们对应的点云 P_iP\_iP_iP_jP\_jP_j 尽可能对齐。采用体素化 GICP(Voxelized GICP, VGICP)作为代价函数,它是 GICP 的一种变体,适合 GPU 加速计算。

VGICP 会将每个点 p_k∈P_ip\_k \in P\_ip_kP_i 用高斯分布 (μ_k,C_k)(\mu\_k, C\_k)(μ_k,C_k) 来建模,其中协方差 C_kC\_kC_k 由邻域点计算得到。点云 P_jP\_jP_j 则被离散为体素,并为每个体素计算均值和协方差。匹配代价定义为:

eM(Pi,Pj,Ti,Tj)=∑pk∈PieD2D(pk,Ti−1Tj),e_M(P_i, P_j, T_i, T_j) = \sum_{p_k \in P_i} e_{D2D}(p_k, T_i^{-1} T_j), eM(Pi,Pj,Ti,Tj)=pkPieD2D(pk,Ti1Tj),

eD2D(pk,Tij)=dkT(Ck0+TijCkTijT)−1dk,e_{D2D}(p_k, T_{ij}) = d_k^T \big(C_k^0 + T_{ij} C_k T_{ij}^T \big)^{-1} d_k, eD2D(pk,Tij)=dkT(Ck0+TijCkTijT)1dk,

其中 d_k=μ_k0−T_ijμ_kd\_k = \mu\_k^0 - T\_{ij}\mu\_kd_k=μ_k0T_ijμ_k 是点间残差,p_k0=(μ_k0,C_k0)p\_k^0 = (\mu\_k^0, C\_k^0)p_k0=(μ_k0,C_k0) 来自 P_jP\_jP_j 的体素地图。

每次优化迭代都会重新计算并线性化 $e_M$,相比传统的 SE(3) 相对位姿约束,VGICP 提供了更精确的约束信息。


4.2、 IMU 预积分因子

IMU 预积分因子能够高效地将 IMU 测量融入因子图。给定加速度 a_ta\_ta_t 和角速度 ω_t\omega\_tω_t,传感器状态随时间演化:

Rt+Δt=Rtexp⁡((ωt−bωt−ηωt)Δt),R_{t+\Delta t} = R_t \exp((\omega_t - b_\omega^t - \eta_\omega^t)\Delta t), Rt+Δt=Rtexp((ωtbωtηωt)Δt),

vt+Δt=vt+gΔt+Rt(at−bat−ηat)Δt,v_{t+\Delta t} = v_t + g \Delta t + R_t (a_t - b_a^t - \eta_a^t) \Delta t, vt+Δt=vt+gΔt+Rt(atbatηat)Δt,

tt+Δt=tt+vtΔt+12gΔt2+12Rt(at−bat−ηat)Δt2.t_{t+\Delta t} = t_t + v_t \Delta t + \frac{1}{2} g \Delta t^2 + \frac{1}{2} R_t (a_t - b_a^t - \eta_a^t) \Delta t^2. tt+Δt=tt+vtΔt+21gΔt2+21Rt(atbatηat)Δt2.

通过预积分,可以在两个时间步 iiijjj 之间获得相对运动约束,从而在缺乏几何特征或 LiDAR 因子受限的环境中仍能保持稳定估计,并减少四自由度漂移,同时提供重力方向约束。


4.3、 预处理

输入点云先经过体素滤波下采样。在去畸变过程中,每个体素不仅对点位置取平均,也对时间戳取平均。如果点的时间与体素时间差过大,会将其重新分配到新体素,以避免扫描首尾点被错误融合。

接着,为每个点找到 kkk 个邻近点,用于协方差估计。假设去畸变过程中点的邻域关系不会发生大的变化,这些邻近点可直接用于后续计算。


4.4、 里程计估计

里程计估计模块通过融合 LiDAR 和 IMU 测量,补偿快速传感器运动并稳健地估计传感器状态。首先,根据 IMU 动力学预测,将点云变换到 IMU 坐标系,以去除运动畸变。随后,通过预先计算的邻近点协方差,为每个点建立不确定性模型。

在去畸变后的点云基础上,构建因子图(如图 2 所示)。为了保持实时性能,采用固定时滞平滑(fixed-lag smoothing)方法,并对旧帧进行边缘化。借鉴直接稀疏里程计(Direct Sparse Odometry)的思路,引入关键帧机制来实现高效且低漂移的轨迹估计。关键帧是一组在空间上分布合理、且与最新帧重叠度较高的帧。在最新帧与每个关键帧之间添加匹配代价因子,以减小漂移。若关键帧已被固定时滞平滑器边缘化,则其位姿被视为固定,并通过一元匹配代价因子约束最新帧的位姿。
在这里插入图片描述
图2

关键帧管理策略如下:

  1. 定义两帧 P_iP\_iP_iP_jP\_jP_j 的重叠率为 P_iP\_iP_i 中落在 P_jP\_jP_j 体素内的点占比 。

  2. 新帧到达时,若其与最新关键帧重叠率低于阈值(如 90%),则将其加入关键帧列表。

  3. 为避免冗余关键帧:

    • 移除与最新关键帧重叠率低于阈值(如 5%)的关键帧;

    • 若关键帧总数超过 N_odomN\_{\text{odom}}N_odom(如 20),则移除评分最低的关键帧:

      s(i)=o(i,Nodom)∑j∈[1,Nodom−1]∖{i}(1−o(i,j)),s(i) = o(i, N_{\text{odom}}) \sum_{j \in [1, N_{\text{odom}}-1] \setminus \{i\}} (1 - o(i, j)), s(i)=o(i,Nodom)j[1,Nodom1]{i}(1o(i,j)),

      其中 o(i,j)o(i,j)o(i,j) 表示第 iii 帧与第 jjj 帧关键帧的重叠率。该评分函数旨在保持关键帧在空间上的均匀分布,同时保留最新帧附近的关键帧。

此外,在最新帧与最近几帧(如最近三帧)之间建立匹配代价因子,以增强里程计对快速运动的鲁棒性。同时,连续帧之间添加 IMU 预积分因子,在特征稀少环境下进一步提升估计稳定性。


4.5、 局部建图

里程计估计中被边缘化的帧会被送入局部建图模块,作为子图(submap)的初始状态。局部建图将若干帧组合为子图,从而减少全局优化变量数量。
在这里插入图片描述

处理流程如下:

  1. 使用边缘化状态重新去畸变(deskewing)并计算协方差,从而获得更准确的点云初始估计。
  2. 评估新帧与子图中最新帧的重叠率,若低于阈值(如 90%),则将新帧加入子图因子图。
  3. 为子图内每一帧组合添加匹配代价因子,实现全帧两两配准。
  4. 连续帧间添加 IMU 预积分因子,并为每帧速度与偏置添加边缘化状态先验因子,以增强子图优化的稳定性。

当子图帧数达到 N_subN\_{\text{sub}}N_sub(如 15)或首尾帧重叠率低于阈值(如 5%)时,通过 Levenberg-Marquardt 优化器 对因子图进行优化,并将优化结果合并为单个子图。


4.6、 全局建图

全局建图模块用于消除累积漂移,实现全局一致的地图构建。每对子图间若重叠率超过阈值(如 5%),则创建匹配代价因子,生成稠密的全局因子图。这样,子图不仅与相邻子图对齐,还能与重新访问的子图对齐,从而实现闭环校正。

由于子图创建间隔较大(如 10 秒),仅依赖 IMU 因子无法有效约束子图间相对位姿,同时会丢失局部建图的速度与偏差信息。为解决这一问题, 为每个子图 x_ix\_ix_i 引入两个“端点”状态:x_iLx\_i^Lx_iLx_iRx\_i^Rx_iR,分别对应子图首尾帧相对于子图原点的状态。

具体做法:

  1. 子图原点 T_iT\_iT_i 定义为中间帧 T_N_sub/2T\_{N\_\text{sub}/2}T_N_sub/2 的位姿。
  2. 将每帧状态 x_tx\_tx_t 表示为相对于子图原点的状态。
  3. x_ix\_ix_i 与端点 x_iL,x_iRx\_i^L, x\_i^Rx_iL,x_iR 之间创建相对状态因子,以满足公式 11–13。
  4. x_iRx\_i^Rx_iRx_i+1Lx\_{i+1}^Lx_i+1L 之间添加 IMU 因子,以覆盖较短时间间隔,既约束子图位姿,又保留局部建图速度与偏差信息。

每当累积若干新子图(如每 5 个)时,使用 GTSAM 的 iSAM2 优化器对全局因子图进行增量优化,持续更新全局一致的地图。


四、优势总结

  1. 全局一致性:通过全局匹配代价最小化保证地图一致性。
  2. 高鲁棒性:紧耦合 LiDAR-IMU,可在特征稀缺或动态环境中保持精度。
  3. 实时性:GPU 加速匹配代价计算,前端/后端优化高效。
  4. 灵活扩展:方法可适应不同传感器速率、不同点云密度和环境类型。

五、参考文献

  1. Koide, K., Yokozuka, M., Oishi, S., & Banno, A. (2022). Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping. IEEE ICRA 2022. PDF
  2. Koide, K., Yokozuka, M., Oishi, S., & Banno, A. (2021). Globally Consistent 3D LiDAR Mapping with GPU-accelerated GICP Matching Cost Factors. IEEE Robotics and Automation Letters, 6(3), 5282–5289.
  3. Shan, T., Englot, B., Meyers, D., Wang, W., Ratti, C., & Rus, D. (2020). LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping. arXiv:2007.00258.

相关文献

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94054.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94054.shtml

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

相关文章

【STM32】HAL库中的实现(七):DMA(直接存储器访问)

DMA 是什么? DMA(Direct Memory Access)是 外设直接和内存之间数据搬运的机制,不需要 CPU 参与。 ✅ 举个例子:传统方式: ADC → CPU → RAM 使用 DMA:ADC → DMA → RAM(CPU 不需干…

【LeetCode热题100道笔记+动画】字母异位词分组

题目描述 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 示例 1: 输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]] 解释: 在 strs 中没有字符串可…

【Kafka】常见简单八股总结

为什么使用消息队列? 解耦: 我以我的一段开发经验举例: 【Kafka】登录日志处理的三次阶梯式优化实践:从同步写入到Kafka多分区批处理 我做过一个登录日志逻辑,就是在登录逻辑末尾,加一段写进数据库登录日志…

微信小程序连接到阿里云物联网平台

目录准备阶段阿里云配置下载mqtt.min.js文件小程序实现注意小程序配置服务器域名概述:介绍使用微信小程序连接到阿里云平台的快捷方法和完整过程。 阿里云平台建立设备,提供mqtt连接参数,小程序借助mqtt.min.js,也就是基于Github下…

2-3〔O҉S҉C҉P҉ ◈ 研记〕❘ 漏洞扫描▸AppScan(WEB扫描)

郑重声明: 本文所有安全知识与技术,仅用于探讨、研究及学习,严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任,本人不承担任何责任。 如需转载,请注明出处且不得用于商业盈利。 …

LeetCode 刷题【47. 全排列 II】

47. 全排列 II 自己做 解1&#xff1a;检查重复 class Solution { public:void circle(vector<int> nums, vector<vector<int>> &res,int start){int len nums.size();if(start len - 1){ //到头了//检查重复bool is_exist fa…

Https之(一)TLS介绍及握手过程详解

文章目录简介 TLSTLS第一次握手1.Client HelloTLS第二次握手2.Server Hello3.Certificate4.Server Hello DoneTLS第三次握手5.Client Key Exchange6.Change Cipher Spec7.Encrypted Handshake MessageTLS第四次握手8.New Session Ticket9.Change Cipher Spec10.Encrypted Hands…

【WEB 】从零实现一个交互轮播图(附源码)

文章目录 一、轮播图整体功能规划二、HTML结构深度解析三、CSS样式实现细节1. 定位系统详解2. 显示/隐藏机制3. 按钮交互效果实现4. 纯CSS箭头实现5. 指示器&#xff1a;当前位置可视化 四、JavaScript逻辑深入解析1. 核心变量与DOM获取2. 图片切换函数&#xff08;核心逻辑&am…

机器学习--PCA降维

一核心部分 1解决的问题&#xff1a;应对高维数据带来的计算量大、冗余信息多、易出现过拟合等问题&#xff0c;在减少数据维度的同时尽可能保留原始数据的关键信息。2核心思想&#xff1a…

leetcode 1277. 统计全为 1 的正方形子矩阵 中等

给你一个 m * n 的矩阵&#xff0c;矩阵中的元素不是 0 就是 1&#xff0c;请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。示例 1&#xff1a;输入&#xff1a;matrix [[0,1,1,1],[1,1,1,1],[0,1,1,1] ] 输出&#xff1a;15 解释&#xff1a; 边长为 1 的正方形有…

知识蒸馏 - 各类概率分布

知识蒸馏 - 各类概率分布 flyfish一、离散概率分布 离散分布描述的是取值为离散值&#xff08;如0,1,2,…&#xff09;的随机变量的概率规律&#xff0c;通常用概率质量函数&#xff08;PMF&#xff09; 表示某一取值的概率。 1. 伯努利分布&#xff08;Bernoulli Distribution…

软件测试-Selenium学习笔记

""" 目标&#xff1a; driver.find_element() 需求&#xff1a; 1. 使用driver.find_element()方法 2. 输入用户名&#xff1a;admin 3. 输入密码&#xff1a;123456 """ # 导包 from selenium import webdriver from time import …

知微传感3D相机上位机DkamViewer使用:给相机升级固件

写在前面 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有&#xff1a; 1、便利他人应用相机&#xff0c;本系列文章包含公司所出售相机的SDK的使用例程及详细注释&#xff1b;2、促进行业发展及交流。 知微传感Dkam系列3D相机可以应用于定位分拣、焊接焊缝提取、…

CMake进阶: CMake Modules---简化CMake配置的利器

目录 1.简介 2.为什么需要 CMake Modules&#xff1f; 3.内置模块&#xff1a;开箱即用的工具 3.1.依赖查找模块&#xff08;FindXXX.cmake&#xff09; 3.2.功能检测模块&#xff08;CheckXXX.cmake&#xff09; 3.3.通用工具模块&#xff08;如 FetchContent.cmake、CT…

【Docker】Ubuntu上安装Docker(网络版)

【Docker】Ubuntu上安装Docker注意&#xff1a;一、环境准备1. 系统要求2. 卸载旧版本二、安装步骤1.配置仓库源2.安装 Docker引擎3.验证安装情况三、解决报错1、检查网络连接2、检查Docker服务状态3、换源4.重载生效、重启服务、查看是否配置成功5.验证解决情况四、权限与配置…

Socket 编程 TCP

TCP 网络程序 和刚才 UDP 类似. 实现一个简单的英译汉的功能。TCP是面向字节流的可靠传输&#xff0c;如同前文的管道流&#xff0c;只要是流&#xff0c;它的操作就是文件的写出与读入。TCP socket API 详解下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。so…

使用AWS S3 + Lambda + MediaConvert 实现上传视频文件并自动转码

前言 最近团队在做短视频平台的技术调研&#xff0c;其中有一个环节便是音视频开发&#xff0c;即对用户上传的视频进行自适应转码。自适应的原理其实就是预先将视频转换为几个常用的分辨率&#xff0c;app端根据用户手机分辨率拉取相应分辨率的视频。 目前尝试了两种方案&…

QT之QWaitCondition降低cpu占用率,从忙等待到高效同步

在多线程编程中&#xff0c;线程间的同步是一个核心问题。在处理线程等待时&#xff0c;经常会写出高CPU占用率的代码&#xff0c;其中最典型的就是使用忙等待&#xff08;busy waiting&#xff09;。本文将详细介绍如何使用Qt框架中的QWaitCondition类来优雅地解决这一问题&am…

pcl求平面点云的边界凸包点

基本流程1&#xff0c;读入点云&#xff0c;并去除无效点2&#xff0c;拟合平面3&#xff0c;去除离平面距离较远的点4&#xff0c;对点云进行平面投影5&#xff0c;进行convex_hull运算初学者&#xff0c;暂时不知道能用来干嘛。练手还是非常不错的&#xff01;#define _CRT_S…

Windows系统上使用GIT

首先破除一下畏惧心理&#xff1a;在Windows上使用git和在linux系统中的使用方法是一样的&#xff0c;只是安装方式没那么便捷&#xff0c;毕竟linux中安装git只需要一行命令 GIT下载地址 如果你的电脑的CPU是64位的&#xff0c;就点击&#xff1a; Git-2.50.1-64-bit.exe 如果…