一起做RGB-D SLAM(7)BUG笔记

跟做高博的《一起做RGB-D SLAM》系列时,出现了挺多bug的(主要因为自己还是个小白),在此记录下解决过程。(ubuntu18.04,opencv3.4.9)

一起做RGB-D SLAM(7):

1.安装g20

参照一起做RGB-D SLAM(6)BUG笔记的第一个问题

2.error: no matching function for call to ‘g2o::BlockSolver >::BlockSolver(SlamLinearSolver*&)’ SlamBlockSolver* blockSolver = new SlamBlockSolver( linearSolver );

这个错误在一起做RGB-D SLAM(6)BUG笔记的第二个错误说过,因为g2o新版本和旧版本在智能指针上不兼容导致的。把src/slam.cpp的g2o初始化部分(下图白框处内容)改为:

unique_ptr<SlamBlockSolver::LinearSolverType> linearSolver (new SlamLinearSolver());
unique_ptr<SlamBlockSolver> blockSolver (new SlamBlockSolver( move(linearSolver) ));
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( move(blockSolver) );

一起做RGB-D SLAM(7)BUG笔记_第1张图片

3.error: ‘RED’ was not declared in this scope cout<

对这些颜色进行定义即可,在include/slamBase.h的末尾,添加:

#define RESET "\033[0m"
#define BLACK "\033[30m"
#define RED "\033[31m"
#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define BLUE "\033[34m"
#define MAGENTA "\033[35m"
#define CYAN "\033[36m"
#define WHITE "\033[37m"
#define BOLDBLACK "\033[1m\033[30m"
#define BOLDRED "\033[1m\033[31m"
#define BOLDGREEN "\033[1m\033[32m"
#define BOLDYELLOW "\033[1m\033[33m"

4.error: ‘__gnu_cxx::__alloc_traits::value_type {aka struct FRAME}’ has no member named ‘frameID’ dynamic_castg2o::VertexSE3*(globalOptimizer.vertex( keyframes[i].frameID ));

一起做RGB-D SLAM(6)BUG笔记的第四个错误说过,在include/slamBase.h里(下图白框处)加上:

int frameID;

一起做RGB-D SLAM(7)BUG笔记_第2张图片

5.slam.cpp:(.text+0x990):对‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(std::unique_ptr)’未定义的引用slam.cpp:(.text+0x9b5):对‘g2o::SparseOptimizer::SparseOptimizer()’未定义的引用slam.cpp:(.text+0x9ce):对‘g2o::SparseOptimizer::setAlgorithm(g2o::OptimizationAlgorithm*)’未定义的引用slam.cpp:(.text+0x9e2):对‘g2o::SparseOptimizer::setVerbose(bool)’未定义的引用slam.cpp:(.text+0x9f7):对‘g2o::VertexSE3::VertexSE3()’未定义的引用slam.cpp:(.text+0xeff):对‘g2o::OptimizableGraph::save(char const*, int) const’未定义的引用…

src/CMakeLists.txt里添加的slam二进制执行文件要链接一些g2o库,修改为:

ADD_EXECUTABLE(slam slam.cpp)
TARGET_LINK_LIBRARIES(
	slam
	slambase
	${Opencv_LIBS}
	${PCL_LIBRARIES} 
	g2o_core g2o_types_slam3d g2o_solver_csparse g2o_stuff g2o_csparse_extension ${CSPARSE_LIBRARY})

6.bin/slam: error while loading shared libraries: libg2o_opengl_helper.so: cannot open shared object file: No such file or directory

这个错误是因为链接器找不到动态库文件libg2o_opengl_helper.so。ld默认的目录是/lib和/usr/lib,而我的这个库文件在/usr/local/lib,因此需要在src/CMakeLists.txt里加上一句:

LINK_DIRECTORIES("/usr/local/lib")

7.parameter file does not exist. Parameter name start_index not found! Parameter name end_index not found! Initializing … Parameter name rgb_dir not found! Parameter name depth_dir not found! Parameter name rgb_extension not found! Parameter name depth_extension not found! Parameter name detector not found! Parameter name descriptor not found!

这个错误应该很明显了,配置文件没读取到,我是把配置文件放到data目录下了,所以要把include/slamBase.h参数读取类里把"./parameters.txt"改为:

"data/parameters.txt"

8.Not enough inliers.Reading files 3 Not enough inliers.Reading files 4 Not enough inliers.

所有数据都出错的话,大概率应该是数据路径出了问题,在parameters.txt里,把数据所在目录改为:

rgb_dir=data/rgb_png/
rgb_extension=.png
depth_dir=data/depth_png/
depth_extension=.png

ps:也可以改为绝对路径。

9.error: (-2:Unspecified error) in function ‘void cvFindExtrinsicCameraParams2(const CvMat*, const CvMat*, const CvMat*, const CvMat*, CvMat*, CvMat*, int)’> DLT algorithm needs at least 6 points for pose estimation from 3D-2D point correspondences. (expected: ‘count >= 6’), where> ‘count’ is 5 > must be greater than or equal to > ‘6’ is 6 已放弃 (核心已转储)————运行bin/slam时出错。

这个问题和一起做RGB-D SLAM(5)BUG笔记第11个bug里的不一样,修改ransac的内部阈值没用。
这个问题困扰我了好久,明明传入的obj和img点对有几十对,但是在solvepnpransac内部调用cvFindExtrinsicCameraParams2函数时候,就变成了5对。修改了迭代次数、ransac阈值、置信度什么的都没用。查看opencv相关源码时候,发现了一个地方(下图白框处):
一起做RGB-D SLAM(7)BUG笔记_第3张图片
这里就是报错的地方,而他在else里!!!!! 灵机一动,找到对应的if,发现是在判断solvepnpransac()的一个参数值是否为true(useExtrinsicGuess参数),抱着试一试的心态,把对应的参数改为true。。。。。。结果就运行成功了?what?

~~~~解决方法~~~~: 首先要保证,点对数目大于5,在src/slamBase.cpp里(下图白框处)加上两个判断:优化匹配点对数目至少要6对以上:

if (goodMatches.size() <= 5) 
{
     result.inliers = -1;
     return result;
}

输入solvepnpransac函数的前一帧三维点对和后一帧二维点对数目至少要大于5(注意,这里一定要大于5对):

if (pts_obj.size() <=5 || pts_img.size() <= 5)
{
     result.inliers = -1;
     return result;
}

一起做RGB-D SLAM(7)BUG笔记_第4张图片
然后将src/slamBase.cpp(下图白框处)改为:

cv::solvePnPRansac( pts_obj, pts_img, cameraMatrix, cv::Mat(), rvec, tvec, true, 100, 1.0, 0.99, inliers );

一起做RGB-D SLAM(7)BUG笔记_第5张图片
这个bug具体的出错原因至今不明白,希望有大佬可以在评论区答疑解惑一下,大家有其他解决方法也欢迎交流哈。

运行结果不错,优化的人影也可以看出来,奶斯!

你可能感兴趣的:(手撕vslam,slam,ubuntu,c++,cmake,计算机视觉)