在rm队伍里作为算法组梯队队员度过了一个赛季,为了促进和负责其他工作的算法组成员的交流,我决定在接下来的半个学期里(可能更快)读完这本书,并将其中的部分理论应用于我自制的雷达导航小车上。
以下为第二讲的部分笔记:
第二讲 SLAM系统概述
2.0 目标
1.理解一个视觉SLAM框架由哪几个模块组成,各模块的任务是什么。
2.搭建编程环境,为开发和实验做准备
2.1 相机
单目相机:只使用一个摄像头。无法通过单张照片获取三维信息,需移动相机视角,通过时序信息获取。由于无法获取三维信息,故其估计的轨迹和地图与真实世界相差一个因子,即尺度。称之为尺度不确定性
双目相机:双目相机由两个单目相机组成,两个相机之间的距离(称为基线)已知,通过基线估计每个像素的空间位置,与人眼类似。基线距离越大,测量范围越远。
深度相机(RGB-D):通过红外结构光或Time-of-Flight原理,通过主动向物体发射光并接受返回的光,测量处物体离相机的距离。缺点:测量范围窄、噪声大、视野小、易受日光干扰、无法测量透射材料。
2.2 SLAM框架
SLAM流程为以下几步:
1.传感器信息读取与时间戳同步
2.视觉里程计,用于估算相邻图像间相机的运动及局部地图的模样,被称为前端。
3.后端优化,后端接受不同时刻视觉里程计测量的相机位姿及回环检测的信息,对其优化后得到全局一致的轨迹和地图。
4.回环检测,判断机器人是否到达过先前的位置,若检测到回环,则将信息交由后端处理。
5.建图,根据估计的轨迹,建立于任务要求对应的地图。
若将工作环境限定在静态、刚体、光照变化不明显、没有人为干扰的场景,该系统已相当成熟。
2.2.1 视觉里程计
计算机如何通过图像确定相机的运动?
要定量地估计相机运动,必须在了解相机与空间点的几何关系之后进行。
视觉里程计只计算相邻时刻的图像,与更前或更后的信息没有关联。将相邻时刻的运动串联起来,构成了机器人的运动轨迹。
但由于其只估计两个图像,不可避免地出现累计漂移——误差的累计传递使得轨迹错误。此时需要后端优化与回环检测。回环检测负责检测机器人是否回到了原始位置,后端优化根据信息矫正整个轨迹的形状。
2.2.2 后端优化
后端优化主要指处理SLAM过程中噪声的问题,即如何从带有噪声的传感器数据中估计整个系统的状态,以及这个状态估计的不确定性有多大——最大后验概率估计。状态包括机器人自身的轨迹与地图。
2.2.3 回环检测
主要解决位置随时间漂移的问题,通过在原点设置环境传感器或判断图像的相似性来完成检测。通过回环检测,可以消除累计误差,得到全局一致的轨迹和地图。
2.2.4 建图
建图指构建地图的过程,但其数据结构应视需要而定。
度量地图:强调精确表示地图中物体的位置关系,以稀疏与稠密对其分类。稀疏地图进行了一定程度的抽象,并不需要表达所有的物体。例如,若选择一部分具有代表意义的东西,称之为路标,则一张稀疏地图就是由路标组成的,而不是路标的部分可以忽略掉。
相对的,稠密地图着重于建模所有东西。对于定位,稀疏足够了,对于导航则需要稠密地图。
稠密地图通常按照某种分辨率,由许多个小块组成。二维度量地图由格子组成,三位为小方块。一般地,一个小块有占据、空闲、未知三种状态,表达该格内是否有物体。这样的地图空间成本大,会出现一致性问题,一点误差都可能使得地图出现重叠,进而失效。
拓扑地图:拓扑地图更强调地图元素之间的关系。拓扑地图由节点与边组成,只考虑节点间的连通性,不考虑节点间通行的过程。拓扑地图不擅长表达具有复杂结构的地图,且有待研究如何将地图分割为节点和边,以及如何利用其进行导航和路径规划。
2.3 SLAM的数学表述
如何用数学描述机器人的运动?
由于传感器是离散地采集数据的,故将一段连续时间内的运动分割为离散时刻的 t = 1 , . . . , K t=1,...,K t=1,...,K当中发生的事,在这些时刻, x x x表示机器人自身的位置, x 1 , . . . , x K x_1,...,x_K x1,...,xK记为各时刻的位置,其构成了机器人的轨迹。假如地图由许多个路标组成的,而每个时刻,传感器会检测到一部分路标点。假设路标以 y 1 , . . . , y N y_1,...,y_N y1,...,yN表示。
则机器人的运动由如下两件事描述:
1.什么是运动?需要考虑从 k − 1 k-1 k−1时刻到 k k k时刻,机器人的位置 x x x是如何变化的,
2.什么是观测?假如机器人在 k k k时刻,于 x k x_k xk检测到了某路标 y j y_j yj,则需要考虑如何用数学描述。
机器人上搭载的传感器一般可以测量运动相关的读数,可能是位置之差、加速度、角速度等信息。以下有一个通用的抽象数学模型:
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为控制输入(如速度、角速度等,指从
x
k
−
1
x_{k-1}
xk−1到
x
k
x_k
xk之间施加的控制量),
w
k
w_k
wk为噪声。此为运动方程。与之相对,还有一个观测方程。其描述的是机器人在
x
k
x_k
xk位置时看到某个路标点
y
j
y_j
yj,产生了一个观测数据
z
k
,
j
z_{k,j}
zk,j。同样有一个数学模型:
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问题即:当知道输入 u u u以及对某个对象的观测数据 z z z时,如何求解定位问题(估计 x x x)和建图问题(估计 y y y)——如何通过带有噪声的测量数据,估计内部的隐藏着的状态变量?
要求解这个状态估计问题,与两个方程的具体形式,以及噪声服从哪种分布有关。按照运动和观测方程是否为线性,以及噪声是否服从高斯分布进行分类,分为线性/非线性和高斯/非高斯系统。
其中线性高斯系统是最简单的,其无偏最优估计可以由卡尔曼滤波器给出,而非线性非高斯系统中,以扩展卡尔曼滤波器和非线性优化两种方法求解,或是粒子滤波器、图优化等。优化技术在计算资源充足的情况下优于滤波技术。
位姿 x x x是什么?三维空间的运动由三个轴构成,则机器人的运动由三轴上的平移与旋转(为方便,视为yaw轴旋转)描述,共有六自由度。表达与优化这样的位姿在第三、四讲中讨论。如何在视觉上参数化观测方程,则在第五章讨论,知道了以上信息,如何求解上述状态方程,则在第六讲中。有待后续学习。