(1)VINS-Mono的前段是采用的提取关键点然后采用光流法追踪,因此对于弱纹理,关键点少的环境鲁棒性和精度差;
(2)同样还是因为前段的问题,因为没有提取特征描述子,而是使用光流法进行的追踪匹配,一旦画面模糊或者图像丢失,相机就会丢,而且没有重定位模块;
(3)在恒速运动下,会使得IMU有一个自由度不客观,因此会发生漂移。
Local Map优化的是当前帧和其由共视关系的关键帧的位姿, 以及当前帧和共视帧看到的地图点,没有涉及到边缘化保留先验信息的操作,而VINS-mono的滑窗相对较为复杂,需要考虑通过边缘化进行先验信息的保留等操作。
liftProjective() 代替 OpenCV中undistortPoints()
原理:图像中,靠外侧的像素点的畸变程度大于靠内侧的像素点
方法:假设,想求得畸变坐标A‘的去畸变坐标A。先视A‘点为畸变点B的去畸变坐标,那么△A’B<△A’A,点B可以通过将A‘的坐标代入畸变模型中求得。再在线段AA’上取点B’,使得A’B=A’B’。这样反复迭代逼近8次,最终得到点A在相机归一化坐标系下的坐标
像素坐标->特征点提取算法
去畸变后归一化坐标->特征点去畸变算法
特征点id ->光流追踪算法
特征点速度
30hz输入图像
如果图像太暗或者太亮,提特征点比较难,要均衡化预处理
光流追踪cv::calcOpticalFlowPyrLK(),追踪时候会剔除外点
判断追踪到的特征点是否在图像有效范围内
双指针遍历所有特征点(包含内外点),只保留内点(被成功追踪到的特征点),从而降低空间复杂度
对需要发送到后端的10hz图像帧:1.对极约束F去除外点 2.特征点分布均匀化 3.提取新的特征点保证特征点数目衡为150个
所有特征点去畸变,计算每个特征点速度(用来后续时间戳标定)
因为比较耗时,不适合每帧都做,所以在给后端发送前进行本操作。调用cv::findFundamentalMat()找出外点,再用双指针遍历剔除外点实现瘦身
u = fx * x + width/2:假定了一个虚拟相机,固定fx=460、size。好处是在计算本质矩阵时,参数F_THRESHOLD和实际相机无关(因为可容忍的像素误差个数和相机的焦距有关了),不用因为相机的不同设置不同的参数阈值了;而且之前函数去畸变得到的是归一化相机坐标系下的坐标,所以坐标就和相机模型无关了(当然如果设置为真实值的话性能更好)
setMask(),比orb-slam里四叉树简单
对图像中所有被追踪到的特征点排序(权重为特征点已经被追踪到的次数:越多越稳定)
按照权重由小到大遍历所有特征点,视当前特征点为有效点,但是再这个特征点的圆形区域内的所有比其权重小的点都视为冗余点(使用值都为255的mask)
滤波里不需要预积分:只要维持当前的位姿估计,之前的那些位姿估计和他没有关系
松耦合
因为重力是初始化过程中待求的量,而加速度计偏置与重力耦合,而且系统的加速度相对于重力加速度很小,所以加速度计偏置在初始化过程中很难观测,因此初始化过程中先不考虑加速度计偏置的校正
y = Ax
Σy = AΣxA⊤
要推导预积分量的协方差,我们需要知道 imu 噪声和预积分量之间的线性递推关系,这样才能将方差一直传递下去
然而像四元素是非线性的,所以考虑 一阶泰勒展开线性化、或 基于误差随时间变化的递推方程,
(因为变化非常小,所以可以用一阶泰勒近似)
因为零偏也是待优化变量,每次优化都会变化,而预积分公式中包含bias,则每次bias变化后都需要对预积分重新计算,计算量非常大,所以考虑用一阶泰勒近似:=原先的预积分结果+J*△X
方差标定
Allen方差https://blog.csdn.net/weixin_38258767/article/details/111514038
预积分
预积分方差传递
IMU在每个时刻的高斯白噪声是不一样的,没法通过标定得到,所以要求积分形成的预计分量的方差就要借助线性传递的方式,在此就需要知道imu噪声和预计分量之间的线性递推关系,然而,像四元素这样的状态量的递推关系是非线性的,所以需要将其线性化(建立一种基于误差随时间变化的递推方程),对当前时刻的位移、速度、bias(acc、gray)微分得到线性传递方程
##
基于误差卡尔曼滤波得置信度
卡尔曼滤波后得到的最优值
误差卡尔曼滤波:送入的是误差
为何使用:9min??
旋转的误差状态通常是很小的值,所以参数的数目是和旋转的自由度想等,因为误差卡尔曼中,我们通常使用旋转向量表示旋转误差,因为四元素是过参数的表示形式:四个量来表示三个自由度的旋转(因为模为1),
纯视觉的SFM三维重建 + 视觉惯性对齐,将SFM和预积分的结果对齐,实现视觉惯性联合初始化
关键帧:如果两个图像中的像素误差超过阈值,则加入关键帧
计算:
信息矩阵 = 协方差矩阵的逆
直接求逆会很麻烦且计算量大,可以借助概率方式简化求解,即通过计算联合高斯分布就可以得到:
非对角元素:=0:两个元素相互独立,但是两个元素不相关则不一定为0 <0:正相关 >0:负相关
去除某个变量
为何要滑动窗口:
随着系统中增加新的相机姿态、看到新的环境特征,最小二乘残差会越来越多导致信息矩阵越来越大,计算量会不断增加。因此为了保持优化变量的个数在一定范围内,使用滑动窗口算法动态增加或移除优化变量。
流程:
循环做如下两步:增加新的变量进入最小二乘系统优化,如果变量数目达到了一定的维度,则移除老的变量
如何移除老的变量
利用边际概率移除老的变量 ,因为直接丢弃变量和对应的测量值,会损失信息,而且也会导致信息矩阵变得稠密了(因为 原本独立的变量之间变得相关了)。所以使用边际概率,将丢弃的变量所携带的信息传递给剩余的变量,让本来间接相关的变量之间此时直接相关
问题
存在的问题:
H矩阵的稀疏性是由雅克比矩阵引起的。因为对于代价函数中的其中一个errij,只描述了Ti观测到pj,和其他位姿和路标点无关,所以这条观测边只和这两个顶点有关,其他的部分的变量的导数都是0。
而H是由J构造的。H矩阵中,非对角线上的矩阵块不为0,则表示其对应的两个变量之间存在约束关系。
可用来对矩阵进行三角化,以简化协方差矩阵求逆:对多元高斯分布p(a,b)分解得到边际概率P(a)和条件概率p(b|a),从而求得 边际概率和条件概率 的信息矩阵
为什么要讨论 P(a), P(b|a) 的信息矩阵
因为基于优化的 SLAM 问题中,直接操作的是信息矩阵,而不是协方差矩阵。所以,可借助边际概率、条件概率的信息矩阵从总体信息矩阵中简单方便的marg掉某一变量的影响
物理意义:
(就是 将联合概率分布分解为边缘概率分布和条件概率分布的过程、利用shur补减少优化参数)
如果当前帧图像和上一帧添加到滑窗的图像帧视差很小,则测量的协方差(重投影误差)会很大,进而会恶化优化结果
标志位:
2:没有任何先验,设定初始值为单位阵,在初始化中完成旋转外参标定
1:已经有比较好的旋转外参的值,初始化则不用标定,直接送给后端滑窗优化器,因为在真值附近,所以容易优化到真值
0:数据集中,提供精确地外参数,直接认为一个固定值
提特征点的精度,体现于重投影误差的置信度,通过虚拟相机统一设置为1.5pixel的误差的,认为提取点的精度在1.5pixel误差范围内
预积分的置信度是通过状态的递归得到来计算出协方差矩阵
在11帧的滑窗中,选一个枢纽帧,要与最后一帧足够远(才能得到足够远的平移),但是不能太远(特征关联的点就会太少,保证结果可信且能三角化出更多的点)。
对极几何求得枢纽帧(设定为单位阵)与最后一帧间的位姿,得到三角化出特诊点的位置,PNP求解得到枢纽帧与最后一帧中所有帧的位姿(因为光流追踪,所以枢纽帧与最后一帧三角化得的地图点也可以被这些帧看到)。得到其他帧位姿后,又可以优化出更多的点(因为每一帧都会提取新特征点)。再求枢纽帧前面帧的位姿(与上面同样方法)。通过ceres优化器做一个小规模的重投影误差的global BA
IMU还没来:最后一个IMU时间要大于feature最早的时间
IMU最早的时间要大于等于第一个图像的时间,对于这个图像帧,是没有办法找到这个IMU数据
视觉SLAM总结——ORB SLAM2中关键知识点总结
视觉SLAM总结——SVO中关键知识点总结
视觉SLAM总结——LSD SLAM中关键知识点总结