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

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

一起做RGB-D SLAM(4):

1.CMake Error: The current CMakeCache.txt directory /home/slam/build/CMakeCache.txt is different than the directory /home/slam/build where CMakeCache.txt was created. This may result in binaries being created in the wrong place. If you are not sure, reedit the CMakeCache.txt CMake Error: The source “/home/slam/CMakeLists.txt” does not match the source “/home/slam/CMakeLists.txt” used to generate cache. Re-run cmake with a different source directory.

这个错误时因为CMakeLists里面没有添加可执行二进制文件,在src/CMakeLists.txt文件末尾添加如下代码即可:

ADD_EXECUTABLE( joinPointCloud joinPointCloud.cpp)
TARGET_LINK_LIBRARIES( joinPointCloud
    slambase
    ${OpenCV_LIBS} 
    ${PCL_LIBRARIES} )

2./home/slam/src/slambase.cpp:45:17: error: ‘FeatureDetector’ is not a member of ‘cv’ cv::Ptrcv::FeatureDetector _detector;

这个错误是因为缺少头文件,在include/slamBase.h里加上即可:

#include <opencv2/calib3d/calib3d.hpp>

3./home/max/slam0.1/slamt(复件)1/src/slamBase.cpp:48:9: error: ‘initModule_nonfree’ is not a member of ‘cv’ cv::initModule_nonfree();

这个错误之前说过,详情参考:
一起做RGB-D SLAM(3)BUG笔记第2个bug。

这里我们把src/slamBase.cpp里的这行代码删掉即可:

cv::initModule_nonfree();

4./home/max/slam0.1/slamt(复件)1/src/slamBase.cpp:48:38: error: ‘create’ is not a member of ‘cv::FeatureDetector {aka cv::Feature2D}’ _detector = cv::FeatureDetector::create( detector.c_str() );

出现这个错误应该可以猜到,是opencv版本问题,3.0版本以上的特征检测器和描述子提取器是这样初始化的:

cv::Ptrcv::FeatureDetector detector;
cv::Ptrcv::DescriptorExtractor descriptor;
detector = cv::SIFT::create();
descriptor = cv::SIFT::create();

所以,照理我们需要这样改写:

cv::Ptrcv::FeatureDetector _detector;
cv::Ptrcv::DescriptorExtractor _descriptor;
_detector = cv::detector.c_str()::create();
_descriptor = cv::descriptor.c_str()::create();

但是,由于c++没有类似eval()的函数,不能直接用传进来的字符串做函数方法名,因此只能用最简单的if判断了(本人小白,欢迎各位大佬在评论区留下更好的方法哈):
修改src/slambase.cpp文件:
在这里插入图片描述

将上图白框处代码替换为:

if (detector == "ORB")
{
    _detector = cv::ORB::create();
}

if (descriptor == "ORB")
{
    _descriptor = cv::ORB::create();
}

这里我只判断了ORB算法,如果安装了opencv的扩展模块的话,大家可自行添加其余算法。

5./usr/lib/gcc/x86_64-linux-gnu/7/…/…/…/x86_64-linux-gnu/Scrt1.o:在函数‘_start’中:(.text+0x20):对‘main’未定义的引用collect2: error: ld returned 1 exit status src/CMakeFiles/joinPointCloud.dir/build.make:361: recipe for target ‘…/bin/joinPointCloud’ failed make[2]: *** […/bin/joinPointCloud] Error 1 CMakeFiles/Makefile2:241: recipe for target ‘src/CMakeFiles/joinPointCloud.dir/all’ failed make[1]: *** [src/CMakeFiles/joinPointCloud.dir/all] Error 2 Makefile:83: recipe for target ‘all’ failed make: *** [all] Error 2

出现这个错误是pcl库的问题,在src/CMakeLists.txt中,加入下面代码:

FIND_PACKAGE(PCL REQUIRED COMPONENTS common io visualization filters)

(如果出现的是绿黑红三色块,按r键可以重置视角)
如果问题还未解决,则只能把src/joinPointCloud.cpp里最后一段代码删除(下图白框处内容):
在这里插入图片描述

这里删除以后,拼合的点云图结果需要用pcl_viewer自行去查看。

6.extracting features Unknown detector or discriptor type !SIFT,SIFT Unknown detector or discriptor type !SIFT,SIFT

在执行bin/joinPointCloud文件时出现这个错误,看看根目录下的parameters.txt文件里的算法是否正确(没安装opencv扩展模块,需要改为ORB算法):

detector=ORB
descriptor=ORB

7.terminate called after throwing an instance of ‘cv::Exception’ what(): OpenCV(3.4.9) /home/max/SLAM-env/opencv-3.4.9/modules/flann/src/miniflann.cpp:315: error: (-210:Unsupported format or combination of formats) in function ‘buildIndex_’ > type=0 > 已放弃 (核心已转储)

这个错误是因为我们用的ORB算法的描述子为uchar,只能使用BruteForce匹配法。将src/slamBase.cpp里(下图白框处)匹配方法代码改为:

cv::BFMatcher matcher;

在这里插入图片描述

8.terminate called after throwing an instance of ‘cv::Exception’ what(): OpenCV(3.4.9) /home/max/SLAM-env/opencv-3.4.9/modules/calib3d/src/ptsetreg.cpp:172: error: (-215:Assertion failed) confidence > 0 && confidence < 1 in function ‘run’ 已放弃 (核心已转储)

这个错误之前也说过,是因为opencv版本问题,3.0以上使用solvepnpransac函数时要修改置信度。将src/slamBase.cpp里(下图白框处)匹配方法代码改为:

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

在这里插入图片描述

9. 点云图拼接错误或拼合的两幅点云图相距很远,并未拼合在一起

这个基本都是因为计算的变换矩阵R和平移矩阵T不正确(正确值应该都是正负零点几)。
看下src/slamBase.cpp里的point2dTo3d函数是否写对,p.x和p.y的计算都是用的p.z而非point.z。

ps:高博在src/joinPointCloud.cpp里有一段代码写错了(如下图白框处所示):
在这里插入图片描述

这里在计算变换矩阵时把平移向量当成了[1,3],实际上是[3,1],应按如下修改:

T(0,3) = result.tvec.at<double>(0,0);
T(1,3) = result.tvec.at<double>(1,0);
T(2,3) = result.tvec.at<double>(2,0);

不过这个对结果的影响不是很大。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值