slam概述
SLAM是搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型。
定位和建图可以看成感知的内外之分,一方面要明白自身的状态,另一方面也要了解外在的环境。
将传感器分为两类,一类传感器是携带与机器人本体上的,例如机器人的轮式编码器、相机、激光灯等。一类是安装于环境中的,例如导轨、二维码标志等。安装于环境中的传感设备,通常能够直接测量到机器人的位置信息,简单有效地解决定位问题。
但是,由于必须在环境中设置,在一定程度上限制了机器人的适用范围。
按照相机的工作方式,将相机分为单目、双目和深度相机(RGB-D)三个大类。
单目相机 : 只使用一个摄像头进行SLAM的做法称为单目SLAM。这种传感器结构特别简单,成本很低。
由于单目相机只是三维空间的二维投影,所以如果真想恢复三维结构,必须移动相机的视角。移动相机后,估计相机的运动,同时估计场景中的物体的远近和大小,称之为结构。
由于相机往右移动,图像中的东西就会往左移动,同时近处的物体移动块,远处的物体移动缓慢。于是,相机移动时,这些物体在图像上的运动,形成了视差,通过视差可以判断物体的远近。
但是对于单目相机,将相机的运动和场景同时放大一定的倍数,看到的景象是一样的。
这说明了单目SLAM估计的轨迹和地图,将于真实的相差一个因子,也就是所谓的尺度。由于单目SLAM无法仅凭图像确定这个真实尺度,又称为尺度不确定性。
单目的缺点:
平移后才能计算深度
无法计算真实的尺度
本质原因是通过单张图像无法确定深度
双目相机和深度相机
双目相机和深度相机的目的,在于通过某种手段测量物体离我们的距离,克服单目无法知道距离的缺点。
如果知道了距离,场景的三维结构就可以通过单个图像恢复出来,也就消除了尺度不确定性。
双目相机与深度相机测量深度的原理不同
双目相机由两个单目相机组成,这两个相机之间的距离也就是基线是已知的。我们通过基线来来估计每个像素的空间位置。
这类似于人类可以通过左右眼图像的差异,判断物体的远近。对于双目相机进行拓展,也可以搭建多目相机,但是本质原理相同。
双目相机对于计算量有很大的要求。且双目相机测量的深度范围与基线有关。基线距离越大,能测量的范围越远。
深度相机可以通过红外结构光或tof原理,像激光传感器一样,测出距离,相比于双目相机,极大的减少了计算量。但是目前也主要应用于室内,室外较难应用。
经典视觉slam框架
对目前的slam框架以及包含的算法来说。如果把工作环境限定在静态、刚体、光照变化不明显、没有人为干扰的场景,那么slam系统已经相当成熟了。
三维空间刚体运动
旋转矩阵
想要确定一个点的位置,首先要确定它所在的坐标系,确定坐标系后可以得到该线性空间的基,就可以根据此来确定该点在这组基下的坐标了。
当我们用该表示法表示出多点坐标之后,它们之间存在着多种计算方式,重要的有内积:
可以描述向量间的投影关系
还有外积:
外积只对三维向量存在定义,还能用外积表示向量的旋转。因为a到b之间的旋转关系,可以使用旋转向量来描述,也就是三个实数就可以刻画出旋转的状态。
与向量间的旋转类似,坐标系之间也存在着变换关系。
坐标系之间的转换关系运用矩阵T来描述。
相机运动是一个刚体运动,保证了同一个向量在各个坐标系长度和夹角都不会发生变化,这种变换称为欧式变换。
利用同一个点在不同坐标系中坐标表示不同,但是位置不会发生变化,建立等式,推导出如下式子:
得到了矩阵R,这个矩阵有两个坐标系的基的内积组成,只要旋转相同,那么矩阵R一定相同,所以它又被称为旋转矩阵。
旋转矩阵存在着它是一个行列式为1的正交矩阵的性质。同时,行列式为1的正交矩阵也是一个旋转就很。所以旋转矩阵的集合定义为下:
SO(n)是特殊正交群的意思。SO(3)就是三维空间旋转的意思。旋转矩阵可以描述相机的旋转。
通过旋转矩阵和平移向量可以完整地描述欧式空间的坐标变换关系。
坐标系在经过多次变换后会变得过于负载,所以引入了齐次变换和变换矩阵重写式。
通过添加1,将三维向量变成四维向量,叫做齐次变换。这样旋转和平移在一个矩阵中,变为线性式,T称为变换矩阵。
T结构特殊,左上角为旋转矩阵,右侧为平移向量,左下角为0向量,右下角为1,这种矩阵又称为特殊欧式群:
旋转向量和欧拉角
任意宣战都可以用一个旋转轴和一个旋转角来表示,所以可以寻找一个向量,方向与旋转轴已知,长度等于旋转角,称为旋转向量。
这样表示旋转只需一个三维向量,表示变换旋转加平移,只需六维。
旋转向量到旋转矩阵的过程由罗德里格斯公式表示:
符号^表示向量到反对称的转换符。
同时也可以根据旋转矩阵计算旋转向量,求转角θ:
求转轴n,由于旋转轴上的向量在旋转爱庵后不发生改变。
转轴n是矩阵R特征值1对应的特征向量。
欧拉角提供了一种很直观的方式来描述旋转,使用了三个分离的转角,把一个旋转分解成三次绕不同轴的旋转。
欧拉角也存在着不同的定义方式,比如绕三个轴先后旋转的顺序,以及每次旋转是绕固定轴旋转,还是绕旋转之后的轴旋转的。
欧拉角的一个重大缺点是会碰到万向锁问题。
在俯仰角为90时,第一次旋转和第三次旋转将使用同一个轴,使得失去了一个自由度,这被称为奇异性问题。
产生的万向锁原因主要是由于旋转轴之间存在着层级关系,会导致旋转轴出现旋转面重合。
四元数
由于无法找到不带奇异性的三维向量描述方式。所以引用了一种类似于复数的代数,四元数。四元数是一种扩展复数,它既是紧凑的,也没有奇异性。缺点是不够直观,运算复杂。
一个四元数拥有一个实部和三个虚部。
i,j,k为四元数的三个虚部,满足关系式。
有时人们也用一个标量和一个向量来表示四元数。
s称为四元数的实部,v是它的虚部,如果一个四元数虚部为0,则称之为实四元数,反之,实部为0,则称之为虚四元数。
可以使用单位四元数表示三维空间中任意一个旋转。
假设进行了角度为θ的旋转,那么这个旋转的四元数形式为:
可以从中计算出旋转轴和夹角
任意的旋转都可以由两个互为相反数的四元数表示。
四元数运算表示
加法和减法
乘法
向量形式
由于最后一项外积的存在,四元数乘法通常是不可交换的,除非外积项为零。
共轭
虚部取相反数
四元数共轭乘自身,会得到一个实四元数,实部是模长的平方。
模长
乘积的模也是模的乘积
逆
四元数和自己逆的乘积为实四元数的1
如果是单位四元数,逆和共轭就是一个量
数乘和点乘
点乘指两个四元数每个位置上的数值分别相乘
把一个三维空间点用一个虚四元数来描述
相当于用三个虚部表示空间中的三个轴
然后运用四元数表示这个旋转
所以旋转后的点可以表示为这样的乘积
四元数到矩阵旋转的转换
先将四元数转换为轴角θ和n,然后再根据罗德里格斯公式转换为矩阵。
也存在着简单的方法
设 四元数
对应的旋转矩阵R为:
反之,旋转矩阵对应的四元数为
由于q和-q表示同一个旋转,一个R对应的四元数表示的并不是唯一的。
相似、仿射、射影变换
相似变换
相似变换比欧式变换多了一个自由度,允许物体进行均匀的缩放
旋转部分多了缩放因子s,不再保持原来的长度不变。
仿射变换
与欧式变换不同,仿射变换只要求A是一个可逆矩阵,不必是一个正交阵。仿射变换也叫作正交投影。
射影变换
左上角为可逆矩阵A,右上为平移t,左下是缩放矩阵。
所以3D射影变换有15个自由度
7个相似变换,5个仿射变换,3个射影变换。