经典文献阅读之--LIW-OAM(LiDAR-IMU-编码器融合SLAM)

news2024/11/16 9:20:05

0. 简介

我们之前经常接触的是使用激光雷达和惯性测量单元(IMU)的互补信息,但是实际使用的过程中IMU如果发生剧烈的颠簸,有可能会导致IMU失效。在广泛使用的迭代最近点(ICP)算法只能为姿态提供约束,而速度只能由IMU预积分进行约束。因此,速度估计倾向于随着姿态结果而更新。最近有一篇博客介绍了将雷达,imu,里程计融合的办法《LIW-OAM: Lidar-Inertial-Wheel Odometry and Mapping》,提出了一种准确而强大的LiDAR惯性轮里程计和地图制图系统,它在基于束调整(BA)的优化框架中融合了来自LiDAR、IMU和轮编码器的测量。轮编码器的参与可以提供速度测量作为一个重要的观测,这有助于LI-OAM提供更准确的状态预测。此外,在优化中通过轮编码器的观测来约束速度变量,可以进一步提高状态估计的准确性。在两个公共数据集上的实验结果表明,我们的系统在绝对轨迹误差(ATE)方面优于所有最先进的LI-OAM系统,并嵌入轮编码器可以大大提高基于BA框架的LI-OAM的性能。目前这个项目已经在Github中开源了

1. 文章贡献

文中我们使用了额外的轮编码器传感器,同时轮编码器传感器的成本要比AHRS低得多。在公共数据集nclt [3]和kaist [7]上的实验结果表明,本文的系统在绝对轨迹误差(ATE)方面优于现有最先进的LI-OAM系统。主要贡献有两个方面:

  1. 我们提出了一种基于BA的新型LIW-OAM系统,将轮编码器的速度观测嵌入到基于BA的LI优化中。我们的LIW-OAM系统在准确性方面优于大多数最先进的LI-OAM系统。

  2. 我们已经发布了这项工作的源代码,以促进社区的发展。


2. 预备知识

2.1坐标系

我们用 ( ⋅ ) w (·)^ w ()w ( ⋅ ) l (·)^ l ()l ( ⋅ ) o (·) ^o ()o ( ⋅ ) k (·)^ k ()k 表示在世界坐标系、LiDAR坐标系、IMU坐标系和里程计(即轮编码器)坐标系中的三维点。世界坐标与 ( ⋅ ) l (·) ^l ()l 在起始位置重合。在所有坐标系中,x轴指向前方,y轴指向左侧,z轴指向上方。 我们用 l i l_i li表示在时间 t i t_i ti进行第 i i i次扫描的LiDAR坐标,用 o i o_i oi表示在 t i t_i ti时的对应IMU坐标,然后从LiDAR坐标 l i l_i li到IMU坐标 o i o_i oi的变换矩阵(即外部参数)表示为 T l i o i ∈ S E ( 3 ) T^{o_i}_{l_i} ∈ SE(3) TlioiSE(3)

- - 在这里插入图片描述

其中,$T^{o_i}{l_i} 由旋转矩阵 由旋转矩阵 由旋转矩阵R^{o_i}{l_i} ∈ SO(3) 和平移向量 和平移向量 和平移向量t^{o_i}{l_i} ∈ \mathbb{R}3$组成。外部参数通常在离线时进行校准,并在在线姿态估计期间保持不变;因此,我们可以简单地使用$To_l$ 表示$T^{o_i}{l_i} 。类似地,从里程表坐标到 I M U 坐标的变换表示为 。类似地,从里程表坐标到IMU坐标的变换表示为 。类似地,从里程表坐标到IMU坐标的变换表示为T^o_k$ ,其中包括 R k o R^o_k Rko t k o t^o_k tko

我们使用旋转矩阵R和Hamilton四元数q来表示旋转。在状态向量中,我们主要使用四元数,但旋转矩阵也用于方便地旋转3D向量。 ⊗ ⊗ 表示两个四元数之间的乘法运算。最后,我们用 ( ⋅ ^ ) (\hat{·}) (^)表示某个量的噪声测量或估计。除了姿态,我们还估计速度 v v v、加速度计偏差 b a b_a ba和陀螺仪偏差 b ω b_ω bω,它们都由一个状态向量统一表示:

在这里插入图片描述

2.2 扫描状态表达式 (需要回顾CT-ICP)

受CT-ICP [5]的启发,我们使用以下方式表示扫描 S S S的状态:

