相机按照工作方式不同,分为:
如果把工作环境限定在静态、刚体、光照变化不明显、没有人为干扰的场景,这种场景下的slam技术已经相当成熟。
度量地图(Metric Map):强调精确地表示地图中物体的位置关系,通常用稀疏(Sparse)与稠密(Dense)对其分类。定位时使用稀疏地图,导航使用稠密地图。
拓扑地图(Topological Map):是一个图,由节点个边组成只考虑节点的连通性。
视觉里程计关心相邻图像之间的相机运动,最简单的情况是两张图像之间的运动关系。
视觉里程计能够通过相邻帧间的图像古遗迹相机运动,并恢复场景的空间结构。称它为‘里程计’是因为它和实际的里程计一样,只计算相邻时刻的运动,和过去的信息没有关联。
漂移:是由于视觉里程计的估计误差导致的,先前时刻的误差会传递到下一刻,导致经过一段时间后,估计的轨迹就不再准确。
后端优化和回环检测可以解决漂移问题。回环检测负责把“把机器人回到原始位置”的事情检测出来,后端优化则根据该信息校正整个轨迹的形状。
在视觉slam中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法。
SLAM问题的本质:对运动物体自身和周围环境空间不确定性的估计。为解决slam问题,我们需要状态估计理论,把定位和见图的不确定性表达出来,然后采用滤波器或非线性优化,估计状态的均值和不确定性(方差)。
视觉回环检测实质上是一种计算图像数据相似性的算法。
离散 时刻:;
轨迹:;
路标:N个,用表示
时刻位于处探测到某一个路标
运动方程:
这里,是运动传感器的读数或者输入,为该过程中加入的噪声。
观测方程:在时刻位于处探测到某一个路标,产生一个观测数据。用一个抽象函数h来描述这个关系:
是这次观测里的噪声。
SLAM过程可以总结为两个基本方程:
其中是一个集合,记录着哪个时刻观察到了哪个路标。这;两个方程描述了最基本的slam问题:
当知道运动测量的读数,以及传感器的读数,如何求解定位问题(估计)和建图问题(估计)?
我们就把slam问题建模成了一个状态估计问题:如何通过带有噪声的测量数据,估计内部的、隐藏着的状态变量?
三位空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数和欧拉角。
1、内积
指向量的夹角。 也可以描述向量间的投影关系。
2、外积
外积的结果是一个向量,他的方向垂直于这两个向量,大小为,是两个向量张成的四边形的有向面积。
反对称符号:^
反对称矩阵:
任意向量都对应着唯一的一个反对称矩阵,反之亦然。向量的加减法和内外积与坐标系无关。
3、刚体运动 :两个坐标之间的运动由一个旋转加上一个平移组成,这种运动成为刚体运动。
欧式变换由旋转和平移组成。
矩阵R描述了旋转本身。成为旋转矩阵(Rotation Matrix)。同时,该矩阵各分量是两个坐标系基的内积,由于基向量的程度为1,所以是各基向量夹角的余弦值。所以这个矩阵也叫方向余弦矩阵(Direction Cosine Matrix).
旋转矩阵是一个行列式为1的正交矩阵。反之,行列式为1 的正交矩阵也是一个旋转矩阵。可以将n维旋转矩阵的集合定义如下:
是特殊正交群。这个集合是由n维空间的旋转矩阵组成,特别地,指三维空间的旋转。
由于旋转矩阵为正交矩阵,它的逆(转置)描述了一个相反的旋转。按照上面的定义方式,有
显然,刻画了一个相反的旋转。
加上一次平移之后,
实际中,我们会定义坐标系1、坐标系2,那么向量在两个坐标系下的坐标为,,它们之间的关系是:
是指“把坐标系2的向量变换到坐标系1”中。
关于平移它实际对应的是坐标系1原点指向坐标系2原点的向量,在坐标系1下去的坐标。
假设进行了两次变换:和:
那么,从到的变换为
引入齐次坐标和变换矩阵:
数学技巧:在三维向量的末位添加1,将其变为四维向量,称为齐次坐标。对于四维向量可以把旋转和平移写在一个矩阵里,使得整个关系变成线性关系,矩阵称为变换矩阵(Transform Matrix)。
关于变换矩阵具有特殊的结构:左上角为旋转矩阵,右侧为平移变量,左下角为,右下角为1.这种矩阵又称为特殊欧氏群(Special Euclidean Group):
与SO(3)一样,求解该矩阵的逆表示一个反向的变换:
当写时,使用的是齐次坐标。而写时,使用的是非齐次坐标。
Eigen是一个C++开源线性代数库。它提供了快速的有关矩阵的线性代数运算,还包括解方程等。
它是一个纯用头文件搭建起来的库,只需要引入Eigen的头文件即可,不需要链接库文件。
Ubuntu 安装:
sudo apt install libeigen3-dev
查找命令:
sudo updatedb
locate eigen3
矩阵表示的缺点:
任意一个旋转都可以用一个旋转轴和一个旋转角来刻画。
旋转向量:方向与旋转轴一致,长度等于旋转角。
考虑某个旋转用R表示。如果用旋转向量来描述,假设旋转轴为一个单位长度的向量,角度为,那么向量也可以描述这个旋转。
从旋转向量到旋转矩阵的转换过程由罗德里格斯公式表明,
符号^是向量到反对称矩阵的转换符。反之。我们可以从一个旋转矩阵到旋转向量的转换。对于转角,取两边的迹,有
因此
关于旋转轴,旋转轴上的向量在旋转后不发生改变,说明:
因此,旋转轴是矩阵R特征值1对应的特征向量。求解此方程,再归一化,就得到了旋转轴。
欧拉角:
使用3个分离的转角,把一个旋转分解成3次绕不同轴的旋转。
“偏航-俯仰-滚转”(yaw-pitch-roll)的旋转顺序等价于ZYX轴的旋转。
这样一个三维向量可以描述任意旋转。
欧拉角的重大缺点是会碰到万向锁问题(Gimbal Lock):在俯仰角为时,第一次旋转与第三次旋转将使用同一个轴。
四元数是Hamilton找到的一种扩展的复数。它既是紧凑的,也没有奇异性。
一个四元数有1个实部3个虚部。
其中,i,j,k 为四元数的三个虚部。这三个虚部满足以下关系式:
人们也用一个标量和一个向量来表达四元数:
s称为四元数的实部,称为四元数的虚部。若虚部为,则称为实四元数 。若实部为0,则称虚四元数。
可以用单位四元数表示三维空间中任意一个旋转。
1、四元数加减法:
2、乘法(向量外积运算形式):
四元数乘法不可交换的,除非和在中共线,外积项为0.
两个四元数的乘积仍是实的,这与复数一致。
3、模长
四元数乘积的模即模的乘积。
4、四元数的共轭是把虚部取成相反数:
5、逆
6、数乘、
四元数到其他旋转表示的转换
设,那么定义如下的符号+和为:
可证:
四元数到旋转矩阵的变换:
四元数到旋转向量的转换公式: