其他章节:
第二讲:初识SLAM
SLAM(Simultaneous Localization and Mapping),同时定位与地图构建。它是指搭载特定传感器主体,在没有环境先验信息的情况下,于运动过程中建立环境模型,同时估计自己的运动。
相机介绍
单目相机:即一个摄像头,这种传感器结构简单,成本低;缺点是但是它以二维的形式反映了三维的世界,丢掉了深度,因此平移之后才能计算深度,但仍然无法确定真实尺度。
双目相机:由两个单目相机组成,但两个相机之间的距离(基线)已知,因此我们通过基线来估计每个像素的空间位置。它的缺点是配置与标定均较为复杂,其深度量程和精度受基线和分辨率所限;并且视差的计算非常消耗计算资源。
深度相机:通过红外结构光原理,测出物体与相机之间的距离,因此可以节省大量的计算;但目前多数深度相机还存在测量范围窄、噪声大、视野小、易受日光干扰、无法测量透射材质等诸多问题。
经典视觉SLAM框架
1.传感器信息读取。在视觉SLAM中主要为相机图像信息的读取和预处理。如果是在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。
2.视觉里程计(Visual Odometry, VO)。估算相邻图像间相机的运动,以及局部地图的样子。
VO能够通过相邻帧间的图像估计相机运动,并恢复场景的空间结构,它和实际的里程计一样,只计算相邻时刻的运动。但是由于里程计的工作方式,导师误差会传递,形成累计漂移。
3.后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。
主要指SLAM过程中噪声的问题。后端优化要考虑的,就是如何从有噪声的数据中估计整体系统的状态,以及这个状态估计的不确定性有多大(最大后验概率估计MAP)。
4.回环检测(Loop Closing) 。回环检测判断机器人是否到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。
主要解决位置估计随时间漂移的问题。通过识别到过的场景,并把“A与B是同一个点”的信息告诉后端优化算法;然后后端根据这些新的信息,把轨迹和地图调整到符合回环检测结果的样子。这样,如果我们有充分而且正确的回环检测,就可以消除累积误差,得到全局一致的轨迹和地图。
5.建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。.
大体分为度量地图和拓扑地图。度量地图强调精确地表示地图中物体的位置关系,通常用稀疏与稠密对其分类。稀疏地图并不需要表达所有的物体;稠密地图着重于建模所有看到的东西。拓扑地图更强调地图元素之间的关系。拓扑地图由节点和边组成,只考虑节点间的连通性。
SLAM问题的数学表述
若机器人在离散时刻 t = 1 , . . . , k t=1,...,k t=1,...,k中的位置为 x = x 1 , . . . , x k x=x_1,...,x_k x=x1,...,xk,那么从 k − 1 k-1 k−1时刻到 k k k时刻,机器人的位置可以抽象成一个运动方程: 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为噪声
假设地图中有 N N N个路标 y 1 , . . . , y N y_1,...,y_N y1,...,yN,当机器人在 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是这次观测里的噪声。
实践部分
使用的vm虚拟机,ubuntu20.04版本。
首先是基础的创建文件(vim记得要sudo权限,第一次没加没法写入。)
书里示例程序:
使用g++编译,并运行out文件:
为了便捷管理未来的项目,书里介绍了cmake生成makefile
使用命令sudo cmake .
编译
生成的Makefile可以用make
命令进行
这一节都是基础,之前基本都用过学过,包括后面的库函数之类的,不多写了