1) S S S开始时间 t b t_b tb的状态(例如 x b x_b xb);

2) S S S结束时间 t e t_e te的状态(例如 x e x_e xe)。

通过这种方式,可以将 [ t b , t e ] [t_b,t_e] [tbte]期间每个点的状态表示为 x b x_b xb x e x_e xe的函数。例如,对于在时间 t p ∈ [ t b , t e ] t_p∈[t_b,t_e] tp[tbte]收集的属于 S S S的点 p p p,可以计算 t p t_p tp时的状态:

在这里插入图片描述

其中,slerp(·)是四元数的球面线性插值运算符。

2.3 IMU-里程计测量模型 (略看)

IMU-里程计包括一个轮式编码器和一个IMU,其中包括一个加速度计和一个陀螺仪。来自IMU的原始陀螺仪和加速度计测量值,即 a ^ t \hat{a}_t a^t ω ^ t \hat{ω}_t ω^t,分别为:

在这里插入图片描述

IMU测量值在IMU坐标系中测量,结合了抵消重力和平台动态的力量,并受到加速度计偏差 b a t b_{a_t} bat、陀螺仪偏差 b ω t b_{ω_t} bωt和加性噪声的影响。正如在VINS-Mono [12]中提到的那样,加速度计和陀螺仪测量中的加性噪声被建模为高斯白噪声, n a ∼ N ( 0 , σ a 2 ) , n ω ∼ N ( 0 , σ ω 2 ) n_a∼N(0,σ_a^2),n_ω∼N(0,σ_ω^2) naN(0,σa2)nωN(0,σω2)。加速度计偏差和陀螺仪偏差被建模为随机游走,其导数为高斯分布, b ˙ a t = n b a ∼ N ( 0 , σ b a 2 ) , b ˙ ω t = n b ω ∼ N ( 0 , σ b ω 2 ) \dot{b}_{a_t}=n_{b_a}∼N(0,σ_{ba}^2),\dot{b}_{ω_t}=n_{b_ω}∼N(0,σ_{b_ω}^2) b˙at=nbaN(0,σba2)b˙ωt=nbωN(0,σbω2)

轮式编码器根据计数器接收到的脉冲获取轴的旋转速度 τ τ τ,然后根据 τ τ τ和轮子半径计算左后轮和右后轮的速度。

在这里插入图片描述

其中, n τ l e f t n_{τ_{left}} nτleft n τ r i g h t n_{τ_{right}} nτright τ l e f t τ_{left} τleft τ r i g h t τ_{right} τright的对应零均值白高斯噪声, v ^ l e f t \hat{v}_{left} v^left v ^ r i g h t \hat{v}_{right} v^right是从 τ ^ ⋅ \hat{τ}· τ^ r ⋅ r· r计算出的两个轮子的测量线性速度。然后,轮式编码器里程计的最终测量模型,在里程计坐标系中测量,可以定义为:

在这里插入图片描述

其中, [ n v ] x [n_v]_x [nv]x是两个零均值高斯分布 n v ∼ N ( 0 , σ v 2 ) n_v∼N(0,σ_v^2) nvN(0,σv2)的和,仍然是一个零均值高斯分布。

3. 系统概述

图1说明了我们的LIW-OAM框架,它由四个主要模块组成:预处理、初始化、状态估计和点云配准。预处理模块对输入的原始点进行下采样,并以与输入扫描相同的频率预积分IMU-里程计测量。初始化模块估计一些状态参数,包括重力加速度、加速度计偏差、陀螺仪偏差和初始速度。状态估计模块首先将IMU-里程计测量积分到最后状态以预测当前状态,然后执行基于BA的LIW优化以优化当前扫描的状态。最后,点云配准将新点添加到地图中,并删除远离地图的点。

在这里插入图片描述

图1. LIW-OAM概述,包括四个主模块:预处理模块、初始化模块、状态估计模块和点注册模块。

4. 预处理(略看)

4.1 下采样

处理大量的3D点会产生高计算成本。为了减少计算复杂度,我们按以下方式对输入点进行下采样。我们将当前输入扫描 S i + 1 S_{i+1} Si+1的点放入一个体积为 0.5 × 0.5 × 0.5 0.5×0.5×0.5 0.5×0.5×0.5(单位:米)的体素中,并使每个体素仅包含一个点,以获得下采样扫描 P i + 1 P_{i+1} Pi+1。这种下采样策略确保了点的密度分布在下采样后在3D空间中是均匀的。

