点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

本文由知乎作者Welson WEN授权转载,不得擅自二次转载。

原文链接:https://zhuanlan.zhihu.com/p/108298657

就目前视觉SLAM的引用来区分,分为基于特征法的和直接法的视觉SLAM。本文内容参考[1][2][3]。

DSO属于稀疏直接法的视觉里程计。它不是完整的SLAM,因为它不包含回环检测、地图复用的功能。因此,它不可避免地会出现累计误差,尽管很小,但不能消除。DSO目前开源了单目实现,双目DSO的论文已被ICCV接收,但目前未知是否开源。

DSO是少数使用纯直接法(Fully direct)计算视觉里程计的系统之一。相比之下,SVO[2]属于半直接法,仅在前端的Sparse model-based Image Alignment部分使用了直接法,之后的位姿估计、bundle adjustment,则仍旧使用传统的最小化重投影误差的方式。而ORB-SLAM2[3],则属于纯特征法,计算结果完全依赖特征匹配。从方法上来说,DSO是新颖、独树一帜的。

直接法相比于特征点法,有两个非常不同的地方:

1. 特征点法通过最小化重投影误差来计算相机位姿与地图点的位置,而直接法则最小化光度误差(photometric error)。所谓光度误差是说,最小化的目标函数,通常由图像之间的误差来决定,而非重投影之后的几何误差。

·最小化重投影误差也称特征点法,误差函数的形式是像素的坐标值相减。

2. 直接法将数据关联(data association)与位姿估计(pose estimation)放在了一个统一的非线性优化问题中,而特征点法则分步求解,即,先通过匹配特征点求出数据之间关联,再根据关联来估计位姿。这两步通常是独立的,在第二步中,可以通过重投影误差来判断数据关联中的外点,也可以用于修正匹配结果(例如[4]中提到的类EM的方法)

·误差函数的形式是两个像素的灰度值相减,光度误差函数计算方式为:

光度差并用协方差加权

光度差

光度差的方差

·误差函数分子就是基本的光度误差函数,重点看分母。分母中分为了两部分,第一部分是图像的光度方差,是一个与相机等有关的常数,因为有两帧图像,所以存在系数2。第二部分是深度相关方差,通过深度滤波器中得到的逆深度的方差传递获得。

3. 关于重投影误差和最小光度误差,参考WAVE实验室的

https://www.youtube.com/watch?v=XzZd5lHZaHQ

由于这个原因,DSO会一直求解一个比较复杂的优化问题,我们很难将它划分为像特征点法那样一步一步的过程。DSO甚至没有“匹配点”这个概念。每一个三维点,从某个主导帧(host frame)出发,乘上深度值之后投影至另一个目标帧(target frame),从而建立一个投影残差(residual)。只要残差在合理范围内,就可以认为这些点是由同一个点投影的。从数据关联角度看,在这个过程中并没有a1-b1, a2-b2这样的关系,也可能存在a1-b1, a2-b1, a3-b1这样的情况。但是DSO并不在意这些,只要残差不大,我们就看成是同一个点。这是很重要的一点。在特征点法中,我们可以找到一个地图点分别在哪些帧中被看到,乃至找到各帧中的图像描述子是什么;但在DSO中,我们会尝试把每个点投影到所有帧中,计算它在各帧中的残差,而并不在意点和点之间的一一对应关系。

从后端来看,DSO使用一个由若干个关键帧组成的滑动窗口作为它的后端。这个窗口在整个VO过程中一直存在,并有一套方法来管理新数据的加入以及老数据的去除。具体来说,这个窗口通常保持5到7个关键帧。前端追踪部分,会通过一定的条件,来判断新来的帧是否可作为新的关键帧插入后端。同时,如果后端发现关键帧数已经大于窗口大小,也会通过特定的方法,选择其中一个帧进行去除。请注意被去除的帧并不一定是时间线上最旧的那个帧,而是会有一些复杂条件的。

