https://github.com/TurtleZhong/Map-based-Visual-Localization
基于地图的视觉定位的通用框架。它包含了
-
支持传统特征或深度学习特征的地图生成。
-
视觉(点或线)地图中的分层定位视觉。
-
具有 IMU、轮 odom 和 GPS 传感器的融合框架。
我将发布一些相关论文和基于地图的视觉定位工作的介绍。我想介绍会先用中文写的。所以很快就来了,让我们去做吧。
基于地图的视觉定位
基于已知地图的视觉定位是一个比较大的问题,基本上会涉及到slam系统,重定位,图像检索,特征点提取及匹配,多传感器融合领域。
0.写在前面
作者:钟心亮 https://github.com/TurtleZhong
在写本文之前,我想先简单的总结一下历年用的比较多的slam系统,另外会提出一些开放性的思考问题,这些思考性的问题我也会提供一个简单粗暴的替代办法或者思路,然后后面讲这个项目可以解决的一些问题以及后面还要探究的问题,原则上来讲,本文:
a)应该不会放出太多的代码[当然看心情],但会整理一些这个项目参考过的有意思的项目以及一些教学性代码小样;
b)不会涉及到太多公式细节,尽量写成白话文,且大多数东西都能在github上找到或者进行魔改;
c)会有这个项目的一些框架图,以及效果图,应该会对想涉足这个领域的有帮助;
d)会涉及到slam系统,重定位,图像检索,特征点提取及匹配,多传感器融合领域。
主要做了以下方面的一些工作,但也并不是说拿来就能用。
a)基本上支持绝大部分SLAM系统的输出轨迹进行视觉地图构建,当然这是离线的,一方面,有些slam系统的历史轨迹是会经过优化的,所以这部分是拿最终的轨迹和图像来进行离线选择pose和image进行SFM构建地图的;
b)支持传统特征如SIFT以及深度学习特征如SuperPoint等众多特征的地图构建,但问题在于轨迹的来源是各式各样的,我什至可以使用rtk或者激光雷达作为真值,但实际重定位使用的时候必须要使用与构建视觉地图的特征一致,不然是会定位失败的;这里建议参考一些开源SFM的文档,hack它们也不算难。
c)整个框架在线定位基本基于C++开发,可以方便集成到ROS,所以也许会提供一个提取深度学习特征点和描述子网络,模型本身不会修改,只是改成cpp版本,便于后续开发,不然ros的python2环境和现在各大网络的python3环境很烦;一个可用的版本在这里.
d)将SFM重建之后的元素分解整合成视觉定位所依赖的元素,譬如关键帧,特征点,描述子,3D点等等;
e)一个可以兼容传统特征和深度学习特征的重定位框架,之所以叫重定位,是因为基于b步骤的地图定位的,另外本质上确实也是重定位过程;
f)一个理论上可以融合imu, wheel encoder等其它传感器的融合思路或者说方案。之所以要是因为当你机器人走到了没有视觉地图的地方怎么办呢,对吧。
g)代码不一定开源,但会提供思路,会提供相关论文,这些应该只要追了近几年的论文很容易想到,也有很多论文是这么干的,我只是做了一点微小的工作。
1.历年slam系统总结与思考
玩视觉slam的小伙伴想必都跑过各种vo,vio,slam系统,至少下面的一款你肯定玩过的ORB-SLAM,SVO,DSO,VINS-Mono,MSCKF,Kimera等等。下面先简单总结一下历年来slam系统的对比,对比如下表
1.1 现有slam系统到实际使用存在的问题
ok 如果这些还不够,那么可以参考吴同学的 83 项开源视觉 SLAM 方案够你用了吗?,参考了那么多的slam系统之后,咱们来思考一下以下问题:
1)是否可以将表格中的一个或者某几个算法原理弄懂,在自己的相机,自己的项目场景中跑起来,修改一些参数适配自己的场景等等。
想必这个应该是最基础的,玩过的同学至少先能在数据集上跑通,跑通之后大多也都会买一个双目imu相机或者rgbd相机等等,用kalibr标定自己的相机,然后修改配置文件,不出意外的话,你拿着相机不断的动,相机的轨迹就会显示在屏幕上。ok,到这应该大家都是这么过来的。
2)有没有小改或者大改过一个开源项目,使得能更鲁棒,cover更多的corner case? 譬如老板给你提出的下面这些需求:
-
a)这个特征提取还是太慢了,我们把他挪到ARM下也得实时,你考虑加速一下?
-
b)场景运动太快了,特征跟踪不稳,系统老是崩掉,你能不能改稳定点?
-
c)为什么你这个图跟实际场景对不上,一条走廊为什么你来回轨迹都对不上,为什么人家激光雷达就可以?
-
d)能不能把imu和*还要多个相机给我加进去,到底能不能行?
-
e)你这玩意为什么每次坐标系都不一样,好像只在局部有用啊,能不能改一个存地图复用的版本,不然机器人每次导航点都不一样啊?
-
f)你这个怎么室内场景稍微变换了一下就不行了,到室外天气变化大点你这不完犊子?
可能上面的问题有点夸大,但是应该来讲是现实场景中会实实在在遇到的问题。总结来讲,这几个问题可以归结为,大多数slam系统不考虑地图的保存以及复用,试想现在的自动驾驶行业,应该很少有说离开了高精地图来做定位的吧,这里的高精度地图当然也包含激光雷达事先建立好的点云地图。反观到视觉其实也是一样的,如果要完成一个需要满足机器人任何时刻放置在场景中都输出同一个绝对坐标的任务时,譬如室内或者小区送货等等,如果说你事先都没有一张地图的话,那么上面提到的83项slam应该都是以每次启动的时候作为坐标系原点,那么问题来了,你能保证每次都在同一个位置?就算保证了,有一些slam系统还涉及到和imu的初始化,你能保证每次初始化都一样?