提示
前言
理解图优化理论第一步,搞清楚三要素:误差项、优化变量、协方差,当然开局讲这三个概念有点复杂,所以先借鉴三个简单例子讲基本概念。本例在现有博客基础上进行了案例扩充,由浅入深,便于初学者理解。
提示:以下是本篇文章正文内容,下面案例可供参考
一、SLAM图优化
图是由节点和边构成的一种结构。
在机器人SLAM中,机器人位姿是节点,表示机器人状态量
p
i
p_i
pi(位置、姿态),用以下形式表示
p
i
=
[
x
,
y
,
z
,
q
x
,
q
y
,
q
z
,
q
w
]
p_i=[x,y,z,q_x,q_y,q_z,q_w]
pi=[x,y,z,qx,qy,qz,qw]
前三项为机器人位置,后四项为机器人姿态的四元数表示。
各个位姿之间的变换关系构成边(旋转R、平移t)
T
i
j
=
[
R
t
0
1
]
T_{ij}=\begin{bmatrix} R&t\\ 0&1\end{bmatrix}
Tij=[R0t1]
构建误差项,已有当前观测
x
i
x_i
xi,再通过
T
i
j
T_{ij}
Tij将
x
j
x_j
xj变换至
x
i
x_i
xi,理论上若无误差,则变换后的值应与
x
i
x_i
xi相等,但实际上存在误差,因此作差后得到误差项,构建最小二乘问题,使得整个图的边误差最小
min
R
,
t
E
=
∑
i
j
∥
x
i
−
T
i
j
x
j
∥
2
\min_{R,t}E=\sum_{ij}\lVert {x}_i - T_{ij}x_j \rVert^2
R,tminE=ij∑∥xi−Tijxj∥2
二、相机位姿图优化案例
与上述不同的是,相机位姿图优化中,通常采用机器人对路标点的观测来构建边。
如下图所示案例,假设机器人在初始位置
x
0
x_0
x0处,此时观测到路标
l
0
l_0
l0在前方2m处,通过轮式里程计观测到机器人向前移动1m后,这时再看路标点
l
0
l_0
l0在前方0.8m处,此时机器人最优位姿和路标最优位姿如何计算。
在这个案例中,我们将路标作为顶点:
x
0
=
0
(
初
始
点
在
0
处
)
x_0=0(初始点在0处)
x0=0(初始点在0处)
l
0
=
x
0
+
2
(
路
标
点
在
前
方
2
m
处
)
l_0=x_0+2(路标点在前方2m处)
l0=x0+2(路标点在前方2m处)
x
1
=
x
0
+
1
(
轮
式
里
程
计
测
得
前
进
1
m
)
x_1=x_0+1(轮式里程计测得前进1m)
x1=x0+1(轮式里程计测得前进1m)
l
0
=
x
1
+
0.8
(
路
标
点
在
前
方
0.8
m
处
)
l_0=x_1+0.8(路标点在前方0.8m处)
l0=x1+0.8(路标点在前方0.8m处)
用图表示如下
对上式移项构建误差项得
f
0
=
x
0
−
0
(
初
始
点
在
0
处
)
f_0=x_0-0(初始点在0处)
f0=x0−0(初始点在0处)
f
1
=
l
0
−
x
0
−
2
(
路
标
点
在
前
方
2
m
处
)
f_1=l_0-x_0-2(路标点在前方2m处)
f1=l0−x0−2(路标点在前方2m处)
f
2
=
x
1
−
x
0
−
1
(
轮
式
里
程
计
测
得
前
进
1
m
)
f_2=x_1-x_0-1(轮式里程计测得前进1m)
f2=x1−x0−1(轮式里程计测得前进1m)
f
3
=
l
0
−
x
1
−
0.8
(
路
标
点
在
前
方
0.8
m
处
)
f_3=l_0-x_1-0.8(路标点在前方0.8m处)
f3=l0−x1−0.8(路标点在前方0.8m处)
误差平方和函数如下
F
=
∑
i
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
F=\sum_{i} 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
F=i∑fi2=f02+f12+f22+f32=(x0−0)2+(l0−x0−2)2+(x1−x0−1)2+(l0−x1−0.8)2
求误差平方和最小,将上式对每个变量进行求偏导,令偏导为0,即为函数极值点
∂
F
∂
x
0
=
2
x
0
−
2
(
l
0
−
x
0
−
2
)
−
2
(
x
1
−
x
0
−
1
)
=
0
⇒
3
x
0
−
x
1
+
l
0
=
−
3
\frac{ \partial F }{ \partial x_0 }=2x_0-2(l_0-x_0-2)-2(x_1-x_0-1)=0 \\ \Rightarrow 3x_0-x_1+l_0=-3
∂x0∂F=2x0−2(l0−x0−2)−2(x1−x0−1)=0⇒3x0−x1+l0=−3
∂
F
∂
x
1
=
2
(
x
1
−
x
0
−
1
)
−
2
(
l
0
−
x
1
−
0.8
)
=
0
⇒
−
x
0
+
2
x
1
−
l
0
=
0.2
\frac{ \partial F }{ \partial x_1 }=2(x_1-x_0-1)-2(l_0-x_1-0.8)=0 \\ \Rightarrow -x_0+2x_1-l_0=0.2
∂x1∂F=2(x1−x0−1)−2(l0−x1−0.8)=0⇒−x0+2x1−l0=0.2
∂
F
∂
l
0
=
2
(
l
0
−
x
0
−
2
)
+
2
(
l
0
−
x
1
−
0.8
)
=
0
⇒
−
x
0
−
x
1
+
2
l
0
=
2.8
\frac{ \partial F }{ \partial l_0 }=2(l_0-x_0-2)+2(l_0-x_1-0.8)=0 \\ \Rightarrow -x_0-x_1+2l_0=2.8
∂l0∂F=2(l0−x0−2)+2(l0−x1−0.8)=0⇒−x0−x1+2l0=2.8
将上面三式写成矩阵形式得
[
3
−
1
1
−
1
2
−
1
−
1
−
1
2
]
[
x
0
x
1
l
0
]
=
[
−
3
0.2
2.8
]
\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}
⎣⎡3−1−1−12−11−12⎦⎤⎣⎡x0x1l0⎦⎤=⎣⎡−30.22.8⎦⎤
求解线性方程组,相当于调整后满足这些边得条件,路标点和机器人得位置为
[
x
0
x
1
l
0
]
=
[
0
1.07
1.93
]
\begin{bmatrix} x_0 \\ x_1 \\ l_0 \end{bmatrix}=\begin{bmatrix} 0 \\ 1.07 \\ 1.93 \end{bmatrix}
⎣⎡x0x1l0⎦⎤=⎣⎡01.071.93⎦⎤
三、信息矩阵
实际定位中,传感器的精度是有差别的,因此我们会对传感器赋于不同的置信度,比如本例中,我们认为轮式里程计的精度很高,则将其权重赋值为10,对应误差项为
f
2
f_2
f2,则误差平方和函数如下
F
=
∑
i
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
F=\sum_{i} 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
F=i∑fi2=f02+f12+10f22+f32=(x0−0)2+(l0−x0−2)2+10(x1−x0−1)2+(l0−x1−0.8)2
计算过程与上节一致,因此求得路标和机器人位置得
[
x
0
x
1
l
0
]
=
[
0
1.01
1.9
]
\begin{bmatrix} x_0 \\ x_1 \\ l_0 \end{bmatrix}=\begin{bmatrix} 0 \\ 1.01 \\ 1.9 \end{bmatrix}
⎣⎡x0x1l0⎦⎤=⎣⎡01.011.9⎦⎤
该结果显示
x
1
x_1
x1的值接近1,因此更加相信轮式里程计的数据,这就是信息矩阵的作用。
四、相机观测
本节介绍开头所说的三要素。(顶点为优化变量,边为运动/观测约束)
1.高斯牛顿法
目标函数:
Δ
x
∗
=
arg min
x
∥
e
(
x
+
Δ
x
)
∥
p
2
\Delta x^*=\argmin_{x}\lVert {e(x+\Delta x)}\rVert^2_p
Δx∗=xargmin∥e(x+Δx)∥p2
p
p
p——协方差
误差项:
e
(
x
+
Δ
x
)
≈
e
(
x
)
+
J
(
x
)
Δ
x
e(x+\Delta x) \approx e(x)+J(x)\Delta x
e(x+Δx)≈e(x)+J(x)Δx
J
(
x
)
J(x)
J(x)——Jacobian
令目标函数关于
Δ
x
\Delta x
Δx的导数为0(类似上节中误差平方和函数导数为0),得到高斯牛顿方程,即增量方程:
J
T
P
−
1
J
Δ
x
=
−
J
T
P
−
1
e
J^TP^{-1}J\Delta x = -J^TP^{-1}e
JTP−1JΔx=−JTP−1e
其中
J
T
P
−
1
J
=
H
J^TP^{-1}J=H
JTP−1J=H
−
J
T
P
−
1
e
=
b
-J^TP^{-1}e=b
−JTP−1e=b
因此增量方程可以写为
H
Δ
x
=
b
H\Delta x=b
HΔx=b
非线性优化的思想是从某个的初始值开始,不断地寻找下降方向 ∆x 来找到目标函数的最优解,即不断地求令以下目标函数值达到最小值中的增量 ∆x 。
例:一次观测
1.误差项:e为像素平面上的重投影误差(2x1)
2.优化变量:x为相机位姿
T
1
T_1
T1(6x1)、路标点
P
1
P_1
P1(3x1)
3.协方差:P为像素误差(2x2)
Jacobian矩阵如下:
J
2
∗
9
=
∂
e
∂
x
=
[
∂
e
∂
T
1
∂
e
∂
P
1
]
=
[
J
T
2
∗
6
J
p
2
∗
6
]
J^{2*9}=\frac{ \partial e }{ \partial x }=\begin{bmatrix} \frac{ \partial e }{ \partial T_1} \frac{ \partial e }{ \partial P_1 } \end{bmatrix}=\begin{bmatrix}J_T^{2*6} J_p^{2*6} \end{bmatrix}
J2∗9=∂x∂e=[∂T1∂e∂P1∂e]=[JT2∗6Jp2∗6]
总结
简单的图优化实例,帮助理解概念。