• NDT方法总结与公式推导


    参考

    NDT论文下载:https://www.researchgate.net/publication/4045903_The_Normal_Distributions_Transform_A_New_Approach_to_Laser_Scan_Matching
    NDT论文翻译:https://blog.csdn.net/sunqin_csdn/article/details/106183711
    NDT算法七个步骤:https://blog.csdn.net/weixin_41469272/article/details/105622447?
    代码实现: https://zhuanlan.zhihu.com/p/503522458
    三维NDT:
    https://blog.csdn.net/u013794793/article/details/89306901
    https://blog.csdn.net/adamshan/article/details/79230612

    摘要

    大多数扫描匹配算法需要找到使用的,如点或线等特征之间的对应。我们为范围扫描提供了一个可选的表达,即正态分布变换。与占用栅格类似,我们将2D平面分成小的单元格。对于每一个单元格,我们分配一个正态分布,它局部地建模了测量一个点的概率。变换的结果是分段连续且可微的概率密度,我们可以使用牛顿算法将其和另一个扫描进行匹配。因此,不需要建立明确的对应关系。

    方法

    1. 将参考点云(reference scan)所占的空间划分成指定大小(CellSize)的网络或体素(Voxel)
    2. 计算网络的概率分布模型

    计算cell中的所有点云的均值以及协方差矩阵:
    均值 : q = 1 n ∑ i x i q = \frac{1}{n}\sum_ix_i q=n1ixi

    协方差矩阵 : Σ = 1 n ∑ i ( x i − q ) ( x i − q ) T \Sigma = \frac{1}{n}\sum_i(x_i-q)(x_i-q)^T Σ=n1i(xiq)(xiq)T

    则点云位于cell中的概率建模为正态分布 N ( q , Σ ) N(q,\Sigma) N(q,Σ) p ( x ) ∼ e x p ( − ( x − q ) T Σ − 1 ( x − q ) 2 ) p(x) \sim exp(-\frac{(x-q)^T\Sigma^{-1}(x-q)}{2}) p(x)exp(2(xq)TΣ1(xq))

    若随机变量X服从一个位置参数为 μ \mu μ、尺度参数为 σ \sigma σ的正态分布 N ( μ , σ 2 ) N(\mu,\sigma^2) N(μ,σ2) ,则其概率密度函数为 f ( x ) = 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 ) f(x)=\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(x-\mu)^2}{2\sigma^2}) f(x)=2π σ1exp(2σ2(xμ)2)

    实现细节1:为了较少离散化的影响,使用四个的栅格(将一个栅格分成四个栅格)That is, one grid with side length l of a single cell is placed first, then a second one, shifted by l/2 horizontally, a third one, shifted by l/2 vertically and finally a fourth one, shifted by l/2 horizontally and vertically.保证每个点云落在四个栅格的区域,计算四个概率密度的和。
    在这里插入图片描述

    实现细节2:为了防止协方差矩阵奇异且不可逆,我们检查 Σ \Sigma Σ的较小特征值是否至少是较大特征值的0.001倍,如果不是,则将其设为该值

    1. 变换需要配准的点云到参考坐标系(参考点云的坐标系通常是前一帧)

    ( x ′ y ′ ) = ( c o s ϕ − s i n ϕ s i n ϕ c o s ϕ ) ( x y ) + ( t x t y )

    (xy)" role="presentation" style="position: relative;">(xy)
    =
    (cosϕsinϕsinϕcosϕ)" role="presentation" style="position: relative;">(cosϕsinϕsinϕcosϕ)
    (xy)" role="presentation" style="position: relative;">(xy)
    +
    (txty)" role="presentation" style="position: relative;">(txty)
    (xy)=(cosϕsinϕsinϕcosϕ)(xy)+(txty)

    其中 t x , t y t_x,t_y tx,ty ϕ ϕ ϕ分别描述了两个坐标系之间的平移和旋转

    1. 根据正态分布参数计算每个转换点落在cell中的概率
      p ( x ) ∼ e x p ( − ( x − q ) T Σ − 1 ( x − q ) 2 ) p(x) \sim exp(-\frac{(x-q)^T\Sigma^{-1}(x-q)}{2}) p(x)exp(2(xq)TΣ1(xq))

    2. NDT配准得分(score): 计算对应点落在对应网格cell中的概率之和:
      s c o r e ( p ) = ∑ i e x p ( − ( x i ′ − q i ) T Σ − 1 ( x i ′ − q i ) 2 ) score(p)= \sum_i exp(-\frac{(x_i'-q_i)^T\Sigma^{-1}(x_i'-q_i)}{2}) score(p)=iexp(2(xiqi)TΣ1(xiqi))

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

    由于一般的优化问题都是优化最小值,所以我们对score函数加上一个负号,这样优化-score的最小值就对应了score的最大值

    q = x i ′ − q i q = x_i'-q_i q=xiqi,则有 s = − e x p ( − q T Σ − 1 q 2 ) s= -exp(-\frac{q^T\Sigma^{-1}q}{2}) s=exp(2qTΣ1q)

    根据链式求导法则以及向量、矩阵求导的公式,s的梯度方向为:
    ∂ s ∂ p i = ∂ s ∂ q ∂ q ∂ p i = q T Σ − 1 e x p ( − q T Σ − 1 q 2 ) ∂ q ∂ p i \frac{\partial s}{\partial p_i} = \frac{\partial s}{\partial q} \frac{\partial q}{\partial p_i} = q^T\Sigma^{-1}exp(-\frac{q^T\Sigma^{-1}q}{2}) \frac{\partial q}{\partial p_i} pis=qspiq=qTΣ1exp(2qTΣ1q)piq

    协方差矩阵 Σ \Sigma Σ是对称矩阵,对称矩阵的形式为 Σ T = Σ \Sigma^T=\Sigma ΣT=Σ也即 Σ − T = Σ − 1 \Sigma^{-T}=\Sigma^{-1} ΣT=Σ1
    ∂ ( X 1 × n T A n × n X n × 1 ) ∂ x = A X + A T X \frac{\partial (X^T_{1\times n }A_{n\times n}X_{n\times 1})}{\partial x}=AX+A^TX x(X1×nTAn×nXn×1)=AX+ATX = > − e x p ( − q T Σ − 1 q 2 ) ∂ q = ( Σ − T q + Σ − 1 q ) / 2 ∗ e x p ( − q T Σ − 1 q 2 ) = Σ − 1 q ⋅ e x p ( − q T Σ − 1 q 2 ) =>\frac{-exp(-\frac{q^T\Sigma^{-1}q}{2})}{\partial q}=(\Sigma^{-T}q +\Sigma^{-1}q)/2 *exp(-\frac{q^T\Sigma^{-1}q}{2})= \Sigma^{-1}q \cdot exp(-\frac{q^T\Sigma^{-1}q}{2}) =>qexp(2qTΣ1q)=(ΣTq+Σ1q)/2exp(2qTΣ1q)=Σ1qexp(2qTΣ1q)
    由于 Σ − 1 q ⋅ e x p ( − q T Σ − 1 q 2 ) \Sigma^{-1}q \cdot exp(-\frac{q^T\Sigma^{-1}q}{2}) Σ1qexp(2qTΣ1q)是个标量,所以也可以等于 q T Σ − 1 e x p ( − q T Σ − 1 q 2 ) q^T\Sigma^{-1}exp(-\frac{q^T\Sigma^{-1}q}{2}) qTΣ1exp(2qTΣ1q)

    {标量 T = ^T= T=标量},所以 f ( x ) = A T X = X T A f(x)=A^TX=X^TA f(x)=ATX=XTA,

    其中 q q q对变换参数 p i p_i pi的偏导数 ∂ q ∂ p i \frac{\partial q}{\partial p_i} piq即为变换T的雅克比矩阵:
    ∂ q ∂ p i = J T = ( 1 0 − x s i n ϕ − y c o s ϕ 0 1 x c o s ϕ − y s i n ϕ ) \frac{\partial q}{\partial p_i}=J_T=

    (10xsinϕycosϕ01xcosϕysinϕ)" role="presentation" style="position: relative;">(10xsinϕycosϕ01xcosϕysinϕ)
    piq=JT=(1001xsinϕycosϕxcosϕysinϕ)

    ∂ q ∂ p i = J = ∂ [ c o s ϕ x − s i n ϕ y + t x , s i n ϕ x + c o s ϕ y + t x ] ∂ [ t x , t y , ϕ ] = ( ∂ c o s ϕ x − s i n ϕ y + t x ∂ t x ∂ s i n ϕ x + c o s ϕ y + t x ∂ t x ∂ c o s ϕ x − s i n ϕ y + t x ∂ t y ∂ s i n ϕ x + c o s ϕ y + t x ∂ t y ∂ c o s ϕ x − s i n ϕ y + t x ∂ ϕ ∂ s i n ϕ x + c o s ϕ y + t x ∂ ϕ ) \frac{\partial q}{\partial p_i}=J = \frac{\partial [cos\phi x-sin\phi y + t_x, sin\phi x + cos\phi y +t_x]}{\partial [t_x,t_y,\phi ]}=

    (cosϕxsinϕy+txtxsinϕx+cosϕy+txtxcosϕxsinϕy+txtysinϕx+cosϕy+txtycosϕxsinϕy+txϕsinϕx+cosϕy+txϕ)" role="presentation" style="position: relative;">(cosϕxsinϕy+txtxsinϕx+cosϕy+txtxcosϕxsinϕy+txtysinϕx+cosϕy+txtycosϕxsinϕy+txϕsinϕx+cosϕy+txϕ)
    piq=J=[tx,ty,ϕ][cosϕxsinϕy+tx,sinϕx+cosϕy+tx]=txcosϕxsinϕy+txtycosϕxsinϕy+txϕcosϕxsinϕy+txtxsinϕx+cosϕy+txtysinϕx+cosϕy+txϕsinϕx+cosϕy+tx
    = ( 1 0 0 1 − x s i n ϕ − y c o s ϕ x c o s ϕ − y s i n ϕ ) =
    (1001xsinϕycosϕxcosϕysinϕ)" role="presentation" style="position: relative;">(1001xsinϕycosϕxcosϕysinϕ)
    =10xsinϕycosϕ01xcosϕysinϕ

    则 有 J T = ( 1 0 − x s i n ϕ − y c o s ϕ 0 1 x c o s ϕ − y s i n ϕ ) 则有J^T=
    (10xsinϕycosϕ01xcosϕysinϕ)" role="presentation" style="position: relative;">(10xsinϕycosϕ01xcosϕysinϕ)
    JT=(1001xsinϕycosϕxcosϕysinϕ)

    根据上面梯度的计算结果, 继续求 s \mathrm{s} s 关于变量 p i 、 p j \mathrm{p}_{\mathrm{i}} 、 \mathrm{p}_{\mathrm{j}} pipj 的二阶偏导:
    H i j = ∂ 2 s ∂ p i ∂ p j = ∂ ( ∂ s ∂ p i ) ∂ p j = ∂ ( q T Σ − 1 exp ⁡ ( − q T Σ − 1 q 2 ) ∂ q ∂ p i ) ∂ p j = ∂ ( q T Σ − 1 ∂ q ∂ p i ) ∂ p j exp ⁡ ( − q T Σ − 1 q 2 ) + ( q T Σ − 1 ∂ q ∂ p i ) ∂ exp ⁡ ( − q T Σ − 1 q 2 ) ∂ p j = − exp ⁡ ( − q T Σ − 1 q 2 ) [ ( q T Σ − 1 ∂ q ∂ p i ) ( q T Σ − 1 ∂ q ∂ p j ) − ( ∂ q T ∂ p j Σ − 1 ∂ q ∂ p i ) − ( q T Σ − 1 ∂ 2 q ∂ p i ∂ p j ) ]

    Hij=2spipj=(spi)pj=(qTΣ1exp(qTΣ1q2)qpi)pj=(qTΣ1qpi)pjexp(qTΣ1q2)+(qTΣ1qpi)exp(qTΣ1q2)pj=exp(qTΣ1q2)[(qTΣ1qpi)(qTΣ1qpj)(qTpjΣ1qpi)(qTΣ12qpipj)]" role="presentation" style="position: relative;">Hij=2spipj=(spi)pj=(qTΣ1exp(qTΣ1q2)qpi)pj=(qTΣ1qpi)pjexp(qTΣ1q2)+(qTΣ1qpi)exp(qTΣ1q2)pj=exp(qTΣ1q2)[(qTΣ1qpi)(qTΣ1qpj)(qTpjΣ1qpi)(qTΣ12qpipj)]
    Hij=pipj2s=pj(pis)=pj(qTΣ1exp(2qTΣ1q)piq)=pj(qTΣ1piq)exp(2qTΣ1q)+(qTΣ1piq)pjexp(2qTΣ1q)=exp(2qTΣ1q)[(qTΣ1piq)(qTΣ1pjq)(pjqTΣ1piq)(qTΣ1pipj2q)]
    其中,向量 q \mathrm{q} q 对变换参数 p \mathrm{p} p 的二阶导数的向量为:
    ∂ 2 q ∂ p i ∂ p j = { ( − x cos ⁡ ϕ + y sin ⁡ ϕ − x sin ⁡ ϕ − y cos ⁡ ϕ ) i = j = 3 ( 0 0 )  otherwise  \frac{\partial^2 \mathbf{q}}{\partial p_i \partial p_j}=\left\{
    \begin{array}{cc} \left(\begin{array}{c} -x \cos \phi+y \sin \phi \\ -x \sin \phi-y \cos \phi \end{array}" role="presentation" style="position: relative;">\begin{array}{cc} \left(\begin{array}{c} -x \cos \phi+y \sin \phi \\ -x \sin \phi-y \cos \phi \end{array}
    \right) & i=j=3 \\ \left(
    00" role="presentation" style="position: relative;">00
    \right) & \text { otherwise } \end{array}\right.
    pipj2q=(xcosϕ+ysinϕxsinϕycosϕ)(00)i=j=3 otherwise 

    1. 跳转到第3步继续执行,指导达到收敛条件为止
  • 相关阅读:
    打工人准时下班踩点利器——python写一个自动关机程序并打包成exe文件
    Yum 和 Rpm 安装包管理软件的区别 - 分布式网络包仓库管理 - 手动包管理
    利用R语言进行聚类分析实战(数据+代码+可视化+详细分析)
    SpingBoot的配置文件,SSM整合
    智能硬件evt dvt pvt mp
    上周热点回顾(4.25-5.1)
    2023华为OD统一考试(B卷)题库清单(按算法分类),如果你时间紧迫,就按这个刷
    【数据结构】带头节点双向循环链表
    AlexNet—论文分析及复现
    计算机科学导论
  • 原文地址:https://blog.csdn.net/weixin_45626706/article/details/127648104