本博客总结基本都参考了《SLAM十四讲》
● 我们必须移动相机之后,才能估计它的 运动(Motion)
● 同时估计场景中物体的远近和大小,不妨称之为结构(Structure)
● 近处的物体移动快,远处的物体则运动缓慢。于是,当相机移动时,这些物体在图像上的运动,形成了视差。通过视差,我们就能定量地判断哪些物体离得远,哪些物体离的近。
● 单目SLAM 估计的轨迹和地图,将与真实的轨迹、地图,相差一个因子,也就是所谓的尺度(Scale)
直观地说,如果把相机的运动和场景大小同时放大两倍,单目所看到的像是一样的。同样的,把这个大小乘以任意倍数,我们都将看到一样的景象
相比于单目相机存在尺度不确定性,双目相机由两个单目相机组成,但这两个相机之
间的距离(称为基线(Baseline))是已知的。我们通过这个基线来估计每个像素的空间位置——这和人眼非常相似。我们人类可以通过左右眼图像的差异,判断物体的远近。计算机上的双目相机需要大量的计算才能(不太可靠地)估计每一个像素点的深度,相
比于人类真是非常的笨拙
双目相机测量到的深度范围与基线相关。基线距离越大,能够测量到的就越远。所以无人车上搭载的双目通常会是个很大的家伙。双目相机的距离估计是比较左右眼的图像获得的,并不依赖其他传感设备,所以它既可以应用在室内,亦可应用于室外。双目或多目相机的缺点是配置与标定均较为复杂,其深度量程和精度受双目的基线与分辨率限制,而且视差的计算非常消耗计算资源,需要使用GPU 和FPGA 设备加速后,才能实时输出整张图像的距离信息。因此在现有的条件下,计算量是双目的主要问题之一。
它最大的特点是可以通过红外结构光或Time-of-Flight(ToF)原理,像激光传感器那样,通过主动向物体发射光并接收返回的光,测出物体离相机的距离。这部分并不像双目那样通过软件计算来解决,而是通过物理的测量手段,所以相比于双目可节省大量的计算量。不过,现在多数RGB-D 相机还存在测量范围窄、噪声大、视野小、易受日光干扰、无法测量透射材质等诸多问题,在SLAM 方面,主要用于室内SLAM,室外则较难应用。
这里知识全部参考 《视觉SLAM十四讲》。笔者仅仅做了摘录。
SLAM Simultaneous Localization and Mapping, 中文称作「即时定位与地图创建」