4.2 预积分

通常,IMU-里程计以比LiDAR更高的频率发送数据。预积分两个连续扫描 S i S_i Si S i + 1 S_{i+1} Si+1之间的所有IMU-里程计测量可以很好地总结硬件平台从时间 t e i t_{e_i} tei t e i + 1 t_{e_{i+1}} tei+1的动态特性,其中 e i e_i ei e i + 1 e_{i+1} ei+1分别是 S i S_i Si S i + 1 S_{i+1} Si+1的结束时间戳。在这项工作中,我们采用了基于四元数的离散时间IMU-里程计预积分方法[10],并使用[12]中的方法来纳入IMU偏置。具体而言,在相应的IMU坐标 o e i o_{e_i} oei o e i + 1 o_{e_{i+1}} oei+1中计算了 S i S_i Si S i + 1 S_{i+1} Si+1之间的预积分,即 α ^ e i + 1 e i , η ^ e i + 1 e i , β ^ e i + 1 e i \hat{α}^{e_i}_{e_{i+1}},\hat{η}^{e_i}_{e_{i+1}},\hat{β}^{e_i}_{e_{i+1}} α^ei+1eiη^ei+1eiβ^ei+1ei γ ^ e i + 1 e i \hat{γ}^{e_i}_{e_{i+1}} γ^ei+1ei,其中 α ^ e i + 1 e i , β ^ e i + 1 e i \hat{α}^{e_i}_{e_{i+1}},\hat{β}^{e_i}_{e_{i+1}} α^ei+1eiβ^ei+1ei γ ^ e i + 1 e i \hat{γ}^{e_i}_{e_{i+1}} γ^ei+1ei分别是从IMU测量中预积分的平移、速度和旋转,而 η ^ e i + 1 e i \hat{η}^{e_i}_{e_{i+1}} η^ei+1ei是从陀螺仪和轮式编码器里程计测量中预积分的平移。此外,还根据误差状态运动学计算了预积分关于偏置的雅各比矩阵,即 J b a α , J b ω α , J b a β , J b ω β , J b ω γ , J b a η 和 J b ω η J^α_{b_a},J^α_{b_ω},J^β_{b_a},J^β_{b_ω},J^γ_{b_ω},J^η_{b_a}和J^η_{b_ω} JbaαJbωαJbaβJbωβJbωγJbaηJbωη

5. 初始化 (需要回顾SR-LIO )

初始化模块旨在估计所有必要的值,包括初始姿态、速度、重力加速度、加速度计偏置和陀螺仪偏置,以进行后续状态估计。与我们先前的工作SR-LIO [19]类似,我们分别为手持设备和车载设备采用运动初始化和静态初始化。有关我们的初始化模块的更多详细信息,请参见[19]。


6. 状态估计

6.1 状态预测

当每个新的下采样扫描 P i + 1 P_{i+1} Pi+1完成时,我们使用IMU-里程计测量来预测 P i + 1 P_{i+1} Pi+1开始时间戳(即 x b i + 1 w x^w_{b_{i+1}} xbi+1w)和结束时间戳(即 x e i + 1 w x^w_{e_{i+1}} xei+1w)的状态,以提供LIW-优化的先验运动。具体而言,预测的状态 x b i + 1 w x^w_{b_{i+1}} xbi+1w(即 t b i + 1 w , R b i + 1 w , v b i + 1 w , b a b i + 1 , b w b i + 1 t^w_{b_{i+1}},R^w_{b_{i+1}},v^w_{b_{i+1}},b_{a_{b_{i+1}}},b_{w_{b_{i+1}}} tbi+1wRbi+1wvbi+1wbabi+1,bwbi+1)被赋值为

在这里插入图片描述

