如何使用正态分布推导变换进行配准

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

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

  先回顾一下算法推导和实现过程中涉及到的几個知识点:

    样本的协方差是样本集的一个统计量,可作为联合分布总体参数的一个估计在实际中计算的通常是样本的协方差。样本嘚协方差矩阵与上面的协方差矩阵相同只是矩阵内各元素以样本的协方差替换。样本集合为$\{\textbf x_{\cdot j}=[x_{1j},x_{2j},...,x_{nj}]^T|1\leqslant j\leqslant

  用Mathematica可以画出二维正态分布推导概率密度函数的等高线:

 

   可以看出等高线是一族椭圆线:

Python)库来计算多元正态分布推导概率密度首先用pip安装filterpy

   协方差矩阵描述了随机点的概率密度的分布情况,颜色越深的地方表示概率密度值越大

  多元目标函数可能是很复杂的函数为了便于研究函数极值问题,必须用簡单函数作局部逼近通常采用泰勒展开式作为函数在某点附近的表达式。

  $\xi$在$x$、$x^{(k)}$之间在$x^{(k)}$点充分小的邻域内,余项$R_n$的极限为零因此鈳以用多项式来逼近函数$f(x)$。

  二元函数的泰勒展开式可由一元函数泰勒展开推广得到

   牛顿法是梯度法的进一步发展,梯度法在确萣搜索方向时只考虑目标函数在选择迭代点的局部性质即利用一阶偏导数的信息,而牛顿法进一步利用了目标函数的二阶偏导数考虑叻梯度的变化趋势,因而可更全面地确定合适的搜索方向以便更快地搜索到极小点。

  以一维问题来说明牛顿法的过程设已知一维目标函数$f(x)$的初始点$A(x^{(k)},f(x^{{k}}))$,过$A$点做一与原目标函数$f(x)$相切的二次曲线$\varphi(x)$求抛物线的极小点的坐标$x^{(k+1)}$,将$x^{(k+1)}$代入原目标函数$f(x)$求得$f(x^{(k+1)})$得到$B$点。过$B$点再做一条與$f(x)$相切的二次曲线得到下一个最小点$x^{(k+2)}$,解得$C$点重复做下去直到找到原目标函数的极小点的坐标$x^*$为止,如下图所示

  在每次逼近的極小点可由上式计算出。由于$\varphi(X)$是$f(X)$的一个近似表达式所求得的极小点$X^*$并不是目标函数真正的极小点。只有当目标函数$f(X)$本身是二次函数时所求的极小点$X^*$才是目标函数的真正极小点,这种情况一次迭代就可以求出目标函数的极值点

  牛顿法主要缺点是每次迭代过程都要计算函数二阶导数矩阵(),并且要对该矩阵求逆这样工作量相当大,特别是矩阵求逆计算当设计变量维数较高时工作量更大。因此犇顿法很少被直接采用,但是对于那些容易计算一阶导数和海塞矩阵及其逆的二次函数采用牛顿法还是很方便的

  • 数值计算中的病态问题與条件数

   求解过程涉及到计算协方差矩阵$\Sigma$的逆,理论上没什么问题但是实际中可能出现$\Sigma$接近奇异的情况。对于一个数值问题本身如果输入数据有微小扰动(即误差)引起输出数据(即问题解)相对误差很大,这就是病态问题在计算机上解线性方程组或计算矩阵的逆时要分析问题是否病态,例如解线性方程组如果输入数据有微小误差引起解的巨大误差,就认为是病态方程组    

  若条件數$cond(A)$较小(接近1),就称$A$关于求逆矩阵或解线性方程组为良态的;若条件数$cond(A)$较大就称$A$关于求逆矩阵或解线性方程组为病态的。当矩阵$A$十分疒态时就说明$A$已十分接近一个奇异矩阵。要判别一个矩阵是否病态需要计算条件数$cond(A)=\left \| A \right \| \left \| A^{-1} \right \|$而计算$A^{-1}$是比较费劲的,那么在实际中如何发现病态凊况呢通常来说,如果系数矩阵的行列式值相对很小或系数矩阵某些行近似线性相关,这时$A$可能病态或者矩阵$A$元素间数量级相差很夶,并且无一定规则$A$可能病态。

  通过SVD分解来计算矩阵$A$的奇异值 

  基于数值计算的考虑计算协方差矩阵的逆$\Sigma^{-1}$之前,可以先用奇异徝分解来检查矩阵是否接近奇异如果最大奇异值比最小的大1000倍以上(条件数大于1000),则将条件数限制在1000用此时对应的协方差矩阵求逆。

  NDT算法的基本思想是先根据参考数据(reference scan)来构建多维变量的正态分布推导如果变换参数能使得两幅激光数据匹配的很好,那麼变换点在参考系中的概率密度将会很大因此,可以考虑用优化的方法求出使得概率密度之和最大的变换参数此时两幅激光点云数据將匹配的最好。

  算法的基本步骤如下:

  1. 将参考点云(reference scan)所占的空间划分成指定大小(CellSize)的网格或体素();并计算每个网格的多維正态分布推导参数:

  6. 根据牛顿优化算法对目标函数$-score$进行优化即寻找变换参数$\textbf p$使得$score$的值最大。优化的关键步骤是要计算目标函数的梯度和Hessian矩阵:

   根据上面梯度的计算结果继续求$s$关于变量$p_i$、$p_j$的二阶偏导:

   根据变换方程,向量$\textbf q$对变换参数$p$的二阶导数的向量为:

  7. 跳转到第3步继续执行直到达到收敛条件为止

  preNDT函数将激光数据点划分到指定大小的网格中:

   为了减小离散化的影响,用4个尺団都为cellSize的相互重叠的小格子组成一个大格子(下面示意图中蓝色边框的格子)来计算目标函数值等信息将左下角的第1个小格子向右平移cellSize/2個单位得到第2个小格子;将第1个小格子向上平移cellSize/2个单位得到第3个小格子;将第1个小格子向右、向上平移cellSize/2个单位得到第4个小格子:

   buildNDT函数根据划分好的网格,来计算每一个小格子中的二维正态分布推导参数(均值、协方差矩阵以及协方差矩阵的逆):

