自动驾驶02:点云预处理——02(运动补偿篇LIO-SAM)

当激光雷达(LiDAR)在运动中采集点云时,每个点的时间戳不同,而车辆在移动,导致点云在不同时间点的坐标与实际情况不符,这种现象称为运动畸变(Motion Distortion)。为了得到无畸变的点云,需要进行运动畸变补偿

LIO-SAM(IMU + LiDAR):https://github.com/TixiaoShan/LIO-SAM

https://ieeexplore.ieee.org/document/9341176

LIO-SAM 是一个基于因子图优化激光雷达-惯性导航里程计(LiDAR-Inertial Odometry, LIO)的开源 SLAM 框架。它结合了激光雷达点云IMU 数据,通过优化算法(GTSAM)进行高精度定位和建图,特别适用于动态环境运动畸变补偿

LIO-SAM 主要用于:

  • 点云去畸变补偿(消除 LiDAR 在运动中的扭曲)

  • 实时激光 SLAM(局部里程计 + 全局地图优化)

  • 自动驾驶、无人机、机器人导航等场景

研究背景

LOAM是目前为止激光里程计(LO)领域最经典最广泛使用的方法。但是它存在一个问题,就是它直接存储全局体素地图而不是局部地图,从而很难执行回环检测以修正漂移,或者组合GPS(提供绝对位置)等测量进行位姿修正。并且体素地图的使用效率会随时间降低。为了克服该问题,作者只独立地存储每个关键帧的特征,而不是在位姿估计完成后就将特征加入到全局地图中。

另一方面,IMU和LiDAR的联合位姿估计已经被广泛研究,大致分为两类。第一类是松耦合的方法,例如LOAM和LeGO-LOAM中使用IMU去除LiDAR点云的运动畸变,以及[8]-[12]使用EKF整合LiDAR和IMU的测量。第二类是紧耦合的方法,例如R-LINS[15],使用误差状态卡尔曼滤波器迭代地修正机器人的位姿估计,再比如LIOM [16]联合优化LiDAR和IMU测量。但是LIOM一次性处理所有测量,因此不能实时运行。而本文也属于紧耦合的激光-惯性里程计方法,只是采用了因子图优化而不是滤波的方法。

LOAM 主要基于 激光点云特征匹配 来估计位姿,每一帧都会根据上一帧的位姿进行增量更新。但这种方法会导致:

  • 短期误差累积:每一帧匹配的误差会逐步积累,导致位姿逐步偏移。

  • 长时间运行后误差显著:如果机器人或无人车长时间运行,没有全局优化,就可能出现位置漂移,使得建图产生错位。

回环检测:当机器人/无人车回到某个 曾经到达的地方,通过匹配当前点云和历史点云,可以发现 当前估计的位姿和真实位姿的偏差。

1. LIO-SAM 运动畸变补偿原理

LiDAR 由于逐点扫描,每个点的采集时间不同,因此在车辆运动时,同一帧点云可能包含不同时间的位置信息,导致点云扭曲(Motion Distortion)。

图2展示了LIO-SAM的因子图。图中主要包含四种因子。第一种是IMU预积分因子(橙色),由两个相邻关键帧之间的IMU测量积分得到。第二种是激光里程计因子(绿色),由每个关键帧和之前n个关键帧之间的帧图匹配结果得到。第三种是GPS因子(黄色),由每个关键帧的GPS测量得到。第四种是回环因子(黑色),由每个关键帧和候选回环关键帧的时序相邻的2m+1个关键帧之间的帧图匹配得到。

因子图是什么?

因子图是一种概率图模型,它用于优化机器人在不同时间步的位姿(Position & Orientation),使其符合传感器观测数据的约束。在LIO-SAM中,因子图的优化由 iSAM2(增量平滑和映射)算法完成。

因子图的本质:

  • 变量(节点):表示待优化的机器人关键帧位姿(位置、方向)。

  • 约束(因子):连接不同变量的观测数据,提供优化条件。

