之前有記錄關於ORB_SLAM的第一個版本的編譯,每次就是要編譯程序,都會遇到很多問題,並不是所謂的按照教程來就一定能編譯成功,所以這一次編譯也遇到了很多問題。百度的時候也看到網上有很多相似的問題,但是也有很多還沒有解決的問題,恰好的我也遇到了,並且解決了。
首先默認電腦環境ubuntu14.04和ROS indigo已經裝好。
1. 安裝Pangolin,用於可視化和用戶接口
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake -DCPP11_NO_BOOST=1 ..
make -j
如果出現Could NOT find GLEW錯誤 ,就是要安裝一些依賴項
就是sudo apt-get install 以下這些依賴項
libx11-dev libxmu-dev libglu1-mesa-dev libgl2ps-dev libxi-dev g++ libzip-dev libpng12-dev libcurl4-gnutls-dev libfontconfig1-dev libsqlite3-dev libglew*-dev libssl-dev
2.安裝BLAS和LAPACK
sudo apt-get install libblas-dev sudo apt-get install liblapack-dev
3 構建ORB_SLAM2庫
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2 cd ORB_SLAM2 chmod +x build.sh ./build.sh
問題(1)
可能會出現在./build.sh 這一步,如果出現的錯誤大部分是跟openni.h和XnCppWrapper.h有關的話,請看這位大神的博客是可以解決問題的
www.cnblogs.com/liufuqiang/p/5618335.html
問題(2)
如果在編譯ORB_SLAM2時出現卡住的情況,無論怎么重新編譯都會無法通過,網上也查不到關於卡住怎么辦 的解決辦法
http://tieba.baidu.com/p/4475718587就像這個貼吧里說的這樣,只能ctrl+c,如如下圖
如果編譯的過程中卡住了 解決辦法:把make -j 改為make -l,看一下make的用法:
Usage: make [options] [target] ...
Options:
-b, -m Ignored for compatibility.
-B, --always-make Unconditionally make all targets.
-C DIRECTORY, --directory=DIRECTORY
Change to DIRECTORY before doing anything.
-d Print lots of debugging information.
--debug[=FLAGS] Print various types of debugging information.
-e, --environment-overrides
Environment variables override makefiles.
-f FILE, --file=FILE, --makefile=FILE
Read FILE as a makefile.
-h, --help Print this message and exit.
-i, --ignore-errors Ignore errors from commands.
-I DIRECTORY, --include-dir=DIRECTORY
Search DIRECTORY for included makefiles.
-j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no arg.
-k, --keep-going Keep going when some targets can't be made.
-l [N], --load-average[=N], --max-load[=N]
Don't start multiple jobs unless load is below N.
-L, --check-symlink-times Use the latest mtime between symlinks and target.
-n, --just-print, --dry-run, --recon
Don't actually run any commands; just print them.
-o FILE, --old-file=FILE, --assume-old=FILE
Consider FILE to be very old and don't remake it.
-p, --print-data-base Print make's internal database.
-q, --question Run no commands; exit status says if up to date.
-r, --no-builtin-rules Disable the built-in implicit rules.
-R, --no-builtin-variables Disable the built-in variable settings.
-s, --silent, --quiet Don't echo commands.
-S, --no-keep-going, --stop
Turns off -k.
-t, --touch Touch targets instead of remaking them.
-v, --version Print the version number of make and exit.
-w, --print-directory Print the current directory.
--no-print-directory Turn off -w, even if it was turned on implicitly.
-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
Consider FILE to be infinitely new.
--warn-undefined-variables Warn when an undefined variable is referenced.
這樣就編譯成功,如圖:
4.編譯生成ROS節點:根據read.md
在 ~/.bashrc添加路徑
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS
然后進入“Examples/ROS/ORB_SLAM2:執行
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make -j
可能出現的錯誤就是在 cmake .. -DROS_BUILD_TYPE=Release 如下圖
意思是cv_bridge找不到opencv 的依賴項,即使把package.xml文件中的cv_bridge去除,雖然可以cmake成功,但是依賴項沒有了。后面的make 也不能成功,
所以就把CMakefile.txt文件中