Direct Sparse Odometry (DSO) 的出现将直接法推进到一个相当成熟可用的地位,许多实验已表明它的精度与鲁棒性均优于现在的ORB-SLAM2,而相比之下Large Scale Direct SLAM (LSD-SLAM) 则显然没有那么成熟。

在大部分数据集上,DSO均有较好的表现。虽然DSO要求全局曝光相机,但即使是卷帘快门的相机,只要运动不快,模糊不明显,DSO也能顺利工作。但是,如果出现明显的模糊、失真,DSO也会丢失。

直接法相比传统特征点法,最大的贡献在于,直接法以更整体、更优雅的方式处理了数据关联问题。特征点法需要依赖重复性较强的特征提取器,以及正确的特征匹配,才能得正确地计算相机运动。在环境纹理较好,角点较多时,这当然是可行的——不过直接法在这种环境下也能正常工作。然而,如果环境中出现了下列情况,对特征点法就不那么友善:

  • 环境中存在许多重复纹理;

  • 环境中缺乏角点,出现许多边缘或光线变量不明显区域;

这在实际图像中很常见,我们以道路环境为例(取自kitti):

来自于高博[1]

显然,路面上角点甚少,仅有车道线的起始/终止处存在角点,其他地方纹理不足;天空通常也没有纹理;路旁栏杆和障碍物重复纹理非常明显。这些都是特征点法必须面对的问题,所以特征点法通常只能依赖一些车辆、行人、交通告示板来确定明显的特征匹配,这会影响整个SLAM系统的稳定性。其根本原因在于:无法找到有用的匹配点、或者容易找到错误的匹配点。例如,车道线边缘上的点外观都非常相似,栏杆附近的点则由于栏杆本身纹理重复,容易出现错配。

而直接法,如前所示,则并不要求一一对应的匹配。只要先前的点在当前图像当中具有合理的投影残差,我们就认为这次投影是成功的。而成功与否,主要取决于我们对地图点深度以及相机位姿的判断,并不在于图像局部看起来是什么样子。举个例子,如果用特征法或光流法追踪某个位于边缘的像素,由于沿着边缘方向图像局部很相似,所以这个匹配或追踪的结果,可能被计算成此边缘方向的另一个点——这主要是因为图像局部的相似性;而直接法的约束则来自更为整体的相机位姿,所以即使单个点无法给出足够的信息,还可以靠其他点来修正它的投影关系,从而找到正确的投影点。

这是一把双刃剑。直接法给予我们追踪边缘、平滑区块的能力,但同时也要付出代价——正确的直接法追踪需要有一个相当不错的初始估计,还需要一个质量较好的图像。由于DSO严重依赖于使用梯度下降的优化问题求解,而它成功的前提,是目标函数从初始值到最优值之间一直是下降的。在图像质量不佳或者相机初始位姿给的不对的情况下,这件事情往往无法得到保证,所以DSO也会丢失。

这种做法一个显而易见的后果是,除非存储所有的关键帧图像,否则很难利用先前建好的地图。退一步说,即使有办法存储所有关键帧的图像,那么在重用地图时,我们还需要对位姿有一个比较准确的初始估计——这通常是困难的,因为你不知道误差已经累计到了多大的程度。而在特征点法中,地图重用则相对简单。我们只需存储空间中所有的特征点和它们的特征描述,然后匹配当前图像中看到的特征,计算位姿即可。

数据关联和位姿估计,在直接法中是耦合的,而在特征点法中则是解耦的。耦合的好处,在于能够更整体性地处理数据关联;而解耦的好处,在于能够在位姿不确定的情况下,仅利用图像信息去解数据关联问题。所以直接法理应更擅长求解连续图像的定位,而特征点法则更适和全局的匹配与回环检测。

当然DSO也不是万能的。最容易看到的缺点,就是它不是个完整的SLAM——它没有回环检测、地图重用、丢失后的重定位,而这些在实际场景中往往又是必不可少的功能。DSO的初始化部分也比较慢,当然双目或RGBD相机会容易很多。