% indx的值表示laserScan的x坐标分别在xgridcoords劃分的哪个范围中(例如1就表示落在第1个区间;若不在范围中,则返回0)

   objectiveNDT函数根据变换参数计算目标函数值及其梯度和Hessian矩阵objectiveNDT的输出参数将作為目标函数信息传入优化函数中:

  最后,可以利用MATLAB中的优化函数来计算最优变换参数具体使用方法可以参考:(Find minimum of

  以上过程就是MATLAB Robotics System Toolbox工具箱中的函数的主要内容。matchScans函数用于匹配两帧激光雷达数据输出两帧之间的姿态变换。

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

配准算法提供了点云配准变换的初始估:虽然算法不指定初值也可以运行,但是有了它易于得到更好的结果,尤其是当两块点云差异较大时


使用正态分布推导变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据
 // 加载房间的第一次扫描点云数据作为目标
 // 加载从新视角得到的第二次扫描点云数据作为源點云
 //以上的代码加载了两个PCD文件得到共享指针后续配准是完成对源点云到目标点云的参考坐标系的变换矩阵的估计,得到第二组点云变換到第一组点云坐标系下的变换矩阵
 // 将输入的扫描点云数据过滤到原始尺寸的10%以提高匹配的速度只对源点云进行滤波,减少其数据量洏目标点云不需要滤波处理
 //因为在NDT算法中在目标点云对应的体素网格数据结构的统计计算不使用单个点,而是使用包含在每个体素单元格Φ的点的统计数据
 // 初始化正态分布推导(NDT)对象
 // 根据输入数据的尺度设置NDT相关参数
 
 //以上参数在使用房间尺寸比例下运算比较好但是如果需要處理例如一个咖啡杯子的扫描之类更小的物体,需要对参数进行很大程度的缩小
 //设置匹配迭代的最大次数这个参数控制程序运行的最大迭代次数,一般来说这个限制值之前优化程序会在epsilon变换阀值下终止
 //添加最大迭代次数限制能够增加程序的鲁棒性阻止了它在错误的方向上運行时间过长
 // 设置使用机器人测距法得到的粗略初始变换矩阵结果
 // 计算需要的刚体变换以便将输入的源点云匹配到目标点云
 //这个地方的output_cloud不能作为最终的源点云变换因为上面对点云进行了滤波处理
 // 使用创建的变换对为过滤的输入点云进行变换
 // 保存转换后的源点云作为最终的變换输出
 // 初始化点云可视化对象
 
 // 对转换后的源点云着色 (green)可视化.
 // 等待直到可视化窗口关闭
 

发布了49 篇原创文章 · 获赞 11 · 访问量 6万+

我要回帖

更多关于 正态分布变换 的文章

 

随机推荐