@Xiaobuyi
2018-03-22T15:09:43.000000Z
字数 26139
阅读 29872
SLAM
[1] VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator, Tong Qin, Peiliang Li, Zhenfei Yang, Shaojie Shen (techincal report)
[2] Solà J. Quaternion kinematics for the error-state KF[M]// Surface and Interface Analysis. 2015.
[3] Solà J. Yang Z, Shen S. Monocular Visual–Inertial State Estimation With Online Initialization and Camera–IMU Extrinsic Calibration[J]. IEEE Transactions on Automation Science & Engineering, 2017, 14(1):39-51.
[4] Engel J, Schöps T, Cremers D. LSD-SLAM: Large-scale direct monocular SLAM[C]//European Conference on Computer Vision. Springer, Cham, 2014:834-849.
[5] Shen S, Michael N, Kumar V. Tightly-coupled monocular visual-inertial fusion for autonomous flight of rotorcraft MAVs[C]// IEEE International Conference on Robotics and Automation. IEEE, 2015:5303-5310.
[6] Shen S, Mulgaonkar Y, Michael N, et al. Initialization-Free Monocular Visual-Inertial State Estimation with Application to Autonomous MAVs[M]// Experimental Robotics. Springer International Publishing, 2016.
[7] Sibley G. A Sliding Window Filter for SLAM[J]. University of Southern California, 2006.
[8] CamOdoCal: https://github.com/hengli/camodocal
[9] Tightly-coupled Visual-Inertial Sensor Fusion based on IMU Pre-Integration
视觉与IMU融合的分类:
滤波法和优化法:
参考
Vins-Mono是视觉与IMU的融合中的经典之作,其定位精度可以媲美OKVIS,而且具有比OKVIS更加完善和鲁棒的初始化以及闭环检测过程。同时VINS-Mono也为该邻域树立了一个信标吧,视觉SLAM的研究和应用会更新偏向于 单目+IMU。因为在机器人的导航中,尤其是无人机的自主导航中,单目不具有RGBD相机(易受光照影响、获取的深度信息有限)以及双目相机(占用较大的空间。。。)的限制,能够适应室内、室外及不同光照的环境,具有较好的适应性。而且在增强和虚拟现实中,更多的移动设备仅具有单个相机,所以单目+IMU也更符合实际情况。
那么为什么要进行视觉与IMU的融合呢,自己总结的主要有以下几点:
视觉与IMU的融合可以借助IMU较高的采样频率,进而提高系统的输出频率。
上面总结了视觉与IMU融合的几个优点,以及与单目融合可以解决单目相机尺度不可测的问题。但是单目相机的尺度不可测也是具有优点的,参考[4]。单目尺度不确定的优点主要有两方面:单目尺度的不确定性,可以对不同的规模大小的环境空间之间进行游走切换,起到无缝连接的作用,比如从室内桌面上的环境和大规模的户外场景;诸如深度或立体视觉相机,这些具备深度信息的传感器,它们所提供的可靠深度信息范围,是有限制的,故而不像单目相机那样具有尺度灵活性的特点。
关于这部分的论文和代码中的推导,可以参考文献[2]中Appendx部分“A Runge-Kutta numerical integration methods”中的欧拉法和中值法。
论文中Ⅱ.B部分的误差状态方程是连续时间域内,在实际代码中需要的是离散时间下的方程式,而且在前面的预积分方程中使用了中值法积分方式。所以在实际代码中和论文是不一致的。在推导误差状态方程式的最重要的部分是对 部分的推导。
由泰勒公式可得:
在提取的图像的Features和做完IMU的预积分之后,进入了系统的初始化环节,那么系统为什么要进行初始化呢,主要的目的有以下两个:
所以我们要从初始化中恢复出尺度、重力、速度以及IMU的bias,因为视觉(SFM)在初始化的过程中有着较好的表现,所以在初始化的过程中主要以SFM为主,然后将IMU的预积分结果与其对齐,即可得到较好的初始化结果。
系统的初始化主要包括三个环节:求取相机与IMU之间的相对旋转、相机初始化(局部滑窗内的SFM,包括没有尺度的BA)、IMU与视觉的对齐(IMU预积分中的 等和相机的translation)。
这个地方相当于求取相机与IMU的一部分外参。相机与IMU之间的旋转标定非常重要,偏差1-2°系统的精度就会变的极低。这部分的内容参考文献[3]中Ⅴ-A部分,这里做简单的总结。
设相机利用对极关系得到的旋转矩阵为 ,IMU经过预积分得到的旋转矩阵为,相机与IMU之间的相对旋转为 ,则对于任一帧满足,
这一阶段的思路就是单目相机的初始化过程,先求取本质矩阵求解位姿,进而三角化特征点,然后PnP求解位姿,不断重复的过程,直到恢复出滑窗内的Features和相机位姿,代码比较清晰。要注意的就是坐标系的和位姿的变换,容易混乱。如以下几个函数:
triangulateTwoFrames
:输入是相机外参(世界到相机),求解出的3D点是在世界坐标系下。
cv::solvePnP
:该API输入是世界坐标系的点,求解出的是世界坐标系到相机坐标系的变换,所以一般需要将结果转置。
视觉与IMU的对齐主要解决三个问题:
(1) 修正陀螺仪的bias;
(2) 初始化速度、重力向量 和尺度因子(Metric scale);
(3) 改进重力向量 的量值;
发现校正部分使用的都是一系列的约束条件,思路很重要啊。陀螺仪Bias校正的时候也是使用了一个简单的约束条件:
在这个步骤中,要估计系统的速度、重力向量以及尺度因子。所以系统的状态量可以写为,
这部分和上一小节的内容差不多,就是迭代不断更新重力向量的过程,要注意重力向量被表达为:
后端优化是VINS-Mono中除了初始化之外,创新性最高的一块,也是真真的 紧耦合 部分,而初始化的过程事实上是一个 松耦合。因为初始化过程中的状态量并没有放在最底层融合,而是各自做了位姿的计算,但是在后端优化的过程中,所有优化量都是在一起的。
状态量
这部分内容主要对应在后端的优化过程中IMU测量部分的残差以及在优化过程中的雅克比矩阵的求解。
首先推导IMU测量的残差部分,由文献[1]中body系下的预积分方程式(4),可以得到IMU的测量模型式(13)
[2]
中III.B式(14)部分。[5]
中IV.A部分,以及十四讲中10.2.2小节的目标函数可知,这个地方的雅克比矩阵是针对变化量 的。所以,在后面求取四部分雅可比的时候,也不是对状态量求偏导,而是对误差状态量求偏导。 [1]
中4.3.4“旋转向量的雅克比矩阵”推导得到,第3项是可以参考文献[1]
中公式(22)和文献[9]
中3.2部分。 相机测量误差万变不离其宗,还是要会到像素坐标差或者灰度差(光度误差)。Vins-Mono中的相机测量误差本质还是特征点的重投影误差,将特征点 从相机的 系转到相机的 系,即把相机的测量残差定义为,
projection_factor.cpp
中的ProjectionFactor::check
还没有理解这部分内容默认已经检测到闭环,只涉及到后续的优化部分。
边缘化(marginalization)的过程就是将滑窗内的某些较旧或者不满足要求的视觉帧剔除的过程,所以边缘化也被描述为将联合概率分布分解为边缘概率分布和条件概率分布的过程(说白了,就是利用shur补减少优化参数的过程)。利用Sliding Window做优化的过程中,边缘化的目的主要有两个:
如果当前帧图像和上一帧添加到滑窗的图像帧视差很小,则测量的协方差(重投影误差)会很大,进而会恶化优化结果。LIFO导致了协方差的增大,而恶化优化结果?
直接进行边缘化而不加入先验条件的后果:
无故地移除这些pose和feature会丢弃帧间约束,会降低了优化器的精度,所以在移除pose和feature的时候需要将相关联的约束转变为一个先验的约束条件作为prior放到优化问题中
这两种边缘化的措施主要还是针对悬停和恒速运动等退化运动。下面就边缘化的过程做简要的总结。
设共有 个状态量,其中状态量中的加速度计是经过充分激励的,那么状态量只有满足下面两个条件之一的时候才能被加入到滑窗内。
(1) 两帧图像之间的时间差 超过阈值。
(2) 排除旋转运动,两帧之间共同Features的视差超过阈值。
其中,条件(1)避免了两帧图像之间的IMU长时间积分,而出现漂移。条件(2)保证了系统的运动时,有足够视差的共视帧能够被加入到滑窗。
因为滑窗的大小是固定的,要加入新的Keyframe,就要从滑窗中剔除旧的Keyframe。在VINS-Mono中剔除旧帧有两种方式,剔除滑窗的首帧或者倒数第二帧(假设滑窗默认是由右向左滑的!)。所以关于剔除旧帧也有一定的剔除规则或者说是边缘化规则。
设定一个变量, 是由滑窗内的最新的两个Keyframe视差决定的,如果视差大于阈值,则边缘化最旧帧,如果视差小于,则边缘化倒数第二帧。具体可以参考文献[6]中Algorithm1。 要注意边缘化的时候,不仅要移除相机位姿,被该相机首次观测到的Features也要移除。最终构建出的先验约束可以写为,
这一小节主要总结下面两个问题:舒尔补边缘化优化状态量和式(4.2)的非线性优化过程中的优化一致性(FEJ)。
设状态量和分别是需要被边缘化和保留的状态量,根据式(4.4)的线性方程及H矩阵的稀疏性和特性,将式(4.4)进一步写作:
在进行舒尔补过程中,已经将 给边缘掉,得到了关于 新的带有先验信息的关系式。然后将这部分带入到代价函数的边缘化残差中即可。也可以说,由边缘化得到了条件概率 。正如文献[7]中作者说的,"SLAM is tracking a noraml distribution through a large state space"
FEJ算法貌似是在边缘化过程中比较重要的内容。付兴银师兄在讲解OKVIS的博客中提到,在Pose和Landmark分开边缘化的时候,要使用FEJ算法,为了只计算一次雅克比矩阵(还没弄懂)。博哥在毕设论文中提到,在IMU和视觉测量残差分开边缘化的时候,要保证优化一致性,确保各部分在线性化的时候具有相同的线性化点。
个人理解,这个地方应该有两层意思。回想高斯迭代过程中,我们在求取雅克比矩阵的时候是针对 求取的,在后面的迭代更新过程中,雅克比矩阵是不变的(或者说是求取雅克比矩阵的点是不变的,仍然在 处。只能说是还是在附近计算雅克比,而不是更新之后的,),也就是称作"fix the inearization point"。,这样的话雅克比矩阵就是不变的了。但是仅能说,在marg掉某些点之后,和这些点相关联的点的雅克比矩阵是不变的。
按理说是不应该把滑窗当做一小节来讲的,边缘化、舒尔补都属于滑窗的范围,但前面已经总结了。而且正如贺一加师兄在其博客中提到的,滑窗的三大法宝"Marginalization","Schur complement","First estimate jacobin",这些在前面也提到了,所以这一小节基本没什么可以总结的地方。关于这部分内容,可以参考这几篇博客,讲的真是太好了。okvis1,okvis2,知行合一1,知行合一2
要注意的是在vins-mono中,添加关键帧的时候是在添加完新的图像帧,做完滑窗优化之后,将滑窗内的倒数第二帧作为关键帧,并加入到了关键帧序列当中,具体位置。
Vins-mono在选择关键帧的共有两个条件:
对于视差的判断,在特征处理主程序Estimator::processImage
就有,但是关于视差的判断,并没有看到关于角度的补偿,或者是在后面边缘化的具体过程中存在角度的补偿。关于视差判断的具体思路是:
建立包含滑窗内所有特征点集合的vectorfeature
,若满足以下条件就边缘化最旧帧,否则边缘化倒数第二帧
直接法不能像特征法那样直接将拿描述子利用Dbow进行闭环检测,所以在闭环的时候只能重新对Keyframe提取Brief等描述子建立Database进行闭环检测,或者使用开源的闭环检测库FabMap来进行闭环检测。Vins-Mono选择了第一种闭环检测的方法。
Vins-Mono还是利用词袋的形式来做Keyframe Database的构建和查询。在建立闭环检测的数据库时,关键帧的Features包括两部分:VIO部分的200个强角点和500 Fast角点。然后描述子仍然使用BRIEF(因为旋转可观,匹配过程中对旋转有一定的适应性,所以不用使用ORB)。
在闭环检测成功之后,会得到回环候选帧。所以要在已知位姿的回环候选帧和滑窗内的匹配帧做匹配,然后把回环帧加入到滑窗的优化当中,这时整个滑窗的状态量的维度是不发生变化的,因为回环帧的位姿是固定的。
因为之前做的非线性优化本质只是在一个滑窗之内求解出了相机的位姿,而且在回环检测部分,利用固定位姿的回环帧只是纠正了滑窗内的相机位姿,并没有修正其他位姿(或者说没有将回环发现的误差分配到整个相机的轨迹上),缺少全局的一致性,所以要做一次全局的Pose Graph。全局的Pose Graph较之滑窗有一定的迟滞性,只有相机的Pose滑出滑窗的时候,Pose才会被加到全局的Pose Graph当中。
因为VINS-Mono的代码写的有点乱,好多变量的命名过于随意,不能很好理解,而且为了注释方便自己也给某些变量或者环节做了命名。
image(estimator.cpp)
某一帧图像得到的某个特征点,某一帧图像得到的特征点,<Feature_id, <camera_id,Feature>>
f_manager
滑窗的特征点管理器
1.为什么至少两个轴向上的加速度不为0的时候,尺度才是客观的。
在文献6
的第3小节
提到,在单目和视觉融合的时候,只有当至少两个轴向的加速度不为0的时候,尺度才是客观的。针对无人机来说,无人机的正常俯仰、横滚运动都会在两个轴向上有加速度。加速度仅存在于一个轴向的情况多属于平面运动的机器人。