【文献分享】KITTI里程计排行榜上第五!CT-ICP:实时弹性激光雷达里程计与回环检测

news2024/9/28 13:25:56

论文题目:CT-ICP: Real-time Elastic LiDAR Odometry with Loop Closure

中文题目:CT-ICP:实时弹性激光雷达里程计与回环检测

作者:Pierre Dellenbach, Jean-Emmanuel Deschaud, Bastien Jacquet and Francois Goulette

作者机构:巴黎高等矿业大学机器人技术中心 Kitware计算机视觉团队

论文链接:https://arxiv.org/pdf/2109.12979.pdf

论文实验链接:https://github.com/jedeschaud/ct_icp

论文开源代码:https://github.com/Kitware/pyLiDAR-SLAM

本文主要是提出了一种新的实时激光雷达里程测量方法,称为CT-ICP(连续时间ICP),通过新颖的环路检测程序完成完整的SLAM。该方法的核心是在扫描匹配中引入连续性和扫描间不连续的组合。它允许在配准过程中扫描的弹性变形,以提高精度,并增加了对不连续的高频运动的鲁棒性。在七个数据集上进行了测试:KITTI、KITTI-raw、KITTI-360、KITTICARLA、ParisLuco、Newer College和NCLT,分别用于驾驶和高频运动场景。

1 引言

本文提出的目的:

  1. 使用匀速运动假设矫正点云畸变的方法无法适应大幅度的方向变化或者剧烈速度变化
  2. 即使目前有工作考虑了连续时间内的运动,但是也无法适应高频的剧烈运动情况,或者以精度损失为代价。

本文主要贡献:

  • 提出了一种基于位姿扫描内连续性和扫描间不连续的弹性激光雷达里程计。

本文次要贡献:

  • 提出了一种基于密集点云的局部地图,存储在稀疏体素结构中,以获得实时处理速度。
  • 在驾驶和高频运动场景的7个数据集上进行大规模实验,所有实验都有开源代码可以复现。
  • 结合姿态图后端构建了完整SLAM的快速回环检测方法,为pyLiDAR-SLAM(开源)。

2 算法概述

算法主要流程如下图所示:

图中的彩色部分为激光雷达扫描。点云的颜色对应每个点的时间戳(蓝色表示时间戳更远的点云,红色表示时间戳更近的点云)。

通过在每一帧扫描的开始和结束时刻联合优化两个姿势,并根据时间戳进行插值,使扫描进行弹性变形以与地图(白点)对齐,从而创建连续时间扫描到地图的里程计。图片最下面下面说明轨迹具有扫描内姿势的连续性和扫描之间的不连续性。

3 算法框架

3.1 里程计公式

在激光雷达的每一帧中,里程计有两个位姿用于参数化插值:

  • 起始位姿 Ω b ( R b , t b ) Ω_b(R_b,t_b) Ωb(Rb,tb)
  • 结束位姿 Ω e ( R e , t e ) Ω_e(R_e,t_e) Ωe(Re,te)

对于在每一帧扫描的第一个时间戳 τ b \tau_b τb和最后一个时间戳 τ e \tau_e τe之间的时间 τ \tau τ∈[ τ b \tau_b τb, τ e \tau_e τe]捕获的每个传感器的测量,通过在扫描的起始和结束两个姿态之间插值来估计传感器的姿态。

与其他里程计不同的是,当前帧的起始位姿不等于上一帧的结束位姿,这两个位姿之间加入了一个邻近约束,迫使两个姿态保持接近,这使里程计对传感器的高频运动更加稳健。

