经典文献阅读之--VGICP(体素化的ICP匹配)

news2024/9/28 19:53:20

0. 简介

之前我们在以前的文章中介绍了很多有关于点云匹配相关的知识,最近两年处理GICP这一大一统的ICP匹配方法以外,还有一个工作对体素化和ICP这两者打起了心思,《Voxelized GICP for Fast and Accurate 3D Point Cloud Registration》提出了一种体素化的广义迭代最近点(VGICP)算法,用于快速、准确地进行三维点云配准。该方法扩展了广义迭代最近点(GICP)方法的体素化,避免了代价昂贵的最近邻搜索,同时保持了算法的精度。与从点位置计算体素分布的正态分布变换(NDT)不同,我们通过聚集体素中每个点的分布来估计体素分布。体素化方法使算法能够高效地并行处理优化问题,所提出的算法在CPU上可以运行30hz,在GPU上可以运行120hz。通过在模拟环境和真实环境中的评估,我们证实了该算法的精度可以与GICP相媲美,但比现有的方法快得多。结合类ICP和NDT的两者的优点。
在这里插入图片描述
这里深蓝AI的文章中也证明了这一点。
在这里插入图片描述
值得一提的是与GICP一样,VGICP也是开源的,开源地址为:https://github.com/SMRT-AIST/fast_gicp.git

1. 文章贡献

三维点云配准是标定、定位、建图和环境重建的等任务中的关键任务。有两种主流的点云配准方法: 广义迭代最近邻方法GICP和正态分布变换NDT方法。GICP算法扩展了经典的ICP算法,通过计算分布到分布的形式提高了配准精度。NDT利用体素化方法避免高昂的最近邻搜索,提高处理速度。由于GICP和其他ICP算法的变种均依赖于最近邻搜索,这使得很难在计算资源受限的计算机中实时的处理大量点云数据。而NDT通常对体素的分辨率大小非常敏感。最佳的体素分辨率取决于环境和传感器属性,如果选择不当的分辨率,则NDT的精度将大幅降低。本文的通过聚合每个体素内所有点的分布,使得体素化的过程更为鲁棒。相比于NDT从点的空间位置估计体素的分布,本文的体素化方法即使体素中有很少的点,也能够产生有效的体素分布。这也使得算法对体素分辨率的改变更加鲁棒。VGICP论文内容写得还是比较详细充实的,从作者的归纳来看论文的贡献有三个方面:

  1. 首先,提出了一种多点分布聚合方法来从较少的点稳健估计体素的分布。
  2. 其次,提出了VGICP算法,它与GICP一样精确,但比现有方法快得多。
  3. 第三,代码开源,并且代码实现了包含了所提出的VGICP以及GICP。
    开源代码中包含有以下几个部分,同时支持ROS

FastGICP: multi-threaded GICP algorithm (~40FPS)
FastGICPSingleThread: GICP algorithm optimized for single-threading (~15FPS)
FastVGICP: multi-threaded and voxelized GICP algorithm (~70FPS)
FastVGICPCuda: CUDA-optimized voxelized GICP algorithm (~120FPS)

在这里插入图片描述

2. 具体算法

由于VGICP是由ICP变化而来,这里我们一一来将GICP和VGICP公式之间的对应进行梳理,以方便各位来进行对比:

2.1 初始化

我们考虑变换 T \bold{T} T的估计,它将一组点 A = { a 0 , ⋅ ⋅ ⋅ , a N } \mathcal{A}=\lbrace a_0,··· , a_N\rbrace A={a0,⋅⋅⋅,aN}(源点云)与另一组点 B = { b 0 , ⋅ ⋅ ⋅ , b N } \mathcal{B}= \lbrace b_0,··· ,b_N\rbrace B={b0,⋅⋅⋅,bN}( 目标点云)。 遵循经典的ICP算法,我们假设A和B之间的对应关系由最近邻搜索给出: b i = T a i b_i= \bold T{a_i} bi=Tai。 GICP 算法 [8] 将采样点的表面建模为高斯分布: a i ∼ N ( a ^ i , C i A ) , b i ∼ N ( b ^ i , C i B ) a_i∼ N(\hat{a}_i, C_i^A), b_i∼ N(\hat{b}_i, C_i^B) aiN(a^i,CiA),biN(b^i,CiB)。 然后,我们定义转换误差如下:
d i ( T ) = b i − T a i d_i^{(T)}=b_i-Ta_i di(T)=biTai