SLAM 流程包含:
视觉SLAM 中主要为相机图像信息的读取和预处理。如果在机前端(Front End)。后端(Back End)。回环,它会把信息提供给后端进行处理。视觉里程计关心相邻图像之间的相机运动,最简单的情况当然是两张图像之间的运动
关系。叫它为“里程计”是因为它和实际的里程计一样,只计算相邻时刻的运动,而和再往前的
过去的信息没有关联。在这一点上,VO 就像一种只有很短时间记忆的物种一样。
现在,假定我们已有了一个视觉里程计,估计了两张图像间的相机运动。那么,只要把相邻时刻的运动“串”起来,就构成了机器人的运动轨迹,从而解决了定位问题。另一方面,我们根据每个时刻的相机位置,计算出各像素对应的空间点的位置,就得到了地图。这么说来,有了VO,是不是就解决了SLAM 问题呢?
我们说,视觉里程计确实是SLAM 的关键问题,我们也会花大量的篇幅来介绍它。然
而,仅通过视觉里程计来估计轨迹,将不可避免地出现累计漂移(Accumulating Drift)。这
是由于视觉里程计(在最简单的情况下)只估计两个图像间运动造成的。我们知道,每次
估计都带有一定的误差,而由于里程计的工作方式,先前时刻的误差将会传递到下一时刻,
导致经过一段时间之后,估计的轨迹将不再准确。
比方说,机器人先向左转90 度,再向右转了90 度。由于误差,我们把第一个90 度估计成了89 度。那我们就会尴尬地发现,向右转之后机器人的估计位置并没有回到原点。更糟糕的是,即使之后的估计再准确,与真实值相比,都会带上这-1 度的误差。
为了解决漂移问题,我们还需要两种技术:后端优化和回环检测。
笼统地说,后端优化主要指处理SLAM 过程中噪声的问题。虽然我们很希望所有的数据都是准确的,然而现实中,再精确的传感器也带有一定的噪声。因此,除了解决“如何从图像估计出相机运动”之外,我们还要关心这个估计带有多大的噪声,这些噪声是如何从上一时刻传递到下一时刻的、而我们又对当前的估计有多大的自信。后端优化要考虑的问题,就是如何从这些带有噪声的数据中,估计整个系统的状态,以及这个状态估计的不确定性有多大——这称为最大后验概率估计(Maximum-a-Posteriori,MAP)。这里的状态既包括机器人自身的轨迹,也包含地图。
还有几个需要注意的点:
主要解决位置估计随时间漂移的问题。假设实际情况下,机器人经过一段时间运动后回到了原点,但是由于漂移,它的位置估计值却没有回到原点。怎么办呢?我们想,如果有某种手段,让机器人知道“回到了原点”这件事,或者把“原点”识别出来,我们再把位置估计值“拉”过去,就可以消除漂移了。这就是所谓的回环检测。
比如,为了实现回环检测,我们需要让机器人具有识别曾到达过的场景的能力。它的实现手段有很多。例如像前面说的那样,我们可以在机器人下方设置一个标志物(如一张二维码图片)。只要它看到了这个标志,就知道自己回到了原点。
.
再比如我们可以判断图像间的相似性,来完成回环检测。这一点和人是相似的。当我们看到两张相似图片时,容易辨认它们来自同一个地方。如果回环检测成功,可以显著地减小累积误差。所以视觉回环检测,实质上是一种计算图像数据相似性的算法。
建图(Mapping)是指构建地图的过程。地图是对环境的描述,但这个描述并不是固
定的,需要视SLAM 的应用而定。

内积非常简单

而外积相对复杂些,外积的方向垂直于这两个向量,大小为
∣
a
∣
∣
b
∣
s
i
n
<
a
,
b
>
|a||b|sin<a, b>
∣a∣∣b∣sin<a,b>

物理意义图参考 这里

与向量间的旋转类似,我们同样可以描述两个坐标系之间的旋转关系,再加上平移,统称为坐标系之间的变换关系。

相机运动是一个刚体运动,它保证了同一个向量在各个坐标系下的长度和夹角都不会发生变化。这种变换称为欧氏变换。
假设某个点
(
a
1
,
a
2
,
a
3
)
(a_1,a_2,a_3)
(a1,a2,a3)在线性空间基
(
e
1
,
e
2
,
e
3
)
(\textbf{e}_1, \textbf{e}_2, \textbf{e}_3)
(e1,e2,e3) 表示的坐标为:

