ORB_SLAM2 環境構築中に出たエラーとその対処

OpenCV

  • OpenCVをcmakeする際に発生
fatal error: stdlib.h: No such file or directory

cmakeにオプションをつけて

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -DENABLE_PRECOMPILED_HEADERS=OFF ..

とすることで解決。


  • opencvのアンインストール
cd build
sudo make uninstall

(openCVのアンインストールを行う場合は先にDBoW2をアンインストールする。)



g2o

  • g2oをcmakeするときに発生
target_compile_features specified unknown feature "cxx_std_14" for target "core".

g2o/g2o/core/CMakeLists.txtをgeditで開き、46行目の

target_compile_features(core PUBLIC cxx_std_14)

を、

set (CMAKE_CXX_STANDARD 14)

とすることで解決。



DBoW2

  • DBoW2をcmakeする際に発生
CMake Error at CMakeLists.txt:32 (find_package):

DBoW2/CMakeLists.txtの32行目に、

find_package(OpenCV REQUIRED)

とあるので、その上の行に、

set(OpenCV_DIR "~/opencv-3.1.0/build")

を追加して解決


  • DBoW2の最新バージョンで発生
error: ‘class cv::ORB’ has no member named ‘detectAndCompute’;
cv::KeyPoint is not a member of 'cv'

opencvのバージョンが古いことが原因のためopencv3.xを入れるか、DBoW2の古いバージョンを入れることで解決しました。


  • DBoW2のアンインストール

makeからはアンインストールできなかったので、手動でアンインストールしました。
sudo make install
一度再インストールを行い、インストール箇所を表示してくれるため、それを見て手動で削除。



ROS

  • 全てインストール完了後、ORB-SLAMを実行する際に発生
OpenCV Error: Bad argument (Invalid pointer to file storage) in cvGetFileNodeByName, file /build/opencv-_msWgW/opencv-2.4.8+dfsg1/modules/core/src/persistence.cpp, line 740
terminate called after throwing an instance of 'cv::Exception'

自分でインストールしたOpenCVとROSに対応するOpenCVのバージョンが異なることが原因。
ROSをインストールする際に自動でROS内部にOpenCVがインストールされます。Ubuntu14.04 ROS IndigoはOpenCV2.4.8に正式対応していてUbuntu16.04 ROS KineticはOpenCV3.1.0に正式対応しています。ROSのバージョンに対応しているOpenCVを入れることで解決します。


ORB-SLAM

  • ./build.shを実行する際に発生
/tmp/cc7KAqxb.s: Assembler messages:
/tmp/cc7KAqxb.s:1008: Error: operand type mismatch for `vxorps'

gcc,g++のバージョンを4.8に戻して解決。


  • ./build.shを実行する際に発生
error: ‘usleep’ was not declared in this scope

https://ei0124.blog.fc2.com/blog-entry-21.html
を参考にして以下のように対処しました。

grep -ril "usleep" ~/ORB_SLAM2/Examples/ | xargs  sed -i 1i#include\ \"unistd.h\"
grep -ril "usleep" ~/ORB_SLAM2/src/ | xargs  sed -i 1i#include\ \"unistd.h\"

src/と.Examples/の中にあるファイルのうちusleepの文字が含まれるものの先頭行に#include "unistd.h"を付加しています。


  • ./build_rosを実行した際に発生
fatal error: Eigen/Core: そのようなファイルやディレクトリはありません

次のように対処します。

gedit ./Examples/ROS/ORB_SLAM2/CMakeLists.txt

テキストエディタでCtrl+Fで検索機能を使い、「include_directories」と入力。以下の箇所に

include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/../../../
${PROJECT_SOURCE_DIR}/../../../include
${Pangolin_INCLUDE_DIRS}
)

一行追加して、このようにします。

include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/../../../
${PROJECT_SOURCE_DIR}/../../../include
${Pangolin_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
)


  • ubuntu 16.04で./build_rosを実行した際に発生
/usr/bin/ld: CMakeFiles/RGBD.dir/src/ros_rgbd.cc.o: シンボル '_ZN5boost6system15system_categoryEv' への未定義参照です
/usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

gedit ./Examples/ROS/ORB_SLAM2/CMakeLists.txt
テキストエディタでCtrl+Fで検索機能を使い、「include_directories」と入力。その下にあるsetの部分を変更して以下のように-lboost_systemを追加します。

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
)


  • いろんなところで発生
warning: ‘Eigen::AlignedBit’ is deprecated (declared at /usr/local/include/eigen3/Eigen/src/Core/util/Constants.h:162) [-Wdeprecated-declarations]

errorではなくwarningなので出てきても一応ビルドは行えました。今回は無視してます。