本文的优化函数如下:
a r g m i n F I C P ( X ) + β l C l o c ( X ) + β v C v e l ( X ) argmin F_{ICP}(X)+\beta_l C_{loc}(X)+\beta_v C_{vel}(X) argminFICP(X)+βlCloc(X)+βvCvel(X)
其中,优化变量 X = ( τ b , τ e ) ∈ S E ( 3 ) 2 X=(\tau_b,\tau_e) \in SE(3)^2 X=(τb,τe)SE(3)2, F I C P F_{ICP} FICP为扫描到地图的连续时间ICP(其实就是插值和ICP的过程)。
F I C P ( X ) = 1 ∣ I n ∣ ∑ i ∈ I ρ ( r i 2 ∣ X ∣ ) F_{ICP}(X) = \frac{1}{|\mathbb{I}^n|}\sum_{i \in \mathbb{I}} \rho (r^2_i|X|) FICP(X)=In1iIρ(ri2X)
I \mathbb{I} I是从每一帧雷达数据中提取的一个特征点序号的集合 I n : { p i ∈ S n ∣ i ∈ I } \mathbb{I}^n: \{p_i \in \mathbb{S^n} | i \in \mathbb{I} \} In:{piSniI},对于每个i有:
r i [ X ] = a i ( p i W [ X ] − q i W ) ⋅ n i r_i[X]=a_i(p^W_i[X]-q^W_i) · n_i ri[X]=ai(piW[X]qiW)ni
p i W [ X ] = R α i [ X ] ∗ p i L + t ] a l p h a i [ X ] p^W_i[X]=R^{\alpha_i}[X]*p^L_i+t^{]alpha_i}[X] piW[X]=Rαi[X]piL+t]alphai[X]
R α i [ X ] = s l e r p ( R b , R e , α i ) R^{\alpha_i}[X]=slerp(R_b,R_e,\alpha_i) Rαi[X]=slerp(Rb,Re,αi)
t α i [ X ] = ( 1 − α i ) t b + α i t e t^{\alpha_i}[X]=(1-\alpha_i)t_b+\alpha_it_e tαi[X]=(1αi)tb+αite

  • r i r_i ri是样本点 p i W p^W_i piW与其在地图中最近的邻居之间点到平面距离的残差;

  • p i W p^W_i piW为世界坐标系中表示的点 p i p_i pi n i n_i ni p i W p^W_i piW在局部地图中邻域的法线, p i l p^l_i pil为传感器测量值(在LiDAR坐标系中);

  • Ω α i [ X ] = ( R α i , t α i ) ∈ S E ( 3 ) Ω^{\alpha_i}[X]=(R^{\alpha_i},t^{\alpha_i})∈SE(3) Ωαi[X]=(Rαi,tαi)SE(3)是雷达坐标系在时间 τ i \tau_i τi到世界W的变换。通过定义 α i = ( τ i − τ b ) / ( τ e − τ b ) \alpha_i=(\tau_i-\tau_b)/(\tau_e-\tau_b) αi=(τiτb)/(τeτb),在 Ω b Ω_b Ωb Ω e Ω_e Ωe之间进行插值估计。对于旋转插值,使用标准球面线性插值(slerp)。

  • 还引入了有利于平面邻域的权重: a i = a 2 D = ( σ 2 − σ 3 ) / σ 1 a_i=a_{2D}=(\sigma_2−\sigma_3)/\sigma_1 ai=a2D=(σ2σ3)/σ1,是 p i W p^W_i piW邻域的平面度,其中 σ i \sigma_i σi是邻域协方差特征值的平方根。

优化函数还引入了两个约束 C l o c C_{loc} Cloc(位置一致性约束)和 C v e l ( X ) C_{vel}(X) Cvel(X)(等速约束),其权重分别为 β l \beta_l βl β v \beta_v βv,定义如下:
C l o c ( t b ) = ∣ ∣ t b − t e n − 1 ∣ ∣ 2 C_{loc}(t_b)=||t_b-t^{n-1}_e||^2 Cloc(tb)=∣∣tbten12
C v e l ( t b , t e ) = ∣ ∣ ( t e − t b ) − ( t b n − 1 − t e b − 1 ) ∣ ∣ 2 C_{vel}(t_b,t_e)=||(t_e-t_b)-(t^{n-1}_b-t^{b-1}_e)||^2 Cvel(tb,te)=∣∣(tetb)(tbn1teb1)2

C l o c C_{loc} Cloc迫使传感器的开始和结束位置保持一致(限制不连续性),而 C v e l ( X ) C_{vel}(X) Cvel(X)限制过快的加速。

CT-ICP执行迭代,直到满足参数步长范数的阈值(通常为平移0.1 cm和旋转0.01°)或达到多次迭代(5次以确保实时性)。

3.2 局部地图和鲁棒的配置文件

作为局部地图,世界坐标系(W)中的点存储在体素的稀疏数据结构中,以便比kd-trees(常数时间访问而不是对数访问)更快地进行邻域访问。
地图的体素大小控制着邻域搜索的半径,以及存储点云的详细程度。

每个体素最多存储20个点,这样两个点之间的距离就不会超过10厘米,以限制由于沿着扫描线的测量密度而造成的冗余。
一旦一个体素被填满,就不会再插入点了。

为了构建点 p i W p^W_i piW的邻域(用于计算ni和ai),从当前点的27个相邻体素中选择地图中k=20个最近邻。在对当前扫描n运行CT-ICP后,这些点被添加到局部地图中。

使用这些类型地图的里程计对错误配准高度敏感,并且无法从错误扫描插入的地图污染中恢复,为了处理这个问题,引入了一个鲁棒的配置文件,可以检测硬情况(快速方向变化)和注册失败(位置不一致或大量新关键点落在空体素中),并尝试使用一组更保守的参数(最明显的是大量采样关键点和更大的邻域搜索)对当前扫描进行新的注册;对于重要的方向修改(≥5◦),不会在地图中插入新的扫描,因为这有更高的不对齐概率。

