论文阅读及复现——《CT_ICP: Real-time Elastic LiDAR Odometry with Loop Closure》

论文阅读之——《CT_ICP: Real-time Elastic LiDAR Odometry with Loop Closure》带闭环的实时弹性激光雷达里程计

  • 1. 主要贡献
  • 2. 相关说明
  • 3. 激光里程计
    • 3.1 里程计公式构建
    • 3.2 局部地图与健壮性
  • 4. 回环检测与后端
  • 5. 实验结果
    • 5.1 里程计实验结果
    • 5.2 回环检测实验结果
  • 6. 总结

论文网址:https://arxiv.org/abs/2109.12979
源码网址:https://github.com/jedeschaud/ct_icp
复现过程:https://blog.csdn.net/qq_44164791/article/details/132188049?spm=1001.2014.3001.5502

1. 主要贡献

  1. 提出了一个具有扫描内姿态连续性扫描间不连续性的新型弹性激光雷达里程计
  2. 使用稀疏体素结构存储稠密点云的局部地图,可以达到实时处理的速度。
  3. 做了大量实验,在7个高频运动驾驶场景数据集上进行了实验,所有的代码均开源
  4. 提出了一个回环检测的方法,还实现了位姿后端,构成了一个完整的SLAM。

2. 相关说明

CT-ICP 定义的轨迹在扫描内连续,在扫描间间断。在一个扫描过程中,轨迹可以使用开始位姿和结束位姿表示。CT-ICP 的最终轨迹是不连续的,因为一次扫描的开始位姿不等于上一次扫描的结束位姿。这种方法考虑到插值不适用于不规则运动。

激光雷达里程计在开发环境中依然有累积误差,这会导致轨迹偏移。回环闭合可以全局矫正轨迹,但回环检测仍然是一个开放性的问题。现在大多数解决方法都主要依赖配准法( registration methods)直接闭合回环。这样只能处理小规模轨迹和较小偏移。很多位置识别方法都在每一个扫描中识别位置,这对环境变化很敏感,更适合驾驶场景。最近和多基于深度学习的方法被提出,但由于训练样本,这些方法不适用于新环境。CT-ICP 的回环闭合算法作用于投影在一个高程图像上的汇聚点云(aggregated point clouds)。该方法需要传感器的运动接近 2 维,且需要估计重力矢量,该方法可以用于任何满足这些条件的激光雷达里程计。CT-ICP 在局部地图中检测回环。因此 CT-ICP 不需要检查每次扫描是否与之前的位置一样。这在在线 SLAM 场景中更高效。

3. 激光里程计

3.1 里程计公式构建

在每一帧,里程计具有两个位姿,分别是帧起始位姿和帧结束位姿, 时间也一样:
在这里插入图片描述
与其他里程计不同的是,当前帧的起始位姿不等于上一帧的结束位姿,这两个位姿之间还存在一个邻近约束。

定义求解问题如下:
在这里插入图片描述

1. 局部地图和鲁棒的配置文件
这部分论文里写的有点像是实验报告,两段话,大致讲了体素格参数配置和雷达点云帧插入标准的大致准则(判断角度变化是否大于阈值)。
2. 回环检测和后段
思路和SC有点类似,但是实现方式不一样
将地图中的每个点插入到2D高程网格,使每个像素点保持在最大高度,在2D网格中,通过Zmin和Zmax的差值获取高程图像,然后提取旋转不变的2D特征并且和高程网格一起保存。提取到匹配对后,通过ICP和RANSAC约束位姿…
总体而言,限制很多,首先要求是运动尽量是平面运动,然后要求将Z轴和地平面法向量对齐,这个回环不如用SC来代替。

3.2 局部地图与健壮性

我们使用过往的扫描作为局部地图。体素用于存储世界坐标系中的点,为了快速访问临近体素,体素使用稀疏的数据结构实现,而不是使用 kd 树。
所以与kd树相比,其访问时间复杂度是线性的,而不是对数。对于驾驶场景来说,高频运动场景下,局部地图的体素尺寸是1米和0.8米。

