回环线程
闭环检测原理: 若连续4个关键帧都能在数据库中找到对应的闭环匹配关键帧组,且这些闭环匹配关键帧组间是连续的,则认为实现闭环。
具体来说,回环检测过程如下:
1. 找到当前关键帧的闭环候选关键帧 vpCandidateKFs : 闭环候选关键帧取自于与当前关键帧具有相同的BOW向量但不存在直接连接的关键帧.
2. 将闭环候选关键帧和其共视关键帧组合成为关键帧组 vCurrentConsistentGroups
3. 在当前关键组和之前的连续关键组间寻找连续关系.
若当前关键帧组在之前的连续关键帧组中找到连续关系,则当前的连续关键帧组的连续长度加 1 .
若当前关键帧组在之前的连续关键帧组中没能找到连续关系,则当前关键帧组的连续长度为 0
关键帧组的连续关系是指两个关键帧组间是否有关键帧同时存在于两关键帧组中.
回环矫正:
1. Sim3位姿传播: 将Sim3位姿传播到局部关键帧组上;将Sim3位姿传播到局部地图点上.
2. 地图点融合: 将闭环关键帧组地图点投影到当前关键帧上;将闭环关键帧组地图点投影到局部关键帧组上.
ORB SLAM中采用的是词袋模型进行闭环检测筛选出候选帧,再通过求解Sim3判断最合适的关键帧
3. BA优化
本质图BA优化: 优化所有地图点和关键帧位姿,基于本质图.
全局BA优化: 优化所有地图点和关键帧位姿,基于地图点到关键帧的投影关系.
共视图:共视图是无向加权图,每个节点是关键帧,如果两个关键帧之间满足一定的共视关系(至少15个共同观测地图点)他们就连成一条边,边的权重就是共视地图点数目。
本质图:本质图比共视图更稀疏,这是因为本质图的作用是用在闭环矫正时,用相似变换来矫正尺度漂移,把闭环误差均摊在本质图中。本质图中节点也是所有关键帧,但是连接边更少,只保留了联系紧密的边来使得结果更精确。
2.本质矩阵、基础矩阵、单应性矩阵
本质矩阵:5个自由度,最少可以用5对点求解,也可以使用八点法估计本质矩阵(需要SVD分解)
基础矩阵:7个自由度,八对点求矩阵矩阵。
单应性矩阵(描述了两个平面的映射关系):8个自由度,已知两个平面的图像坐标p1和p2,则p2 = H p1
一对点提供两个约束方程,需要四对点就单应性矩阵。
从原理上来说,计算 F 矩阵最少只需要 7 对匹配点,计算 H 矩阵最少只需要 4 对匹配 点;ORB-SLAM2中为了编程方便,每次迭代使用 8 对匹配点计算 F 和 H
注意:只有旋转没有平移的时候可以用单应性矩阵求R
3.RANSAC
RANSAC算法是随机采样一致算法,从一组含有“外点”的数据中正确估计数学模型参数的迭代算法。“外点”一般指的是数据中的噪声,比如匹配中的误匹配和估计曲线中的离群点。因此,RANSAC算法是一种“外点”检测算法,也是一种不确定的算法,只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大。RANSAC主要解决样本中的外点问题,最多可以处理50%的外点情况。
RANSAC主要通过反复选择数据中的一组随机子集来达成目标,被选取的子集假设为局内点,验证步骤如下:
(1)一个模型适用于假设的局内点,也就是说所有的未知参数都能从假设的局内点计算得到。
(2)使用(1)中得到的模型测试所有其他数据,如果某个点适用于估计的模型,认为它也是局内点。
(3)如果有足够多的点被归类为假设的局内点,则估计的模型就足够合理。
(4)使用假设的局内点重新估计模型,因为它仅仅被初始的假设局内点估计。
(5)最终,通过估计局内点和模型的错误率估计模型。
RANSAC算法的核心是减少每次迭代所需的采样点数.
4.路径规划
路径规划分为依据已获取的全局环境信息,给机器人规划出一条从起点至终点的运动路径的全局路径规划方法(GlobalPath Planning)和侧重考虑机器人探知的当前局部环境信息,这使机器人具有较好的避碰能力的局部路径规划方法(LocalPath Planning)。
全局路径规划
全局路径规划规划方法的精确程度取决于获取环境信息的准确程度。通常可以寻找最优解,但需要预先知道准确的全局环境信息。
局部路径规划方法
局部规划仅依靠传感系统实时感知的信息,与全局规划方法相比,局部规划更具实时性和实用性;对动态环境具有较强适应能力;但是由于仅依靠局部信息,有时会产生局部极值点或振荡,无法保证机器人能顺利地到达目标点。
A* D*是基于搜索的路径规划方法,A* 只能用于静态环境下的路径优化,D* 主要应用于动态环境下的路径优化,也能兼容静态环境。
DWA算法其原理主要是在速度空间(v,w)中采样多组速度,并模拟出这些速度在一定时间内的运动轨迹,并通过评价函数对这些轨迹进行评价,选取最优轨迹对应的(v,w)驱动机器人运动。每次都选择下一步的最佳路径,而非全局最优路径。
5.对极几何、PnP、ICP
对极几何:空间三维点P投影到两帧图像得到两个像素坐标(已经匹配好的特征点),求R和t
这里通过本质矩阵、基础矩阵和单应性矩阵求位姿
ORB-SLAM2代码中需要同时求基础矩阵和单应性矩阵,因为当特征点共面或相机发生纯旋转的时候,基础矩阵的自由度会下降,出现退化现象。为了避免这种情况同时求基础矩阵和单应性矩阵,选择重投影误差小的作为运动估计矩阵。
PnP:已知空间的某个三维点P 和其投影到某帧图像的特征点p1,求R和t
①线性法: 把空间点看作另一个相机坐标系的点,与单应性矩阵类似,
T有十二维,至少需要6对点求解
②非线性法(BA)
最小化重投影误差求解:误差项 = 观测值 - 预测值
这个等式存在一个误差,对误差求和,构建最小二乘问题,寻找最优的T 使得误差最小,
需要了解误差对位姿的雅可比矩阵和误差对空间点P的雅可比矩阵
ICP:已知一对匹配好的三维点,求位姿使得
①线性法:SVD分解 ,197页
②非线性法:同样使用最小化重投影误差的方法计算 199页。
注意:这里的ICP指的是图像特征给定了的匹配进行位姿估计。
在 RGB-D SLAM中,深度已知特征点,使用3D-3D方法;深度未知,使用3D-2D方法
6.Linux 常用命令
cd、mkdir、pwd、ls、rm、mv(移动或者修改文件)、cp(将源文件复制至目标文件)、chmod (改变权限)、ln(为文件在另外一个位置建立一个同步的链接)、ps(用来查看当前运行的进程状态)、kill(杀死指定进程)、free(显示系统内存使用情况)
7.简述ORB-SLAM2流程
跟踪线程:提取ORB -> 地图初始化(连续两帧间成功三角化超过 100 个点,则初始化成功;双目/RGBD相机的要求就宽松多了,只要左目图像能找到多于 500 个特征点,就算是初始化成功.) -> 相机位姿跟踪(参考关键帧跟踪、恒速运动模型、重定位三种方法估计位姿)-> 局部地图跟踪(成功估计当前帧的初始位姿后,基于当前位姿更新局部地图并优化当前帧位姿)->关键帧选择(时间、空间、共视特征点数目)
局部地图线程:插入关键帧 -> 剔除地图点(判断依据如图1) -> 生成新地图点(如图2)
-> 融合当前关键帧和其共视帧的地图点(图3) -> 局部BA(优化当前帧的局部地图.)-> 剔除冗余关键帧 (冗余关键帧标准: 90%以上的地图点能被超过3个其他关键帧观测到.)
图1
图3
回环线程:回环检测(回环检测原理: 若连续4个关键帧都能在数据库中找到对应的回环匹配关键帧组,且这些回环匹配关键帧组间是连续的,则认为实现回环) -> 计算sim3变换 ->回环矫正(地图点融合和本质图优化)-> 全局BA优化 (优化所有地图点和关键帧位姿,基于地图点到关键帧的投影关系)
8.松耦合和紧耦合
紧耦合就是把数据放到一起联合优化,紧耦合可以是滤波方式也可以借助ceres,g2o
松耦合就是分别对参数做出估计,再把多个参数进行融合松耦合一般基于卡尔曼滤波
VIO:紧耦合是把图像的特征加到特征向量中去,这样做优点是可以免去中间状态的累计误差,提高精度,缺点是系统状态向量的维数会非常高,需要很高的计算量;
松耦合是把VO处理后获得的变换矩阵和IMU进行融合,这样做优点是计算量小但是会带来累计误差。
9.李群和李代数
给定某时刻一个旋转矩阵,则可以求出对象的旋转向量(对数映射),这个向量是对应到旋转矩阵的李代数
10.为什么SLAM中常用L-M?
G-N中的H矩阵可能为奇异矩阵或者病态矩阵,导致算法不收敛。而且当步长较大时,也无法保证收敛性,所以采用L-M求解增量方程,但是它的收敛速度可能较慢。
11.四元数
四元数具有一个实部和三个虚部,四元数可以表示三维空间中任意一个旋转