ある人から教えてもらった情報が元なんですが、画像認識の一分野としてSLAM(Simultaneous Localization and Mapping:自己位置推定)という技術が在ることを知りました。現存の物だと、お掃除ロボット、未来の物だと、自動運転車などに利用される技術らしいです。
画像認識はいまの自分の主たる研究テーマの一つなのに、こんな興味深い技術をいままで知らないでいたとは不覚です。慌てて、SLAMについて調べ始めています。
入力データの形式によってSLAMにも複数の種類があるようですが、その中でもVisual SLAMに注目しています。
オープンソースとして公開されているVisual SLAMの代表的な実装例として、OpenVSLAMというものがあります。これは国立研究開発法人産業技術総合研究所が開発したものだそうです。
本記事執筆時点でOpenVSLAMのソースは非公開になっているのですが、OpenVSLAMのコミュニティ・フォーク版がGithHub上にいくつか存在しているので、ソースを入手することはできます。
これらの中からstella_vslamを選んで、Ubuntu 18.04上でのビルドと動作確認までやってみました。
stella_vslamのビルドに必要なパッケージの導入
$ sudo apt install -y build-essential pkg-config cmake git wget curl unzip $ sudo apt install -y libatlas-base-dev libsuitesparse-dev $ sudo apt install -y libgtk-3-dev $ sudo apt install -y ffmpeg $ sudo apt install -y libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavresample-dev
$ sudo apt install -y gfortran
$ sudo apt install -y binutils-dev
$ sudo apt install -y libyaml-cpp-dev libgflags-dev
$ sudo apt install -y libglew-dev
$ sudo apt install -y libsqlite3-dev
stella_vslamとリンクされるライブラリのビルドとインストール
Eigenのビルドとインストール
$ git clone -b 3.3 https://gitlab.com/libeigen/eigen.git $ cd eigen $ mkdir build && cd build $ cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ .. $ make -j4 $ sudo make install
OpenCVのビルドとインストール
$ wget -q https://github.com/opencv/opencv/archive/3.4.0.zip $ unzip -q 3.4.0.zip $ cd opencv-3.4.0 $ mkdir build && cd build $ cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DENABLE_CXX11=ON \ -DBUILD_DOCS=OFF \ -DBUILD_EXAMPLES=OFF \ -DBUILD_JASPER=OFF \ -DBUILD_OPENEXR=OFF \ -DBUILD_PERF_TESTS=OFF \ -DBUILD_TESTS=OFF \ -DWITH_EIGEN=ON \ -DWITH_FFMPEG=ON \ -DWITH_OPENMP=ON \ -DWITH_CUDA=OFF \ -DWITH_NVCUVID=OFF \ .. $ make -j4 $ sudo make install
FBoWのビルドとインストール
$ git clone https://github.com/stella-cv/FBoW.git $ cd FBoW $ mkdir build && cd build $ cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ .. $ make -j4 $ sudo make install
g2oのビルドとインストール
$ git clone https://github.com/RainerKuemmerle/g2o.git $ cd g2o $ git checkout 9b41a4ea5ade8e1250b9c1b279f3a9c098811b5a $ mkdir build && cd build $ cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DCMAKE_CXX_FLAGS=-std=c++11 \ -DBUILD_SHARED_LIBS=ON \ -DBUILD_UNITTESTS=OFF \ -DG2O_USE_CHOLMOD=OFF \ -DG2O_USE_CSPARSE=ON \ -DG2O_USE_OPENGL=OFF \ -DG2O_USE_OPENMP=OFF \ .. $ make -j4 $ sudo make install
PangolinViewerのビルドとインストール
$ git clone https://github.com/stevenlovegrove/Pangolin.git $ cd Pangolin $ git checkout ad8b5f83222291c51b4800d5a5873b0e90a0cf81 $ mkdir build && cd build $ cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ .. $ make -j4 $ sudo make install
stella_vslamのビルドとインストール
$ git clone https://github.com/stella-cv/stella_vslam.git $ cd stella_vslam $ git submodule update -i --recursive $ mkdir build && cd build $ cmake \ -DUSE_PANGOLIN_VIEWER=ON \ -DINSTALL_PANGOLIN_VIEWER=ON \ -DUSE_SOCKET_PUBLISHER=OFF \ -DBUILD_TESTS=ON \ -DBUILD_EXAMPLES=ON \ .. $ make -j4 $ sudo make install
stella_vslamの動作確認
$ ./run_kitti_slam -h Allowed options: -h, --help produce help message -v, --vocab arg vocabulary file path -d, --data-dir arg directory path which contains dataset -c, --config arg config file path --frame-skip arg (=1) interval of frame skip --no-sleep not wait for next frame in real time --wait-loop-ba wait until the loop BA is finished --auto-term automatically terminate the viewer --log-level arg (=info) log level --eval-log store trajectory and tracking times for evaluation -p, --map-db arg store a map database at this path after SLAM
上のような結果になれば、stella_vslamのビルドとインストールは成功しているはず。
上記のビルド手順は、stella_vslamのドキュメントサイトに掲載されている情報とほぼ同じですが、一点だけ相違があり、ビルドに必要なパッケージとしてlibsqlite3-devを追加インストールしています。これを入れないと、stella_vslamの "cmake ..." 過程で以下のようなエラーに遭遇します。
CMake Error at /usr/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message): Could NOT find SQLite3 (missing: SQLite3_INCLUDE_DIR SQLite3_LIBRARY) Call Stack (most recent call first): /usr/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE) cmake/FindSQLite3.cmake:57 (find_package_handle_standard_args) src/stella_vslam/CMakeLists.txt:10 (find_package) -- Configuring incomplete, errors occurred!
ビルドできたんなら当然動かしてみたい。プログラムを動かしてみるのが、その中で使われている技術を理解する早道だし。
公式サイトで推薦されているKITTI Visual Odometryという車載画像データセットを利用してstella_vslamの動作確認をやってみました。
下のような手順によって、このデータセットを使ってstella_vslamの動作確認ができます。
# at the stella_vsalm/build directory $ mkdir ../vocab $ mkdir ../dataset $ cd ../vocab $ curl -sL "https://github.com/stella-cv/FBoW_orb_vocab/raw/main/orb_vocab.fbow" -o orb_vocab.fbow $ cd ../dataset # Download KITTI Odometry dataset (grayscale, 22 GB)
$ wget -q HTTPS_URLPATH_TO_KITTI_DATASET/data_odometry_gray.zip
$ unzip -q data_odometry_gray.zip $ cd ../build $ ./run_kitti_slam -v ../vocab/orb_vocab.fbow -d ../dataset/dataset/sequences/00/ -c ../example/kitti/KITTI_mono_00-02.yaml --frame-skip 1 --no-sleep --map-db map-KITTI_mono_00-02.msg
上の手順中のdata_odometry_gray.zipというのが対象のデータセットが格納された圧縮ファイルですが、これはKITTI(The KITTI Vision Benchmark Suite)のサイトでアカウント登録をしないとダウンロードできません。
このデータセットでstella_vslamを作動させると、下の動画のように、Visual SLAMの動きが良く解ります。
参照リンク