视觉SLAM十四讲
文章目录
第二讲 初识SLAM
1.1 SLAM
SLAM(同时定位与地图构建)指搭载特定传感器的主体,在没有环境先验信息的情况下,在运动过程中建立环境的模型,同时顾及自己的运动。
2.2 经典视觉SLAM框架
- 传感器信息读取:在视觉SLAM种主要为相机图像信息的读取和预处理。
- 前端视觉里程计(Visual Odometry,VO):估算相邻图像间相机的运动以及局部地图。
- 后端(非线性)优化:接受不同时刻视觉里程计测量的相机位姿,以及回环检测信息,对他们进行优化,得到全局一致地图。
- 回环检测(Loop Closure Detection):回环判断机器人是否到达过先前的位置
- 建图(Mapp):根据估计的轨迹建立任务相对应的地图。
2.2.1 视觉里程计
视觉里程计关心相邻图像之间的相机运动。
仅通过视觉里程计估计轨迹,将出现累计漂移现象。将导致无法建立一致的地图,需要后端优化与回环检测。回环检测负责把机器人“回到原来的位置”,后端优化根据该信息矫正整个轨迹的形状
2.2.2 后端优化
后端优化主要指处理SLAM过程中的噪声问题。
视觉里程计有时被称为前端,由前端给后端提供待优化的数据,。后端优化负责整体的优化过程,往往只面对数据,在视觉SLAM中,前端和计算机视觉领域更为相关,比如图像的特征提取和匹配等,后端则主要是滤波和非线性优化算法。
SLAM问题的本质:对运动主体自身和周围环境空间不确定性的估计。
2.2.3 回环检测
主要解决位置估计随时间飘移的问题。为实现回环检测,需要让机器人具有识别到过场景的能力。视觉回环检测实质上是计算图像数据相似性的算法。·
2.2.4 建图
建图是指构建地图的过程。地图的形式随SLAM应用场合来决定,大体上分为度量地图和拓扑地图两种。
度量地图(Metric Map)强调精确的表示地图中物体的位置关系,通常用稀疏和稠密对其分类。稀疏地图进行了一定程度的抽象,并不需要表达所有的物体。例如选取一部分具有代表意义的东西,称之为路标,稀疏地图就是由路标组成的地图。相对的,稠密图着重于建模所有看到的物体。定位时,使用稀疏路标地图就足够了。二导航时则需要稠密地图。稠密地图通常按照某种分辨率,有多个小块组成。在二维地图中体现为多个小格子,在三维地图中则体现为多个小方块。通常一个格子有占据、空闲和未知三种状态,来表达该格子中是否有有物体。
拓扑地图(Topological Map)更强调地图元素之间的关系。拓扑地图是一个图,由节点和边组成,只考虑节点之间的联通性。
2.2 SLAM问题的数学表述
由于相机是在某些时刻采集数据的,因此我们只关心这些时刻和地图,这就把连续时间的运动变成了离散时刻 t = 1 , . . . , K t=1,...,K t=1,...,K当中发生的事情。在这些时刻,用 x x x表示机器人自身的位置,于是各时刻位置为 x 1 , … , x K x_1,\dots,x_K x1,…,xK,构成了机器人的轨迹。在地图方面,地图由多个路标组成,每个时刻,传感器会检测到一部分路标点,得到他们的观测数据。用 y 1 , … , y N y_1,\dots,y_N y1,…,yN表示。
运动可以抽象为一个数学模型
x
k
=
f
(
x
K
−
1
,
u
k
,
w
k
)
x_k=f(x_{K-1},u_k,w_k)
xk=f(xK−1,uk,wk)
这里
u
k
u_k
uk是运动传感器的读数或输入,
w
k
w_k
wk表示该过程中加入的噪声。
f
(
⋅
)
f(·)
f(⋅)用于表述运动的过程,称之为运动方程。
与运动方程相对应,存在一个观测方程,描述的是机器人在
x
k
x_k
xk位置上看到某个路标点
y
j
y_j
yj时,产生的观测数据
z
k
,
j
z_{k,j}
zk,j。同样,用一个抽象函数
h
h
h来描述:
z
k
,
j
=
h
(
y
j
,
x
k
,
v
k
,
j
)
z_{k,j}=h(y_j,x_k,v_{k,j})
zk,j=h(yj,xk,vk,j)
这里
v
k
,
j
v_{k,j}
vk,j是这次观测过程产生的噪声。
针对不同传感器,运动方程与观测方程有不同的参数化表示,SLAM过程可以表示为两个基本方程:
{
x
k
=
f
(
x
k
−
1
,
u
k
,
w
k
)
,
k
=
1
,
⋯
,
K
z
k
,
j
=
h
(
y
j
,
x
k
,
v
k
,
j
)
,
(
k
,
j
)
∈
O
.
\left\{\begin{array}{ll}\boldsymbol{x}_{k}=f\left(\boldsymbol{x}_{k-1}, \boldsymbol{u}_{k}, \boldsymbol{w}_{k}\right), & k=1, \cdots, K \\ \boldsymbol{z}_{k, j}=h\left(\boldsymbol{y}_{j}, \boldsymbol{x}_{k}, \boldsymbol{v}_{k, j}\right), & (k, j) \in \mathcal{O} .\end{array}\right.
{xk=f(xk−1,uk,wk),zk,j=h(yj,xk,vk,j),k=1,⋯,K(k,j)∈O.
其中,
O
\mathcal{O}
O是一个集合,记录在那个时刻观察到了哪个路标。这两个方程描述了SLAM的基本问题:当知道运动测量的读书
u
u
u,以及传感器的数据
z
z
z时,我们讲SLAM问题建模成了一个状态估计问题:如何通过有噪声的测量数据,估计内部的、隐藏的状态变量?
状态估计问题的求解,由方程具体形式以及噪声的分布有关。线性高斯系统的无偏最有估计可以由卡尔曼滤波器给出。非线性非高斯系统可以使用看u欧战的卡尔曼滤波和非线性优化两大类方法求解。
分布有关。线性高斯系统的无偏最有估计可以由卡尔曼滤波器给出。非线性非高斯系统可以使用看u欧战的卡尔曼滤波和非线性优化两大类方法求解。