体素的尺寸就是地图的栅格大小,它决定邻近搜索半径和局部地图的详细程度。每个体素存储的点达到 20 个,为了避免冗余,任意两个点的距离都不小于10厘米。为了构造点 p i W p^{W}_i piW 的近邻(用于计算法向量 n i n^i ni 和平面权重 a i a^i ai ),我们在地图中离该点最近的 27 个(边长为 3 的立方体)体素中找出k=20个最近点。处理完当前扫描后,点被加入局部地图。体素被占满时,其中的点将被删除(为什么)。我们的局部地图不像 pyLiDAR的F2M一样,局部地图不会使用滑动窗口丢弃点云。

如果向地图中添加错误的数据,或者方向变化较快,使用滑动窗口丢弃点云的地图很容易受影响。对于方向变化快的数据,我们提出一个健壮性的方案:检测困难情况(快速的方向变化)和失败的注册(位置不一致或者大量新关键点落入空体素),使用更保守的参数重新注册;如果方向变化大于5度,我们就不会把新的扫描结果插入地图,否则很可能偏离方向。健壮性的提高会增加一定的时间复杂度。

4. 回环检测与后端

CT-ICP 的回环闭合算法在内存中维持一个窗口,窗口内是里程计最近添加进来的扫描。当窗口大小等于 N m a p N m a p NmapN_{map} NmapNmap个扫描时,点就会被加入位于窗口中心位置的那个扫描的点云中。解释:假如窗口大小是 9,如果窗口内有 9 个扫描,就把窗口内的点加入第 5 个扫描的点云中。这是因为一般情况下,第 5 个扫描与其它 8 个扫描的重合最多。

地图的每个点都会被插入一个 2 维的高程栅格,让每个像素的点保持最大高度。在这个 2 维栅格内,以点的最小z坐标 z m i n z_{min} zminz和最大 z 坐标 z m a x z_{max} zmax作为 z 轴的范围,得到高程图像。然后提取 2 维旋转不变特征,与高程栅格一块保存在内存中。除了最后 N o v e r l a p N_{overlap} Noverlap个扫描,其它都被移出窗口。

每一个新创建的高程图像(包含 N m a p − N o v e r l a p N_{map} - N_{overlap} NmapNoverlap个扫描),都会与内存中的高程图像匹配。使用 2 维刚体变换和 RANSAC 算法,把新创建的高程图像变换到与内存中保存的高程图像一致。如果能匹配,就对高程栅格的点云,使用 ICP 改善算法(Open3D 的 ICP 算法)提高 2 维刚体变换,得到一个精确的 6 自由度闭环约束。为了减少候选数量,使用阈值 n c a n d i d a t e s = 10 n_{candidates} = 10 ncandidates=10筛选与当前高程栅格最近的 10 个高程栅格。这个阈值与误差有关,阈值过小导致闭环的漏检。

CT-ICP 的后端使用 g2o 实现标准的位姿图。位姿图定期添加新位姿,但只有检测到闭环时,才对整个轨迹作全局优化。

CT-ICP 的算法需要传感器在平面上运动(上下运动幅度小),还需要外参标定以对齐 z 坐标与实际平面。这限制了传感器和运动。如果重力矢量或者局部平面已知,高程图像就能正确地投影,这个限制也就没有了。但我们在第 Ⅴ 部分说了,在室外场景中,使用向上的传感器,使我们的闭环检测成功检测到一些闭环。

5. 实验结果

5.1 里程计实验结果

在这里插入图片描述
表中数据在 5 个驾驶场景数据集和2个高频运动场景数据集上的相对变换误差 RTE。AVG 是所有 sequences 上 RTE 的平均值,ΔT是每个扫描的平均耗时。KITTI-corrected 是唯一一个被校正过的数据集,其它数据集的点云都是原始未校正的。

