最近定了方向为视觉SLAM,买了高翔的视觉SLAM这本书,寥寥草草看完一遍,一头雾水,感叹视觉SLAM入门太难,今天来到博客,再学一边,顺便记录下自己第一次写博客。
在此引用“小萝卜”机器人,小萝卜为了探索一个房间需知道两件事:
1、我在什么地方?(定位)
2、周围环境是什么样?(建图)
SLAM="定位+建图";视觉SLAM=“用摄像头作为传感器的SLAM”
单目相机(一个摄像头):
优点:结构简单、成本低。
缺点:照片本质上是以二维的形式记录了三维的世界=>缺失了深 度信 息(无法知道物体的距离)=>需要通过移动单目,获得视差来判断物体的距离。总的来说就是单目SLAM无法凭借图像知道图像里面物体的真实尺度,又称为尺度不确定性。
双目相机(由两个在一条直线上的单目相机组成,两个相机之间的距离称为基线)
优点:通过左右眼的差异可以判断物体与相机之间的距离。
缺点:计算量巨大,且深度和基线的长度有关系
深度相机(RGB-D相机)
优点:带有红外,可以直接测量物体距离相机的深度。
缺点:红外受光影响较大,应用场景很局限。
1. 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。
2. 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动, 以及局部地图的样子。VO 又称为前端(Front End)工作=>(图像的特征提取与匹配等)。问题=>会出现累积漂移=>解决办法(后端优化和回环检测)
3. 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回 环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后, 又称为后端(Back End)工作=>(滤波与非线性优化算法(很重要,需要拥有基础的状态估计理论)基本理论)。
4. 回环检测(Loop Closing)。回环检测判断机器人是否曾经到达过先前的位置。如果 检测到回环,它会把信息提供给后端进行处理 工作(解决位置估计随时间漂移问题)=>可通过图片的相似性来完成回环检测=>可向深度学习方向扩展(语义SLAM)。
5. 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。稀疏地图:不需要表达地图里面所有的物体,选择一些具有标志性的物体,作为路标,由所有路标组成的地图成为稀疏地图,稠密地图:用于导航。
运动:k-1 时刻到 k 时刻,小萝卜的位置 x 是如何变化的。(x:小萝卜自身的位置,各个时刻则记为 )
这里 是运动传感器的读数(有时也叫输入),
为噪声。注意到,我们用一个一 般函数 f 来描述这个过程,而不具体指明 f 的作用方式。这使得整个函数可以指代任意 的运动传感器,成为一个通用的方程,而不必限定于某个特殊的传感器上。我们把它称为运动方程。
观测:当小萝卜在位置上 看到某个路标点
,产生了一个观测数据
。同样,我们用一个抽象的函数 h 来描述这 个关系:
=
这里是这次观测里的噪声。由于观测所用的传感器形式更多,这里的观测数据 z 以及观测方程 h 也许多不同的形式.
状态估计问题:上面两个方程描述了SLAM的基本问题,即如何求解定位(估计x)和建图(估计)问题,这就转换成了状态估计问题=>如何通过带有噪声的测量数据,估计内部的,隐藏着的状态变量
状态估计的问题可用滤波器和非线性优化来求解,现在主流以图优化来进行状态估计。
mkdir build
cd build
cmake ..
make
./cpp文件名