IMU预积分因子(橙色)

  • 数据来源:IMU传感器(惯性测量单元)。

  • 作用:利用IMU数据,估计两个相邻关键帧之间的位移和旋转。

  • 原理

    • 由于IMU可以高频率提供加速度和角速度信息,因此可以通过 数值积分 来推算位姿变化。

    • 但单独使用IMU会导致 漂移(drift),因此需要与其他传感器(如Lidar)进行融合校正。

激光里程计因子(绿色)

  • 数据来源:激光雷达点云的匹配结果(帧间匹配)。

  • 作用:通过点云匹配计算关键帧之间的位姿变换,提高里程计的精度。

  • 原理:

    • LIO-SAM在每个关键帧与前 n 个关键帧之间进行点云匹配,计算相对位姿变化。

    • 这个因子提供了 短时间尺度的几何约束,用于修正IMU的漂移。

GPS因子(黄色)

  • 数据来源:GPS 传感器。

  • 作用:提供全局定位信息,防止长期漂移。

  • 原理:

    • GPS测量的是绝对坐标(经纬度或UTM坐标),可以为因子图提供全球位置信息。

    • 由于GPS可能存在噪声(如城市环境中的多路径效应),LIO-SAM并不直接采用GPS的数值,而是将其作为软约束,用于优化位姿。

回环因子(黑色)

  • 数据来源:基于激光雷达点云的回环检测(Loop Closure)。

  • 作用:当机器人经过曾经到达过的地方,检测并校正累积漂移,提高长期建图精度。

  • 原理:

    • 通过 扫描匹配(Scan Matching),检测当前关键帧是否与历史关键帧匹配。

    • 如果匹配成功,则添加一个回环因子,提供全局几何约束,用于修正误差。

    • LIO-SAM使用了 2m+1 个关键帧 进行匹配,以确保匹配稳定性。

因子图优化(iSAM2)

LIO-SAM使用 iSAM2(增量平滑和映射)算法进行因子图优化。

  • iSAM2的特点

    • 通过增量更新的方式,避免每次重新计算整个因子图,提高计算效率。

    • 只在新增关键帧时进行局部优化,保证了实时性。

    • 结合 IMU、Lidar、GPS、回环检测 的多传感器信息,提高位姿估计的精度和鲁棒性。

2.  核心思路及步骤

LIO-SAM 通过IMU 预积分(IMU Pre-integration),将 IMU 计算出的运动轨迹与 LiDAR 点云的时间戳对齐,从而补偿 LiDAR 运动导致的畸变。核心思路如下:

步骤 1:获取 LiDAR 和 IMU 数据

  1. LiDAR 点云帧(Scan):包含多个点,每个点有自己的时间戳。

  2. IMU 数据(惯性测量)

    • 加速度计(Acceleration)

    • 陀螺仪(Gyroscope)

    • 角速度 & 线速度

  3. 时间同步:确保 IMU 与 LiDAR 的时间戳对齐(通常用硬件同步,或软件插值处理)。

步骤 2:IMU 预积分(Pre-integration)

IMU 在两个时刻之间的测量值(加速度 & 角速度)可以计算增量运动轨迹,即:

  • 旋转增量 $R_{i+1} = R_i \cdot \text{exp}(\omega \Delta t)$

  • 位置增量 $p_{i+1} = p_i + v_i \Delta t + \frac{1}{2} a_i \Delta t^2$

  • 速度增量 $v_{i+1} = v_i + a_i \Delta t$

LIO-SAM 通过 IMU 预积分,在 LiDAR 点云的采集时间范围内,估计出每个时间点的位姿 $T_w(t)$,用于运动畸变补偿。

步骤 3:将点云变换到统一坐标系

  • $p_i$ 是 LiDAR 采集的某个点

  • $T_w(t_i)$是该点采集时刻的世界坐标系位姿

  • 目标是将所有点转换到相同时间(通常是当前帧起始时间$t_0$):

    其中:

    • $p_i^{(w)}$ 是补偿后的世界坐标

    • $p_i^{(l)}$是 LiDAR 采集时的局部坐标

    • $T_w(t_0)$是扫描开始时刻的位姿

    • $T_w(t_i)$ 是该点采集时刻的位姿

步骤 4:因子图优化(Factor Graph Optimization)

LIO-SAM 采用 GTSAM(Factor Graph) 进行位姿优化:

  1. 通过 IMU 计算短时间位姿变换(高频)

  2. 通过 LiDAR 进行回环检测(低频)

  3. 结合 GPS,优化全局地图

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

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

相关文章

基础算法篇(3)(蓝桥杯常考点)—图论

前言 这期是基础算法篇的第三节,其中的dijkstra算法更是蓝桥杯中的高频考点 图的基本相关概念 有向图和无向图 自环和重边 稠密图和稀疏图 对于不带权的图,一条路径的路径长度是指该路径上各边权值的总和 对于带权的图,一条路径长度时指该路…

Crawl4AI:专为AI设计的开源网页爬虫工具,释放大语言模型的潜能

在当今数据驱动的AI时代,高效获取结构化网页数据是模型训练和应用落地的关键。Crawl4AI作为一款专为大型语言模型(LLMs)设计的开源爬虫工具,凭借其极速性能、AI友好输出和模块化设计,正在成为开发者社区的热门选择。本文将深入解析其核心特性与技术优势。 一、Crawl4AI的核…

前后端数据序列化:从数组到字符串的旅程(附优化指南)

🌐 前后端数据序列化:从数组到字符串的旅程(附优化指南) 📜 背景:为何需要序列化? 在前后端分离架构中,复杂数据类型(如数组、对象)的传输常需序列化为字符…

汇编学习之《移位指令》

这章节学习前需要回顾之前的标志寄存器的内容: 汇编学习之《标志寄存器》 算数移位指令 SAL (Shift Arithmetic Left)算数移位指令 : 左移一次,最低位用0补位,最高位放入EFL标志寄存器的CF位(进位标志) OllyDbg查看…

NLP高频面试题(二十九)——大模型解码常见参数解析

在大语言模型的实际应用中,如何更有效地控制文本生成的质量与多样性,一直是热门研究话题。其中,模型解码(decode)策略至关重要,涉及的主要参数包括 top_k、top_p 和 temperature 等。本文将详细介绍这些常见…

【C#】Task 线程停止

