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