最近ORB-SLAM3正式开源了,出品自西班牙萨拉戈萨大学的ORB-SLAM系列,一如既往的风格,一脉相传的味道。
0 资源
可以去github上查看源码:地址
有同学反映github最近网速不给力,也可以去百度云盘下载,源码:地址 密码: dh9a ;论文:地址 密码: 6ml4。
1 解读
ORB-SLAM3应该说是对他们组近几年工作进行的一个系统总结,集成了之前的ORB-SLAM2、ORB-SLAM-VI等。支持了纯视觉、视觉+惯性、构建多子地图系统、单目、双目、RGB-D、针孔相机、鱼眼相机模型。是目前种类最齐全、工程化最好、精度和鲁棒性整体最佳的一个工程框架。
主要创新点:
1)IMU初始化阶段引入了最大后验概率估计(MAP),实时快速,鲁棒性好(大场景小场景,室内室外),论文中说是有2-5倍精确度提升;
2)回环检测召回率高,多子地图系统(Atlas),视觉跟丢时,重新建一个子地图,回环时与之前的子地图合并。
论文中说双目+IMU,在EuRoC数据集平均误差3.6cm,在TUM-VI数据集平均误差9mm,和其他工程的详细比较可以看论文图表,绝大多数场景下ORB-SLAM3目前是最好的!
有优点就肯定有不足,吹毛求疵一点哈:
1)特征点法和多子地图,在耗时和吃内存上较大,也可以理解的,但想移植到移动端(手机、眼镜、可移动设备)上,需要大的裁剪和优化;
2)这次开源貌似有些仓促,有的注释里作者自己标注了TODO的点,而且github上每隔3-5天会更新下代码,看来作者那边也在继续优化,目前尝鲜足够,求稳定版本可持续关注哈。
主要框架内容:
1)Atlas是一堆未合并的map的集合,分为active map和non-active-map两部分,基于DBoW2 keyframes database来做重定位、回环和地图合并。
2)tracking thread,处理进来的图像和IMU信息,通过最小化重投影误差实时计算当前帧与地图的相对位姿,同时也进行keyframe的选择。在VI配置下,速度与IMU的biases也同时被优化与估计。当跟丢后,tracking thread尝试利用atlas进行重定位,如果成功了,将继续进行tracking,需要的话进行切换active map的操作;若定位失败(过了一个设定时间),重新初始化一个新active map 进行tracking和mapping。
3)local mapping thread,往active map中添加keyframes和points,移走outliers,在一个local window中通过视觉和VI BA来refine maps。IMU的参数初始化也通过这个mapping thread进行refine。
4)loop and map merging thread,一直将active map与整个atlas基于keyframe的速度进行相似性度量。如果相似场景区域在当前的active map中,将进行回环矫正;当这个区域也属于其他地图,将进行合并操作并将合并后的地图置为当前的active map。在进行回环矫正时,一个full BA将再开一个线程进行,来追求更高的精度,但这个并不要求实时性。
其它:相机模型有针孔相机模型和鱼眼相机模型;重定位,之前orb-slam是通过ePnP做重定位,但ePnP需要针孔模型,为了兼顾鱼眼相机模型,采用MLPnP,以反投影光线为输入,所以提供个反投影模型鱼眼相机就可以了。
2 工程编译
和之前ORB-SLAM、ORB-SLAM2基本一致。
环境和依赖:ubuntu16或ubuntu18,OpenCV、Eigen3、Pangolin、DBOW2、G2O、Python。
可以简单安装
cd ORB_SLAM3
chmod +x build.sh
./build.sh
可能的2点问题:
1) Pangolin界面显示问题,运行时报错:
terminate called after throwing an instance of 'std::runtime_error'
what(): Pangolin X11: Unable to retrieve framebuffer options
Aborted (core dumped)
对应修改Pangolin源码Pangolin/src/display/device下的display_x11.cpp修改:
staticint visual_attribs[] =
{
GLX_X_RENDERABLE , True,
GLX_DRAWABLE_TYPE , GLX_WINDOW_BIT,
GLX_RENDER_TYPE , GLX_RGBA_BIT,
GLX_X_VISUAL_TYPE , GLX_TRUE_COLOR,
GLX_RED_SIZE , 8,
GLX_GREEN_SIZE, 8,
GLX_BLUE_SIZE, 8,
GLX_ALPHA_SIZE, 8,
GLX_DEPTH_SIZE, 24,
GLX_STENCIL_SIZE, 8,
GLX_DOUBLEBUFFER , glx_doublebuffer ? False : False, //True改为False
//注释这一行GLX_SAMPLE_BUFFERS , glx_sample_buffers,
//注释这一行 GLX_SAMPLES , glx_sample_buffers > 0 ? glx_samples : 0,
None
};
之后重新编译Pangolin。
2) 编译ORB-SLAM3工程或跑数据集时:Aborted (core dumped)。
查看原因绝大多数是电脑内存不够的原因,建议大内存下编译运行,或者编译时关掉无关软件进程,或restart下电脑即可解决。
3 数据集实测
效果怎么样,拉出来练练。实测单目+IMU。
1) EuRoC的ASL飞行数据集,选了Room的V201(easy)和V102(medium)。上图看效果
V201: 与GT进行比较,通过evaluate_ate_scale.py得到(0.028190,1.012694,0.017424)(absolute_translational_error.rmse, scale, absolute_translational_errorGT.rmse).
V102: 与GT进行比较,(0.077849,0.968763,0.020400)(absolute_translational_error.rmse, scale, absolute_translational_errorGT.rmse).
对比GT,可以看出,ORB-SLAM3的精度和效果确实很好,用相同数据集重复跑两次,每次结果会有一点差异。
2) 浙大ZJUCVG的AR数据集试试效果,设备是小米8手机,随机试了A3数据集。效果图如下:
数据集有GT,偷懒了,没有与真值去比较,仅仅是看了个效果,手机晃动不大,SLAM跑的很连贯,中间没有tracking lost。
3) 自己的手机采数据的效果,设备是华为mate10,跑之前要自己标好手机内参(matlab或opencv, fx, fy, cx ,cy, k1, k2, p1, p2,25Hz)、IMU参数(IMU芯片manual+经验,NoiseGyro、GyroWalk、NoiseAcc、AccWalk,100Hz)、手机与IMU外参(kalibr,R, t),采集单目相机+IMU数据,效果图如下:
用自己的数据测,中间有好几次tracking lost,基本与走的路径一致,因中间断了几次,没有进行定量精度比较。感叹要是换上鱼眼设备该多好,肯定会鲁棒很多了。
分析原因:
1) 走路故意让手机晃动大一些,数据集难度很大(回头采集几个easy和medium的数据集,或者直接手机和电脑主从机,实时采集,电脑直接看效果);
2) 手机内参好久之前标的,感觉需要重新标下,明显不太准呢;
3) IMU是100Hz不够高,走路故意一颠一颠,加计容易被颠飞,对应VIBA很不好。