为了能够推到出VGICP算法,我们首先对式1进行扩展,使得其可以计算点到其邻近点集 { b j ∣ ∥ a i − b j ∥ < r } \left\{b_{j} \mid\left\|a_{i}-b_{j}\right\|<r\right\} {bjaibj<r}的距离, 如下

d ^ i ( T ) = ∑ j ( b j − T a i ) \hat{d}_i^{(T)}=\sum_j(b_j-Ta_i) d^i(T)=j(bjTai)

2.2 高斯分布

d i ( T ) d_i^{(T)} di(T)的分布由高斯分布的再生特性给出:

d i ( T ) ∼ N ( b i ^ , C i B ) − T N ( a i ^ , C i A ) = N ( b i ^ − T a i ^ , C i B + ( T ) C i A ( T ) T ) = N ( 0 , C i B + ( T ) C i A ( T ) T ) \begin{aligned}d_i^{(T)} &\sim \mathcal{N}(\hat{b_i},C_i^{B}) - T \mathcal{N}(\hat{a_i},C_i^{A}) \\ &= \mathcal{N}(\hat{b_i}-T\hat{a_i},C_i^{B}+(T)C_i^{A}(T)^T)\\&= \mathcal{N}(0,C_i^{B}+(T)C_i^{A}(T)^T)\end{aligned} di(T)N(bi^,CiB)TN(ai^,CiA)=N(bi^Tai^,CiB+(T)CiA(T)T)=N(0,CiB+(T)CiA(T)T)

在VGICP中,这个方程可以解释为平滑目标点分布。类似于 d i ( T ) d_i^{(T)} di(T)

d ^ i ( T ) ∼ N ( μ d i , C d i ) \begin{aligned}\hat{d}_i^{(T)} &\sim \mathcal{N}({\mu}^{d_i},C^{d_i})\end{aligned} d^i(T)N(μdi,Cdi)
μ d i = ∑ j ( b ^ j − T a ^ i ) = 0 \begin{aligned} {\mu}^{d_i} = \sum_j(\hat{b}_j-\bold T\hat{a}_i) =0\end{aligned} μdi=j(b^jTa^i)=0
C d i = ∑ j ( C j B + T C i A T T ) \begin{aligned}C^{d_i} = \sum_j(C^{B}_j+\bold TC_i^A \bold T^T)\end{aligned} Cdi=j(CjB+TCiATT)


的分布由下式给出

2.3 最大化似然概率

GICP 算法找到使方程的对数似然最大化的变换 T \bold{T} T
T = arg ⁡ max ⁡ T ∏ i p ( d i T ) = arg ⁡ max ⁡ T ∑ i log ⁡ ( p ( d i ( T ) ) ) \begin{aligned}T&=\mathop{\arg\max}\limits_\bold{T}\prod_ip(d_i^{T})\\&= \mathop{\arg\max}\limits_\bold{T} \sum\limits_{i}\log (p(d_i^{(\bold{T})}))\end{aligned} T=Targmaxip(diT)=Targmaxilog(p(di(T)))

估计体素化方程的对数似然最大化的变换 T \bold{T} T如下
T = arg ⁡ max ⁡ T ∑ i ( ∑ j ( b j − T a i ) ) T ( ∑ j ( C j B − T C i A T T ) ) − 1 ( ∑ j ( b j − T a i ) ) \begin{aligned}T&=\mathop{\arg\max}\limits_\bold{T} \sum_i (\sum_j(b_j-\bold{T}a_i))^T (\sum_j(C^B_j-\bold{T}C^A_i\bold{T}^T))^{-1}(\sum_j(b_j-\bold{T}a_i))\end{aligned} T=Targmaxi(j(bjTai))T(j(CjBTCiATT))1(j(bjTai))

为了有效地计算上述等式,我们将其修改为

