视觉惯性slam学习记录目录:
本专栏主要用于记录本人自身学习《视觉惯性slam:理论与源码解析》记录。该专栏其他文章链接如下:
视觉惯性slam:ch1-3之slam概览和编译工具以及slam中的数学知识学习记录
目录
一、相机成像原理
1.针孔相机成像
介绍了针孔相机的成像原理,该原理在slam14讲里讲的很详细了,这里还介绍了针孔孔径大小对成像的影响:孔径越小成像越清晰,但亮度降低,实际相机应用中使用透镜对亮度进行了提升,解决了成像清晰和亮度高之间的矛盾。
2.常见坐标系
随后介绍了四种常见的坐标系,分别是:世界坐标系、相机坐标系、图像坐标系和像素坐标系。
2.1 世界坐标系
描述物体在真实世界的位置。用户自己定义三维世界的坐标系,以某点为原点,单位为m。
2.2 相机坐标系
从相机的角度描述物体的位置。以相机为原点建立坐标系,单位为m,作为沟通世界坐标系和图像坐标系的中间一环。
2.3 图像坐标系
为了描述成像过程中,物体从相机坐标系到图像坐标系的透视投影关系,单位为m。该坐标系可以进一步得到像素坐标系。
2.4 像素坐标系
为了描述物体成像后的像点在数字图像上的坐标被引入,单位为像素。是真正从相机内读取到的图像信息所在的坐标系。
2.5 坐标相互之间的转换关系
其中,世界坐标系和相机坐标系是三维的坐标系,而图像坐标系和像素坐标系是而为坐标系。 他们之间的关系如下:(1)相机坐标系的z轴与光轴重合,且垂直于图像坐标系平面并通过图像坐标系原点;(2)像素坐标系和图像坐标系平面重合,两者的区别在于图像坐标系的原点位于图像正中心而像素坐标系的原点位于图中左上角,而且图像坐标系的单位是m,像素坐标系的单位是像素;(3)世界坐标系到相机坐标系的转换:通过旋转矩阵R和平移向量t组成的变换矩阵转换,与相机的内参有关;(4)相机坐标系到图像坐标系的转换是通过针孔相机模型进行投影;(5)图像坐标系到像素坐标系的转换除了是一个平移的过程之外,还得注意两个坐标系单位不一样,所以还要乘以一个系数。
像素坐标系原点定在左上角是因为图像数据都是从左上角开始存储的,这样方便读写数据。在实际应用中,通常把图像坐标系和像素坐标系统称为图像坐标系。
一个三维点投影到图像上的二维坐标是一个从三维到二维的降维过程,是不可逆的。
3.相机畸变模型
针孔相机模型是理想情况下的情形,但在实际的相机里,由于加上透镜,会对成像过程产生一定的影响,产生畸变,分为径向畸变和切向畸变。
3.1 径向畸变
径向畸变也可以分为两种:桶形畸变和枕形畸变。桶形畸变呈现中间凸起的趋势,凸起程度随着与图像几何中心距离的增加而减小,枕形畸变相反,呈中间凹下的趋势。常见的畸变主要是桶形畸变。
3.2 切向畸变
切向畸变是由透镜和成像传感器的安装位置误差引起的,若透镜和成像平面不严格平行,引起图像的畸变称为切向畸变。随着技术的发展,该影响已经比较小了。
3.3 去畸变
畸变参数可以通过相机标定计算得到;假设已经得到了无畸变图像,遍历每个像素点的位置,代入畸变模型,计算无畸变图像中该点对应的畸变图像中的位置,同一点灰度值相等,可以使用距离它最近的4个像素点的灰度插值得到(该过程为图像去畸变时的逆向遍历);如果找不到对应关系,只需要统一填充成某一个灰度值即可。
二、对极几何
对极几何表示一个运动的相机在两个不同位置的成像。随后根据图像分别解释了极点、极线和极平面的概念和表示。
介绍了对极约束的概念,通过叉积以及点积的性质推导本质矩阵以及基础矩阵,本质矩阵是由旋转矩阵R和平移向量t得到,基础矩阵是在本质矩阵的基础上加入相机内参计算求得。
三、图优化库的使用
光束平差法BA是SLAM中常用的非线性优化方法。图优化过程中,一个图由若干个顶点以及这些顶点连接的边构成,顶点通常是待优化的变量例如位姿,空间中的地图点(路标点),边一般是顶点之间约束产生的误差,比如说重投影误差,实线表示相机运动模型,虚线表示观测模型。实现图优化的目的就是通过调整顶点来使得边总体误差最小,这个时候我们认为顶点是最准确的。
在SLAM领域,常用的图优化库有g2o和ceres。
1.g2o的编程步骤
第一步,创建一个线性求解器,使用不同的线性求解法,如sparse cholesky,CSparse,dense cholesky等;第二步创建块求解器,分为固定变量的求解器以及可变尺寸的求解器,并用上面的线性求解器初始化;第三步,创建总求解器,从GN,LM,Dogleg中选择一个再用块求解器初始化,这几个算法继承同一个类OptimizationWithHessian,OptimizationWithHessian又继承于OptimizaitonAlgorithm,其中用的比较多的是LM法;第四步,创建稀疏优化器,并用已定义的求解器作为求解方法;第五步,定义图的顶点和边,并添加到优化器中;第六步,设置优化参数,开始执行优化。
2.构建g2o顶点
顶点的基本类型是BaseVertex,在不同的应用场景(二维场景和三维场景),有不同的优化变量(位姿、地图点),还涉及不同的优化(李代数位姿、李群位姿)。好消息是g2o内部定义了一些常用的顶点类型:2D位姿顶点、六维向量、二维点、三维点、SE(3)顶点、SBACam顶点、Sim(3)顶点等。
2.1 自定义顶点步骤
但若需要的顶点类型不在其中则需要自定义顶点,步骤如下:(1)设定被优化顶点的初始值为0;(2)写顶点更新函数,根据更新的需要用乘法或是加法或是其他运算;(3)存盘和读盘:留空。
2.2 向图中添加点的步骤
(1)新建顶点;(2)设定估计值;(3)设置顶点编号ID;(4)将顶点添加到优化器中。
3.构建g2o边
边的构建比顶点的构建更复杂。
3.1 边的类型
边可以分为三种类型,分别是一元边、二元边和多元边。一元边可以理解为一条边只连接一个顶点,二元边可以理解为一条边连接两个顶点,多元边可以理解为一条边能够连接多个(3个及以上)顶点。主要有以下参数:测量值的维度、测量值的数据类型和不同顶点的类型。
3.2 自定义边步骤
(1)定义读/写函数;(2)定义重写误差函数,测量值-估计值;(3)计算增量函数:误差对于优化变量的偏导数。
3.3 向图中添加边的步骤
3.3.1 添加一元边示例:曲线拟合
(1)设置边的ID;(2)设置连接的顶点v,其编号为0;(3)设置观测的数值;(4)设置信息矩阵;(5)将边添加到优化器。
3.3.2 添加二元边示例:PnP投影
(1)设置边的ID;(2)设置边连接的第一个顶点:三维地图点;(3)设置边连接的第二个顶点:位姿;(4)设置观测:图像上的二维特征点坐标;(5)设置信息矩阵;(6)将边添加到优化器;(7)添加边的ID。
总结
本文记录了第四到六章的学习主要内容,相机成像原理和对极几何在14讲中有详细的介绍,该书对其进行了一些补充说明,图优化库主要从源码的角度介绍了其原理和应用方式。