ubuntu16.04配置ORBSLAM3遇到的一系列问题,记录一下

ubuntu16.04配置ORBSLAM3遇到的一系列问题,记录一下。

我使用的ubuntu系统自带ROS的opencv3.3.1以及自己装的另一个版本opencv4.0.0,默认opencv的使用版本是4.0.0;同时eigen3已经命令行安装在了/usr/include/eigen3中。

问题1:编译时opencv报大量语法错误,显示使用opencv4.0.0时相关语法错误。

查看编译信息,cmake检索到的opencv版本均为4.0.0,orbslam3和里面的DBoW对应的cmakelists文件,均如下:

// An highlighted block
#find_package(OpenCV 4.0)
#if(NOT OpenCV_FOUND)
#  find_package(OpenCV 3.0)
#  if(NOT OpenCV_FOUND)
#    message(FATAL_ERROR "OpenCV > 3.0 not found.")
#  endif()
#endif()

默认优先使用4.0,但是不知道为什么会报大量错误,本来3和4的语法有很多大的变动应该,因此这里将opencv的搜索路径自定义如下,同时注释掉本来的find_package和include_directories对应的opencv部分,在orbslam3和里面的DBoW对应的cmakelists文件中都进行相关操作。

// An highlighted block
set(OpenCV_DIR /opt/ros/kinetic/share/OpenCV-3.3.1-dev)
find_package(OpenCV REQUIRED)

问题2:找不到eigen3导致编译中断。

orbslam3的cmakelists文件对应搜索eigen的内容是:

// An highlighted block
# find_package(Eigen3 3.1.0 REQUIRED)//这里
...
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include/CameraModels
# ${EIGEN3_INCLUDE_DIR}//和这里
${Pangolin_INCLUDE_DIRS}
)

由于命令行安装不能自定义安装位置,别的帖子很多建议源码安装,如果不想卸了重新装一遍,可以直接在cmakelists文件中注释掉先关内容并添加include_directories("/usr/include/eigen3"),具体如下:

// An highlighted block
include_directories("/usr/include/eigen3")//添加
# find_package(Eigen3 3.1.0 REQUIRED)//注释掉
find_package(Pangolin REQUIRED)
find_package(realsense2)

include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include/CameraModels
# ${EIGEN3_INCLUDE_DIR}//注释掉
${Pangolin_INCLUDE_DIRS}
)

解决!

问题3:x3D = x3D_h.get_minor<3,1>(0,0) / x3D_h(3); 提示error: no match for ‘operator/’

不知道原作者怎么编译通过的,应该是是重载了这个符号,但是这里直接这样写是不合格的,有两个地方提示出错:

// An highlighted block
/ORB_SLAM3/src/LocalMapping.cc:628:49: error: no match for ‘operator/ (operand types are ‘cv::Matx<float, 3, 1>’ and ‘float’)
                 x3D = x3D_h.get_minor<3,1>(0,0) / x3D_h(3);
// An highlighted block
/ORB_SLAM3/src/CameraModels/KannalaBrandt8.cpp:534:41: error: no match for ‘operator/ (operand types are ‘cv::Matx<float, 3, 1>’ and ‘float’)
         x3D = x3D_h.get_minor<3,1>(0,0) / x3D_h(3);

在源码中的这两个地方,将x3D = x3D_h.get_minor<3,1>(0,0) / x3D_h(3);
修改为如下,参考自:https://blog.csdn.net/Mwithz/article/details/117222990

// An highlighted block
x3D = cv::Matx31f(x3D_h.get_minor<3,1>(0,0)(0) / x3D_h(3), x3D_h.get_minor<3,1>(0,0)(1) / x3D_h(3), x3D_h.get_minor<3,1>(0,0)(2) / x3D_h(3));

最后测试运行数据集,来自01序列
https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets#downloads

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值