T = arg ⁡ max ⁡ T ∑ i N i ( ∑ j ( b j N i − T a i ) ) T ( ∑ j ( f r a c C j B N i − T C i A T T ) ) − 1 ( ∑ j ( b j N i − T a i ) ) \begin{aligned}T&=\mathop{\arg\max}\limits_\bold{T} \sum_i N_i(\sum_j(\frac{b_j}{N_i}-\bold{T}a_i))^T (\sum_j(frac{C^B_j}{N_i}-\bold{T}C^A_i\bold{T}^T))^{-1}(\sum_j(\frac{b_j}{N_i}-\bold{T}a_i))\end{aligned} T=TargmaxiNi(j(NibjTai))T(j(fracCjBNiTCiATT))1(j(NibjTai))

其中 N i N_i Ni为邻点的数量。 上式 表明我们可以通过用 a i a_i ai周围的点 ( b j b_j bj C j C^j Cj) 的分布的平均值代替GICP等式中的 b i b_i bi C _ i B C\_i^B C_iB​ 来有效地计算目标函数。 并通过 N i N_i Ni​对函数进行加权。 我们可以通过在每个体素中存储 b i ′ = ∑ b j N i {b_i}'=\frac{\sum b_j} {N_i} bi=Nibj C i ′ = ∑ C j B N i {C_i}'=\frac{\sum C_j^B}{N_i} Ci=NiCjB来自然地将该方程应用于基于体素的计算。

…详情请参照古月居

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

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

相关文章

动车的颜色种类

01 大家平时见到最多的动车 可能就是白色的吧 和谐号动车组开行后 白就是动车的经典配色 白色为底 车腰一条蓝色飘带让其设计感十足 我们也可以把这种动车配色 称为和谐白 02 复兴号CR400AF型电力动车组 最高运营速度350公里每小时 因其车身采用银色底色 搭配侧窗…

大数据时代必备技能,从0开始学好数据可视化

当今社会&#xff0c;数据可视化已经成为了一项非常重要的技能。随着大数据时代的到来&#xff0c;越来越多的人开始关注数据可视化&#xff0c;并希望能够快速地掌握这项技能。那么&#xff0c;如何快速学习数据可视化呢&#xff1f;以下是AdBright数据分析师的一些建议。 什么…

CDN的发展史和未来

互联网是一种不断变化的机制&#xff0c;新形式的数据和内容正在不断创造。在它商业化后不久&#xff0c;必须解决尽快将大量数据推送给最终用户的问题&#xff0c;CDN因此应运而生。 CDN的根源产生于近20年前&#xff0c;并一直是内容交付的驱动力&#xff0c;自其创立以来&a…

企业电子招投标系统源码之了解电子招标投标全流程

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

虚拟机里安装ubuntu-23.04-beta-desktop-amd64,开启SSH(换源、备份),配置中文以及中文输入法等

一、下载 官网 清华镜像站(推荐) 二、配置虚拟机 【自定义】 点击“下一步”&#xff0c;此处【默认】&#xff0c;再点击“下一步”。 点击“稍后安装操作系统”&#xff0c;再点击“下一步”。 点击“Linux(L)”&#xff0c;版本选择【Ubuntu 64 位】&#xff0c;再点击…

升级H2数据库2.x版本遇见的问题

目录 一、引言二、集成H2基础配置三、升级H2版本2.x遇到的问题报错1报错2 三、H2关键字 一、引言 之前在跑代码单元测试时&#xff0c;一直用的内存数据库H2代替实际的Mysql数据库&#xff0c;如此便省去了对Dao的大量mock代码&#xff0c;类似于在跑Junit单元测试时直接跑了集…

报错:crbug/1173575 non-js module files deprecated

文章目录 报错分析解决方法一&#xff1a;尽可能使用JS模块文件方法二&#xff1a;使用type"module"属性方法三&#xff1a;忽略警告 报错 分析 这个错误报告 (crbug/1173575) 指的是非 JavaScript 模块文件将不再被支持&#xff0c;并且已经弃用。这个问题是因为Ch…

【获奖案例巡展】信创先锋之星——云上贵州信创工程中心大数据中台

为表彰使用大数据、人工智能等基础软件为企业、行业或世界做出杰出贡献和巨大创新的标杆项目&#xff0c;星环科技自2021年推出了“新科技 星力量” 星环科技科技实践案例评选活动&#xff0c;旨在为各行业提供更多的优秀产品案例&#xff0c;彰显技术改变世界的力量&#xff0…

