ORB-SLAMという自己位置推定のアルゴリズムを7,8年前に動かして遊んだ記憶があるのですが、現在ではバージョン3まで出ているそうなので知識をアップデートする為にビルドして遊んでみました。

WindowsのWSL2を使って行ってみたのですが思ったよりも苦労したので記録に残しておきます。

環境

Windows : 10 / 11
WSL2 : Ubuntu 22.04
ORB-SLAM3 : v1.0-release / v0.4-beta
OpenCV : v1.0用 4.5.5 / v0.4用 3.2.0
Pangolin : 0.9.1
Eigen3 : 3.4.0

 

ORB-SLAM3とは

ざっくり理解ではIMUデータ対応とアルゴリズムの修正により大幅に性能が向上したバージョンだそうです。

ちなみに初代と2との違いは下記記事で詳しくまとめられています。

ORB-SLAM3のビルド情報

 

WSLでUbuntuをインストールする

DL可能なリストを確認

wsl --list --online

バージョンを指定してインストールしますが、Ubuntu-20.04はお勧めしません。

wsl --install -d Ubuntu-22.04

注1:Ubuntu-20.04ではORBコンパイル時にpthreadの参照エラーが出たので22.04を選びました。
注2:ORB-SLAM3が利用するpangolinはUbuntu-20.04ではビルドエラーが起きます。[Build failed on ubuntu20.04 #913]

インストール完了後、再起動が求められたり求められなかったりします。
(私の場合はWindows11で初回インストール時に再起動要求)

ユーザー名/パスワードを設定後に念のためアップデートをしておきます。
このアップデートでORBのウィンドウが表示されない問題が解決する場合があります。

wsl --update

wslの状態確認コマンドは下記です。

#Linux稼働状態の確認
wsl -l -v
#Linuxのシャットダウン。wsl上のcuiでshutdownしても止まらない場合用。
wsl --shutdown

コマンドラインでの操作は以上です。

次にUbuntuに移動してツールのインストールを行います。

sudo install gcc g++ ffmpeg cmake git pkg-config
#いちいちY/n確認されるのが嫌な場合は下記の通り-yオプション
sudo install -y gcc g++ ffmpeg cmake git pkg-config

最終的なフォルダ構成は下記の用に作っていきます。

SLAM/ [mkdir]
 ├ ORB-SLAM3/ [git clone]

 ├ Datasets/ [mkdir]
 └ lib/ [mkdir]
  ├Pangolin / [git clone]
  └ opencv/ [git clone]

 

Pangolinのビルド

プロジェクトのダウンロード

git clone --recursive https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin

gitのインストールガイドに従ってスクリプトを実行します。

./scripts/install_prerequisites.sh recommended
cmake -B build
cmake --build build
sudo make install

 

OpenCVのインストール

OpenCVのインストール方法については沢山情報があるので、ここでは参考程度に記載します。

依存パッケージのインストールをします。

# Y/nがめんどくさい場合はinstall -yオプションを付ける
sudo apt install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev libpython2.7-dev libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev

プロジェクトのダウンロード

git clone https://github.com/opencv/opencv.git
cd opencv

 

Tag 3.2.0の場合 [ORB-SLAM3 v0.4-beta用]

注:ORB-SLAM3のv1.0ではOpenCVの4.4.x以上のバージョンが必要です。

バージョン変更方法は下記

git checkout 3.2.0

ORB-SLAM3ではC++11系コンパイラを利用しているので、プロジェクトのルートCMakeLists.txtに
– set(CMAKE_CXX_STANDARD 11)
– set(CMAKE_CXX_STANDARD_REQUIRED ON)
の2行を追加します。(もう少しスマートなやり方がある気がします)

# ----------------------------------------------------------------------------
#  Root CMake file for OpenCV
#
#    From the off-tree build directory, invoke:
#      $ cmake <PATH_TO_OPENCV_ROOT>
#
# ----------------------------------------------------------------------------

# Disable in-source builds to prevent source tree corruption.
if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}")
  message(FATAL_ERROR "
FATAL: In-source builds are not allowed.
       You should create a separate directory for build files.
")
endif()
#---------------------------------------
# My Change
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#---------------------------------------
include(cmake/OpenCVMinDepVersions.cmake)

後はBuildディレクトリを作りmakeしていきます。
インストールフォルダは/user/localにしていますがお好みで。

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)
sudo make install

たいていの場合はすんなりいかないと思いますので、下記に私が遭遇したエラーとその解決策を記載します。