3.3 回环检测和后端

回环检测算法在其内存中保留了一个由里程计记录的最后扫描的窗口。当窗口达到 N m a p N_map Nmap扫描的大小时,这些点被聚合成一个点云,放置在窗口中心的坐标框架中。

然后将该地图的每个点插入到二维高程网格中,使每个像素点保持最大高程。从这个二维网格中,通过在 Z m i n Z_min Zmin Z m a x Z_max Zmax之间剪切每个像素的z坐标来获得高程图像。

然后提取旋转不变的2D特征,并将其与高程网格一起保存在内存中。除了最后一次 N o v e r l a p N_overlap Noverlap之外的所有扫描都将从窗口中删除。

每次建立新的高程图像时,它都会与保存在其内存中的高程图像进行匹配。使用RANSAC鲁棒拟合两个特征集之间的二维刚性变换,并使用内层数的阈值来验证对应关系。当匹配被验证后,对初始2D变换在高程网格的点云上进行ICP细化,产生精确的6自由度闭环约束。

后端使用位姿图,当添加新的里程约束时,会向图中添加新的姿态,但只有当检测到新的环路约束时,轨迹才会进行全局优化,此时闭环模块的轨迹也会更新。

4 实验与结果

在KITTI, KITTI-raw, KITTI-360, KITTI- carla, ParisLuco, Newer College Dataset (NCD)和NCLT数据集上进行了实验。

4.1 里程计实验

使用KITTI相对平移误差(RTE)进行评估。并且在提供的数据集上与其他三种LiDAR里程计进行比较:MULLS、IMLSSLAM和pyLIDAR-SLAM F2M。实验结果如下:

4.2 回环检测实验

为了定量评价其质量,RTE不太适合,并且在环路关闭后趋于恶化。为了证明全局轨迹改进,使用标准的绝对轨迹误差(ATE)来进行评估。然而,为了将质量评估与初始姿态的方向误差分离开,在计算ATE之前首先估计地面真值与估计轨迹之间的最佳刚性变换。

下图给出了实验定性结果:

下表给出了实验定量结果:

最后给出了NCLT数据集(左上)、KITTI-CARLA(右上)、Newer College数据集(左下)和ParisLuco(右下)的聚合点云使用CT-ICP获得的地图的质量。

5 总结

本文提出了一种新的实时激光雷达里程计方法,该方法在七个不同数据集(从驾驶到高频运动场景)上超越了目前的技术水平。该方法的核心是匹配CT-ICP的连续扫描,它在优化过程中弹性地扭曲新的扫描,以补偿采集过程中的运动。

未来的工作将专注于改进后端,将所提出的连续公式扩展到扫描匹配之外,并充分利用循环关闭程序。

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

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

相关文章

逻辑代数运算

逻辑代数运算中的三种基本运算 与(AND):只有满足全部条件,才会产生结果 或(OR) :只要满足一个条件,就会产生结果 非(NOT):只要满足条件&#xff…

14-4_Qt 5.9 C++开发指南_QUdpSocket实现 UDP 通信_UDP组播

文章目录 1. UDP组播的特性2. UDP 组播实例程序的功能3. 组播功能的程序实现4. 源码4.1 可视化UI设计4.2 mainwindow.h4.3 mainwindow.cpp 1. UDP组播的特性 下图简单表示了组播的原理。UDP 组播是主机之间“一对一组”的通信模式,当多个客户端加入由一个组播地址定…

爆卖1.5万件!这款美牙神器成TikTok“现象级爆款!

在大多数美国人心中,健康洁白的牙齿是自信社交的底气,这使得他们对牙齿美白格外重视。 特看数据显示,TikTok Shop美国小店有一款“牙齿美白套件”近两个多月以 300 元的客单价爆卖 1.5 万件,截至7月 26日,产品近7 天共…

HTML基础铺垫

😊HTML基础铺垫 👻前言📜HTML文档结构🎭头部head🥏标题title标记🥏元信息meta标记 🎭主体body🥏body标记🥏body标记属性 🎭HTML基本语法🥏标记类型…

最新SecureCRT 中文注册版

SecureCRT是一款由VanDyke Software公司开发的终端仿真软件,它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT专门为网络管理员、系统管理员和其他需要保密访问网络设备的用户设计。 软件下载:SecureCRT for ma注册版 远程访问:Sec…

海外市场品牌定位策略:打造独特品牌形象的关键步骤

在海外市场建立品牌,品牌定位是至关重要的一环。品牌定位是指企业在目标市场中通过一系列战略来塑造品牌形象和传达品牌价值,以区别于竞争对手并满足目标客户的需求和愿望。 在国际化的背景下,品牌定位需要更加细致入微和深思熟虑&#xff0…

《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

