前端配准 II
内容基于深蓝学院课件,如有错误,烦请斧正,不胜感激。
1.爬山法(拟梯度法)
1.1 示意图
1.2 基本思想
-
搜索方向固定(只在有限的几个方向中选取,平移8个,旋转2个)
-
搜索时,保持得分单调递增;不满足 则把搜索步长减半
-
当搜索步长减半的次数大于一定的次数时,则认为收敛
1.3 得分函数定义
符号
T
T
T: 机器人的位姿
S
i
(
T
)
S_i(T)
Si(T): 激光点
i
i
i位姿变换
T
T
T后的坐标
M
(
x
)
M(x)
M(x): 似然域地图中坐标
x
x
x处的值
n
n
n: 当前帧激光点的数量
公式
S
c
o
r
e
(
T
)
=
∑
i
=
1
n
M
(
S
i
(
T
)
)
Score(T)=\sum_{i=1}^n M(S_i(T))
Score(T)=i=1∑nM(Si(T))
注意
- S c o r e ( T ) Score(T) Score(T)函数表示位姿 T T T在似然域地图中的得分
- 似然域地图由前一帧或前几帧激光数据生成
1.4 算法流程
- 搜索从一个初始位姿开始 T ( 0 ) T(0) T(0)
- 对于当前最优位姿搜索位姿 T ( i ) T(i) T(i),计算周围10个待搜索位姿的得分,并得到最高得分对应的位姿 T ( ∗ ) T(*) T(∗)
- 如果最高得分比当前搜索位姿得分更高,则更新当前搜索位姿 T ( i + 1 ) = T ( ∗ ) T(i+1)=T(*) T(i+1)=T(∗)
- 否则,搜索步长减半,继续从当前搜 索位姿进行搜索 T ( i + 1 ) = T ( i ) T(i+1)=T(i) T(i+1)=T(i)
- 如果搜索步长减半的次数超过阈值,则认为搜索结束,返回当前的最优位姿
1.5 伪代码
2.高斯牛顿优化方法
误差项与似然域有关,实际上是把帧间匹配问题转换为求解与似然域有关的极值问题。
(⚠️这里的似然与第3部分NDT里模拟出的似然域中的似然不是同一种)
论文:
- 《A Flexible and Scalable SLAM System with Full 3D Motion Estimation》
2.1 示意图
2.2 数学描述
构造误差函数
E
(
T
)
=
a
r
g
min
T
∑
[
1
−
M
(
S
i
(
T
)
)
]
2
E(T)=arg \min_T \sum[1-M(S_i(T))]^2
E(T)=argTmin∑[1−M(Si(T))]2
其中
T
=
(
T
x
,
T
y
,
T
θ
)
T=(T_x,T_y,T_{\theta})
T=(Tx,Ty,Tθ)表示机器人的位姿
p
i
=
(
p
i
x
,
p
i
y
)
p_i=(p_{ix},p_{iy})
pi=(pix,piy)表示第
i
i
i个激光点的坐标
M
(
x
)
M(x)
M(x)表示似然域地图中坐标
x
x
x处的值,表示了栅格地图栅格被障碍物占用的概率
S
i
(
T
)
S_i(T)
Si(T)表示第
i
i
i个激光点位姿变换
T
T
T后的坐标
S
i
(
T
)
=
[
cos
(
T
θ
)
−
sin
(
T
θ
)
T
x
sin
(
T
θ
)
cos
(
T
θ
)
T
y
0
0
1
]
[
p
i
x
p
i
y
1
]
S_i(T)= \begin{bmatrix} \cos(T_\theta) & -\sin(T_\theta) & T_x \\ \sin(T_\theta) & \cos(T_\theta) & T_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} p_{ix} \\ p_{iy} \\ 1 \end{bmatrix}
Si(T)=
cos(Tθ)sin(Tθ)0−sin(Tθ)cos(Tθ)0TxTy1
pixpiy1
2.3 优化方法的求解
误差函数
E
(
T
)
=
a
r
g
min
T
∑
[
1
−
M
(
S
i
(
T
)
)
]
2
E(T)=arg \min_T \sum[1-M(S_i(T))]^2
E(T)=argTmin∑[1−M(Si(T))]2
M
(
S
i
(
T
)
)
M(S_i(T))
M(Si(T))为非线性函数,进行一阶泰勒展开
f
(
T
+
Δ
T
)
≈
f
(
T
)
+
f
′
(
T
)
Δ
T
f(T+\Delta T)\approx f(T)+f'(T)\Delta T
f(T+ΔT)≈f(T)+f′(T)ΔT
可得
E
(
T
+
Δ
T
)
≈
a
r
g
min
T
∑
[
1
−
M
(
S
i
(
T
)
)
−
∇
M
(
S
i
(
T
)
)
∂
S
i
(
T
)
∂
T
Δ
T
]
2
E(T+\Delta T)\approx arg \min_T \sum[1-M(S_i(T))-\nabla M(S_i(T)) \frac{\partial S_i(T)}{\partial T}\Delta T]^2
E(T+ΔT)≈argTmin∑[1−M(Si(T))−∇M(Si(T))∂T∂Si(T)ΔT]2
求
E
(
T
+
Δ
T
)
E(T+\Delta T)
E(T+ΔT)对
Δ
T
\Delta T
ΔT的导数,并令其等于0,可得
∑
[
∇
M
(
S
i
(
T
)
)
∂
S
i
(
T
)
∂
T
]
T
[
1
−
M
(
S
i
(
T
)
)
−
∇
M
(
S
i
(
T
)
)
∂
S
i
(
T
)
∂
T
Δ
T
]
=
0
\sum [\nabla M(S_i(T)) \frac{\partial S_i(T)}{\partial T}]^T[1-M(S_i(T))-\nabla M(S_i(T)) \frac{\partial S_i(T)}{\partial T}\Delta T]=0
∑[∇M(Si(T))∂T∂Si(T)]T[1−M(Si(T))−∇M(Si(T))∂T∂Si(T)ΔT]=0
展开
∑
[
∇
M
(
S
i
(
T
)
)
∂
S
i
(
T
)
∂
T
]
T
[
1
−
M
(
S
i
(
T
)
)
]
=
∑
[
∇
M
(
S
i
(
T
)
)
∂
S
i
(
T
)
∂
T
]
T
[
∇
M
(
S
i
(
T
)
)
∂
S
i
(
T
)
∂
T
Δ
T
]
\sum [\nabla M(S_i(T)) \frac{\partial S_i(T)}{\partial T}]^T[1-M(S_i(T))]=\sum [\nabla M(S_i(T)) \frac{\partial S_i(T)}{\partial T}]^T[\nabla M(S_i(T)) \frac{\partial S_i(T)}{\partial T}\Delta T]
∑[∇M(Si(T))∂T∂Si(T)]T[1−M(Si(T))]=∑[∇M(Si(T))∂T∂Si(T)]T[∇M(Si(T))∂T∂Si(T)ΔT]
令
H
=
[
∇
M
(
S
i
(
T
)
)
∂
S
i
(
T
)
∂
T
]
T
[
∇
M
(
S
i
(
T
)
)
∂
S
i
(
T
)
∂
T
]
H=[\nabla M(S_i(T)) \frac{\partial S_i(T)}{\partial T}]^T[\nabla M(S_i(T)) \frac{\partial S_i(T)}{\partial T}]
H=[∇M(Si(T))∂T∂Si(T)]T[∇M(Si(T))∂T∂Si(T)]
等式两边同时乘以
H
−
1
H^{-1}
H−1,可得
Δ
T
=
H
−
1
∑
[
∇
M
(
S
i
(
T
)
)
∂
S
i
(
T
)
∂
T
]
T
[
1
−
M
(
S
i
(
T
)
)
]
\Delta T=H^{-1}\sum [\nabla M(S_i(T)) \frac{\partial S_i(T)}{\partial T}]^T[1-M(S_i(T))]
ΔT=H−1∑[∇M(Si(T))∂T∂Si(T)]T[1−M(Si(T))]
Δ
T
\Delta T
ΔT表达式中似然域地图
M
(
S
i
(
T
)
)
M(S_i(T))
M(Si(T))已知,未知量为
∇
M
(
S
i
(
T
)
)
\nabla M(S_i(T))
∇M(Si(T))、
∂
S
i
(
T
)
∂
T
\frac{\partial S_i(T)}{\partial T}
∂T∂Si(T)
求未知量
-
∂
S
i
(
T
)
∂
T
\frac{\partial S_i(T)}{\partial T}
∂T∂Si(T)
S i ( T ) = [ cos ( T θ ) − sin ( T θ ) T x sin ( T θ ) cos ( T θ ) T y 0 0 1 ] [ p i x p i y 1 ] = [ cos ( T θ ) ∗ p i x − sin ( T θ ) ∗ p i y + T x sin ( T θ ) ∗ p i x + cos ( T θ ) ∗ p i y + T y 1 ] ⟹ ∂ S i ( T ) ∂ T = [ 1 0 − sin ( T θ ) ∗ p i x − cos ( T θ ) ∗ p i y 0 1 cos ( T θ ) ∗ p i x − sin ( T θ ) ∗ p i y ] S_i(T)= \begin{bmatrix} \cos(T_\theta) & -\sin(T_\theta) & T_x \\ \sin(T_\theta) & \cos(T_\theta) & T_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} p_{ix} \\ p_{iy} \\ 1 \end{bmatrix}= \begin{bmatrix} \cos(T_\theta) *p_{ix} - \sin(T_\theta)*p_{iy} +T_x \\ \sin(T_\theta) *p_{ix} + \cos(T_\theta)*p_{iy} +T_y \\ 1 \end{bmatrix} \\ \implies \frac{\partial S_i(T)}{\partial T}= \begin{bmatrix} 1 & 0 & -\sin(T_\theta) *p_{ix} - \cos(T_\theta)*p_{iy} \\ 0 & 1 & \cos(T_\theta) *p_{ix} - \sin(T_\theta)*p_{iy} \end{bmatrix} Si(T)= cos(Tθ)sin(Tθ)0−sin(Tθ)cos(Tθ)0TxTy1 pixpiy1 = cos(Tθ)∗pix−sin(Tθ)∗piy+Txsin(Tθ)∗pix+cos(Tθ)∗piy+Ty1 ⟹∂T∂Si(T)=[1001−sin(Tθ)∗pix−cos(Tθ)∗piycos(Tθ)∗pix−sin(Tθ)∗piy] -
∇
M
(
S
i
(
T
)
)
\nabla M(S_i(T))
∇M(Si(T))
M ( S i ( T ) ) M(S_i(T)) M(Si(T))表示似然域地图中坐标 S i ( T ) S_i(T) Si(T)处的值, ∇ M ( S i ( T ) ) \nabla M(S_i(T)) ∇M(Si(T))表示似然域对坐标位置的导数。
需要通过插值求得地图插值函数,再对坐标位置进行求导。
2.4 地图插值
在进行地图插值求地图插值函数之前,先介绍一下拉格朗日插值法,介绍完毕之后用拉格朗日插值法求得地图插值函数。
2.4.1 拉格朗日插值
详细介绍可见:如何直观地理解拉格朗日插值法?
主要思想:
- 写出插值基函数
- 构造拉格朗日插值多项式得到插值函数
2.4.2 进行地图插值
由于这里的地图是二维的,因此需要插值得到函数 L ( x , y ) L(x,y) L(x,y),故使用双线性插值的办法。
直接求
- 在
x
x
x方向进行一次线性插值
令 R 1 = ( x , y 0 ) , R 2 = ( x , y 1 ) R_1=(x,y_0),R_2=(x,y_1) R1=(x,y0),R2=(x,y1)
f ( R 1 ) ≈ x − x 1 x 0 − x 1 Z 1 + x − x 0 x 1 − x 0 Z 2 f ( R 2 ) ≈ x − x 1 x 0 − x 1 Z 4 + x − x 0 x 1 − x 0 Z 3 f(R_1)\approx \frac{x-x_1}{x_0-x_1}Z_1+\frac{x-x_0}{x_1-x_0}Z_2 \\ f(R_2)\approx \frac{x-x_1}{x_0-x_1}Z_4+\frac{x-x_0}{x_1-x_0}Z_3 f(R1)≈x0−x1x−x1Z1+x1−x0x−x0Z2f(R2)≈x0−x1x−x1Z4+x1−x0x−x0Z3 - 在
y
y
y方向进行一次线性插值
令 P = ( x , y ) P=(x,y) P=(x,y)
f ( P ) ≈ y − y 1 y 0 − y 1 f ( R 1 ) + y − y 0 y 1 − y 0 f ( R 2 ) f(P)\approx \frac{y-y_1}{y_0-y_1}f(R_1)+\frac{y-y_0}{y_1-y_0}f(R_2) f(P)≈y0−y1y−y1f(R1)+y1−y0y−y0f(R2) - 综合
f ( x , y ) ≈ y − y 1 y 0 − y 1 f ( R 1 ) + y − y 0 y 1 − y 0 f ( R 2 ) = y − y 1 y 0 − y 1 ( x − x 1 x 0 − x 1 Z 1 + x − x 0 x 1 − x 0 Z 2 ) + y − y 0 y 1 − y 0 ( x − x 1 x 0 − x 1 Z 4 + x − x 0 x 1 − x 0 Z 3 ) = ( x − x 1 ) ( x 0 − x 1 ) ( y − y 1 ) ( y 0 − y 1 ) Z 1 + ( x − x 0 ) ( x 1 − x 0 ) ( y − y 1 ) ( y 0 − y 1 ) Z 2 + ( x − x 0 ) ( x 1 − x 0 ) ( y − y 0 ) ( y 1 − y 0 ) Z 3 + ( x − x 1 ) ( x 0 − x 1 ) ( y − y 0 ) ( y 1 − y 0 ) Z 4 \begin{aligned} f(x,y)&\approx \frac{y-y_1}{y_0-y_1}f(R_1)+\frac{y-y_0}{y_1-y_0}f(R_2) \\ &=\frac{y-y_1}{y_0-y_1}(\frac{x-x_1}{x_0-x_1}Z_1+\frac{x-x_0}{x_1-x_0}Z_2) \\ &+\frac{y-y_0}{y_1-y_0}(\frac{x-x_1}{x_0-x_1}Z_4+\frac{x-x_0}{x_1-x_0}Z_3) \\ &=\frac{(x-x_1)}{(x_0-x_1)}\frac{(y-y_1)}{(y_0-y_1)}Z_1+\frac{(x-x_0)}{(x_1-x_0)}\frac{(y-y_1)}{(y_0-y_1)}Z_2 \\ &+\frac{(x-x_0)}{(x_1-x_0)}\frac{(y-y_0)}{(y_1-y_0)}Z_3+\frac{(x-x_1)}{(x_0-x_1)}\frac{(y-y_0)}{(y_1-y_0)}Z_4 \end{aligned} f(x,y)≈y0−y1y−y1f(R1)+y1−y0y−y0f(R2)=y0−y1y−y1(x0−x1x−x1Z1+x1−x0x−x0Z2)+y1−y0y−y0(x0−x1x−x1Z4+x1−x0x−x0Z3)=(x0−x1)(x−x1)(y0−y1)(y−y1)Z1+(x1−x0)(x−x0)(y0−y1)(y−y1)Z2+(x1−x0)(x−x0)(y1−y0)(y−y0)Z3+(x0−x1)(x−x1)(y1−y0)(y−y0)Z4
简化求
令
u
=
x
−
x
0
x
1
−
x
0
,
v
=
y
−
y
0
y
1
−
y
0
u=\frac{x-x_0}{x_1-x_0},v=\frac{y-y_0}{y_1-y_0}
u=x1−x0x−x0,v=y1−y0y−y0
则对应的四个点的坐标变为
(
x
0
,
y
0
)
=
(
0
,
0
)
,
(
x
1
,
y
0
)
=
(
1
,
0
)
(
x
1
,
y
1
)
=
(
1
,
1
)
,
(
x
0
,
y
1
)
=
(
0
,
1
)
(x_0,y_0)=(0,0) ,(x_1,y_0)=(1,0) \\ (x_1,y_1)=(1,1) ,(x_0,y_1)=(0,1)
(x0,y0)=(0,0),(x1,y0)=(1,0)(x1,y1)=(1,1),(x0,y1)=(0,1)
构造基函数
l
1
(
u
,
v
)
=
(
1
−
u
)
(
1
−
v
)
l
2
(
u
,
v
)
=
u
(
1
−
v
)
l
3
(
u
,
v
)
=
u
v
l
4
(
u
,
v
)
=
(
1
−
u
)
v
\begin{aligned} l_1(u,v)&=(1-u)(1-v) \\ l_2(u,v)&=u(1-v) \\ l_3(u,v)&=uv \\ l_4(u,v)&=(1-u)v \end{aligned}
l1(u,v)l2(u,v)l3(u,v)l4(u,v)=(1−u)(1−v)=u(1−v)=uv=(1−u)v
构造拉格朗日插值多项式得到插值函数
L
(
u
,
v
)
=
Z
1
l
1
(
u
,
v
)
+
Z
2
l
2
(
u
,
v
)
+
Z
3
l
3
(
u
,
v
)
+
Z
4
l
4
(
u
,
v
)
L(u,v)=Z_1l_1(u,v)+Z_2l_2(u,v)+Z_3l_3(u,v)+Z_4l_4(u,v)
L(u,v)=Z1l1(u,v)+Z2l2(u,v)+Z3l3(u,v)+Z4l4(u,v)
将
(
u
,
v
)
(u,v)
(u,v)替换回
(
x
,
y
)
(x,y)
(x,y)可得
L
(
x
,
y
)
=
(
x
−
x
1
)
(
x
0
−
x
1
)
(
y
−
y
1
)
(
y
0
−
y
1
)
Z
1
+
(
x
−
x
0
)
(
x
1
−
x
0
)
(
y
−
y
1
)
(
y
0
−
y
1
)
Z
2
+
(
x
−
x
0
)
(
x
1
−
x
0
)
(
y
−
y
0
)
(
y
1
−
y
0
)
Z
3
+
(
x
−
x
1
)
(
x
0
−
x
1
)
(
y
−
y
0
)
(
y
1
−
y
0
)
Z
4
\begin{aligned} L(x,y) &=\frac{(x-x_1)}{(x_0-x_1)}\frac{(y-y_1)}{(y_0-y_1)}Z_1+\frac{(x-x_0)}{(x_1-x_0)}\frac{(y-y_1)}{(y_0-y_1)}Z_2 \\ &+\frac{(x-x_0)}{(x_1-x_0)}\frac{(y-y_0)}{(y_1-y_0)}Z_3+\frac{(x-x_1)}{(x_0-x_1)}\frac{(y-y_0)}{(y_1-y_0)}Z_4 \end{aligned}
L(x,y)=(x0−x1)(x−x1)(y0−y1)(y−y1)Z1+(x1−x0)(x−x0)(y0−y1)(y−y1)Z2+(x1−x0)(x−x0)(y1−y0)(y−y0)Z3+(x0−x1)(x−x1)(y1−y0)(y−y0)Z4
2.4.3 用插值函数对坐标求导
对
x
x
x的偏导数
∂
L
(
x
,
y
)
∂
x
=
y
−
y
0
y
1
−
y
0
(
Z
3
−
Z
4
x
1
−
x
0
)
+
y
−
y
1
y
0
−
y
1
(
Z
2
−
Z
1
x
1
−
x
0
)
\frac{\partial L(x,y)}{\partial x}= \frac{y-y_0}{y_1-y_0}(\frac{Z_3-Z_4}{x_1-x_0}) + \frac{y-y_1}{y_0-y_1}(\frac{Z_2-Z_1}{x_1-x_0})
∂x∂L(x,y)=y1−y0y−y0(x1−x0Z3−Z4)+y0−y1y−y1(x1−x0Z2−Z1)
对
y
y
y的偏导数
∂
L
(
x
,
y
)
∂
y
=
1
y
1
−
y
0
(
(
x
−
x
0
)
Z
3
−
(
x
−
x
1
)
Z
4
x
1
−
x
0
)
+
1
y
0
−
y
1
(
(
x
−
x
0
)
Z
2
−
(
x
−
x
1
)
Z
1
x
1
−
x
0
)
\frac{\partial L(x,y)}{\partial y}= \frac{1}{y_1-y_0}(\frac{(x-x_0)Z_3-(x-x_1)Z_4}{x_1-x_0}) + \frac{1}{y_0-y_1}(\frac{(x-x_0)Z_2-(x-x_1)Z_1}{x_1-x_0})
∂y∂L(x,y)=y1−y01(x1−x0(x−x0)Z3−(x−x1)Z4)+y0−y11(x1−x0(x−x0)Z2−(x−x1)Z1)
3.NDT方法
似然域中的似然是用高斯分布模拟出的似然,表示了方格中点云分布的概率。
论文:
- 《The Normal Distributions Transform: A New Approach to Laser Scan Matching》
3.1 示意图
3.2 基本思想
- 把空间划分为一个个的cell
- 用高斯分布去模拟似然域,形成一个天然分段连续的似然域
- 在得到连续的似然域之后,直接用牛顿方法进行迭代即可
- 似然域连续,不受离散化带来的影响
3.3 数学描述
T
=
(
T
x
,
T
y
,
T
θ
)
T=(T_x,T_y,T_{\theta})
T=(Tx,Ty,Tθ)表示需要求解的位姿变换
X
i
=
[
x
i
y
i
]
X_i=\begin{bmatrix} x_i \\ y_i \end{bmatrix}
Xi=[xiyi]表示第
i
i
i个激光点的坐标
X
i
′
X_i'
Xi′表示第
i
i
i个激光点经过位姿变换
T
T
T后的坐标
X
i
′
=
[
cos
(
T
θ
)
−
sin
(
T
θ
)
sin
(
T
θ
)
cos
(
T
θ
)
]
[
x
i
y
i
]
+
[
T
x
T
y
]
X_i'= \begin{bmatrix} \cos(T_{\theta}) & -\sin(T_{\theta}) \\ \sin(T_{\theta}) & \cos(T_{\theta}) \end{bmatrix} \begin{bmatrix} x_i \\ y_i \end{bmatrix} + \begin{bmatrix} T_x \\ T_y \end{bmatrix}
Xi′=[cos(Tθ)sin(Tθ)−sin(Tθ)cos(Tθ)][xiyi]+[TxTy]
q
i
,
Σ
i
q_i,\Sigma_i
qi,Σi表示点
X
i
X_i
Xi对应的高斯分布的均值和协方差矩阵
当前帧激光点
i
i
i的得分为:
s
c
o
r
e
i
=
exp
(
−
(
X
i
′
−
q
i
)
T
Σ
i
−
1
(
X
i
′
−
q
i
)
2
)
score_i=\exp(-\frac{(X_i'-q_i)^T\Sigma_i^{-1}(X_i'-q_i)}{2})
scorei=exp(−2(Xi′−qi)TΣi−1(Xi′−qi))
因此匹配的目标函数:
max
∑
s
c
o
r
e
i
⟹
min
∑
−
s
c
o
r
e
i
\max \sum score_i \implies \min \sum -score_i
max∑scorei⟹min∑−scorei
令
q
=
X
i
′
−
q
i
q=X_i'-q_i
q=Xi′−qi,则
s
c
o
r
e
i
=
exp
(
−
q
T
Σ
i
−
1
q
2
)
score_i=\exp(-\frac{q^T\Sigma_i^{-1}q}{2})
scorei=exp(−2qTΣi−1q)
特点
- 目标函数并没有取误差的平方
- 不对 s c o r e ( ) score() score()函数进行线性化
- 本式中可以直接求解Hessian矩阵
3.4 算法流程
- 将空间环境进行cell分割(若是二维空间,则离散为栅格,若是三维空间则离散划分为立方体),这样就可以将点云划分到不同cell中
- 用高斯分布刻画每个cell点云的分布,其均值和协方差根据下方公式计算
μ i s = 1 ∣ V i ∣ ∑ p i ∈ V i p i Σ i s = 1 ∣ V i ∣ ∑ p i ∈ V i ( p i − μ i ) T ( p i − μ i ) \begin{aligned} \mu_i^s&=\frac{1}{|V_i|}\sum_{p_i\in V_i}p_i \\ \Sigma_i^s&=\frac{1}{|V_i|}\sum_{p_i\in V_i}(p_i-\mu_i)^T(p_i-\mu_i) \end{aligned} μisΣis=∣Vi∣1pi∈Vi∑pi=∣Vi∣1pi∈Vi∑(pi−μi)T(pi−μi) - 根据初始解把当前帧的激光点转换到参考帧,并确定在哪一个cell中
- 计算当前帧每个激光点在所属cell中的 s c o r e i score_i scorei
- 计算目标函数 max ∑ s c o r e i \max \sum score_i max∑scorei,通过牛顿方法进行迭代求解,得到位姿转换矩阵 T T T
3.5 NDT求解
3.5.1 牛顿方法
假设目标函数为:
min
f
(
x
)
\min f(x)
minf(x)
等价于求:
g
(
x
)
=
f
′
(
x
)
=
0
g(x)=f'(x)=0
g(x)=f′(x)=0
进行泰勒展开,取一阶进行:
g
(
x
+
Δ
x
)
=
g
(
x
)
+
∂
g
(
x
)
∂
x
Δ
x
=
0
∂
g
(
x
)
∂
x
Δ
x
=
−
g
(
x
)
\begin{aligned} g(x+\Delta x)&=g(x)+\frac{\partial g(x)}{\partial x}\Delta x=0 \\ \frac{\partial g(x)}{\partial x}\Delta x&=-g(x) \\ \end{aligned}
g(x+Δx)∂x∂g(x)Δx=g(x)+∂x∂g(x)Δx=0=−g(x)
其中迭代
x
=
x
+
Δ
x
x=x+\Delta x
x=x+Δx
于是上述等价于:
H
Δ
x
=
−
J
H\Delta x=-J
HΔx=−J
因此,用牛顿法进行迭代求解时,关键是要计算目标函数
f
(
x
)
f(x)
f(x)的Hessian矩阵和Jacobian矩阵。
同时,若:
f
(
x
)
=
∑
f
i
(
x
)
f(x)=\sum f_i(x)
f(x)=∑fi(x)
则:
J
=
∑
J
i
H
=
∑
H
i
\begin{aligned} J&=\sum J_i \\ H&=\sum H_i \end{aligned}
JH=∑Ji=∑Hi
3.5.2 求解
显然:
f
i
=
−
s
c
o
r
e
i
=
−
exp
(
−
q
T
Σ
i
−
1
q
2
)
f_i=-score_i=-\exp(-\frac{q^T\Sigma_i^{-1}q}{2})
fi=−scorei=−exp(−2qTΣi−1q)
因此,根据链式法则:
J
i
=
∂
f
i
∂
T
=
−
exp
(
−
q
T
Σ
i
−
1
q
2
)
(
−
q
T
Σ
i
−
1
)
∂
q
∂
T
H
i
=
∂
J
i
∂
T
=
−
exp
(
−
q
T
Σ
i
−
1
q
2
)
(
−
q
T
Σ
i
−
1
∂
q
∂
T
)
(
−
q
T
Σ
i
−
1
∂
q
∂
T
)
−
exp
(
−
q
T
Σ
i
−
1
q
2
)
(
−
∂
q
T
∂
T
Σ
i
−
1
∂
q
∂
T
)
−
exp
(
−
q
T
Σ
i
−
1
q
2
)
(
−
q
T
Σ
i
−
1
∂
2
q
∂
T
2
)
\begin{aligned} J_i&=\frac{\partial f_i}{\partial T}=-\exp(-\frac{q^T\Sigma_i^{-1}q}{2})(-q^T\Sigma_i^{-1})\frac{\partial q}{\partial T} \\ H_i&=\frac{\partial J_i}{\partial T}=-\exp(-\frac{q^T\Sigma_i^{-1}q}{2})(-q^T\Sigma_i^{-1}\frac{\partial q}{\partial T})(-q^T\Sigma_i^{-1}\frac{\partial q}{\partial T}) \\ &- \exp(-\frac{q^T\Sigma_i^{-1}q}{2})(-\frac{\partial q^T}{\partial T}\Sigma_i^{-1}\frac{\partial q}{\partial T})-\exp(-\frac{q^T\Sigma_i^{-1}q}{2})(-q^T\Sigma_i^{-1}\frac{\partial^2 q}{\partial T^2}) \end{aligned}
JiHi=∂T∂fi=−exp(−2qTΣi−1q)(−qTΣi−1)∂T∂q=∂T∂Ji=−exp(−2qTΣi−1q)(−qTΣi−1∂T∂q)(−qTΣi−1∂T∂q)−exp(−2qTΣi−1q)(−∂T∂qTΣi−1∂T∂q)−exp(−2qTΣi−1q)(−qTΣi−1∂T2∂2q)
其中,
q
=
X
i
′
−
q
i
,
∂
q
∂
T
=
∂
X
i
′
∂
T
q=X_i'-q_i,\frac{\partial q}{\partial T}=\frac{\partial X_i'}{\partial T}
q=Xi′−qi,∂T∂q=∂T∂Xi′
X
i
′
=
[
cos
θ
−
sin
θ
sin
θ
cos
θ
]
[
x
i
y
i
]
+
[
t
x
t
y
]
⟹
∂
X
i
′
∂
T
=
[
1
0
−
x
i
sin
θ
−
y
i
cos
θ
0
1
x
i
cos
θ
−
y
i
sin
θ
]
X_i'= \begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} \begin{bmatrix} x_i \\ y_i \end{bmatrix} + \begin{bmatrix} t_x \\ t_y \end{bmatrix} \implies \frac{\partial X_i'}{\partial T}= \begin{bmatrix} 1 & 0 & -x_i\sin\theta-y_i\cos\theta \\ 0 & 1 & x_i\cos\theta-y_i\sin\theta \end{bmatrix}
Xi′=[cosθsinθ−sinθcosθ][xiyi]+[txty]⟹∂T∂Xi′=[1001−xisinθ−yicosθxicosθ−yisinθ]
4.相关匹配方法(CSM)及分支定界加速
论文:
- 《Real-Time Correlative Scan Matching》
- 《Real-Time Loop Closure in 2D LIDAR SLAM》
4.1 帧间匹配似然域
4.2 算法流程
- 构造似然域
- 在指定的位姿搜索空间内进行搜索,计算每一个位姿的得分
- 根据步骤2中位姿的得分,得分最高的位姿即为要求解的位姿,同时计算本次位姿匹配的方差
4.3 位姿搜索
-
暴力搜索
流程:
三层for循环 ( x , y , θ ) (x,y,\theta) (x,y,θ)枚举每一个位姿,分别计算每一个位姿的得分,计算量巨大。因为激光雷达数据在每一个位姿都要重新投影,投影需要计算 sin \sin sin和 cos \cos cos函数。
特点:
计算量巨大,投影矩阵生成需要计算 sin \sin sin和 cos \cos cos,计算的次数为: n x n y n θ n_xn_yn_{\theta} nxnynθ;
点的投影涉及到矩阵乘法,计算的次数为: n x n y n θ n n_xn_yn_{\theta}n nxnynθn。
代码:
-
预先投影搜索
特点:
交换暴力搜索中的循环顺序,最外层对 θ \theta θ进行搜索,生成投影矩阵时, sin \sin sin和 cos \cos cos的计算从 n x n y n θ n_xn_yn_{\theta} nxnynθ降低到 n θ n_{\theta} nθ;
S c o r e Score Score函数中的点投影运算乘法运算消除,只剩下加法运算。
代码:
-
多分辨率搜索
流程:
(1)构造粗分辨率(25cm)和细分辨率(2.5cm)两个似然域
(2)首先在粗分辨率似然域上进行搜索,获取最优位姿
(3)把粗分辨率最优位姿对应的栅格进行细分辨率划分,然后再进行细分辨率搜索,再次得到最优位姿
(4)粗分辨率地图的栅格的似然值为对应的细分辨率地图对应空间的所有栅格的最大值
图示:
(先找“最优大格子”,再从“最优大格子”中找“最优小格子”)
4.4 分枝定界法介绍
用途
把最优解求解问题转换为树形搜索问题。
根节点表示整个解空间,叶子节点表示最优解,中间的节点表示解空间的某一部分子空间。
特点
- 常用的树形搜索剪枝算法
- 求解整数规划问题
- 解的数量为有限个
分枝和定界
分枝:
即根节点(深度为n)表示整个解深度n-1子节点表示解空间的子空间,深度n-2的节点表示深度n-1节点的子空间,这样层层划分,直到划分到真实解,也就是叶子节点(深度为0)为止。
定界:
对于搜索树中的每一个节点,确定以该节点为根节点的子树的界。对于最小值问题,确定下界;对于最大值问题,确定上界(SLAM中为上界)。
⚠️SLAM中一个多棵树同时搜索,每棵树表示一个固定的角度。
算法伪代码
4.5 分枝定界法在相关方法中的加速作用
-
搜索树中的节点表示一个正方形的搜索范围 ( c x , c y , c θ , c h ) (c_x,c_y,c_{\theta},c_h) (cx,cy,cθ,ch)
( c x , c y ) (c_x,c_y) (cx,cy)表示搜索空间的起点
c h c_h ch表示树的深度
c θ c_{\theta} cθ表示该节点对应的角度 -
分枝
对于一个高度为 c h > 1 c_h>1 ch>1的节点 c = ( c x , c y , c θ , c h ) c=(c_x,c_y,c_\theta,c_h) c=(cx,cy,cθ,ch),将其分枝为高度为 c h − 1 c_h-1 ch−1的四个子节点集合 ( c x , c y , c θ , c h ) (c_x,c_y,c_{\theta},c_h) (cx,cy,cθ,ch)
-
定界
构造得分函数,使得得分函数对于节点 c c c的打分,是以节点 c c c为根节点的子树的上界
-
多分辨率地图
-
算法伪代码
节点选择
分枝规则