总结:但从视觉SLAM的角度去看问题,其实更倾向于与解决单靠视觉或者视觉加IMU去获得更加鲁棒的定位结果。但是从多传感器融合的角度去看问题,则会有不同的科学解决方案。如上图提及的场景,虽然对于视觉SLAM (特征法)比较挑战 ,但是由于场景空旷,单从GPS定位就可以获得较为不错的解。此时比较关键的问题是如何去判断目前视觉SLAM的解不太可靠,然后加大GPS的解在数据融合中的权重。换句话说,在多传感器融合过程中,要充分发挥各个传感器的作用,则需要有效的估计处各个传感器的不确定性。

By jiacheng:

我理解用直接法的话,要考虑相机曝光模式和光度标定的问题,这方面要复杂一些。直接法对图像质量和初始值要求比较高,如果定位丢了,不方便再重新找比较好的初始值。DSO代码我没看过,但据说不是很易读。但直接法更擅长跟踪边缘和平滑区块,像车道线 栏杆 一排排的树干 一栋栋很相似的楼 用特征点法更容易出现误匹配。

特征点法的话,以VINS为例,需要提前把路上运动中的车提前检测出来,去掉,这样是为了去掉动的特征点。车行驶环境中有很多重复的纹理和区域,感觉像VINS中用光流跟踪比计算描述子的特征点匹配,误匹配的情况可能要好一些,因为光流法会指定当前帧图像上的特征点的初始位置,也就是会在上一帧对应光流点的坐标值附近搜索和上一帧的匹配点。还有就是用特征点法地图重用要简单,只存储特征点,需要的时候拿出来就能恢复位姿了。

参考文献:

[1] 高博的知乎文章 https://zhuanlan.zhihu.com/p/29177540.

