NDT的原理分析与实现


前言

相关中文博客1:CSDN
强烈推荐相关中文博客2:CSDN
3D变换雅可比海森矩阵计算:CSDN

一、基本原理

1.原理介绍

在使用NDT(Normal Distributions Transform)进行扫描配准时,目标是找到当前扫描的姿态,使得当前扫描的点云落在参考扫描表面上的可能性最大。姿态的旋转和平移可以用向量 p \mathbf{p} p 表示:
p = [ t x t y t z ϕ θ ψ ] \mathbf{p} = \begin{bmatrix} t_x \\ t_y \\ t_z \\ \phi \\ \theta \\ \psi \end{bmatrix} p= txtytzϕθψ
给定一组点云 X = { x 1 , … , x n } X = \{\mathbf{x}_1, \dots, \mathbf{x}_n\} X={ x1,,xn},并假设有一个空间变换函数 T ( p , x ) T(\mathbf{p}, \mathbf{x}) T(p,x) 可以根据姿态 p \mathbf{p} p 移动点 x \mathbf{x} x。对于正态分布部分,其概率密度函数的形式为:

p ( x ) = 1 ( 2 π ) d / 2 ∣ Σ ∣ 1 / 2 exp ⁡ ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) p(\mathbf{x}) = \frac{1}{(2\pi)^{d/2} |\Sigma|^{1/2}} \exp\left( -\frac{1}{2} (\mathbf{x} - \mathbf{\mu})^T \Sigma^{-1} (\mathbf{x} - \mathbf{\mu}) \right) p(x)=(2π)d/2∣Σ1/21exp(21(xμ)TΣ1(xμ))

  • d d d 是数据的维度(例如,对于三维点云, d = 3 d = 3 d=3
  • ∣ Σ ∣ |\Sigma| ∣Σ∣ 是协方差矩阵的行列式

在NDT中,通常使用一个混合模型来描述点的概率分布。该模型结合了正态分布和均匀分布,以提高对异常值的鲁棒性。

具体形式如下:

p ˉ ( x ) = c 1 exp ⁡ ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) + c 2 p 0 \bar{p}(\mathbf{x}) = c_1 \exp\left( -\frac{1}{2} (\mathbf{x} - \mathbf{\mu})^T \Sigma^{-1} (\mathbf{x} - \mathbf{\mu}) \right) + c_2 p_0 pˉ(x)=c1exp(21(xμ)TΣ1(xμ))+c2p0

其中:

  • p ˉ ( x ) \bar{p}(\mathbf{x}) pˉ(x) 是点 x \mathbf{x} x 的混合概率密度函数。
  • c 1 c_1 c1 c 2 c_2 c2 是归一化常数,确保整个概率分布的总和为1。
  • μ \mathbf{\mu} μ 是NDT单元内的均值。
  • Σ \Sigma Σ 是NDT单元内的协方差矩阵。
  • p 0 p_0 p0 是均匀分布的概率密度,用于表示异常值的期望比例。

在NDT中,优化目标是最小化负对数似然函数,它是基于概率密度函数的。给定点云 X = { x 1 , … , x n } X = \{\mathbf{x}_1, \ldots, \mathbf{x}_n\} X={ x1,,xn},NDT的负对数似然函数可以写为:

− log ⁡ Ψ = − ∑ k = 1 n log ⁡ ( p ( T ( p , x k ) ) ) -\log \Psi = -\sum_{k=1}^{n} \log \left( p(T(\mathbf{p}, \mathbf{x}_k)) \right) logΨ=k=1nlog(p(T(p,xk)))