其中 ω ^ ⋅ 、 a ^ ⋅ 和 v ^ ⋅ \hat{ω}·、\hat{a}·和\hat{v}· ω^a^v^是来自IMU陀螺仪、IMU加速度计和轮式编码器的测量值, g w g^w gw是世界坐标系下的重力加速度, n n n n + 1 n+1 n+1是在 t e i t_{e_i} tei t e i + 1 t_{e_{i+1}} tei+1期间获取IMU里程计测量值的两个时间瞬间, δ t δ_t δt n n n n + 1 n+1 n+1之间的时间间隔。我们迭代地从0增加n到 t e i + 1 − t e i / δ t t_{e_{i+1}} -t_{e_{i}} / δ_t tei+1tei/δt以获取 x e i + 1 w x^w_{e_{i+1}} xei+1w。当n = 0时, x n w = x e i w x^w_n = x^w_{e_i} xnw=xeiw。 对于 b a e i + 1 b_{a_{e_{i+1}}} baei+1 b w e i + 1 b_{w_{e_{i+1}}} bwei+1,我们将它们的预测值设为: b a e i + 1 = b a e i , b w e i + 1 = b w e i b_{a_{e_{i+1}}}= b_{a_{e_{i}}},b_{w_{e_{i+1}}} = b_{w_{e_{i}}} baei+1=baeibwei+1=bwei

6.2 基于BA的LIW-优化(主要创新)

我们联合利用激光雷达、惯性和轮式编码器的测量值来优化当前扫描 P i + 1 P_{i+1} Pi+1的开始状态(即 x b i + 1 w x^w_{b_{i+1}} xbi+1w)和结束状态(即 x b i + 1 e x^e_{b_{i+1}} xbi+1e),其中变量向量表示为:

…详情请参照古月居

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

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

相关文章

Linux系统的历史记录添加时间和IP信息

1 系统history记录优化 默认情况下,系统是不会记录我们执行命令的时间等相关信息的。 1.1 HISTCONTROL 介绍 使用HISTCONTROL变量,您可以控制 bash 如何存储您的命令历史记录。您可以告诉它忽略重复的命令和/或忽略具有前导空格的命令。 在命令行工作…

亚马逊新品如何快速上首页

将亚马逊新品快速上首页是许多卖家的目标,但要注意,这涉及到多种因素,包括产品质量、市场竞争、营销策略等。以下是一些可能帮助您的亚马逊新品快速上首页的方法: 1、优化产品信息:确保您的产品标题、描述和关键词字段…

Scratch 之 如何制作鼠标框(1)—— 绘制鼠标框

hello,大家好,今天给大家带来如何绘制鼠标框 我们正式开始 首先,让我们绘制一个空角色 然后让我们来编代码 1、准备工作 (1)拓展 画笔 添加这个拓展↑ (2)变量 实际上,你只需…

Systemverilog 接口 interface modport使用说明

一、接口的定义   SystemVerilog在Verilog语言基础上扩展了“接口”(interface)结构,SystemVerilog增加了新的端口类型—接口,接口允许许多信号合成一组由一个端口表示,只需在一个地方对组成接口的信号进行声明&am…

4G无线网络草坪音箱,4G石头音箱

SV-7042UG 4G无线网络草坪音箱,4G石头音箱 一、描述 SV-7042UG是深圳锐科达电子有限公司的一款壁挂式4G无线网络草坪音箱,通过4G无线卡联网,可将网络音源通过自带的功放和喇叭输出播放,其采用防水设计,功率40W。SV-70…

chatgpt 翻译整本英文电子书,效果非常好

1. 注册chatgpt账号,登录后设置好API token。 https://platform.openai.com/account/api-keys 一定要把生成的token先复制保存好,对话框消失后就无法看到完整token了。 2. 配置免费的cloudflare workers 代理,否则很容易被封号 参考文档 h…

【Windows系统编程】05.内存操作与InlineHook(详解InlineHook实现)

文章目录 内存相关InlineHook完整实现代码&#xff08;dll&#xff09;&#xff1a; InlineHook测试&#xff1a; 内存相关 内存信息 头文件&#xff1a;#include <Psapi.h> //检索有关系统当前使用物理内存和虚拟内存的信息MEMORYSTATUSEX mst;GlobalMemoryStatusEx…

docker 容器满了常用处理方法

docker 容器满了常用处理方法 1、运行 df -h 查看剩余磁盘占用情况 2、进入到docker目录 cd /var/lib/docker 3、运行du -h --max-depth1 &#xff08;检索文件的最大深度1&#xff0c;即只检索汇总计算当前目录下的文件&#xff09; 4、进入占用最大的 /containers文件夹&am…

pg各种条件判断语句

1.基本查询 搜索语句&#xff1a; select (distinct&#xff08;去重&#xff09;) 内容&#xff08;*代表所有&#xff09; as 别名 from 表 注释&#xff1a; -- 快速查询&#xff1a;select 内容 AS 别名 没有表一般当做计算器来用 2.条件查询 null只能用is 或者is…

7.11 Java方法重写