从表中可以看出,所有里程计方法在经过运动校正的 KITTI-corrected 数据集上表现接近。处理未校正的数据集 KITTI-raw 和 KITTI-360 时,其它方法的表现明显变差,而 CT-ICP 在未校正的数据集上的表现接近其在校正过的数据集上的表现。在校正过的数据集上,CT-ICP 的弹性策略不起作用,这表明了CT-ICP的地图和scan-to-map算法的有效性。在 KITTI 的在线评测上,CT-ICP 以 0.59% 的 RTE 排名第一。
  表中KITTI-corrected 数据集上,CT-ICP 的结果与 MULLS 不同,这是因为 CT-ICP 把一套参数用于所有 sequence,而 MULLS 针对城市、高速公路和村庄场景,使用三套不同的参数。

KITTI-CARLA 数据集的速度变化比 KITTI 快。在该数据集上,CT-ICP 的表现比其它方法都好:CT-ICP 的 RTE 仅为 0.09%,其它方法的最好结果是 0.81%。这证明 CT-ICP 的弹性策略和扫描间位姿不连续策略可以有效弥补位姿误差。

不同于 KITTI 的 64 线激光雷达,ParisLuco 数据集的雷达是 32 线的。由于获取于市中心,ParisLuco 是低惯性的(low inertia)。在该数据集上,CT-ICP 能超过使用稠密地图的IMLS-SLAM。

NCD 和 NCLT 数据集使用棍子和平衡车采集,所以不稳定。而且它们的每个 sequence 包含更多扫描,环境也多样(植被、道路、室内、室外),因此更具挑战性。此外这两个数据集还有很多边界情况,比如快速地从室内转移到室外、急转弯、运动的高频间断引起的扫描大变形。一般的雷达里程计很难处理这些情况。表 1 表明 CT-ICP 在 NCD 数据集上表现优秀。在 NCLT 数据集上的实验也证明了 CT-ICP 的健壮性,因为 CT-ICP 在处理边界情况时,RTE 比 pyLiDAR F2M 还低。

为了专门验证 CT-ICP 的主要贡献,即其弹性策略,只使用匀速运动模型扭曲(distort)扫描,以测试里程计。在 KITTI-raw 上,RTE 从 0.55% 增加到 0.79%,在 KITTI-360 上,RTE 从 0.45% 增加到 0.60%。

5.2 回环检测实验结果

在所有数据集上,CT-ICP 使用的回环闭合模型都是 CT-ICP 加回环闭合,其中
N m a p = 100 N N_{map} = 100N Nmap=100N N o v e r l a p = 30 N N_{overlap} = 30N Noverlap=30N z m i n z_{min} zmin略低于标注值(使用传感器获取一个近似的外部标定), z m a x z_{max} zmax z m i n z_{min} zmin大 10 米。对于 NCLT,使用刚体变换把向下的 z 轴变换成向上。每个高程珊格的计算时间加上与前一个高程珊格的匹配时间,平均需要 1.1 秒。位姿图优化平均需要 1.2 秒。当前的回环闭合由主线程负责,利用多线程可以实现实时。
在这里插入图片描述
CT-ICP 里程计估计出的轨迹和回环闭合校正效果。第 1 幅图是在 KITTI-raw 数据集 sequence 00 的 4541 个扫描上的实验结果,第 2 幅图是在 KITTI-360 数据集 sequence 06 的 9698 个扫描上的实验结果,第 3 幅图是在 KITTI-CARLA 数据集 Town 01 的 5000 个扫描上的实验结果,第 4 幅图是在 NCD 数据集 0 1 s h o r t e x p e r i m e n t 01_short_experiment 01shortexperiment的 15301 个扫描上的实验结果,第 5 幅图是在 NCLT 数据集 2012-01-08 的 42764 个扫描上的实验结果。
在这里插入图片描述
上图图是在 KITTI-360 数据集 sequence 00 的 11501 个扫描上,回环闭合的量化结果。左上部是投影局部地图得到的一个高程图像,右上部是 CT-ICP 里程计轨迹和回环闭合(CT-ICP 加回环闭合)校正效果,下部是在左上图所示的局部地图中发现的多个闭环约束(使用绿色表示)。
在这里插入图片描述
表是回环闭合在每个数据集的一个 sequence 上的实验结果。ATE 是固定了估计轨迹于实际轨迹间的刚体变换后的平均绝对轨迹误差,单位是米。 N l o o p N_{loop} Nloop是检测到的回环数量。LO 代表激光雷达里程计,LC 代表回环闭合。

