论文阅读及复现——《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.rhkb.cn/news/107766.html

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

相关文章

opencv-答题卡识别判卷

#导入工具包 import numpy as np import argparse import imutils import cv2# 设置参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--image", requiredTrue,help"path to the input image") args vars(ap.parse_args())# 正确答案…

【附安装包】Vred2023安装教程

软件下载 软件:Vred版本:2023语言:简体中文大小:2.39G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.0GHz 内存4G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.baidu.com…

Nginx 高级配置

目录 1 网页的状态页 2 Nginx 第三方模块 2.1 ehco 模块 3 变量 3.1 内置 3.2 定义变量 4 Nginx压缩功能 5 https 功能 6 自定义图标 1 网页的状态页 基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 --with-http…

pytest之parametrize参数化

前言 我们都知道pytest和unittest是兼容的,但是它也有不兼容的地方,比如ddt数据驱动,测试夹具fixtures(即setup、teardown)这些功能在pytest中都不能使用了,因为pytest已经不再继承unittest了。 不使用dd…

3 自制一个集群分发脚本

1. 随便取了一个名字:xsync 2. 在一个配置环境变量的目录下,我是放在了/opt/software下,这个路径我是配置了环境变量的。 3. 编辑脚本:vim xsync #!/bin/bash#1. 判断参数个数 if [ $# -lt 1 ] thenecho Not Enough Arguement!…

海康摄像头通过SDK接入到LiveNVR实现双向语音喊话对讲与网页无插件播放,并支持GB28181级联语音对讲...

目录 1、确认摄像头是否支持对讲2、摄像头视频类型复合流3、通道配置SDK接入4、视频广场点击播放5、相关问题 5.1、如何配置通道获取直播流?5.2、如何GB28181级联国标平台?6、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、确认摄像头是否支持对讲 可以访问摄…

为什么使用Nacos而不是Eureka(Nacos和Eureka的区别)

文章目录 前言一、Eureka是什么?二、Nacos是什么?三、Nacos和Eureka的区别3.1 支持的CAP3.2连接方式3.3 服务异常剔除3.4 操作实例方式 总结 前言 为什么如今微服务注册中心用Nacos相对比用Eureka的多了?本文章将介绍他们之间的区别和优缺点…

SemrushBot蜘蛛爬虫屏蔽方式

查看访问日志时候发现有SemrushBot爬虫 屏蔽方法: 使用robots.txt文件是一种标准的协议,用于告诉搜索引擎哪些页面可以和不能被爬取,如想禁止Googlebot爬取整个网站的话,可以在该文件中添加以下内容: User-agent: Googlebot Disallow: / 对于遵循robots协议的蜘蛛…

护目镜佩戴检测识别算法

护目镜佩戴检测识别算法通过opencvpython网络深度学习模型,护目镜佩戴检测识别算法实时监测工人的护目镜佩戴情况,发现未佩戴或错误佩戴的情况,及时提醒调整。与C / C等语言相比,Python速度较慢。也就是说,Python可以使…

【多线程】Thread类的用法

文章目录 1. Thread类的创建1.1 自己创建类继承Thread类1.2 实现Runnable接口1.3 使用匿名内部类创建Thread子类对象1.4 使用匿名内部类创建Runnable子类对象1.5 使用lambda创建 2. Thread常见的构造方法2.1 Thread()2.2 Thread(Runnable target)2.3 Thread(String name)2.4 Th…

什么是算法?

目录 算法是指解决方案的准确而完整的描述。 1.算法的基本特征 所谓算法,是一组严谨地定义运算顺序的规则 并且每一个规则都是有效的,且是明确的 此顺序将在有限的次数下终止 什么是算法? 算法的4个基本特征 算法的6个基本方法 选择算…

使用go语言、Python脚本搭建一个简单的chatgpt服务网站。

使用go语言、Python脚本搭建一个简单的GPT服务网站 前言 研0在暑假想提升一下自己,自学了go语言编程和机器学习相关学习,但是一味学习理论,终究是枯燥的,于是自己弄点小项目做。 在这之前,建议您需要掌握以下两个技…

5.网络原理之初识

文章目录 1.网络发展史1.1独立模式1.2网络互连1.3局域网LAN1.3.1基于网线直连1.3.2基于集线器组建1.3.3基于交换机组建1.3.4基于交换机和路由器组建1.3.4.1路由器和交换机区别 1.4广域网WAN 2.网络通信基础2.1IP地址2.2端口号2.3认识协议2.4五元组2.5 协议分层2.5.1 分层的作用…

Java项目-苍穹外卖-Day05-Redis技术应用

1.店铺营业状态设置 需求分析和设计 左上角要求是有回显的 所以至少两个接口 1.查询营业状态接口(分为了管理端和用户端) 2.修改营业状态接口 因为管理端和用户端路径不同,所以现在是至少三个接口的 可以发现如果存到表里除了id只有一个…

java八股文面试[JVM]——垃圾回收器

jvm结构总结 常见的垃圾回收器有哪些? CMS(Concurrent Mark Sweep) 整堆收集器: G1 由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,…

leetcode 516. 最长回文子序列

2023.8.27 本题依旧使用dp算法做&#xff0c;可以参考 回文子串 这道题。dp[i][j]定义为&#xff1a;子串s[i,j] 的最长回文子串。 直接看代码: class Solution { public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(),vector<int&…

AIGC ChatGPT 实现动态多维度分析雷达图制作

雷达图在多维度分析中是一种非常实用的可视化工具&#xff0c;主要有以下优势&#xff1a; 易于理解&#xff1a;雷达图使用多边形或者圆形的形式展示多维度的数据&#xff0c;直观易于理解。多维度对比&#xff1a;雷达图可以在同一张图上比较多个项目或者实体在多个维度上的…

数据结构(Java实现)LinkedList与链表(下)

** ** 结论 让一个指针从链表起始位置开始遍历链表&#xff0c;同时让一个指针从判环时相遇点的位置开始绕环运行&#xff0c;两个指针都是每次均走一步&#xff0c;最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下&#xff1a; 也…

Linux 线程安全

一、线程安全的概念 线程安全即就是在多线程运行的时候&#xff0c;不论线程的调度顺序怎样&#xff0c;最终的结果都是 一样的、正确的。那么就说这些线程是安全的。 二、如何保证线程安全 1.线程同步 保证同一时刻只有一个线程访问临界资源。线程同步的方法有4种&#xf…

成都瀚网科技:抖店如何经营?

作为热门的短视频分享平台&#xff0c;抖音不仅是一种娱乐工具&#xff0c;更是一个蕴藏着无限商机的电商平台。开店、抖音下单成为很多人的选择。那么&#xff0c;抖音如何开店、下单呢&#xff1f; 1、如何在抖音上开店和下单&#xff1f; 注册账号&#xff1a;首先&#xff…