suffeeen / orbslam2-with-LK-optical-flow

This project is modified from orbslam2. All dependencies are consistent with orbslam2
69 stars 25 forks source link

怎么把光流结果加入Tracking过程呀 #1

Open XinnWang opened 4 years ago

XinnWang commented 4 years ago

您好,十分感谢您能开源代码。我有个疑问想问下,您的代码是在Track前面进行一次光流计算对嘛,但是我不太理解光流计算的结果会怎样影响SLAM的结果呢?我看到光流算出来的RT仅仅是命令行输出了一下,并没有赋值之类的。您CSDN上面说的“使用光流法跟踪非关键帧,不需要提取所有帧的特征点。”是需要在哪里修改代码呀?

suffeeen commented 4 years ago

你好,2020年1月1日提交的版本是尚未完成的版本,只是在orbslam的基础上加入了光流跟踪计算相机位姿,并没有orbslam主体产生影响。稍后我会提交下一个版本

XinnWang commented 4 years ago

您好,十分感谢您的更新。我看到您的代码是只支持RGBD相机的版本,想问下您是否考虑增加单目相机的支持呢?如果您没有这个计划,我fork了您的代码,按照您的想法改了一个单目的版本,但是跑起来效果不是很理想,尤其是弯道的地方。如果您有空的话,可以帮我看看嘛?代码地址 再次感谢您的帮助。

suffeeen commented 4 years ago

单目情况跑不好是正常的,尤其是转弯的时候,场景变化太大,图像也会变模糊,匹配就更难了。而且单目情况下,一对配对点提供的约束要小于双目和rgbd的情况,而且每对配对点的误差比双目和rgbd误差更大,更容易被判断为outlier。 如果是项目需要,建议换传感器,做多传感器融合。 如果只是想减少单目跟踪失败的情况,只能尽可能多的产生3D点,并在跟踪到3D点较少的情况下立刻插入新的3D点。 有两个方法,一个降低插入关键帧的要求,在Tracking::NeedNewKeyFrame()中降低c3、c4、c5的要求,还有一个是尽可能多的用关键帧三角化生成3D点,在 LocalMapping::CreateNewMapPoints() { if(ratioBaselineDepth<0.01) continue; } 把0.01改小,也可以直接改为false试试 这两种方法应该会减少跟踪失败的情况,但会降低运行速度,而且提升有限。 还有一个比较玄学的修改方式: 修改: Optimizer::PoseOptimization(Frame *pFrame) 把这个数组里面的值改大,应该可以增加inlier的数量: const float chi2Mono[4]={5.991,5.991,5.991,5.991};