cmake_minimum_required(VERSION 2.4.6) include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake) rosbuild_init() IF(NOT ROS_BUILD_TYPE) SET(ROS_BUILD_TYPE Release) ENDIF() MESSAGE("Build type: " ${ROS_BUILD_TYPE}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native") # Check C++11 or C++0x support include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_definitions(-DCOMPILEDWITHC11) message(STATUS "Using flag -std=c++11.") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") add_definitions(-DCOMPILEDWITHC0X) message(STATUS "Using flag -std=c++0x.") else() message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../../cmake_modules) find_package(OpenCV 2.4.3 REQUIRED) find_package(Eigen3 3.1.0 REQUIRED) find_package(Pangolin REQUIRED) include_directories( ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/../../../ ${PROJECT_SOURCE_DIR}/../../../include ${Pangolin_INCLUDE_DIRS} ) 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 ) # Node for monocular camera rosbuild_add_executable(Mono src/ros_mono.cc ) target_link_libraries(Mono ${LIBS} ) # Node for stereo camera rosbuild_add_executable(Stereo src/ros_stereo.cc ) target_link_libraries(Stereo ${LIBS} ) # Node for RGB-D camera rosbuild_add_executable(RGBD src/ros_rgbd.cc ) target_link_libraries(RGBD ${LIBS} )
改寫為
cmake_minimum_required(VERSION 2.8.3) #版本不同 project(orb_slam2) find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs image_transport message_filters cv_bridge cmake_modules) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native") # Check C++11 or C++0x support include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_definitions(-DCOMPILEDWITHC11) message(STATUS "Using flag -std=c++11.") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") add_definitions(-DCOMPILEDWITHC0X) message(STATUS "Using flag -std=c++0x.") else() message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../../cmake_modules) find_package(OpenCV 2.4.3 REQUIRED) find_package(Eigen3 3.1.0 REQUIRED) find_package(Pangolin REQUIRED) catkin_package() include_directories( ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/../../../ ${PROJECT_SOURCE_DIR}/../../../include ${Pangolin_INCLUDE_DIRS} ) set(LIBS ${catkin_LIBRARIES} ${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 ) # Node for monocular camera add_executable(mono src/ros_mono.cc ) target_link_libraries(mono ${LIBS} ) # Node for RGB-D camera add_executable(rgbd src/ros_rgbd.cc ) target_link_libraries(rgbd ${LIBS} ) # Node for stereo camera add_executable(stereo src/ros_stereo.cc ) target_link_libraries(stereo ${LIBS} )
把manifest.xml文件內容
<package> <description brief="ORB_SLAM2"> ORB_SLAM2 </description> <author>Raul Mur-Artal</author> <license>GPLv3</license> <depend package="roscpp"/> <depend package="tf"/> <depend package="sensor_msgs"/> <depend package="image_transport"/> <depend package="cv_bridge"/> </package>
刪除改為package.xml 內容為
<package> <name>orb_slam2</name> <version>0.0.1</version> <description>ORB_SLAM2</description> <author>Raul Mur-Artal</author> <maintainer email="raulmur@unizar.es">Raul Mur-Artal</maintainer> <license>GPLv3</license> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>tf</build_depend> <build_depend>sensor_msgs</build_depend> <build_depend>image_transport</build_depend> <build_depend>message_filters</build_depend> <build_depend>cv_bridge</build_depend> <build_depend>cmake_modules</build_depend> <run_depend>roscpp</run_depend> <run_depend>tf</run_depend> <run_depend>sensor_msgs</run_depend> <run_depend>image_transport</run_depend> <run_depend>message_filters</run_depend> <run_depend>cv_bridge</run_depend> </package>
就可以編譯成功,如果出現卡住,仍然換成make -l
我只是記錄下一些問題,大神請忽略