在各数据集的其中一个 sequence 上的实验结果。首先,记录 CT-ICP 在 KITTI-raw、KITTI-360 和 ParisLuco 数据集上,回环闭合的最好结果。KITTI-360 的 ATE 在闭合前后变化很大,这是因为它的 sequence 最长。KITTI-CARLA 的 ATE 在回环闭合前后变化不大,这是因为该数据集包含的路径几何形状简单,也就是说平面大且平整。所以扫描匹配的挑战性主要受传感器采集数据时的运动情况影响。CT-ICP 的对齐效果接近完美,达到了 ATE 为 21 厘米的精度,如图 3 所示,其估计的轨迹与标注值几乎重合。

最后,在每个 sequence 上检测多个回环。回环的数量取决于高程栅格的构造频率,也就是和重叠大小 N o v e r l a p N N_{overlap}N NoverlapN以及地图大小 N m a p N N_{map}N NmapN有关。每到交叉路口,就计算回环约束。重叠大小 N o v e r l a p N N_{overlap}N NoverlapN越大,越能检测出更多回环(包括连续的局部地图间的约束)。

6. 总结

CT-ICP 提出了一个新的实时里程计。在包含驾驶场景和高频运动场景的 7 个数据集上,进行了多方面的评比,CT-ICP 都超过现有方法。

核心是连续的扫描匹配算法,它在优化时,弹性地变换一个新扫描,以弥补采集数据时的运动。

CT-ICP 提供所有代码和数据集以供验证所有实验结果。

在IMLS的基础上,建模帧内和帧间约束

展望: CT-ICP 会着重于后端,进一步延伸扫描外的连续策略,充分利用提出的回环闭合算法。

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

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

相关文章

go: 高性能json工具 easyjson 简介

先安装easyjson go get -u github.com/mailru/easyjson/在结构体上加//easyjson:json的注解 //easyjson:json type School struct {Name string json:"name"Addr string json:"addr" }//easyjson:json type Student struct {Id int json:&…

【黑马头条之热点文章kafkaStream】

本笔记内容为黑马头条项目的热点文章-实时计算部分 目录 一、实时流式计算 1、概念 2、应用场景 3、技术方案选型 二、Kafka Stream 1、概述 2、Kafka Streams的关键概念 3、KStream 4、Kafka Stream入门案例编写 5、SpringBoot集成Kafka Stream 三、app端热点文章…

Python 中星号(*)的用法

星号​​*​​ 往往被称为乘法运算符,是所有程序中最为常用的运算符号之一,在Python 中,星号还有很多隐藏的强大功能。 本文将用最容易理解的例子来解释星号*的 五个使用场景,从初级用法到高阶用法。 乘法和幂运算符 最简单的用法是利用星号…

计算机竞赛 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

GMP原理与调度

GMP原理和调度 1.Golang"调度器"的由来1.1单进程时代不需要调度器1.2多进程/线程时代有了调度器需求1.3协程来提高cpu利用率 1.Golang"调度器"的由来 1.1单进程时代不需要调度器 早期的操作系统每个程序就是一个进程,直到一个程序运行完毕&am…

pandas由入门到精通-数据透视表

采集的数据存储后通常会分为多个文件或数据库,如何将这些文件按需拼接,或按键进行连接十分重要。这节将介绍数据索引的复杂操作如分层索引,stack,unstack,seet_index,reset_index等帮助重构数据,数据的拼接如merge,join,concat,combine_first等帮助连接数据,以及数据透视表…

