ORB-SLAM3实测与解读

最近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很不好。

  • 12
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值