CancellationTokenSource cts 是用于控制任务(线程)停止运行的。我们一步步来解释它的作用。 🔍 现在的代码结构大概是这样的: Task.Run(() > {while (true){// 不断循环采集图像} });这种写法虽然简单,但最大的问…

WebRTC的ICE之TURN协议的交互流程中继转发Relay媒体数据的turnserver的测试

WebRTC的ICE之TURN协议的交互流程和中继转发Relay媒体数据的turnserver的测试 WebRTC的ICE之TURN协议的交互流程中继转发Relay媒体数据的turnserver的测试 WebRTC的ICE之TURN协议的交互流程和中继转发Relay媒体数据的turnserver的测试前言一、TURN协议1、连接Turn Server 流程①…

Redis + Caffeine多级缓存电商场景深度解析

Redis Caffeine多级缓存 Redis Caffeine多级缓存电商场景深度解析一、实施目的二、具体实施2.1 架构设计2.2 组件配置2.3 核心代码实现 三、实施效果3.1 性能指标对比3.2 业务指标改善3.3 系统稳定性 四、关键策略4.1 缓存预热4.2 一致性保障4.3 监控配置Prometheus监控指标 …

前端开发3D-基于three.js

基于 three.js 渲染任何画面,都要基于这 3 个要素来实现 1场景scene:放置物体的容器 2摄像机:类似人眼,可调整位置,角度等信息,展示不同画面 3渲染器:接收场景和摄像机对象,计算在浏…

代码随想录算法训练营--打卡day4

一.移除链表元素 1.题目链接 203. 移除链表元素 - 力扣(LeetCode) 2.思路 通过 while 循环来遍历链表,只要 cur 的下一个节点不为空,就继续循环。在循环中,对 cur 的下一个节点的值进行判断: 值不等于…

虚拟电厂:多元能源聚合,开启绿色电力新时代

虚拟电厂:多元能源聚合,开启绿色电力新时代 在“双碳”目标驱动下,电力系统正经历从集中式向分布式、从单一能源向多能互补的深刻变革。 作为能源互联网的核心载体,虚拟电厂通过数字化技术整合多种能源资源,而是像指…

高通Android10 铃声通话音频80%音量修改

先修改最高的音量step --- a/SC60_AP/frameworks/base/services/core/java/com/android/server/audio/AudioService.javab/SC60_AP/frameworks/base/services/core/java/com/android/server/audio/AudioService.java-311,14 311,14 public class AudioService extends IAudio…

类加载过程?类隔离了解过吗?

类加载过程详解 类加载是 JVM 将类的字节码从磁盘、网络或其他来源加载到内存,并转换为 Class 对象的过程,主要分为以下 五个阶段: 1. 加载(Loading) 任务:查找类的二进制字节流(如 .class 文…

使用msmtp和mutt在CentOS上发送指定目录下的所有文件作为邮件附件

1.安装 msmtp: 如果尚未安装,请先通过以下命令安装msmtp。 sudo yum install msmtp 2.配置 msmtp 使用新浪邮箱: 创建或编辑配置文件~/.msmtprc,输入以下内容(记得替换授权码)。 defaults tls on tls_st…

Vue+Elementui首页看板

源码 <template><!-- 查询条件--><div class="optimize-norm" v-loading="selectDataLoading"><el-form :model="queryParams" ref="queryRef" style="padding-bottom:8px" :inline="true"…

汇编学习之《指针寄存器大小端学习》

什么是指针寄存器&#xff1f; 操作栈的寄存器 栈&#xff1a; 保存函数里面传递的参数&#xff0c;局部变量等。 EBP&#xff1a; 指向栈底的指针 ESP&#xff1a; 指向栈顶的指针。 计算入栈地址变化规则 通过OllDbg查看 有可能点击安装的时候栈区域第一次查看会没有显…

Oracle数据库数据编程SQL<3.7 PL/SQL 触发器(Trigger)>

触发器是Oracle数据库中的一种特殊存储过程&#xff0c;它会在特定数据库事件发生时自动执行。触发器通常用于实现复杂的业务规则、数据验证、审计跟踪等功能。 目录 一、触发器基本概念 1. 触发器特点 2. 触发器组成要素 二、触发器类型 1. DML触发器 2. DDL触发器 3.…

2025年渗透测试面试题总结-某 携程旅游-基础安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 携程旅游-基础安全工程师 反序列化原理 核心原理 扩展分析 SQL注入本质 核心原理 扩展分析 SQL注…

CSS 边框(Border)样式详解

CSS 边框&#xff08;Border&#xff09;样式详解 CSS 提供了多种边框样式&#xff0c;使我们能够控制元素的外观。本文将详细介绍 CSS 边框的各种属性及应用示例。 1. 基本边框属性 CSS 主要使用 border 相关属性定义边框&#xff0c;基本语法如下&#xff1a; border: [边…

SpringCould微服务架构之Docker(6)

容器的基本命令&#xff1a; 1. docker exec &#xff1a;进入容器执行命令 2. docker logs: -f 持续查看容器的运行日志 3. docker ps&#xff1a;查看所有运行的容器和状态 案例&#xff1a;创建运行一个容Nginx容器 docker run--name myNginx -p 80:80 -d nginx 命…