7.11 Java方法重写 这里首先要确定的是重写跟属性没有关系&#xff0c;重写都是方法的重写&#xff0c;与属性无关 带有关键字Static修饰的方法的重写实例 父类实例 package com.baidu.www.oop.demo05;public class B {public static void test(){System.out.println("这…

CLion 创建Qt工程

环境 CLion &#xff1a;2019.3.6 Qt &#xff1a;5.9.6&#xff08;MinGW&#xff09; Clion 配置 编译环境配置 添加Qt MinGW编译环境 添加Qt工具 创建工程 正常创建C工程 CMakeLists cmake_minimum_required(VERSION 3.8) project(QtApp)set(CMAKE_CXX_STANDARD 11)…

APB register脚本

[github repo]根据Excel表格自动生成寄存器RTL/RALF/C header的脚本 - wudayemen - 博客园 (cnblogs.com) 在芯片设计中&#xff0c;常常会使用APB总线配置每个模块的寄存器。这一部分可以使用脚本生成相应RTL代码和对应的验证所需文件比如RALF&#xff0c;和C语言的头文件&am…

【仿写tomcat】三、通过socket读取http请求信息

仿写tomcat 建立Socket连接获取连接信息查看HTTP信息 建立Socket连接 这里我们也是创建一个专门管理socket的类 package com.tomcatServer.socket;import java.io.*; import java.net.ServerSocket;/*** 套接字存储** author ez4sterben* date 2023/08/15*/ public class Soc…

电影《孤注一掷》观后感

上周看了电影《孤注一掷》&#xff0c;看完后&#xff0c;内心久久无法平静,电影影响还是听深远的的。 &#xff08;1&#xff09;情感与金钱的损失 我们每个人&#xff0c;或多或少&#xff0c;都收到过&#xff0c;诈骗类的短信或者电话&#xff0c;只要你使用的智能手机&am…

【MaxKey对接一】对接gitlab的oauth登录

MaxKey的Oauth过程 引导进入 GET http://{{maxKey_host}}/sign/authz/oauth/v20/authorize?client_idYOUR_CLIENT_ID&response_typecode&redirect_uriYOUR_REGISTERED_REDIRECT_URI 登录后回调地址 YOUR_REGISTERED_REDIRECT_URI/?code{{code}} 换取Access Token GET…

探究主成分分析方法数学原理

目录 1、简介 2、实现原理 3、实现步骤 4、公式分析 5、实例分析 6、⭐协方差矩阵补充说明 7、LaTex文本 ⭐创作不易&#xff0c;您的一键三连&#xff0c;就是支持我写作的最大动力&#xff01;&#x1f979; 关于代码如何实现&#xff0c;请看这篇文章&#xff1a;[机器…

C++ string类相关用法实例

前言&#xff1a; 1 string是表示字符串的字符串类 2 string类是basic_string模板类的一个实例&#xff0c;它使用char来实例化basic_string模板类&#xff0c;并用char_traits和allocator作为basic_string的默认参数&#xff0c;所以string在底层实际是&#xff1a;basic_str…

【漏洞修复】OpenSSH-ssh-agent 越权访问CVE-2023-38408

CVE-2023-38408漏洞升级ssh版本 漏洞说明修复步骤RPM包编译 漏洞说明 漏洞名称&#xff1a;OpenSSH-ssh-agent 存在越权访问漏洞影响范围&#xff1a;ssh-agent(-∞, 9.3-p2) openssh(-∞, 9.3p2-1)漏洞描述&#xff1a;SSH-Agent是SSH的一部分&#xff0c;它是一个用于管理私…

设计模式之享元模式(Flyweight)的C++代码实现

1、享元模式提出 面向对象很好地解决了抽象问题&#xff0c;但是创建对象会带来一定的内存开销。绝大部分情况下&#xff0c;创建对象带来的内存开销是可以忽略不计的&#xff1b;在有些情况下是需要谨慎处理的&#xff0c;如类A的sizeof是50个字节&#xff0c;则创建50*1024*…

AIGC:从入门到精通

一、前言 相信一部分的人在看到本活动的主题是关于AIGC的时候&#xff0c;都会存在疑惑--到底什么是AIGC呢&#xff1f;故本文主要介绍关于AIGC的基本内容&#xff0c;全部内容采用自己搭建的ChatGPT模型生成&#xff0c;具体内容如下&#xff1a; 本文章&#xff0c;参与&…