首先,怎么下载和安装ORB-SLAM2就不说了,网上一大堆教程,这里贴两个:
https://www.ncnynl.com/archives/201807/2501.html
https://github.com/raulmur/ORB_SLAM2
需要注意的是,Kinect自己带了一个opencv3.3.1,我以前安了一个3.4.0,后来又安了一个2.4.16.6,这样opencv就比较乱,在执行./build.sh的时候就会报错,大概是这种类型的错误
于是我就把opencv2.4.16.6给卸载了,没想到它把3.4.0也卸了一部分相同的部分,导致的结果是3.4.0的测试程序能跑,但是系统检测不到安装了opencv,输入
pkg-config --modversion opencv
会显示没有安装opencv,于是我就是所有opencv相关的都卸了想重新安装,重装的过程中,cmake的时候竟然出错了,查了半天看大体的意思是以前装过,哪里有了错误怎样怎样,反正解决办法是https://blog.csdn.net/midi666/article/details/95522211
到现在就安装好了opencv,
./build.sh 在这里可能报错,应该sudo一下可以通过了,跑了下数据集也没问题。
然后就想跑下自己的turtlebot,然而在./build_ros.sh时,又出现了最开始那个错误,我很一脸懵逼,又查,结果是因为这次编译的时候用的是ROS,所以编译的时候就指到了Kinect自带的opencv3.3.1,就会报那个错误。经过我的不懈努力,最终很遗憾,也没找到方法。。。下面把试过的方法总结一下吧。。
一、在/opt/ros/kinetic/share/OpenCV-3.1.0-dev/OpenCVConfig.cmake
里面的第144行和116行
# Extract the directory where *this* file has been installed (determined at cmake run-time)
if(CMAKE_VERSION VERSION_LESS "2.8.12")
get_filename_component(OpenCV_CONFIG_PATH "${CMAKE_CURRENT_LIST_FILE}" PATH CACHE)
else()
get_filename_component(OpenCV_CONFIG_PATH "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY CACHE)
endif()
说是把CACHE去掉就行,上面这个程序是网上的,我把我的打开一看,是下面这样的:
if(CMAKE_VERSION VERSION_LESS "2.8.3")
get_filename_component(CMAKE_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
endif()
# Extract the directory where *this* file has been installed (determined at cmake run-time)
# Get the absolute path with no ../.. relative marks, to eliminate implicit linker warnings
set(OpenCV_CONFIG_PATH "${CMAKE_CURRENT_LIST_DIR}")
get_filename_component(OpenCV_INSTALL_PATH "${OpenCV_CONFIG_PATH}/../../" REALPATH)
首先人家就没有CACHE,而且人家直接set(OpenCV_CONFIG_PATH "${CMAKE_CURRENT_LIST_DIR}"),我就把set这一句注释掉了,再把上面的那一段复制过来。结果。。没啥用。
二、在ORB-SLAM2的CMakelist里
find_package(OpenCV 3.3.1 QUIET)
if(NOT OpenCV_FOUND)
find_package(OpenCV 3.3.1 QUIET)
if(NOT OpenCV_FOUND)
message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
endif()
endif()
就把3.3.1和2.4.16.6换来换去,如果先是2.4.16.6的话,./build.sh倒是能编译过去,./build_ros.sh还是不行。
又说在target-link-library()里面加入:
/usr/lib/x86_64-linux-gnu/libboost_system.so
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so12
还是没啥用。
三、把./build_ros.sh里面的make -j的-j去掉,说是避免多线程运行的错误,我感觉没啥用,事实证明,确实没啥用。。
四、在ORB-SLAM2/Examples/ROS/ORB-SLAM2/Cmakelists中,加入下面的部分:
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
-lboost_system
)
也没啥用。
五、在ORB-SLAM2的src的ORBextractor.cc中加入:
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/imgproc/imgproc.hpp>12
没啥用。
总结:没找到合适的办法,猜测可能有用的方法是:
1.把Kinect自带的opencv卸了。。感觉风险有点大,不想这么做。
2.把自己安装的opencv卸了,用Kinect自带的。但是感觉也够呛。
补充:试过了,也不行。而且卸载了后,./build.sh也编译不过去了,,心累。
3.Kinect跑自己的ORB-SLAM2不适合。。还是14.04把。