机器人定位问题已经从滤波方法逐渐变成优化方法,事实也证明基于优化方法的定位效果要比滤波方法效果好。其中,优化和图论结合的图优化方法几乎占据了头条,成为学习SLAM必须要掌握的一门知识。那么,什么是图优化呢?
本文注重手推,想理解图优化的童鞋请准备好笔和纸,和我一起推导,完成之后必然有所收获。
一、SLAM图优化
机器人的位姿是一个节点(位姿)和边构成(R,t)。
在最简单的情况下,节点代表相机的各个位姿(四元数或者矩阵):
p
i
=
[
x
,
y
,
z
,
q
x
,
q
y
,
q
z
,
q
w
]
(1)
p_i=[x,y,z,q_x,q_y,q_z,q_w]\tag{1}
pi=[x,y,z,qx,qy,qz,qw](1)
边则代表各个位姿的转换关系:
T
j
i
=
[
R
3
×
3
t
3
×
1
0
1
]
(2)
T_{ji}=\begin{bmatrix}R_{3×3}&t_{3×1} \\0&1 \end{bmatrix} \tag{2}
Tji=[R3×30t3×11](2)
简单的回环来说可以大概表示为:
p
1
⟶
T
21
p
2
⟶
T
32
p
3
⟶
T
43
p
4
(3)
p_1\stackrel{T_{21}}{\longrightarrow} p_2\stackrel{T_{32}}{\longrightarrow} p_3\stackrel{T_{43}}{\longrightarrow} p_4\tag{3}
p1⟶T21p2⟶T32p3⟶T43p4(3)
构造最小二乘问题,使得整个VO图的边误差最小:
m
i
n
R,t
=
m
i
n
E
=
∑
i
,
j
∣
∣
x
i
−
T
i
j
x
j
∣
∣
2
(4)
\underset{\text{R,t}}{min}= minE= \sum_{i,j}||x_i-T_{ij}x_j||^2 \tag{4}
R,tmin=minE=i,j∑∣∣xi−Tijxj∣∣2(4)
于是,我们的工作转移到了对代价函数
∣
∣
x
i
−
T
i
j
x
j
∣
∣
2
||x_i-T_{ij}x_j||^2
∣∣xi−Tijxj∣∣2求最小值上。
二、里程计的图优化
如下图所示,假设一个机器人初始起点在0处,然后机器人向前移动,通过里程计测得它向前移动了1米,到达第二个地点。接着,又向后返回,里程计测得它向后移动了0.8米。但是,通过闭环检测 ,发现它回到了初始点。可以看出,里程计误差导致计算的位姿和观测到有差异,那么,机器人这几个状态中的位姿到底是怎么样的才最好的满足这些条件呢?
首先构建位姿之间的关系,即图的边:
x
0
=
0
(
初
始
起
点
在
0
处
)
x
1
=
x
0
+
1
(
向
前
移
动
了
1
米
)
x
2
=
x
1
−
0.8
(
向
后
移
动
了
0.8
米
)
x
2
=
x
0
(
回
到
了
初
始
点
)
(5)
x_0=0(初始起点在0处) \\x_1=x_0+1(向前移动了1米) \\x_2=x_1-0.8(向后移动了0.8米) \\x_2=x_0(回到了初始点) \tag{5}
x0=0(初始起点在0处)x1=x0+1(向前移动了1米)x2=x1−0.8(向后移动了0.8米)x2=x0(回到了初始点)(5)
构建的图如下:
线性方程组中变量小于方程的个数,要计算出最优的结果,就要使用最小二乘法,需要构建残差平方和函数,那么从上面可知,残差函数是:
f
0
=
x
0
−
0
(
初
始
起
点
在
0
处
)
f
1
=
x
1
−
x
0
−
1
(
向
前
移
动
了
1
米
)
f
2
=
x
2
−
x
1
+
0.8
(
向
后
移
动
了
0.8
米
)
f
3
=
x
2
−
x
0
(
回
到
了
初
始
点
)
(6)
f_0=x_0-0(初始起点在0处) \\f_1=x_1-x_0-1(向前移动了1米) \\f_2=x_2-x_1+0.8(向后移动了0.8米) \\f_3=x_2-x_0(回到了初始点) \tag{6}
f0=x0−0(初始起点在0处)f1=x1−x0−1(向前移动了1米)f2=x2−x1+0.8(向后移动了0.8米)f3=x2−x0(回到了初始点)(6)
残差平方和函数是:
F
=
∑
i
,
j
f
i
2
=
f
0
2
+
f
1
2
+
f
2
2
+
f
3
2
=
(
x
0
−
0
)
2
+
(
x
1
−
x
0
−
1
)
2
+
(
x
2
−
x
1
+
0.8
)
2
+
(
x
2
−
x
0
)
2
(7)
F=\sum_{i,j} f_i^2=f_0^2+f_1^2+f_2^2+f_3^2= \\(x_0-0)^2+(x_1-x_0-1)^2+(x_2-x_1+0.8)^2+ (x_2-x_0)^2 \tag{7}
F=i,j∑fi2=f02+f12+f22+f32=(x0−0)2+(x1−x0−1)2+(x2−x1+0.8)2+(x2−x0)2(7)
为了使残差平方和最小,我们对上面的函数每个变量求偏导,并使得偏导数等于0。
∂
F
∂
x
0
=
2
x
0
−
2
(
x
1
−
x
0
−
1
)
−
2
(
x
2
−
x
0
)
=
6
x
0
−
2
x
1
−
2
x
2
+
2
=
3
x
0
−
x
1
−
x
2
+
1
=
0
⇒
3
x
0
−
x
1
−
x
2
=
−
1
(8)
\frac{\partial F}{\partial x_0}= 2x_0-2(x_1-x_0-1)-2(x_2-x_0) \\=6x_0-2x_1-2x_2+2 \\=3x_0-x_1-x_2+1=0 \\\Rightarrow 3x_0-x_1-x_2=-1 \tag{8}
∂x0∂F=2x0−2(x1−x0−1)−2(x2−x0)=6x0−2x1−2x2+2=3x0−x1−x2+1=0⇒3x0−x1−x2=−1(8)
∂
F
∂
x
1
=
2
(
x
1
−
x
0
−
1
)
−
2
(
x
2
−
x
1
+
0.8
)
=
−
2
x
0
+
4
x
1
−
2
x
2
−
3.6
=
−
x
0
+
2
x
1
−
x
2
−
1.8
=
0
⇒
−
x
0
+
2
x
1
−
x
2
=
1.8
(9)
\\\frac{\partial F}{\partial x_1}= 2(x_1-x_0-1)-2(x_2-x_1+0.8) \\=-2x_0+4x_1-2x_2-3.6 \\=-x_0+2x_1-x_2-1.8=0 \\\Rightarrow -x_0+2x_1-x_2=1.8 \tag{9}
∂x1∂F=2(x1−x0−1)−2(x2−x1+0.8)=−2x0+4x1−2x2−3.6=−x0+2x1−x2−1.8=0⇒−x0+2x1−x2=1.8(9)
∂
F
∂
x
2
=
2
(
x
2
−
x
1
+
0.8
)
+
2
(
x
2
−
x
0
)
=
−
x
0
−
x
1
+
2
x
2
+
0.8
=
0
⇒
−
x
0
−
x
1
+
2
x
2
=
−
0.8
(10)
\\\frac{\partial F}{\partial x_2}= 2(x_2-x_1+0.8)+2(x_2-x_0) \\=-x_0-x_1+2x_2+0.8=0 \\\Rightarrow -x_0-x_1+2x_2=-0.8 \tag{10}
∂x2∂F=2(x2−x1+0.8)+2(x2−x0)=−x0−x1+2x2+0.8=0⇒−x0−x1+2x2=−0.8(10)
把公式(8)、(9)、(10)合成矩阵形式,可得:
[
3
−
1
−
1
−
1
2
−
1
−
1
−
1
2
]
[
x
0
x
1
x
2
]
=
[
−
1
1.8
−
0.8
]
(11)
\begin{bmatrix} 3&-1&-1 \\-1&2&-1 \\-1&-1&2 \end{bmatrix} \begin{bmatrix} x_0\\x_1\\x_2 \end{bmatrix}= \begin{bmatrix} -1\\1.8\\-0.8 \end{bmatrix} \tag{11}
⎣⎡3−1−1−12−1−1−12⎦⎤⎣⎡x0x1x2⎦⎤=⎣⎡−11.8−0.8⎦⎤(11)
利用矩阵求解线性方程:
[
x
0
x
1
x
2
]
=
[
3
−
1
−
1
−
1
2
−
1
−
1
−
1
2
]
−
1
[
−
1
1.8
−
0.8
]
=
[
0
0.93
0.07
]
(12)
\begin{bmatrix} x_0\\x_1\\x_2 \end{bmatrix}= \begin{bmatrix} 3&-1&-1 \\-1&2&-1 \\-1&-1&2 \end{bmatrix}^{-1} \begin{bmatrix} -1\\1.8\\-0.8 \end{bmatrix}= \begin{bmatrix} 0\\0.93\\0.07 \end{bmatrix} \tag{12}
⎣⎡x0x1x2⎦⎤=⎣⎡3−1−1−12−1−1−12⎦⎤−1⎣⎡−11.8−0.8⎦⎤=⎣⎡00.930.07⎦⎤(12)
所以调整以后为满足这些边的条件,机器人的位姿为:
[
x
0
x
1
x
2
]
=
[
0
0.93
0.07
]
(13)
\begin{bmatrix} x_0\\x_1\\x_2 \end{bmatrix}= \begin{bmatrix} 0\\0.93\\0.07 \end{bmatrix} \tag{13}
⎣⎡x0x1x2⎦⎤=⎣⎡00.930.07⎦⎤(13)
三、相机的图优化
上面虽然求出来最后的解,但是有个致命的问题:
机器人非常依赖闭环检测,因为只有通过闭环检测才能发现它回到了初始点,否则无法判断。而实际应用中,闭环检测的难度很大,而且也存在误差。
避开使用闭环检测这个方法,在相机图优化中,我们尝试用观测路标的方法来构建边。
如下图所示,假设一个机器人初始起点在0处,并观测到路标在其前方2m。然后机器人向前移动,通过里程计测得它向前移动了1m,这时观测到路标在其前方0.8m。请问,机器人位姿和路标位姿的最优状态?
在这个图中,我们把路标当作了一个顶点,要清楚地意识到,这个路标其实就是相机的位姿。
x
0
=
0
(
初
始
起
点
在
0
处
)
l
0
=
x
0
+
2
(
观
测
到
路
标
在
其
前
方
2
m
)
x
1
=
x
0
+
1
(
测
得
它
向
前
移
动
了
1
m
)
l
0
=
x
1
+
0.8
(
观
测
到
路
标
在
其
前
方
0.8
m
)
(14)
x_0=0(初始起点在0处) \\l_0=x_0+2(观测到路标在其前方2m) \\x_1=x_0+1(测得它向前移动了1m) \\l_0=x_1+0.8(观测到路标在其前方0.8m) \tag{14}
x0=0(初始起点在0处)l0=x0+2(观测到路标在其前方2m)x1=x0+1(测得它向前移动了1m)l0=x1+0.8(观测到路标在其前方0.8m)(14)
构建的图如下:
线性方程组中变量小于方程的个数,要计算出最优的结果,就要使用最小二乘法,需要构建残差平方和函数,那么从上面可知,残差函数是:
f
0
=
x
0
−
0
(
初
始
起
点
在
0
处
)
f
1
=
l
0
−
x
0
−
2
(
观
测
到
路
标
在
其
前
方
2
m
)
f
2
=
x
1
−
x
0
−
1
(
测
得
它
向
前
移
动
了
1
m
)
f
3
=
l
0
−
x
1
−
0.8
(
观
测
到
路
标
在
其
前
方
0.8
m
)
(15)
f_0=x_0-0(初始起点在0处) \\f_1=l_0-x_0-2(观测到路标在其前方2m) \\f_2=x_1-x_0-1(测得它向前移动了1m) \\f_3=l_0-x_1-0.8(观测到路标在其前方0.8m) \tag{15}
f0=x0−0(初始起点在0处)f1=l0−x0−2(观测到路标在其前方2m)f2=x1−x0−1(测得它向前移动了1m)f3=l0−x1−0.8(观测到路标在其前方0.8m)(15)
残差平方和函数是:
F
=
∑
i
,
j
f
i
2
=
f
0
2
+
f
1
2
+
f
2
2
+
f
3
2
=
(
x
0
−
0
)
2
+
(
l
0
−
x
0
−
2
)
2
+
(
x
1
−
x
0
−
1
)
2
+
(
l
0
−
x
1
−
0.8
)
2
(16)
F=\sum_{i,j} f_i^2=f_0^2+f_1^2+f_2^2+f_3^2= \\(x_0-0)^2+(l_0-x_0-2)^2+(x_1-x_0-1)^2+ (l_0-x_1-0.8)^2 \tag{16}
F=i,j∑fi2=f02+f12+f22+f32=(x0−0)2+(l0−x0−2)2+(x1−x0−1)2+(l0−x1−0.8)2(16)
为了使残差平方和最小,我们对上面的函数每个变量求偏导,并使得偏导数等于0。
∂
F
∂
x
0
=
2
x
0
−
2
(
l
0
−
x
0
−
2
)
−
2
(
x
1
−
x
0
−
1
)
=
6
x
0
−
2
x
1
+
2
l
0
+
6
=
3
x
0
−
x
1
+
l
0
+
3
=
0
⇒
3
x
0
−
x
1
+
l
0
=
−
3
(17)
\frac{\partial F}{\partial x_0}= 2x_0-2(l_0-x_0-2)-2(x_1-x_0-1) \\=6x_0-2x_1+2l_0+6 \\=3x_0-x_1+l_0+3=0 \\\Rightarrow 3x_0-x_1+l_0=-3 \tag{17}
∂x0∂F=2x0−2(l0−x0−2)−2(x1−x0−1)=6x0−2x1+2l0+6=3x0−x1+l0+3=0⇒3x0−x1+l0=−3(17)
∂
F
∂
x
1
=
2
(
x
1
−
x
0
−
1
)
−
2
(
l
0
−
x
1
−
0.8
)
=
−
2
x
0
+
4
x
1
−
2
l
0
−
0.4
=
−
x
0
+
2
x
1
−
l
0
−
0.2
=
0
⇒
−
x
0
+
2
x
1
−
l
0
=
0.2
(18)
\\\frac{\partial F}{\partial x_1}= 2(x_1-x_0-1)-2(l_0-x_1-0.8) \\=-2x_0+4x_1-2l_0-0.4 \\=-x_0+2x_1-l_0-0.2=0 \\\Rightarrow -x_0+2x_1-l_0=0.2 \tag{18}
∂x1∂F=2(x1−x0−1)−2(l0−x1−0.8)=−2x0+4x1−2l0−0.4=−x0+2x1−l0−0.2=0⇒−x0+2x1−l0=0.2(18)
∂
F
∂
l
0
=
2
(
l
0
−
x
0
−
2
)
+
2
(
l
0
−
x
1
−
0.8
)
=
−
2
x
0
−
2
x
1
+
4
l
0
−
5.6
=
0
=
−
x
0
−
x
1
+
2
l
0
−
2.8
=
0
⇒
−
x
0
−
x
1
+
2
l
0
=
2.8
(19)
\\\frac{\partial F}{\partial l_0}= 2(l_0-x_0-2)+2(l_0-x_1-0.8) \\=-2x_0-2x_1+4l_0-5.6=0 \\=-x_0-x_1+2l_0-2.8=0 \\\Rightarrow -x_0-x_1+2l_0=2.8 \tag{19}
∂l0∂F=2(l0−x0−2)+2(l0−x1−0.8)=−2x0−2x1+4l0−5.6=0=−x0−x1+2l0−2.8=0⇒−x0−x1+2l0=2.8(19)
把公式(17)、(18)、(19)合成矩阵形式,可得:
[
3
−
1
1
−
1
2
−
1
−
1
−
1
2
]
[
x
0
x
1
l
0
]
=
[
−
3
0.2
2.8
]
(20)
\begin{bmatrix} 3&-1&1 \\-1&2&-1 \\-1&-1&2 \end{bmatrix} \begin{bmatrix} x_0\\x_1\\l_0 \end{bmatrix}= \begin{bmatrix} -3\\0.2\\2.8 \end{bmatrix} \tag{20}
⎣⎡3−1−1−12−11−12⎦⎤⎣⎡x0x1l0⎦⎤=⎣⎡−30.22.8⎦⎤(20)
利用矩阵求解线性方程:
[
x
0
x
1
l
0
]
=
[
3
−
1
−
1
−
1
2
−
1
−
1
−
1
2
]
−
1
[
−
3
0.2
2.8
]
=
[
0
1.07
1.93
]
(21)
\begin{bmatrix} x_0\\x_1\\l_0 \end{bmatrix}= \begin{bmatrix} 3&-1&-1 \\-1&2&-1 \\-1&-1&2 \end{bmatrix}^{-1} \begin{bmatrix} -3\\0.2\\2.8 \end{bmatrix}= \begin{bmatrix} 0\\1.07\\1.93 \end{bmatrix} \tag{21}
⎣⎡x0x1l0⎦⎤=⎣⎡3−1−1−12−1−1−12⎦⎤−1⎣⎡−30.22.8⎦⎤=⎣⎡01.071.93⎦⎤(21)
所以调整以后为满足这些边的条件,路标和机器人位姿为:
[
x
0
x
1
l
0
]
=
[
0
1.07
1.93
]
(22)
\begin{bmatrix} x_0\\x_1\\l_0 \end{bmatrix}= \begin{bmatrix} 0\\1.07\\1.93 \end{bmatrix} \tag{22}
⎣⎡x0x1l0⎦⎤=⎣⎡01.071.93⎦⎤(22)
四、信息阵
我们知道传感器的精度是有差别的,也就是说我们对传感器的相信程度应该不同。比如假设这里编码器信息很精确,测得的路标距离不准,我们应该赋予编码器信息更高的权重,假设是10,对应的残差是 f 2 f_2 f2,那么重新得到残差平方和如下:
F = ∑ i , j f i 2 = f 0 2 + f 1 2 + 10 f 2 2 + f 3 2 = ( x 0 − 0 ) 2 + ( l 0 − x 0 − 2 ) 2 + 10 ( x 1 − x 0 − 1 ) 2 + ( l 0 − x 1 − 0.8 ) 2 (23) F=\sum_{i,j} f_i^2=f_0^2+f_1^2+10f_2^2+f_3^2= \\(x_0-0)^2+(l_0-x_0-2)^2+10(x_1-x_0-1)^2+ (l_0-x_1-0.8)^2 \tag{23} F=i,j∑fi2=f02+f12+10f22+f32=(x0−0)2+(l0−x0−2)2+10(x1−x0−1)2+(l0−x1−0.8)2(23)
为了使残差平方和最小,我们对上面的函数每个变量求偏导,并使得偏导数等于0。
∂
F
∂
x
0
=
2
x
0
−
2
(
l
0
−
x
0
−
2
)
−
20
(
x
1
−
x
0
−
1
)
=
24
x
0
−
20
x
1
−
2
l
0
+
24
=
12
x
0
−
10
x
1
−
l
0
+
12
=
0
⇒
12
x
0
−
10
x
1
−
l
0
=
−
12
(24)
\frac{\partial F}{\partial x_0}= 2x_0-2(l_0-x_0-2)-20(x_1-x_0-1) \\=24x_0-20x_1-2l_0+24 \\=12x_0-10x_1-l_0+12=0 \\\Rightarrow 12x_0-10x_1-l_0=-12 \tag{24}
∂x0∂F=2x0−2(l0−x0−2)−20(x1−x0−1)=24x0−20x1−2l0+24=12x0−10x1−l0+12=0⇒12x0−10x1−l0=−12(24)
∂
F
∂
x
1
=
20
(
x
1
−
x
0
−
1
)
−
2
(
l
0
−
x
1
−
0.8
)
=
−
20
x
0
+
22
x
1
−
2
l
0
−
18.4
=
−
10
x
0
+
11
x
1
−
l
0
−
9.2
=
0
⇒
−
10
x
0
+
11
x
1
−
l
0
=
9.2
(25)
\\\frac{\partial F}{\partial x_1}= 20(x_1-x_0-1)-2(l_0-x_1-0.8) \\=-20x_0+22x_1-2l_0-18.4 \\=-10x_0+11x_1-l_0-9.2=0 \\\Rightarrow -10x_0+11x_1-l_0=9.2 \tag{25}
∂x1∂F=20(x1−x0−1)−2(l0−x1−0.8)=−20x0+22x1−2l0−18.4=−10x0+11x1−l0−9.2=0⇒−10x0+11x1−l0=9.2(25)
∂
F
∂
l
0
=
2
(
l
0
−
x
0
−
2
)
+
2
(
l
0
−
x
1
−
0.8
)
=
−
2
x
0
−
2
x
1
+
4
l
0
−
5.6
=
0
=
−
x
0
−
x
1
+
2
l
0
−
2.8
=
0
⇒
−
x
0
−
x
1
+
2
l
0
=
2.8
(26)
\\\frac{\partial F}{\partial l_0}= 2(l_0-x_0-2)+2(l_0-x_1-0.8) \\=-2x_0-2x_1+4l_0-5.6=0 \\=-x_0-x_1+2l_0-2.8=0 \\\Rightarrow -x_0-x_1+2l_0=2.8 \tag{26}
∂l0∂F=2(l0−x0−2)+2(l0−x1−0.8)=−2x0−2x1+4l0−5.6=0=−x0−x1+2l0−2.8=0⇒−x0−x1+2l0=2.8(26)
把公式(24)、(25)、(26)合成矩阵形式,可得:
[
12
−
10
−
1
−
10
11
−
1
−
1
−
1
2
]
[
x
0
x
1
l
0
]
=
[
−
12
9.2
2.8
]
(27)
\begin{bmatrix} 12&-10&-1 \\-10&11&-1 \\-1&-1&2 \end{bmatrix} \begin{bmatrix} x_0\\x_1\\l_0 \end{bmatrix}= \begin{bmatrix} -12\\9.2\\2.8 \end{bmatrix} \tag{27}
⎣⎡12−10−1−1011−1−1−12⎦⎤⎣⎡x0x1l0⎦⎤=⎣⎡−129.22.8⎦⎤(27)
利用矩阵求解线性方程:
[
x
0
x
1
l
0
]
=
[
12
−
10
−
1
−
10
11
−
1
−
1
−
1
2
]
−
1
[
−
12
9.2
2.8
]
=
[
0
1.01
1.9
]
(28)
\begin{bmatrix} x_0\\x_1\\l_0 \end{bmatrix}= \begin{bmatrix} 12&-10&-1 \\-10&11&-1 \\-1&-1&2 \end{bmatrix}^{-1} \begin{bmatrix} -12\\9.2\\2.8 \end{bmatrix}= \begin{bmatrix} 0\\1.01\\1.9 \end{bmatrix} \tag{28}
⎣⎡x0x1l0⎦⎤=⎣⎡12−10−1−1011−1−1−12⎦⎤−1⎣⎡−129.22.8⎦⎤=⎣⎡01.011.9⎦⎤(28)
所以调整以后为满足这些边的条件,路标和机器人位姿为:
[
x
0
x
1
l
0
]
=
[
0
1.01
1.9
]
(29)
\begin{bmatrix} x_0\\x_1\\l_0 \end{bmatrix}= \begin{bmatrix} 0\\1.01\\1.9 \end{bmatrix} \tag{29}
⎣⎡x0x1l0⎦⎤=⎣⎡01.011.9⎦⎤(29)
将这个结果和之前对比,
[ x 0 x 1 l 0 ] = [ 0 1.07 1.93 ] (22) \begin{bmatrix} x_0\\x_1\\l_0 \end{bmatrix}= \begin{bmatrix} 0\\1.07\\1.93 \end{bmatrix} \tag{22} ⎣⎡x0x1l0⎦⎤=⎣⎡01.071.93⎦⎤(22)
可以看到这里的机器人位姿 x 1 x_1 x1更靠近编码器测量的结果。请记住这种思想,这里的权重就是在SLAM中要经常提到的边的信息矩阵,对于理解图优化有比较大的帮助。
五、总结
总之,图优化理论中,本质还是优化理论,主要涉及最小均方二次优化方法。这里的图与组合数学的图论还是有些区别,这里的图只是一个形象的比喻,本质是优化理论。一看到这些,别说你们,是谁头都大了。所以,上大学逃的高等数学、线性代数、概率论与梳理统计课,找个时候补补吧。
出来混,迟早要还的。
参考:
1.graph slam tutorial : 从推导到应用1
2.SLAM——图优化篇
3.第四篇:图优化理论slam