vue SKU已知sku.tree算出sku.list类目值和id

已知sku.tree算出sku.list类目值和id <van-skuref"sku"v-model"showBase":close-on-click-overlay"closeOnClickOverlay":goods"skuData.goods_info":goods-id"skuData.goods_id":hide-stock"skuData.sku.hide_stoc…

Android Ble蓝牙App(二)连接与发现服务

Ble蓝牙App&#xff08;二&#xff09;连接与发现服务 前言正文一、GATT回调二、连接和断连三、连接状态回调四、发现服务五、服务适配器六、显示服务七、源码 前言 在上一篇中我们进行扫描设备的处理&#xff0c;本文中进行连接和发现服务的数据处理&#xff0c;运行效果图如下…

CSGO游戏搬砖行业乱象

CSGO游戏搬砖行业乱象 CSGO游戏搬砖&#xff0c;这个项目&#xff0c;这个概念相信大家已不再陌生。CSGO这款全球竞技游戏&#xff0c;也早已不是当初的游戏&#xff0c;而是带着目的&#xff0c;带着经济系统向大家缓缓走来&#xff0c;一个虚拟的空间&#xff0c;一种虚拟的…

【大数据】Flink 从入门到实践(一):初步介绍

Flink 从入门到实践&#xff08;一&#xff09;&#xff1a;初步介绍 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在 无边界 和 有边界 数据流上进行 有状态 的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 1.架构 1…

算法与数据结构-跳表

文章目录 什么是跳表跳表的时间复杂度跳表的空间复杂度如何高效的插入和删除跳表索引动态更新代码示例 什么是跳表 对于一个单链表来讲&#xff0c;即便链表中存储的数据是有序的&#xff0c;如果我们要想在其中查找某个数据&#xff0c;也只能从头到尾遍历链表。这样查找效率…

OceanBase上的泡泡玛特抽盒机,轻松应对百倍流量峰值

8月3日晚10点&#xff0c;近百万年轻人再次同时涌入泡泡玛特的抽盒机小程序&#xff0c;参加抢抽盲盒新品的狂欢。 每周四的这个时刻&#xff0c;都是对抽盒机系统的一次技术大考。这个考验不但影响着用户体验&#xff0c;也直接影响着泡泡玛特的业绩。据2022年年度财报&#…

向你推荐这5个好用的UI设计软件,快来收藏

好用的UI设计工具将助力设计师实现高效创作&#xff0c;今天本文将为大家推荐5个好用的UI设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是国产的UI设计工具&#xff0c;它不仅能为设计师提供UI设计上的帮助&#xff0c;还可以助力设计团队实现一体化协…

[CKA]考试之检查可用节点数量

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 检查集群中有多少节点为Ready状态&#xff08;不包括被打上 Taint&#xff1…

java中使用Jsoup和Itext实现将html转换为PDF

1.在build.gradle中安装所需依赖&#xff1a; implementation group: com.itextpdf, name: itextpdf, version: 5.5.13 implementation group: com.itextpdf.tool, name: xmlworker, version: 5.5.13 implementation group: org.jsoup, name: jsoup, version: 1.15.32.创建工具…

Java多线程(1)---多线程认识、四种创建方式以及线程状态

目录 前言 一.Java的多线程 1.1多线程的认识 1.2Java多线程的创建方式 1.3Java多线程的生命周期 1.4Java多线程的执行机制 二.创建多线程的四种方式 2.1继承Thread类 ⭐创建线程 ⭐Thread的构造方法和常见属性 2.2.实现Runnable接口 ⭐创建线程 ⭐使用lambda表达…

大一新生必读:如何选择适合自己的笔记本电脑?

大家好&#xff0c;这里是程序员晚枫&#xff0c; 今天给大家推荐5个适合大学生&#xff0c;尤其是大一新生使用的笔记本电脑。都是大品牌&#xff0c;而且价格实惠&#xff0c;性能优秀&#xff01; 偷偷说一句&#xff0c;点击本文链接有大额优惠券哟~ 01 推荐电脑 以下是…

【IC设计】ICC workshop Lab1 数据准备基本流程 【脚本总结】

Task 1 Create a Milkyway library 先进入lab1_data_setup目录&#xff0c;打开icc_shell&#xff0c;创建项目 create_mw_lib -technology $tech_file -mw_reference_library "$mw_path/sc $mw_path/io $mw_path/ram16x128" -bus_naming_style {[%d]} -open $my_m…

100道Python练习题

100道Python练习题&#xff0c;希望对你提升有所帮助&#xff01; 编写一个程序&#xff0c;输入两个数并计算它们的和。编写一个程序&#xff0c;输入一个字符串&#xff0c;并倒序输出该字符串。编写一个程序&#xff0c;判断一个数是否为质数。编写一个程序&#xff0c;计…