[2] Engel J, Koltun V, Cremers D. Direct sparse odometry[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2017.

[3] https://zhuanlan.zhihu.com/p/47914361

上述内容,如有侵犯版权,请联系作者,会自行删文。

推荐阅读:

吐血整理|3D视觉系统化学习路线

那些精贵的3D视觉系统学习资源总结(附书籍、网址与视频教程)

超全的3D视觉数据集汇总

大盘点|6D姿态估计算法汇总(上)

大盘点|6D姿态估计算法汇总(下)

机器人抓取汇总|涉及目标检测、分割、姿态识别、抓取点检测、路径规划

汇总|3D点云目标检测算法

汇总|3D人脸重建算法

那些年,我们一起刷过的计算机视觉比赛

总结|深度学习实现缺陷检测

深度学习在3-D环境重建中的应用

汇总|医学图像分析领域论文

大盘点|OCR算法汇总

重磅!3DCVer-知识星球和学术交流群已成立

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导,770+的星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

欢迎加入我们公众号读者群一起和同行交流,目前有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

▲长按加群或投稿

视觉SLAM直接法与特征法及其在多传感融合中的思考相关推荐

  1. 对SLAM和自动驾驶定位的思考,最新自动驾驶视觉SLAM方法综述!

    摘要 自动驾驶车辆在不同的驾驶环境中需要精确的定位和建图解决方案.在这种背景下,SLAM技术是一个很好的解决方案.LIDAR和相机传感器通常用于定位和感知.然而,经过十年或二十年的发展,激光雷达SLA ...

  2. 《视觉SLAM十四讲 第二版》笔记及课后习题(第三讲)

    读书笔记:三维空间刚体运动 本讲介绍视觉 SLAM 的基本问题之一:一个刚体在三维空间中的运动是如何描述的.我们当然知道这由一次旋转加一次平移组成.平移确实没有太大问题,但旋转的处理是件麻烦事.我们将 ...

  3. SLAM | 视觉SLAM中的后端:后端优化算法与建图模板

    点击上方"AI算法修炼营",选择加星标或"置顶" 标题以下,全是干货 前面的话 前面系列一中我们介绍了,VSLAM 是利用多视图几何理论,根据相机拍摄的图像信息 ...

  4. vins中imu融合_基于非线性优化算法—当视觉SLAM遇到VINS会碰撞出怎样的火花?

    今天来给大家分享一个视觉SLAM中比较综合且复杂的系统-VINS.VINS旨在通过融合两个传感器测量数据获得移动机器人的位姿和特征点在空间中的位置,在现代控制理论学科中属于最优估计问题.在移动智能机器 ...

  5. SLAM学习--视觉slam学习教材推荐(附相关技术文档下载链接)

    (理论上看完前三本,足够掌握视觉slam的所有理论知识,实践部分参考各种开源代码) 一.<视觉slam十四讲>,高翔,清华大学出版社,(目前已出第二版,优先推荐) 以上教材,其实是基于国外 ...

  6. 激光slam_机器人主流定位技术,激光SLAM与视觉SLAM谁更胜一筹

    定位技术是机器人实现自主定位导航的最基本环节,是机器人在二维工作环境中相对于全局坐标的位置及其本身的姿态.目前SLAM (Simultaneous Localization and Mapping,即 ...

  7. 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?

    定位技术是机器人实现自主定位导航的最基本环节,是机器人在二维工作环境中相对于全局坐标的位置及其本身的姿态.目前SLAM (Simultaneous Localization and Mapping即时 ...

  8. 基于树莓派3b+学习视觉slam

    基于树莓派3b+学习视觉slam(1) 搭建ubuntu mate16.04 参考jacka654321的博客树莓派3B+安装Ubuntu Mate 16.04 PS:本人使用外接显示屏与外设并没有用 ...

  9. 无人机利用视觉slam实现位置估计

    无人机利用视觉slam实现室内位置估计 自己近期所做的以及思考的东西 我们实验室买了阿木的p200(带t265)无人机用于无人机的控制研究,通过阿木实验室的ros功能包px4_command可以无脑的 ...

最新文章

  1. 【CV】吴恩达机器学习课程笔记第10章
  2. 淘宝内部分享:怎么跳出MySQL的10个大坑
  3. CloudStack部署运维手册V2 --- 新鲜出炉
  4. vs找不到dll_零基础学习Python_绝对VS相对
  5. 【Linux】一步一步学Linux——who命令(95)
  6. C++程序内存泄漏都与哪些方面有关,该如何处理和避免
  7. linux删除默认路由
  8. 使用WORD封面自带模板?
  9. tomcat启动之后,Chrome浏览器可以访问,IE不行(IE无法访问8080 端口)
  10. bmp制作自定义字体(cocostudio使用)
  11. 企业中MySQL高可用集群架构三部曲之MM+keepalived
  12. 小菜找实习——阿里3月27日场笔试第一题
  13. win10如何打来计算机的工具,电脑系统教程:Win10自带解压缩文件工具如何使用
  14. 【评测】Attana Cell 200蛋白互作分析仪,实现细胞原位生物大分子互作检测
  15. 基于wifi的物联网技术,主要有哪些优势?
  16. 数据库查询练习(一)
  17. 想要提高自己的写作水平?吃透这篇文章就够了
  18. MySQL数据库操作与查询的综合测试题
  19. 1+1为什么等于2(哥德巴赫猜想)
  20. linux网络编程--网络编程的基本函数介绍与使用【转】

热门文章

  1. Windows下一键搭建redmine
  2. linux grep命令总结
  3. activity生命周期及数据保存
  4. strtok()思考
  5. AI服务器的设计与实现
  6. (方案汇总)批处理中畸形文件夹和畸形文件的创建、访问、删除
  7. Windows Server 2008 Server Core - 小脚印,大安全
  8. 敏捷(Agile)与精益(Lean)对比
  9. 三分钟基础:什么是拥塞控制?
  10. 大公司病(太现实了!)