以前研究VSLAM时,本人对SVO研究过一段时间,那个时候没有时间总结,git
如今快毕业了,总结一下本身了解的算法吧。。。。github
对SVO的总结共分为3各部分,分别为简介和评价部分、跟踪部分、深度滤波部分(建图部分)。算法
简介部分app
转载请说明出处:dom
http://blog.csdn.net/zhubaohua_bupt/article/details/74822742
ide
SVO[2]是C. Forster, M. Pizzoli, and D. Scaramuzza在14年提出的一个半直接法的VSLAM(单目)。函数
开源代码:https://github.com/uzh-rpg/rpg_svo 。性能
咱们知道,VSLAM有直接法和特征点法两大类。直接法和特征点法,在帧间VO阶段的不一样在于,优化
直接法:提取梯度纹理特征明显的像素,帧间VO是靠图像对齐,即经过spa
最小化像素灰度差函数来优化帧间位姿。
特征点法:提取特征点(一般是角点),帧间VO靠PNP,即缩小在后帧图像上,
重投影点与特征匹配点距离偏差,来优化帧间位姿。
而SVO是这样干的:
提取稀疏特征点(相似特征点法),帧间VO用图像对齐(相似于直接法),
SVO结合了直接法和特征点法,所以,称它为半直接法。
SVO主要干了两件事,
<1>跟踪
<2>深度滤波
深度滤波是咱们常说的建图(Mapping)部分。
跟踪部分干的事情是:初始化位姿,估计和优化位姿(分别对应于帧间VO和局部地图优化)。
初始化位姿:
用KLT光流法找匹配,而后恢复H矩阵。初始化思想是这样的,
第一帧上提取的特征点,做为关键帧,后来的帧不断用KLT与第一帧匹配,
直到匹配到的特征点平均视差比较大,就认为初始化成功,计算对应特征点的深度,
与此对应的帧做为第二帧。以后进入正常工做模式,即估计和优化位姿。
正常工做模式:
首先,经过和上一帧进行对齐,求取初始位姿;
而后,创建局部地图,经过优化局部地图和当前帧的投影灰度块偏差,来优化当前位姿;
最后,判断此帧是不是关键帧,若是为关键帧就提取新的特征点。
通过以上四个步骤,完成一帧的处理。若是在CMakeLists里打开了HAVE_G2O的选项,
代码隔一段时间还会BA,不过很是慢。
深度滤波部分主要任务是完成估计特征点的深度信息。
深度滤波和跟踪部分相互依赖,由于深度滤波是以相机位姿已知为前提进行的,
而跟踪部分又依靠深度滤波的结果(较准确的三维点),完成位姿的估计。
乍一看,这是个鸡生蛋,蛋生鸡的问题,既然二者循环迭代,总得有个起始点。
其实,单目的slam在启动时须要初始化,而这个初始化就提供粗糙的帧间位姿,
以便于深度滤波和跟踪部分的迭代。
当深度能够用后(称之为收敛),把它放入地图里,用于跟踪。
这个得从SVO干的事来讲,它既没有闭环检测,也没有重定位(SVO的重定位太。。。),
它干的事只要是定位,比较符合视觉里程计(VO)的特色。
ORBSLAM算是目前性能最好的开源算法,这些功能它都有,所以算一个比较完整的VSLAM算法。
优势:是比较快,若是你跑代码的时候发现很容易跟丢,能够修改这几个配置参数:
quality_min_fts:匹配到的最小特征点。
quality_max_drop_fts:允许相邻帧匹配到特征点的最大落差。
缺点:缺点是比较明显的
和ORBSLAM相比。
<1>因为位姿的估计和优化全是靠灰度匹配,这就致使了系统对光照的鲁棒性不足。
<2>对快速运动鲁棒性性不足。直接法都似这个样子。。能够加入IMU改善。
<3>没有重定位和闭环检测功能。
若是把此工程修改为RGBD的模式后,鲁棒性和精度明显提升,近似于ORBSLAM的RGBD模式。
[1]C. Forster, M. Pizzoli, and D. Scaramuzza, “SVO: Fast Semi-DirectMonocular Visual Odometry,” in Proc. IEEE Intl. Conf. on Robotics and Automation, 2014.
[2] MatiaPizzoli,Christian Forster, and Davide Scaramuzza. REMODE: Probabilistic,monocular densereconstruction in real time. In International Conference onRobotics andAutomation (ICRA), pages 2609–2616, Hong Kong,China, June 2014.