【ctfshow】命令执行->web29-web44

前言 半夜网抑云听歌听emo了 z 刷会儿题不然睡不着了呜呜呜 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 吉林师范大学网安大一的一名普通学生、搞网安论文拿了回大挑校二、 阿里云专家博…

2023年,人工智能和数据训练呈现哪些新趋势?

最近&#xff0c;多才多艺的“全能网友”ChatGPT一次次火出圈。未来人工智能将以多快的速度、发展到何种地步&#xff1f;人们已经开始坐下来认真地探讨和思考。 我们生活在这个日新月异的时代。新的一年&#xff0c;人工智能的真正能力和应用场景又发生了哪些演进&#xff1f;…

【学习笔记】go-gRPC 初尝试

安装protoc 安装地址 找到对应版本的anz安装文件 解压&#xff0c;将文件夹移动到goroot目录中&#xff0c;可以通过命令go env查看goroot目录。 如我的goroot目录为D:\Program Files\Go 或者移动到自定义目录&#xff0c;并将该目录设置到环境变量中即可。 安装go插件 …

混淆矩阵的输出,异常检测可视化(针对二分类)

对于二分类任务&#xff1a; 真阳性&#xff08;True Positives, TP&#xff09;为真实值为1&#xff0c;预测值为1&#xff0c;即正确预测出的正样本个数真阴性&#xff08;True Negatives, TN&#xff09;为真实值为0&#xff0c;预测值为0&#xff0c;即正确预测出的负样本…

网关(史上最全)

什么是网关 网关&#xff0c;很多地方将网关比如成门&#xff0c;没什么问题&#xff0c;但是需要区分网关与网桥的区别。 网桥工作在数据链路层&#xff0c;在不同或相同类型的LAN之间存储并转发数据帧&#xff0c;必要时进行链路层上的协议转换。可连接两个或多个网络&…

漫画:是喜,还是悲?AI竟帮我们把Office破活干完了

图文原创&#xff1a;亲爱的数据 国产大模型烈火制造。阿里百度字节美团各科技大佬不等闲。 大模型嘛&#xff0c;重大工程&#xff0c;对我等“怀保小民”来说&#xff0c;只关心怎么用&#xff0c;不关心怎么造。 我来介绍一下自己&#xff0c;我是一个写稿男团组合的成员&am…

13、fishhook原理Dobby

一、fishhook原理 1.1 fishhook代码分析 int rebind_symbols(struct rebinding rebindings[], size_t rebindings_nel) {//prepend_rebindings的函数会将整个 rebindings 数组添加到 _rebindings_head 这个链表的头部//Fishhook采用链表的方式来存储每一次调用rebind_symbols…

Java动态代理(JDK/CGLIB)静态代理

Java Guide动态代理阅读笔记。 一、代理模式 代理模式是一种比较好的理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real obiect)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。 …

vue2+vue3——36+

vue2vue3——36 尚硅谷vue2vue2 Vue监测数据的原理_数组【18:56】数组vue 查看 没有 set() get()对象 有 get() set() 监测不到 不更新测试 : 数据改了 &#xff0c; 单页面没变 修改数组的 7方法 &#xff1a; filter 不改变原数组&#xff0c; 返回新的 数组 可以替换掉 原数…

逍遥自在学C语言 | 位运算符~的高级用法

前言 在上一篇文章中&#xff0c;我们介绍了^运算符的高级用法&#xff0c;本篇文章&#xff0c;我们将介绍~ 运算符的一些高级用法。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 ——…

linux 安装git(centos7)-yum

文章目录 在 Linux 系统上安装 Git步骤一&#xff1a;使用自带软件管理器安装步骤二&#xff1a;检查 Git步骤三&#xff1a;设置git环境变量 在 Linux 系统上安装 Git Git 是一种分布式版本控制系统&#xff0c;适用于处理从小型到非常大型的项目。在 Linux 系统上&#xff0…

c++11 标准模板(STL)(std::queue)(四)

定义于头文件 <queue> template< class T, class Container std::deque<T> > class queue; std::queue 类是容器适配器&#xff0c;它给予程序员队列的功能——尤其是 FIFO &#xff08;先进先出&#xff09;数据结构。 类模板表现为底层容器的包…