经过了一次旋转变成到了线性空间另一组集
(
e
1
′
,
e
2
′
,
e
3
′
)
(\textbf{e}_1', \textbf{e}_2', \textbf{e}_3')
(e1′,e2′,e3′) 。注意这里当前点没有发生变化,在上一个坐标系是a,在第二个坐标系下是a’。


我们把中间的阵拿出来,定义成一个矩阵 R。这个矩阵由两组基之间的内积组成,刻画了旋转前后同一个向量的坐标变换关系。只要旋转是一样的,那么这个矩阵也是一样的。
可以说,矩阵 R 描述了旋转本身。因此它又称为旋转矩阵。
它有些性质:

如果加上平移t,搭配用一个旋转矩阵R 就可以完整地描述了一个欧氏空间的坐标变换关系。
注意,上式还存在问题。这样的形式在变换多次之后会过于复杂。因此,我们要引入齐次坐标和变换矩阵重写

这是一个数学技巧:我们把一个三维向量的末尾添加1,变成了四维向量,称为齐次坐标。对于这个四维向量,我们可以把旋转和平移写在一个矩阵里面,使得整个关系变成了线性关系。该式中,矩阵T 称为变换矩阵(Transform Matrix)。
举例来说,假设经过了两次变换关系如下式,如果经过多次,式子就会非常复杂。

而引入齐次之后,经过两次变换就可以写成:

也就是说,通过添加最后一维,我们用四个实数描述了一个三维向量,这显然多了一个自由度,但允许我们把变换写成线性的形式。
通过刚才的章节,我们知道了3维空间中变换矩阵的数学表达。



首先,需要知道这里包含了四个坐标系
3d 世界坐标系 (绿色)
3d 相机坐标系 Oc
2d 图像坐标系 o
2d 像素坐标系 uv (距离光心所在的平面焦距 f)
图像出自于 哔哩哔哩
相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程能够用一个几何模型进行描述。
这个模型有很多种,其中最简单的称为针孔模型。针孔模型是很常用,而且有效的模型,它描述了一束光线通过针孔之后,在针孔背面投影成像的关系。在本书中我们用一个简单的针孔相机模型来对这种映射关系进行建模。同时,由于相机镜头上的透镜的存在,会使得光线投影到成像平面的过程中会产生畸变。因此,我们使用针孔和畸变两个模型来描述整个投影过程。
在本节我们先给出相机的针孔模型,再对透镜的畸变模型进行讲解。这两个模型能够把外部的三维点投影到相机内部成像平面, 构成了相机的内参数。

相机内参数是与相机自身特性相关的参数,比如相机的焦距、像素大小等;相机的成像过程实际是将三维空间的点𝑃 = (𝑋,𝑌,𝑍)变换到成像平面的过程。
根据相似三角形原理,我们可以得到 3D 相机坐标系和 2D图像坐标系的映射关系。
相机坐标系 -> 成像坐标系

成像坐标系 -> 像素坐标系
像素坐标系与成像坐标系之间,相差了一个缩放和一个原点的平移。
我个人感觉这里的“缩放”的定义不太直观。讲白了就是一个单位的转换。因为举个例子,成像平面单位 是 米,而像素坐标系单位是 pixel。
在相机坐标下,设P 的坐标为 [ X , Y , Z ] T [X, Y, Z]^T [X,Y,Z]T ,P′ 为 [ X ′ , Y ′ , Z ′ ] T [X', Y', Z']^T [X′,Y′,Z′]T。
我们设像素坐标在成像平面u 轴上缩放了 α \alpha α 倍,在成像平面v轴 上缩放了 β \beta β 倍。同时,原点平移了 [ c x , c y ] T [c_x, c_y]^T [cx,cy]T 。那么,容易得到下图

相机坐标下,P 的坐标为 [ X , Y , Z ] T [X, Y, Z]^T [X,Y,Z]T,我们可以理解为先映射到成像平面坐标,然后映射到像素平面坐标。
并且齐次,最后得到

我们把中间的量组成的矩阵称为相机的内参数矩阵(Camera Intrinsics)K。
K有4个未知数和相机的构造相关,𝑓𝑥,𝑓𝑦和相机的焦距,像素和真实世界的转化比例(比如一米多少个像素)有关;𝑐𝑥,𝑐𝑦是平移的距离,和相机成像平面的大小有关。确定内参的过程就是标定。
除了内参之外,自然还有相对的外参。由于相机在运动,所以P 的相机坐标应该是它的世界坐标 Pw,根据相机的当前位姿,变换到相机坐标系下的结果。
相机的位姿由它的旋转矩阵
R
R
R 和平移向量
t
t
t 来描述。那么有:

复习一下,旋转矩阵R由两组基之间矩阵相乘得到,刻画了旋转前后同一个向量的坐标变换关系。
我们可以理解为 它的世界坐标 P w P_w Pw,
相机的位姿
R
R
R ,
t
t
t 又称为相机的外参数(Camera Extrinsics)。相比于不变的内参,外参会随着相机运动发生改变,同时也是SLAM
中待估计的目标,代表着机器人的轨迹。
相机内参数是与相机自身特性相关的参数,比如相机的焦距、像素大小等;
相机外参数是在世界坐标系中的参数,比如相机的位置、旋转方向等