NDT匹配: The Normal Distributions Transform: A New Approach to Laser Scan
介绍
大多数激光匹配算法都是基于点或者线的特征匹配,该论文提出一种2D激光扫描匹配算法,方法类似于占据栅格,将2D平面分为一个个cell,对于每个cell,设定其一个正态分布,表示该网格测量到每个点的概率。则前后两帧激光转化为一些分段连续(可微)概率密度,通过牛顿法进行匹配,因此不需要建立任何点线对应。该算法在室内环境即使没有里程计数据也能表现很好。前后帧相互匹配转换为最大化前后帧对应点概率密度之和。 作者认为该算法的最大特点在于不需要建立对应点的匹配。
NDT构建:
将2D空间分为一个个cell,cell大小为常数,每个cell至少包含三个点,计算cell中点的均值、方差,则在该cell内测量到一个点x的概率可以用公式(1)中的正态分布表示。则该分布也表示cell内每个位置被测量到的概率,该论文中cell的大小为100*100。则整个2D平面都可以用分段连续可微的概率密度形式表示。
有两点需要注意:为了降低离散化的影响(即密度函数是以cell内的若干个点表示的),作者采用了四个有重叠的网格:\(l*l\)、\(l*\frac{l}{2}\)、\(\frac{l}{2}*l\)、\(\frac{l}{2}*\frac{l}{2}\)。每个点其实只被算一次,计算时算上四个网格,密度为其之和。其次,对于没有噪声,协方差矩阵将会变成奇异的,导致不可逆,检验协方差较小的特征值是否不小于较大特征值的0.001倍。
scan对齐
机器人两帧之间的位姿变换由公式(2)给出,二维的比较简单,就是一个旋转和平移。扫描对齐的目的就是算出两帧之间的相对位姿,算法流程:
1.构建第一帧的NDT 2.初始化估计参数(设为0或者使用里程计数据) 3.对于第二帧激光数据,将每个点根据初始化的参数投影到第一帧坐标系下 4.确定每个点的NDT对应关系(第二帧每个点投影到哪个格子,再将投影后的点带到这个格子的正态分布,得到一个概率) 5.参数的评分为对每个地图点分布评估之和。 6. 通过优化评分得到新的参数,这里使用牛顿法 7.返回第三步直到收敛。 设估计的向量为\(p\),即二维位姿。\(x_i\)为第二帧的激光点,\(x_i^{'}\)为\(x_i\)变换到第一帧对应的点,而\(\Sigma_i\)和\(q_i\)为\(x_ i^{'}\)所在NDT的均值和方差。则评分score公式为(3)。
牛顿法优化
由于优化问题一般为最小化问题,因此这里取-score,通过牛顿法迭代寻找\(p\),即公式(4)
\]
其中\(g\)为\(f\)对\(p_i\)的偏导,\(H_{ij}\)为\(f\)对\(p_i\)和\(p_j\)的偏导。更新公式\(p=p+\delta p\)。其中\(H\)被要求为正定的,如果不是则设定\(H^{'}=H+\lambda I\)。这里的\(f\)即为评分,即为公式3。具体的偏导求解见公式(8)-(13)。计算代价即为求解雅克比矩阵和hessian矩阵。每个点只求一次指数,三角函数仅取决于\(\phi\),每次迭代只用求一次。
位置追踪
位置追踪时定义了关键帧,和我们理解的关键帧应该是一样的,追踪是追踪关键帧,关键帧之间距离不要太近。也是不断迭代,直到和上一关键帧有一定距离,则设定新的关键帧。这里判断远近通过两帧之间的旋转平移量的大小。
应用到SLAM
之前帧间匹配求解的是相邻两帧的位姿变化,SLAM则需要估计每一帧中机器人的位姿,\(R_i\)和\(T_i\)表示激光帧\(i\)在世界中的位姿(我理解是上一帧的位姿,这里应该是上一步求了),而当前帧的机器人位姿则为\(R\)和\(T\),这里要估计的是\(R\)和\(T\)。则将当前帧的坐标映射到上一帧再转换到世界坐标系下:公式(14)。
由于加入了\(R_i\)和\(T_i\),因此雅克比矩阵应该是变复杂了,具体见公式(15)和公式(16)。注意雅克比矩阵和hessian矩阵应该将四个与有重叠的区域加和,但是作者发现这四块区域对最后的导数矩阵求解的影响是独立的,但是会相互影响寻找最优解。
如果当前帧的激光和地图的重合部分太少,则地图需要加入最新的关键帧。类似于orbslam中的共视图,每个关键帧由一个节点表示,节点之间存在边则表示这两帧有一个成对匹配。每加入一个关键帧则需要优化地图,即优化所有关键帧的参数。成对匹配的帧定义一个二次误差模型:\(\Delta p\)表示分别由全局参数和成对匹配定义相对位姿的差异。则评分公式更新为公式(17)。该式通过在\(\Delta p=0\)处进行二次泰勒展开,由于在极值点处展开,一次项为0。此时分数为所有边的上的和。
如果地图太大达不到实时的要求,则维护一个子图,子图中的帧与新的帧之间距离不超过三条边。仅仅优化子图中的关键帧。但如果存在闭环,则优化所有关键帧。
问题:
四个网格那里没看懂
协方差矩阵为什么变奇异
为什么搞帧之间的配对以及重新定义score
NDT匹配: The Normal Distributions Transform: A New Approach to Laser Scan的更多相关文章
- NDT(Normal Distributions Transform)算法原理与公式推导
正态分布变换(NDT)算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.下面的公式推导 ...
- 使用正态分布变换(Normal Distributions Transform)进行点云配准
正态分布变换算法是一个配准算法,它应用于三维点的统计模型,使用标准优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.下面是PCL官网上的一个例 ...
- 论文阅读 Characterization of Multiple 3D LiDARs for Localization and Mapping using Normal Distributions Transform
Abstract 在这个文章里, 我们细致的比较了10种不同的3D LiDAR传感器, 用了一般的 Normal Distributions Transform (NDT) 算法. 我们按以下几个任务 ...
- 【概率论】5-10:二维正态分布(The Bivariate Normal Distributions)
title: [概率论]5-10:二维正态分布(The Bivariate Normal Distributions) categories: - Mathematic - Probability k ...
- 【概率论】5-6:正态分布(The Normal Distributions Part III)
title: [概率论]5-6:正态分布(The Normal Distributions Part III) categories: - Mathematic - Probability keywo ...
- 【概率论】5-6:正态分布(The Normal Distributions Part II)
title: [概率论]5-6:正态分布(The Normal Distributions Part II) categories: - Mathematic - Probability keywor ...
- 【概率论】5-6:正态分布(The Normal Distributions Part I)
title: [概率论]5-6:正态分布(The Normal Distributions Part I) categories: - Mathematic - Probability keyword ...
- NDT(Normal Distribution Transform) 算法(与ICP对比)和一些常见配准算法
原文地址:http://ghx0x0.github.io/2014/12/30/NDT-match/ By GH 发表于 12月 30 2014 目前三维配准中用的较多的是ICP迭代算法,需要提供一个 ...
- 激光数据匹配(MATLAB Robotics System Toolbox)
正态分布变换算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.算法细节可以参考:NDT ...
随机推荐
- GPU编程和流式多处理器
GPU编程和流式多处理器 流式多处理器(SM)是运行CUDA内核的GPU的一部分.本章重点介绍SM的指令集功能. 流式多处理器(SM)是运行我们的CUDA内核的GPU的一部分.每个SM包含以下内容. ...
- 【译】.NET 5 中的诊断改进
基于我们在 .NET Core 3.0 中引入的诊断改进,我们一直在努力进一步改进这个领域.我很高兴介绍下一波诊断改进. 诊断工具不再需要 .NET SDK 直到最近,.NET 诊断工具套件还只能作为 ...
- Django框架之路由层汇总
一 Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...
- JUC下工具类CountDownLatch用法以及源码理解
CountDownLoatch是JUC下一个用于控制计数的计数器,比如我需要从6开始计数,每个线成运行完之后计数减一,等计数器到0时候开始执行其他任务. public static void main ...
- UF_MTX 矩阵操作
Open C UF_MTX2_copyUF_MTX2_determinantUF_MTX2_identityUF_MTX2_initializeUF_MTX2_multiplyUF_MTX2_mu ...
- 【UG二次开发】装配设计
与装配相关的术语 tag 部件或对象的标识,还可能是部件原型.实例和事例 piece part 单个部件 occurrence 部件或对象的事例,装配中的是部件事例 object occurrence ...
- 无需会员将有道云笔记脑图转换xmind
我的烦恼 有道云笔记有脑图功能,我平时经常用到,之所以很少用到其他脑图工具,是因为我一直用有道云笔记写笔记.因此编辑脑图和查看脑图比较方便,但是需要将脑图导出的时候目前只支持图片和xmind,但是需要 ...
- 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则
目录 前言 聚合 聚合和聚合根原则 包含业务原则 单个单元原则 事务边界原则 可序列化原则 聚合和聚合根最佳实践 只通过ID引用其他聚合 用于 EF Core 和 关系型数据库 保持聚合根足够小 聚合 ...
- .NET解密得到UnionID
由于微信没有提供.NET的解码示例代码,自己搜索写了一个,下面的代码是可用的 var decryptBytes = Convert.FromBase64String(encrypdata); var ...
- Python如何设计面向对象的类(上)
Python是一门高级语言,支持面向对象设计,如何设计一个符合Python风格的面向对象的类,是一个比较复杂的问题,本文提供一个参考,表达一种思路,探究一层原理. 目标 期望实现的类具有以下基本行为: ...