sleep_forエラー対応 : [build fails with gcc 11.0.0 #19244]

opencv/modules/gapi/test/test_precomp.hppに#include <thread>を追加。

CMake Error at cmake/OpenCVCompilerOptions.cmake:21 (else): Flow control statements are not properly nested. エラー : [git issue]

2.xで潰されたはずなのに何故か発生しました。
要するにcmakeファイルのif-elseの対応が壊れているだけなのでコメントアウトでごり押しします。(21-22行目をコメントアウト)

      if(IS_CCACHE_WORKS)
        set(CMAKE_COMPILER_IS_CCACHE 1)
      else()
        message(STATUS "Unable to compile program with enabled ccache, reverting...")
        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${__OLD_RULE_LAUNCH_COMPILE}")
      endif()
    # else()
    #  message(STATUS "Looking for ccache - not found")
    endif()
  endif()
endif()

ffmpegのcap_ffmpeg_impl.hppファイルundeclared系エラー : [git issue]

これも力技で宣言してしまいます[modules/videoio/src/cap_ffmpeg_impl.hppファイル内に宣言追加]

#include <assert.h>
#include <algorithm>
#include <limits>

// My Change
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
// My Change End

#define CALC_FFMPEG_VERSION(a,b,c) ( a<<16 | b<<8 | c )

関連情報:link

 

Tag 4.5.5の場合 [ORB-SLAM3 v1.0-release用]

バージョン変更方法は下記

git checkout 4.5.5

ORB-SLAM3ではC++11系コンパイラを利用しているので、プロジェクトのルートCMakeLists.txtに
– set(CMAKE_CXX_STANDARD 11)
– set(CMAKE_CXX_STANDARD_REQUIRED ON)
の2行を追加します。(もう少しスマートなやり方がある気がします)

# ----------------------------------------------------------------------------
#  Root CMake file for OpenCV
#
#    From the off-tree build directory, invoke:
#      $ cmake <PATH_TO_OPENCV_ROOT>
#
# ----------------------------------------------------------------------------

# Disable in-source builds to prevent source tree corruption.
if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}")
  message(FATAL_ERROR "
FATAL: In-source builds are not allowed.
       You should create a separate directory for build files.
")
endif()
#---------------------------------------
# My Change
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#---------------------------------------
include(cmake/OpenCVMinDepVersions.cmake)

後はBuildディレクトリを作りmakeしていきます。
インストールフォルダは/user/localにしていますがお好みで。

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)
sudo make install

3.x系と異なり割とすんなりとビルドが通りました。

Eigen3のインストール

sudo apt install libeigen3-dev

 

ORB-SLAM3のビルド

ReadMeにはDBoW2とg2oをインストールするよう指示がありますが、実際はbuild.sh内で自動的に行われるので自前で用意しなくても大丈夫です。

依存関係のインストール

sudo apt install libboost-filesystem-dev libboost-serialization-dev libssl-dev

プロジェクトのダウンロード

git clone https://github.com/UZ-SLAMLab/ORB_SLAM3
cd ORB_SLAM3
git checkout v1.0-release
chmod +x build.sh

CMakeLists.txtの修正[git issue : ./build.sh Error]

sed -i 's/++11/++14/g' CMakeLists.txt

ビルド実行
注:v0.4をビルドする場合はbuild.shを実行する前に修正項目があります。

./build.sh

Compile time error fix: cv::Matx / float #312 [v0.4用]

src/LocalMapping.ccとsrc/CameraModels/KannalaBrandt8.cppの2つを修正後にbuild.shを実行します。

// src/LocalMapping.ccの628行目を下記に修正
x3D = x3D_h.get_minor<3,1>(0,0) (1 / x3D_h(3));

// src/CameraModels/KannalaBrandt8.cppの534行目を下記に修正
x3D = x3D_h.get_minor<3,1>(0,0) (1 / x3D_h(3));

 

サンプルデータを使った動作確認

ORB-SLAM3のビルドに成功するとExamplesフォルダにEuRoCオープンソースデータ対応のサンプルがあるので実行してみます。

# データのDL
wget -c http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_01_easy/MH_01_easy.zip

# フォルダ作成
mkdir -p Datasets/MH01

# データの解凍とコピー。unzipが無い場合はsudo apt install unzip後
unzip MH_01_easy.zip -d Datasets/MH01

# SLAMフォルダへ移動
cd ORB-SLAM3

# ORB-SLAM3実行
./Examples/Monocular-Inertial/mono_inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml ../Datasets/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono

上記ですんなり成功した場合はおめでとうございます。

初めてWSLでUbuntuを入れるとウィンドウが表示されない場合が大半だと思うので、下記にエラーとその対応策を列挙します。

Loading images for sequence 0…LOADED!で止まる

サンプルデータのディレクトリの指定ミスだと思われます。
このブログの場合は実行コマンドの3番目の引数”../Datasets/MH01″です。

gtk-warning cannot open display

コマンドプロンプトで”wsl –update”後に~./bashrcを開き下記2行を追加。

export DISPLAY=:0
export LIBGL_ALWAYS_INDIRECT=0

追加後に再起動

source ~/.bashrc
sudo reboot

適当なアプリのウィンドウが表示されるかのチェック。
[下記はgeditエディタでのチェック例]

sudo apt install gedit
gedit test.txt

Pangolin X11: Failed to open X display

主にwsl2でディスプレイを表示させる事が出来ない場合に発生していると考えられます。gtk-warning cannot open displayの場合と同じ処置。

malloc(): unsorted double linked list corrupted

malloc()はあったりなかったりします。
wsl2のせいなのかOpenCVのせいなのか場合によると思いますが、私はOpenCVのバージョンを4.4.0->4.5.5に上げたところ解決しました。

Fail to track local map!で止まる

Examples/Monocular/mono_euroc.cc内の83行目の4番目の引数をtrueに修正[git issue]

// Search the line `ORB_SLAM3::System # the modify the 4th argument from `false` to `true`.
SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR, true);

私の出合ったエラーは以上になります。

sam

sam

流山おおたかの森Techブログの管理人です。 お仕事のご依頼などはmail or Twitter[https://twitter.com/sam_sumario]で連絡頂けると反応出来ます。
Previous post jetson XavierとAX210[wifiモジュール]のセットアップ方法まとめ
Next post DROID-SLAMのインストールが失敗した話

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です