用ORB_SLAM也有一段时间了,基于该project也做了不少的开发,期间遇到了一些bug,在这里总结一下,在github上的issue中也有,只是issue数量太大,所以总结出一个关于代码错误的几个方面(主要是在遇到的时候也不敢相信,毕竟是大牛的作品):

1. Reset() 的时候会遇到段错误,很偶尔遇到的一个问题,主要原因是双目的初始化函数StereoInitialization() 中关于mLastFrame的赋值顺序出错,具体分析如下:

Track() 部分在mState=OK时的具体的track方法如下:

if(mVelocity.empty() || mCurrentFrame.mnId<mnLastRelocFrameId+2)
{// 将上一帧的位姿作为当前帧的初始位姿// 通过BoW的方式在参考帧中找当前帧特征点的匹配点// 优化每个特征点都对应3D点重投影误差即可得到位姿bOK = TrackReferenceKeyFrame();}else{// 根据恒速模型设定当前帧的初始位姿// 通过投影的方式在参考帧中找当前帧特征点的匹配点// 优化每个特征点所对应3D点的投影误差即可得到位姿bOK = TrackWithMotionModel();if(!bOK)bOK = TrackReferenceKeyFrame();}

TrackReferenceKeyFrame() 应该只在两种情况下发生:

一种是整个系统刚刚初始化成功,mVelocity.empty();

第二种情况是 刚刚重定位完成  mCurrentFrame.mnId<mnLastRelocFrameId+2, 也就是前两帧用ReferenceKF进行计算,第三帧开始用motionmodel;

但是这里有一个问题是Reset() (该问题仅仅适用于双目), 如果整个系统system运行到一半,这时mVelocity就不为空,在这个过程中突然将系统reset() , 由于reset() 时并未将mVelocity清空,因此会使用motionmodel进行track,

而TrackwithMotionModel() 中需要先进行update,也就是函数UpdateLastFrame();部分摘抄如下:

void Tracking::UpdateLastFrame()
{// Update pose according to reference keyframeKeyFrame* pRef = mLastFrame.mpReferenceKF; //主要是这里的参考帧cv::Mat Tlr = mlRelativeFramePoses.back();mLastFrame.SetPose(Tlr*pRef->GetPose());
}

发生段错误的地方就是这里,因为需要用到mpReferenceKF, 但实际mpReferenceKF却为空,这就导致访问了不存在的内容,也就导致了段错误;

具体的修改方法如下:

1. 在Reset函数中添加如下:

mnLastRelocFrameId = 0;
mVelocity = cv::Mat();

也就是reset时同时也将重定位的ID和运动模型清空,这个不难理解,因为我既然整个系统都已经重新跑了,这两个对应的参数都应该是初始状态;这样保证每次reset() 初始化后可以使用referenceKF进行track;

2. 第二种方法修改StereoInitialization()在中的变量赋值顺,改成如下:

 mpLocalMapper->InsertKeyFrame(pKFini);//original line:mvpLocalKeyFrames.push_back(pKFini);mvpLocalMapPoints=mpMap->GetAllMapPoints();mpReferenceKF = pKFini;mCurrentFrame.mpReferenceKF = pKFini;  // 第5行mLastFrame = Frame(mCurrentFrame);   //第6行mnLastKeyFrameId=mCurrentFrame.mnId;mpLastKeyFrame = pKFini;mpMap->SetReferenceMapPoints(mvpLocalMapPoints);

其实主要是第五行和第六行的顺序,改成先确定mCurrentFrame的参考关键帧,再将该frame包装作为mLastFrame,这样就保证在UpdateLastFrame() 时 mLastFrame的参考帧不为空,不会导致段错误;

我的代码中将这两部分都做了修改,因为对比双目和单目的初始化就可以发现,单目初始化过程就是如上的顺序;当然,这种顺序如果会遇到bug,还请指正;

对应的该问题在github上的issue如下: https://github.com/raulmur/ORB_SLAM2/issues/123

ORB_SLAM2中的疑难杂症相关推荐

  1. sed修炼系列(四):sed中的疑难杂症

    sed系列文章: sed修炼系列(一):花拳绣腿之入门篇 sed修炼系列(二):武功心法(info sed翻译+注解) sed修炼系列(三):sed高级应用之实现窗口滑动技术 sed修炼系列(四):s ...

  2. ORB_SLAM2中特征提取之图像金字塔尺度不变性理解

    本文参考:泡泡机器人提供的带注释的ORB_SLAM2源代码 转载本文请注明出处: https://blog.csdn.net/RobotLife/article/details/87194017 在o ...

  3. 从TCP三次握手说起——浅析TCP协议中的疑难杂症

    PeterWang_bupt 贡献值:2 等級:L1 0 发布 0 评论 1 顶 发布链接发布图文   全部主题 我关注的主题 GEEKNEWS Rust Swift 全栈工程师 /home Pres ...

  4. 从TCP三次握手说起–浅析TCP协议中的疑难杂症(2)

    在"从TCP三次握手说起–浅析TCP协议中的疑难杂症(1)"文章中,我们提到第6个疑问:TCP的头号疼症TIME_WAIT状态,下面我们继续这个问题的解答: 6. 疑症(6) TC ...

  5. ORB_SLAM2中Tracking线程

      Tracking线程是ORB_SLAM2的主线程.在System.cc中,使用构造函数进行了初始化,开启了三个线程. 可执行程序->System构造函数(初始化三个线程)->处理输入的 ...

  6. 从TCP三次握手说起——浅析TCP协议中的疑难杂症(转载)

    [转载] 原博文来自:https://blog.csdn.net/qiansg123/article/details/80126677 作者:黄日成,手Q游戏中心后台开发,腾讯高级工程师. 因为写得太 ...

  7. 浅谈大规模C++工程中一些疑难杂症及解决方案

    一.疑难杂症 从工作到现在,近几年在写C++大规模分布式系统相关,会遇到最头疼的几类问题,特别是新写大模块,或者重构功能基本都会遇到,如下: 内存泄漏 内存写坏 死锁 并发导致状态不对或者结果错误 - ...

  8. ORB_SLAM2中基础矩阵F求解的原理及源码分析

    1. 基础矩阵的定义 如图所示是对极几何约束关系图,图中 O 1 , O 2 O_{1},O_{2} O1​,O2​分别表示相机的两个位姿,平面 I 1 , I 2 I_{1},I_{2} I1​,I ...

  9. ORB_SLAM2中的Sim3变换

    对于双目.RGB-D相机,可获得深度,因此不存在尺度问题,因此Sim3中的尺度s=1. (1)通过词袋加速算法实现当前帧.闭环帧的特征点的匹配,建立闭环帧的路标点和当前帧的特征点间的联系. (2)使用 ...

最新文章

  1. 吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection)
  2. 3600插b450i开不了机_win10电脑开不了机怎么办
  3. 考前自学系列·计算机组成原理·查询方式/中断方式/DMA方式的适用范围及判断
  4. 这款多线程中间件,吊打 Redis!
  5. java——maven依赖版本冲突
  6. vue可以直接进行运算么_Vue实现计算器功能
  7. 高性能滚动scroll(防抖和节流)
  8. excel删除行闪退_excel2010闪退的处理方法
  9. Mysql中的delimiter详解
  10. 产品读书《产品经理的第二本书》
  11. Eclipse 官方简体中文语言包下载地址及安装方法
  12. reg51 reg52区别
  13. 数据结构(七)高级排序算法——归并、快速排序
  14. 敏捷开发 宣言 思想 认识误区
  15. 自动作诗器 二逼青年立马变文艺青年~~
  16. Python基础之图像识别
  17. Windows禁用和启用触屏功能
  18. weboffice使用
  19. 基于表面肌电信号的手势识别——深度学习方法
  20. float和absolute的区别

热门文章

  1. pytorch中的Sequential使用方法
  2. tf.one_hot()
  3. matlab关于向量的基本操作
  4. 磁盘I/O高居不下,通过什么来查看占用I/O的进程?
  5. 小白知识摘录__环境变量
  6. 20172329 2017-2018-2 《程序设计与数据结构》第五周学习总结
  7. windows下php命令行模式错误信息
  8. 今天执行grep命令差点把服务器搞崩
  9. shell(九)几个字符转换命令
  10. 在WPF中自定义你的绘制(二)