介绍

大多数激光匹配算法都是基于点或者线的特征匹配,该论文提出一种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)

\[H\Delta p = -g
\]

其中\(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的更多相关文章

  1. NDT(Normal Distributions Transform)算法原理与公式推导

    正态分布变换(NDT)算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.下面的公式推导 ...

  2. 使用正态分布变换(Normal Distributions Transform)进行点云配准

    正态分布变换算法是一个配准算法,它应用于三维点的统计模型,使用标准优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.下面是PCL官网上的一个例 ...

  3. 论文阅读 Characterization of Multiple 3D LiDARs for Localization and Mapping using Normal Distributions Transform

    Abstract 在这个文章里, 我们细致的比较了10种不同的3D LiDAR传感器, 用了一般的 Normal Distributions Transform (NDT) 算法. 我们按以下几个任务 ...

  4. 【概率论】5-10:二维正态分布(The Bivariate Normal Distributions)

    title: [概率论]5-10:二维正态分布(The Bivariate Normal Distributions) categories: - Mathematic - Probability k ...

  5. 【概率论】5-6:正态分布(The Normal Distributions Part III)

    title: [概率论]5-6:正态分布(The Normal Distributions Part III) categories: - Mathematic - Probability keywo ...

  6. 【概率论】5-6:正态分布(The Normal Distributions Part II)

    title: [概率论]5-6:正态分布(The Normal Distributions Part II) categories: - Mathematic - Probability keywor ...

  7. 【概率论】5-6:正态分布(The Normal Distributions Part I)

    title: [概率论]5-6:正态分布(The Normal Distributions Part I) categories: - Mathematic - Probability keyword ...

  8. NDT(Normal Distribution Transform) 算法(与ICP对比)和一些常见配准算法

    原文地址:http://ghx0x0.github.io/2014/12/30/NDT-match/ By GH 发表于 12月 30 2014 目前三维配准中用的较多的是ICP迭代算法,需要提供一个 ...

  9. 激光数据匹配(MATLAB Robotics System Toolbox)

    正态分布变换算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.算法细节可以参考:NDT ...

随机推荐

  1. GPU编程和流式多处理器

    GPU编程和流式多处理器 流式多处理器(SM)是运行CUDA内核的GPU的一部分.本章重点介绍SM的指令集功能. 流式多处理器(SM)是运行我们的CUDA内核的GPU的一部分.每个SM包含以下内容. ...

  2. 【译】.NET 5 中的诊断改进

    基于我们在 .NET Core 3.0 中引入的诊断改进,我们一直在努力进一步改进这个领域.我很高兴介绍下一波诊断改进. 诊断工具不再需要 .NET SDK 直到最近,.NET 诊断工具套件还只能作为 ...

  3. Django框架之路由层汇总

    一 Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...

  4. JUC下工具类CountDownLatch用法以及源码理解

    CountDownLoatch是JUC下一个用于控制计数的计数器,比如我需要从6开始计数,每个线成运行完之后计数减一,等计数器到0时候开始执行其他任务. public static void main ...

  5. UF_MTX 矩阵操作

    Open C   UF_MTX2_copyUF_MTX2_determinantUF_MTX2_identityUF_MTX2_initializeUF_MTX2_multiplyUF_MTX2_mu ...

  6. 【UG二次开发】装配设计

    与装配相关的术语 tag 部件或对象的标识,还可能是部件原型.实例和事例 piece part 单个部件 occurrence 部件或对象的事例,装配中的是部件事例 object occurrence ...

  7. 无需会员将有道云笔记脑图转换xmind

    我的烦恼 有道云笔记有脑图功能,我平时经常用到,之所以很少用到其他脑图工具,是因为我一直用有道云笔记写笔记.因此编辑脑图和查看脑图比较方便,但是需要将脑图导出的时候目前只支持图片和xmind,但是需要 ...

  8. 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则

    目录 前言 聚合 聚合和聚合根原则 包含业务原则 单个单元原则 事务边界原则 可序列化原则 聚合和聚合根最佳实践 只通过ID引用其他聚合 用于 EF Core 和 关系型数据库 保持聚合根足够小 聚合 ...

  9. .NET解密得到UnionID

    由于微信没有提供.NET的解码示例代码,自己搜索写了一个,下面的代码是可用的 var decryptBytes = Convert.FromBase64String(encrypdata); var ...

  10. Python如何设计面向对象的类(上)

    Python是一门高级语言,支持面向对象设计,如何设计一个符合Python风格的面向对象的类,是一个比较复杂的问题,本文提供一个参考,表达一种思路,探究一层原理. 目标 期望实现的类具有以下基本行为: ...