一起做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<g2o::BlockSolverTraits<6, 3> >::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) );

在这里插入图片描述

3.error: ‘RED’ was not declared in this scope cout<<RED"Not enough inliers."<<endl;error: ‘RESET’ was not declared in this scope cout<<RESET"Too close, not a keyframe"<<endl;error: ‘GREEN’ was not declared in this scope cout<<GREEN"This is a new keyframe"<<endl;error: ‘RESET’ was not declared in this scope cout<<RESET"optimizing pose graph, vertices: "<<globalOptimizer.vertices().size()<<endl;

对这些颜色进行定义即可,在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<std::allocator >::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;

在这里插入图片描述

5.slam.cpp:(.text+0x990):对‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::Solver, std::default_deleteg2o::Solver >)’未定义的引用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相关源码时候,发现了一个地方(下图白框处):
在这里插入图片描述
这里就是报错的地方,而他在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;
}

在这里插入图片描述
然后将src/slamBase.cpp(下图白框处)改为:

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

在这里插入图片描述
这个bug具体的出错原因至今不明白,希望有大佬可以在评论区答疑解惑一下,大家有其他解决方法也欢迎交流哈。

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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
RGB-D SLAM是一种同时定位与地图构建(Simultaneous Localization and Mapping)的技术,它利用RGB-D图像来实现对环境的感知和建模。RGB-D图像由RGB图像和深度图像组成,其中RGB图像提供了颜色信息,深度图像则提供了物体距离传感器的实际距离信息。通过将RGB图像和深度图像进行配准,可以实现像素级别的对应关系。RGB-D SLAM可以通过对连续的RGB-D图像进行处理,实时地估计相机的运动轨迹,并同时构建环境的三维地图。 在RGB-D SLAM中,有多种算法和系统可供选择。例如,RGBDSLAM2是一个非常全面优秀的系统,它将SLAM领域的图像特征、优化、闭环检测、点云等技术融为一体,适合初学者使用并可以进行二次开发。然而,RGBDSLAM2的实时性较差,相机必须以较慢的速度运动,并且使用点云来表示三维地图会消耗较多的内存。此外,还有其他的RGB-D SLAM算法和系统可供选择,具体选择哪种算法和系统取决于具体的应用需求和硬件条件。 引用\[1\]中提到了RGB-D图像的组成和配准过程,引用\[2\]中提到了RGB双目相机的特点和限制,引用\[3\]中提到了RGBDSLAM2系统的特点和缺点。这些引用内容提供了关于RGB-D SLAM的基本概念和相关技术的信息。 #### 引用[.reference_title] - *1* [SLAM(二)——RGB-D的含义](https://blog.csdn.net/u013401766/article/details/78671939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [RGBD-SLAM总结](https://blog.csdn.net/YOULANSHENGMENG/article/details/124141028)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [RGB-D SLAM 相关总结](https://blog.csdn.net/qq_38167930/article/details/118879187)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值