1.7 【MySQL】常用存储引擎

MySQL 支持非常多种存储引擎,我这先列举一些: 存储引擎 描述 ARCHIVE 用于数据存档(行被插入后不能再修改) BLACKHOLE 丢弃写操作,读操作会返回空内容 CSV 在存储数据时,以逗号分隔各个数据项 FEDE…

微信小程序发布迭代版本后如何提示用户强制更新新版本

在点击小程序发布的时候选择,升级选项 之前用户使用过的再打开小程序页面就会弹出升级弹窗modal

ide-eval-resetter jar包下载、源码、使用介绍

如果你在找ide-eval-resetter插件,这里告诉你,2021.3版本开始该插件正式失效。 如果你安装的JB产品版本低于2021.3版本,你确定要找ide-eval-resetter,下面提供相关链接希望对你有帮助。 ide-eval-resetter源码: Githu…

深度学习9:简单理解生成对抗网络原理

目录 生成算法 生成对抗网络(GAN) “生成”部分 “对抗性”部分 GAN如何运作? 培训GAN的技巧? GAN代码示例 如何改善GAN? 结论 生成算法 您可以将生成算法分组到三个桶中的一个: 鉴于标签&#…

华为OD机试真题【最大利润】

1、题目描述 【最大利润】 商人经营一家店铺,有number种商品,由于仓库限制每件商品的最大持有数量是item[index] 每种商品的价格是item-price[item_index][day] 通过对商品的买进和卖出获取利润 请给出商人在days天内能获取的最大的利润 注:…

C++—纯虚函数

一、前言 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义函数为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用&…

VUE3 Setup语法糖

目前setup sugar已经进行了定稿,vue3 setup sugar TS的写法看起来很香,写本文时 Vue 版本是 “^3.2.6” script setup 语法糖 新的 setup 选项是在组件创建之前, props 被解析之后执行,是组合式 API 的入口。 WARNING 在 setup 中你应该避免使用 thi…

火山引擎 DataLeap:从短视频 APP 实践看如何统一数据指标口径

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 短视频正在成为越来越多人发现世界的窗口,其背后的创作者生态建设是各大短视频 APP 不可忽视的重要组成部分。 为了激励更多优质内容生产,某…

数据压缩算法一览

文章首发地址 Huffman编码: Huffman编码是一种基于字符频率的无损压缩算法。它将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,从而实现压缩。Lempel-Ziv-Welch (LZW): LZW是一种基于字典的无损压缩算…

iOS 分别对一张图的局部进行磨砂,拼接起来不能贴合

效果图 需求,由于视图层级的原因,需要对图片分开进行磨砂, 然后组合在一起 如图,上下两部分,上下两个UIImageVIew大小相同,都是和图片同样的大小,只是上面的UIimageVIew 只展示上半部份 &#…

初识【类和对象】

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的…

stm32之9.中断优先级配置

主函数main.c #include <stm32f4xx.h> #include "led.h" #include "key.h"#define PAin(n) (*(volatile uint32_t *)(0x42000000 (GPIOA_BASE0x10-0x40000000)*32 (n)*4)) #define PEin(n) (*(volatile uint32_t *)(0x42000000 (GP…

html实现iframe全屏

前言 html浏览器全屏操作&#xff0c;基于jquery iframe全屏、指定标签全屏 实现 css /** 全屏*/ .lay-dbclick-box{position: relative;width: 100%;height: 100%; } .lay-dbclick-screen{position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 999999999…

pytorch里面的nn.AdaptiveAvgPool2d

今天遇到nn.AdaptiveAvgPool2d((None, 1)) AdaptiveAvgPool2d函数详细解释&#xff1a; 2D自适应平均池化&#xff08;2D adaptive average pooling&#xff09;是一种对输入信号进行二维平均池化的操作&#xff0c;输入信号由多个输入平面&#xff08;input planes&#xff0…