这里的 p ( T ( p , x k ) p(T(\mathbf{p}, \mathbf{x}_k) p(T(p,xk) 是在变换后的点 T ( p , x k ) T(\mathbf{p}, \mathbf{x}_k) T(p,xk) 下的概率密度函数值。通过最小化这个负对数似然函数,我们可以优化姿态参数,使得当前扫描点云与参考扫描的匹配度最大化。对于优化目的,可以将上述混合模型近似为高斯分布:
p ~ ( x ) = − d 1 exp ⁡ ( − d 2 2 ( x − μ ) T Σ − 1 ( x − μ ) ) \tilde{p}(\mathbf{x}) = -d_1 \exp \left( -\frac{d_2}{2} (\mathbf{x} - \mathbf{\mu})^T \Sigma^{-1} (\mathbf{x} - \mathbf{\mu}) \right) p~(x)=d1exp(2d2(xμ)TΣ1(xμ))
其中, d 1 d_1 d1, d 2 d_2 d2 d 3 d_3 d3 是通过拟合得到的参数。对于NDT配准, d 3 d_3 d3 常数被省略,因为它不影响优化过程中的结果。
给定一组点云 X = { x 1 , … , x n } X = \{\mathbf{x}_1, \dots, \mathbf{x}_n\} X={ x1,,xn},姿态 p \mathbf{p} p,以及变换函数 T ( p , x ) T(\mathbf{p}, \mathbf{x}) T(p,x),NDT得分函数为:
s ( p ) = − ∑ k = 1 n p ~ ( T ( p , x k ) ) s(\mathbf{p}) = -\sum_{k=1}^{n} \tilde{p}(T(\mathbf{p}, \mathbf{x}_k)) s(p)=k=1np~(T(p,xk))
这个函数对应的是点 x k \mathbf{x}_k xk 在经过变换后的姿态 p \mathbf{p} p 下,落在参考扫描表面上的可能性。

2.优化流程

(1) 初始化阶段

  1. 初始化时,分配网格结构   B \ B  B
  2. 对参考点云   Y \ Y  Y 中的每个点   y k ∈ Y \ \mathbf{y}_k \in Y  ykY,进行如下操作:
    • 找到包含点   y k \ \mathbf{y}_k  yk 的网格单元   b i ∈ B \ b_i \in B  biB
    • 将点   y k \ \mathbf{y}_k  yk 存储到网格单元   b i \ b_i  bi 中。
  3. 对所有的网格单元   b i ∈ B \ b_i \in B  biB,进行如下操作:
    • 从网格单元   b i \ b_i  bi 中提取所有的点   Y ′ = { y 1 ′ , … , y m ′ } \ Y' = \{\mathbf{y}_1', \dots, \mathbf{y}_m'\}  Y={ y1,,ym}
    • 计算点的均值 μ i \mathbf{\mu}_i μi,公式如下:
      μ i = 1 m ∑ k = 1 m y k ′ \mathbf{\mu}_i = \frac{1}{m} \sum_{k=1}^{m} \mathbf{y}_k' μi=m1k=1myk
    • 计算协方差矩阵 Σ i \Sigma_i Σi,公式如下:
      Σ i = 1 m − 1 ∑ k = 1 m ( y k ′ − μ i ) ( y k ′ − μ i ) T \Sigma_i = \frac{1}{m-1} \sum_{k=1}^{m} (\mathbf{y}_k' - \mathbf{\mu}_i)(\mathbf{y}_k' - \mathbf{\mu}_i)^T Σi=m11k=1m(ykμi)(ykμi)T

(2) 配准阶段

  1. 初始化目标函数得分 score = 0 \text{score} = 0 score=0,梯度 g = 0 \mathbf{g} = 0 g=0,以及海森矩阵   H = 0 \ H = 0  H=0
  2. 对扫描点云   X \ X  X 中的每个点   x k ∈ X \ \mathbf{x}_k \in X  xkX,进行如下操作:
    • 找到包含变换后点   T ( p , x k ) \ T(\mathbf{p}, \mathbf{x}_k)  T(p,xk) 的网格单元   b i \ b_i  bi
    • 更新得分  score \ \text{score}  score,公式如下:
      score = score + p ~ ( T ( p , x k ) ) \text{score} = \text{score} + \tilde{p}(T(\mathbf{p}, \mathbf{x}_k)) score=score+p~(T(p,xk))
      其中,   p ~ ( T ( p , x k ) ) \ \tilde{p}(T(\mathbf{p}, \mathbf{x}_k))  p~(T(p,xk)) 是根据方程计算的概率值:
      p ~ ( x k ) = − d 1 exp ⁡ ( − d 2 2 ( x k − μ k ) T Σ k − 1 ( x k − μ k ) ) p̃(\mathbf{x}_k) = -d_1 \exp\left( -\frac{d_2}{2} (\mathbf{x}_k - \mathbf{\mu}_k)^T \Sigma_k^{-1} (\mathbf{x}_k - \mathbf{\mu}_k) \right) p~(xk)=d1exp(2d2(xkμk)TΣk1(xkμk))
    • 更新梯度 g \mathbf{g} g,参考方程:

g i = ∂ s ∂ p i = ∑ k = 1 n d 1 d 2 x k ′ T Σ k − 1 ∂ x k ′ ∂ p i exp ⁡ ( − d 2 2 x k ′ T Σ k − 1 x k ′ ) g_i = \frac{\partial s}{\partial p_i} = \sum_{k=1}^{n} d_1 d_2 \mathbf{x}_k'^T \Sigma_k^{-1} \frac{\partial \mathbf{x}_k'}{\partial p_i} \exp\left( -\frac{d_2}{2} \mathbf{x}_k'^T \Sigma_k^{-1} \mathbf{x}_k' \right) gi=pis=k=1nd1d2xkTΣk1pixkexp(2d2xkTΣk1xk)
其中, x k ′ = T ( p , x k ) − μ k \mathbf{x}_k' = T(\mathbf{p}, \mathbf{x}_k) - \mathbf{\mu}_k xk=T(p,xk)μk
∂ x k ′ ∂ p i = [ 1 0 0 0 c f 0 1 0 a d g 0 0 1 b e h ] \frac{\partial \mathbf{x}_k'}{\partial p_i}= \begin{bmatrix} 1 & 0 & 0 & 0 & c & f \\ 0 & 1 & 0 & a & d & g \\ 0 & 0 & 1 & b & e & h \end{bmatrix} pixk= 1000100010abcdefgh
其中:

  • a = x 1 ( − s x s z + c x s y c z ) + x 2 ( − s x c z − c x s y s z ) + x 3 ( − c x c y ) a = x_1(-s_x s_z + c_x s_y c_z) + x_2(-s_x c_z - c_x s_y s_z) + x_3(-c_x c_y) a=x1(sxsz+cxsycz)+x2(sxczcxsysz)+x3(cxcy)
  • b = x 1 ( c x s z + s x s y c z ) + x 2 ( − s x s y s z + c x c z ) + x 3 ( − s x c y ) b = x_1(c_x s_z + s_x s_y c_z) + x_2(-s_x s_y s_z + c_x c_z) + x_3(-s_x c_y) b=x1(cxsz+sxsycz)+x2(sxsysz+cxcz)+x3(sxcy)
  • c = x 1 ( − s y c z ) + x 2 ( s y s z ) + x 3 ( c y ) c = x_1(-s_y c_z) + x_2(s_y s_z) + x_3(c_y) c=x1(sycz)+x2(sysz)+x3(cy)
  • d = x 1 ( s x c y c z ) + x 2 ( − s x c y s z ) + x 3 ( s x s y ) d = x_1(s_x c_y c_z) + x_2(-s_x c_y s_z) + x_3(s_x s_y) d=x1(sxcycz)+x2(sxcysz)+x3(sxsy)
  • e = x 1 ( − c x c y c z ) + x 2 ( c x c y s z ) + x 3 ( − c x s y ) e = x_1(-c_x c_y c_z) + x_2(c_x c_y s_z) + x_3(-c_x s_y) e=x1(cxcycz)+x2(cxcysz)+x3(cxsy)
  • f = x 1 ( − c y s z ) + x 2 ( − c y c z ) f = x_1(-c_y s_z) + x_2(-c_y c_z) f=x1(cysz)+x2(cycz)
  • g = x 1 ( c x c z − s x s y s z ) + x 2 ( − c x s z − s x s y c z ) g = x_1(c_x c_z - s_x s_y s_z) + x_2(-c_x s_z - s_x s_y c_z) g=x1(cxczsxsysz)+x2(cxszsxsycz)
  • h = x 1 ( s x c z + c x s y s z ) + x 2 ( c x s y c z − s x s z ) h = x_1(s_x c_z + c_x s_y s_z) + x_2(c_x s_y c_z - s_x s_z) h=x1(sxcz+cxsysz)+x2(cxsyczsxsz)
  • 更新海森矩阵   H \ H  H,参考方程:

H i j = ∂ 2 s ∂ p i ∂ p j = ∑ k = 1 n d 1 d 2 exp ⁡ ( − d 2 2 x k ′ T Σ k − 1 x k ′ ) [ − d 2 ( x k ′ T Σ k − 1 ∂ x k ′ ∂ p i ) ( x k ′ T Σ k − 1 ∂ x k ′ ∂ p j ) + x k ′ T Σ k − 1 ∂ 2 x k ′ ∂ p i ∂ p j + ∂ x k ′ ∂ p j T Σ k − 1 ∂ x k ′ ∂ p i ] H_{ij} = \frac{\partial^2 s}{\partial p_i \partial p_j} = \sum_{k=1}^{n} d_1 d_2 \exp\left( -\frac{d_2}{2} \mathbf{x}_k'^T \Sigma_k^{-1} \mathbf{x}_k' \right) \left[ -d_2 \left( \mathbf{x}_k'^T \Sigma_k^{-1} \frac{\partial \mathbf{x}_k'}{\partial p_i} \right) \left( \mathbf{x}_k'^T \Sigma_k^{-1} \frac{\partial \mathbf{x}_k'}{\partial p_j} \right) + \mathbf{x}_k'^T \Sigma_k^{-1} \frac{\partial^2 \mathbf{x}_k'}{\partial p_i \partial p_j} + \frac{\partial \mathbf{x}_k'}{\partial p_j}^T \Sigma_k^{-1} \frac{\partial \mathbf{x}_k'}{\partial p_i} \right] Hij=pipj2s=k=1nd1d2exp(2d2xkTΣk1xk)[d2(xkTΣk1pixk)(xkTΣk1pjxk)+xkTΣk1pipj2xk+pjxkTΣk1pixk]
∂ 2 x k ′ ∂ p i ∂ p j = [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 a b c 0 0 0 b d e 0 0 0 c e f ] \frac{\partial^2 \mathbf{x}_k'}{\partial p_i \partial p_j} = \begin{bmatrix} \begin{array}{cccccc} \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{a} & \mathbf{b} & \mathbf{c} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{b} & \mathbf{d} & \mathbf{e} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{c} & \mathbf{e} & \mathbf{f} \end{array} \end{bmatrix} pipj2xk= 000000000000000000000abc000bde000cef
其中:

  • a = [ 0 x 1 ( − c x s z − s x s y c z ) + x 2 ( − c x c z + s x s y s z ) + x 3 ( s x c y ) x 1 ( − s x s z + c x s y c z ) + x 2 ( − s x s y s z − c x c z ) + x 3 ( − c x c y ) ] \mathbf{a} = \begin{bmatrix} 0 \\ x_1(-c_x s_z - s_x s_y c_z) + x_2(-c_x c_z + s_x s_y s_z) + x_3(s_x c_y) \\ x_1(-s_x s_z + c_x s_y c_z) + x_2(-s_x s_y s_z - c_x c_z) + x_3(-c_x c_y) \end{bmatrix} a= 0x1(cxszsxsycz)+x2(cxcz+sxsysz)+x3(sxcy)x1(sxsz+cxsycz)+x2(sxsyszcxcz)+x3(cxcy)
  • b = [ 0 x 1 ( c x c y c z ) + x 2 ( − c x c y s z ) + x 3 ( c x s y ) x 1 ( s x c y c z ) + x 2 ( − s x c y s z ) + x 3 ( s x s y ) ] \mathbf{b} = \begin{bmatrix} 0 \\ x_1(c_x c_y c_z) + x_2(-c_x c_y s_z) + x_3(c_x s_y) \\ x_1(s_x c_y c_z) + x_2(-s_x c_y s_z) + x_3(s_x s_y) \end{bmatrix} b= 0x1(cxcycz)+x2(cxcysz)+x3(cxsy)x1(sxcycz)+x2(sxcysz)+x3(sxsy)
  • c = [ 0 x 1 ( − s x c z − c x s y s z ) + x 2 ( − s x s z − s x s y c z ) x 1 ( c x c z − s x s y s z ) + x 2 ( − s x s y c z − s x s z ) ] \mathbf{c} = \begin{bmatrix} 0 \\ x_1(-s_x c_z - c_x s_y s_z) + x_2(-s_x s_z - s_x s_y c_z) \\ x_1(c_x c_z - s_x s_y s_z) + x_2(-s_x s_y c_z - s_x s_z) \end{bmatrix} c= 0x1(sxczcxsysz)+x2(sxszsxsycz)x1(cxczsxsysz)+x2(sxsyczsxsz)
  • d = [ x 1 ( − c y c z ) + x 2 ( c y s z ) + x 3 ( − s y ) x 1 ( − s x s y c z ) + x 2 ( s x s y s z ) + x 3 ( s x c y ) x 1 ( c x s y c z ) + x 2 ( − c x s y s z ) + x 3 ( − c x c y ) ] \mathbf{d} = \begin{bmatrix} x_1(-c_y c_z) + x_2(c_y s_z) + x_3(-s_y) \\ x_1(-s_x s_y c_z) + x_2(s_x s_y s_z) + x_3(s_x c_y) \\ x_1(c_x s_y c_z) + x_2(-c_x s_y s_z) + x_3(-c_x c_y) \end{bmatrix} d= x1(cycz)+x2(cysz)+x3(sy)x1(sxsycz)+x2(sxsysz)+x3(sxcy)x1(cxsycz)+x2(cxsysz)+x3(cxcy)
  • e = [ x 1 ( s y s z ) + x 2 ( s y c z ) x 1 ( − s x c y s z ) + x 2 ( − s x c y c z ) x 1 ( c x c y s z ) + x 2 ( c x c y c z ) ] \mathbf{e} = \begin{bmatrix} x_1(s_y s_z) + x_2(s_y c_z) \\ x_1(-s_x c_y s_z) + x_2(-s_x c_y c_z) \\ x_1(c_x c_y s_z) + x_2(c_x c_y c_z) \end{bmatrix} e= x1(sysz)+x2(sycz)x1(sxcysz)+x2(sxcycz)x1(cxcysz)+x2(cxcycz)
  • f = [ x 1 ( − c y c z ) + x 2 ( c y s z ) x 1 ( − c x s z − s x s y c z ) + x 2 ( − c x c z + s x s y s z ) x 1 ( − s x s z + c x s y c z ) + x 2 ( − c x s y s z − s x s z ) ] \mathbf{f} = \begin{bmatrix} x_1(-c_y c_z) + x_2(c_y s_z) \\ x_1(-c_x s_z - s_x s_y c_z) + x_2(-c_x c_z + s_x s_y s_z) \\ x_1(-s_x s_z + c_x s_y c_z) + x_2(-c_x s_y s_z - s_x s_z) \end{bmatrix} f= x1(cycz)+x2(cysz)x1(cxszsxsycz)+x2(cxcz+sxsysz)x1(sxsz+cxsycz)+x2(cxsyszsxsz)
  1. 求解线性方程   H Δ p = − g \ H \Delta \mathbf{p} = -\mathbf{g}  HΔp=g
  2. 更新参数 p \mathbf{p} p,公式如下:
    p = p + Δ p \mathbf{p} = \mathbf{p} + \Delta \mathbf{p} p=p+Δp

猜你喜欢

转载自blog.csdn.net/weixin_41331879/article/details/142980041