本项目内容是按照自己的理解复现orb-slam代码,希望透过代码深入理解系统运行逻辑及算法原理。
复现版本系统界面:
<效果概述>
复现系统的精度及实时性与orb-slam相当。
<评估方法>
- 使用RMSE评估追踪精度,使用单帧追踪时间评估实时性。
- 选择TUM RGBD数据集中有代表性的场景作为测试集。
- 每个测试集运行5次,除去最大值和最小值,取剩余三次的平均值。
<详细内容>
- 数据集选择
数据集名称 | 场景特点 | 验证内容 |
---|---|---|
fr1_room | 存在回环 | 回环检测 |
fr2_360_kidnap | 传感器输入中断 | 重定位 |
fr3_long_office | 时间跨度长 | 累积误差 |
fr3_sit_halfsph | 慢速移动 动态场景 | 动态场景定位 |
fr3_nstr_tex_near | 无结构特征 有纹理 | 无结构场景定位 |
- 测试结果
为避免机械式的代码输入,刻意选择不同的库函数,基于自己的理解进行代码复现。
相对orb-slam在系统功能、系统组成和代码实现上略有区别。
复现版本选择RGBD相机作为传感器,并增加依据追踪结果创建字典的功能。
项目 | orb-slam | 复现版本 |
---|---|---|
传感器类型 | 单目/双目/RGBD | RGBD |
DBow字典 | 未提供创建功能 | 可依据场景创建 |
模块与orb-slam相同,按照追踪、局部地图、回环检测、绘图4个线程进行划分。
源文件中类的定义及数量有调整,新增camera类,config,合并绘图类等。
变化 | orb-slam | 复现版本 | 变化原因 |
---|---|---|---|
新增 | - | Config & Camera | 配置和相机信息修改便利 |
删除 | Initializer | - | RGBD无需单独初始化 |
删除 | PnPsolver | - | 调用opencv内置函数实现 |
合并 | FrameDrawer & MapDraw & Viewer | Drawer | 功能整合 |
合并 | KeyFrameDatabase & Map | Map | 功能整合 |
使用的库函数有以下变化:
- 矩阵运算:cv::Mat -> Eigen矩阵类 & Sophus
- 后端优化:g2o -> ceres
主要的代码工作:
- 按照自己理解的系统运行逻辑全部重写了除orb特征提取以外的所有代码。
- 参考orb-slam优化部分思路及论文,使用ceres重新构建优化问题并求解。
- 结合ceres优化问题求解模式,直接使用李代数进行点坐标投影,极大缩短优化时间。