ヴェズルフェルニルの研究ノート

座右の銘「ただ一人犀の角のように歩め」的な研究活動ノート

stella_vslamのUbuntu 20.04でのビルド

本ブログの最初の記事でstella_vslam = OpenVSLAMのビルドについて書いたが、あれから1年経って、現在のstella_vslamの状況がどうなっているのか知りたくなった。

blog.ketus-ix.work

github.com

stella_vslamは産業技術総合研究所のOpenVSLAMのコミュニティフォークだが、いまではこちらの方が活動が活発で、OpenVSLAMと言えば、現在ではstella_vslamのことを指すと言っても良い。stella_vslamはオリジナルのOpenVSLAMに追加されている機能があったり変更されている部分も多く、いまも更新が続いている。自己位置推定(SLAM)を始めるなら、このstella_vslamの研究から取りかかるのがベストな選択だと言える。

以前の記事ではUbuntu 18.04でビルドを行ったが、stella_vslamドキュメントサイトの情報が更新されており、いまの最新版ではUbuntu 20.04でのビルド手順が記載されている。それで、stella_vslamのビルドと動作確認をもう一度やりなおしてみることにした。

stella-cv.readthedocs.io

以降はstella_vslamドキュメントサイトに記載されている内容とほとんど同じだが、一部変更や追加部分もある。

stella_vslamのビルド依存パッケージの導入

共通の依存パッケージ

$ sudo apt install -y build-essential pkg-config cmake git wget curl unzip

g2oの依存パッケージ

$ sudo apt install -y libatlas-base-dev libsuitesparse-dev

OpenCVの依存パッケージ

$ sudo apt install -y libgtk-3-dev ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavresample-dev libtbb-dev

Eigenの依存パッケージ

$ sudo apt install -y gfortran

backward-cppの依存パッケージ

$ sudo apt install -y binutils-dev

その他の依存パッケージ

$ sudo apt install -y libyaml-cpp-dev libgflags-dev sqlite3 libsqlite3-dev

PangolinViewerの依存パッケージ

$ sudo apt install -y libglew-dev

stella_vslamとリンクされるライブラリのビルドとインストール

Eigen

$ mkdir -p ~/VSLAM/Depended_Builds
$ cd ~/VSLAM/Depended_Builds
$ wget -q https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.bz2
$ tar xjf eigen-3.3.7.tar.bz2
$ cd eigen-3.3.7
$ mkdir build && cd build
$ cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    ..
$ make -j
$ sudo make install

OpenCV

$ cd ~/VSLAM/Depended_Builds
$ wget -q https://github.com/opencv/opencv/archive/4.6.0.zip
$ unzip -q 4.6.0.zip
# Download aruco module (optional)
$ wget -q https://github.com/opencv/opencv_contrib/archive/refs/tags/4.6.0.zip -O opencv_contrib-4.6.0.zip
$ unzip -q opencv_contrib-4.6.0.zip
$ mkdir opencv_extra && cd opencv_extra
$ ln -s ../opencv_contrib-4.6.0/modules/aruco .
$ cd ../opencv-4.6.0
$ mkdir build && cd build
$ cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DBUILD_DOCS=OFF \
    -DBUILD_EXAMPLES=OFF \
    -DBUILD_JASPER=OFF \
    -DBUILD_OPENEXR=OFF \
    -DBUILD_PERF_TESTS=OFF \
    -DBUILD_TESTS=OFF \
    -DBUILD_PROTOBUF=OFF \
    -DBUILD_opencv_apps=OFF \
    -DBUILD_opencv_dnn=OFF \
    -DBUILD_opencv_ml=OFF \
    -DBUILD_opencv_python_bindings_generator=OFF \
    -DENABLE_CXX11=ON \
    -DENABLE_FAST_MATH=ON \
    -DWITH_EIGEN=ON \
    -DWITH_FFMPEG=ON \
    -DWITH_TBB=ON \
    -DWITH_OPENMP=ON \
    -DOPENCV_EXTRA_MODULES_PATH=../../opencv_extra \
    ..
$ make -j4
$ sudo make install
$ sudo ldconfig

stella_vslamドキュメントサイトではOpenCV 4.5.5を利用しているが、これを4.6.0に変えた。

また、コマンドsudo ldconfigを追加した。これを実行しておかないと、サンプルプログラムの起動時に下のようなエラーになる場合がある。

$ ./run_kitti_slam -h
./run_kitti_slam: error while loading shared libraries: libopencv_highgui.so.405: cannot open shared object file: No such file or directory

FBoW

$ cd ~/VSLAM/Depended_Builds
$ 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

$ cd ~/VSLAM/Depended_Builds
$ git clone https://github.com/RainerKuemmerle/g2o.git
$ cd g2o
$ git checkout 20230223_git
$ mkdir build && cd build
$ cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DBUILD_SHARED_LIBS=ON \
    -DBUILD_UNITTESTS=OFF \
    -DG2O_USE_CHOLMOD=OFF \
    -DG2O_USE_CSPARSE=ON \
    -DG2O_USE_OPENGL=OFF \
    -DG2O_USE_OPENMP=OFF \
    -DG2O_BUILD_APPS=OFF \
    -DG2O_BUILD_EXAMPLES=OFF \
    -DG2O_BUILD_LINKED_APPS=OFF \
    ..
$ make -j4
$ sudo make install

backward-cpp

$ cd  ~/VSLAM/Depended_Builds
$ git clone https://github.com/bombela/backward-cpp.git
$ cd backward-cpp
$ git checkout 5ffb2c879ebdbea3bdb8477c671e32b1c984beaa
$ mkdir build && cd build
$ cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    ..
$ make -j4
$ sudo make install

PangolinViewer

$ cd ~/VSLAM/Depended_Builds
$ git clone https://github.com/stevenlovegrove/Pangolin.git
$ cd Pangolin
$ git checkout eab3d3449a33a042b1ee7225e1b8b593b1b21e3e
$ mkdir build && cd build
$ cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DBUILD_EXAMPLES=OFF \
    -DBUILD_PANGOLIN_DEPTHSENSE=OFF \
    -DBUILD_PANGOLIN_FFMPEG=OFF \
    -DBUILD_PANGOLIN_LIBDC1394=OFF \
    -DBUILD_PANGOLIN_LIBJPEG=OFF \
    -DBUILD_PANGOLIN_LIBOPENEXR=OFF \
    -DBUILD_PANGOLIN_LIBPNG=OFF \
    -DBUILD_PANGOLIN_LIBTIFF=OFF \
    -DBUILD_PANGOLIN_LIBUVC=OFF \
    -DBUILD_PANGOLIN_LZ4=OFF \
    -DBUILD_PANGOLIN_OPENNI=OFF \
    -DBUILD_PANGOLIN_OPENNI2=OFF \
    -DBUILD_PANGOLIN_PLEORA=OFF \
    -DBUILD_PANGOLIN_PYTHON=OFF \
    -DBUILD_PANGOLIN_TELICAM=OFF \
    -DBUILD_PANGOLIN_UVC_MEDIAFOUNDATION=OFF \
    -DBUILD_PANGOLIN_V4L=OFF \
    -DBUILD_PANGOLIN_ZSTD=OFF \
    ..
$ make -j4
$ sudo make install

stella_vslamのビルド

stella_vslam本体

$ mkdir -p ~/VSLAM/Builds
$ cd ~/VSLAM/Builds
$ git clone --recursive https://github.com/stella-cv/stella_vslam.git
$ cd stella_vslam
$ mkdir build && cd build
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
$ make -j4
$ sudo make install

PangolinViewer対応部

$ cd ~/VSLAM/Builds
$ git clone -b 0.0.1 --recursive https://github.com/stella-cv/pangolin_viewer.git
$ cd pangolin_viewer
$ mkdir build && cd build
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
$ make -j4
$ sudo make install

SocketViewer対応部〔使用する場合のみビルド〕

$ cd ~/VSLAM/Builds
$ git clone https://github.com/shinsumicco/socket.io-client-cpp.git
$ cd socket.io-client-cpp
$ git submodule init
$ git submodule update
$ mkdir build && cd build
$ cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DBUILD_UNIT_TESTS=OFF \
    ..
$ make -j4
$ sudo make install
$ sudo apt install -y libprotobuf-dev protobuf-compiler
$ cd ~/VSLAM/Builds
$ git clone -b 0.0.1 --recursive https://github.com/stella-cv/socket_publisher.git
$ cd socket_publisher
$ mkdir build && cd build
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
$ make -j4
$ sudo make install

サンプルプログラム

$ cd ~/VSLAM/Builds
$ git clone -b 0.0.1 --recursive https://github.com/stella-cv/stella_vslam_examples.git
$ cd stella_vslam_examples
$ mkdir build && cd build
$ cmake \
    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
    -DUSE_STACK_TRACE_LOGGER=ON \
    ..
$ make -j

stella_vslamの動作確認

サンプルデータセットの入手

下のサイトにstella_vslam用のサンプルデータセットが置いてあるので、ここから入手できる。

stella-cv.readthedocs.io

上に置いてあるのは、元は産総研(AIST)のOpenVSLAMサイトに在ったものではないだろうか。産総研の許可を得てstella_vslam側へ移したのだろう。

以前の記事を書いたときは上のリンクサイトは存在していなくて、産総研のオリジナルのデータセットを入手する方法が判らなかった。

公開データセットの入手

公開データセットを利用してstella_vslamの動作確認を行うこともできる。各データセットの配布元は以下のサイトになる。

KITTI Odometry Dataset

www.cvlibs.net

EuRoC MAV dataset

http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/

projects.asl.ethz.ch

TUM RGBD Dataset

https://vision.in.tum.de/rgbd/dataset/freiburg3/rgbd_dataset_freiburg3_calibration_rgb_depth.tgz

vision.in.tum.de

以前の記事では、これらの中からKITTI Odometry Datasetを利用したが、このデータセットKITTIのサイトでアカウント登録をしないとダウンロードできない。

サンプルデータセットによる動作確認

stella-cv.readthedocs.io

# at the build directory of stella_vslam_examples
$ pwd
~/VSLAM/Builds/stella_vslam_examples/build
$ ls ../..
pangolin_viewer  socket_publisher  socket_viewer  stella_vslam  stella_vslam_examples

# ORB vocabulary ファイルのダウンロード
$ curl -sL "https://github.com/stella-cv/FBoW_orb_vocab/raw/main/orb_vocab.fbow" -o orb_vocab.fbow

# dataset ディレクトリの作成
$ mkdir ../dataset

# 1つ目のサンプルデータセットのダウンロード
$ FILE_ID="1d8kADKWBptEqTF7jEVhKatBEdN7g0ikY"
$ curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=${FILE_ID}" > /dev/null
$ CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"
$ curl -sLb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o ../dataset/aist_living_lab_1.zip
$ unzip ../dataset/aist_living_lab_1.zip -d ../dataset

# 2つ目のサンプルデータセットのダウンロード
$ FILE_ID="1TVf2D2QvMZPHsFoTb7HNxbXclPoFMGLX"
$ curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=${FILE_ID}" > /dev/null
$ CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"
$ curl -sLb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o ../dataset/aist_living_lab_2.zip
$ unzip ../dataset/aist_living_lab_2.zip -d ../dataset

# tracking and mapping実行指定でvslamを起動
$ ./run_video_slam \
    -v ./orb_vocab.fbow \
    -m ../dataset/aist_living_lab_1/video.mp4 \
    -c ../../stella_vslam/example/aist/equirectangular.yaml \
    --frame-skip 3 \
    --no-sleep \
    --map-db-out map.msg
# [Terminate] ボタン押下でビューア終了
# カレントディレクトリに map.msg が生成されている

# localization実行指定でvslamを起動
$ ./run_video_slam \
    --disable-mapping \
    -v ./orb_vocab.fbow \
    -m ../dataset/aist_living_lab_2/video.mp4 \
    -c ../../stella_vslam/example/aist/equirectangular.yaml \
    --frame-skip 3 \
    --no-sleep \
    --map-db-in map.msg
# localization with temporal mapping based odometry実行指定でvslamを起動
$ ./run_video_slam \
    --temporal-mapping \
    -v ./orb_vocab.fbow \
    -m ../dataset/aist_living_lab_2/video.mp4 \
    -c ../../stella_vslam/example/aist/equirectangular.yaml \
    --frame-skip 3 \
    --no-sleep \
    --map-db-in map.msg

下がサンプルデータセットを使ってstella_vslamの動作確認を行っている様子。

www.youtube.com

公開データセットによる動作確認

stella-cv.readthedocs.io

KITTI Odometry Dataset

# at the build directory of stella_vslam_examples
$ pwd
~/VSLAM/Builds/stella_vslam_examples/build
$ ls ../..
pangolin_viewer  socket_publisher  socket_viewer  stella_vslam  stella_vslam_examples

# KITTI Odometry dataset (grayscale, 22 GB) のダウンロード
$ wget -q URL_HTTPS_KITTI_DATASET/data_odometry_gray.zip -P ../dataset
$ unzip -q data_odometry_gray.zip -d ../dataset

# monocular SLAM with sequence 00
$ ./run_kitti_slam \
    -v ./orb_vocab.fbow \
    -d ../dataset/dataset/sequences/00/ \
    -c ../../stella_vslam/example/kitti/KITTI_mono_00-02.yaml
# stereo SLAM with sequence 05
$ ./run_kitti_slam \
    -v ./orb_vocab.fbow \
    -d ../dataset/dataset/sequences/05/ \
    -c ../../stella_vslam/example/kitti/KITTI_stereo_04-12.yaml

EuRoC MAV Dataset

# at the build directory of stella_vslam_example
$ pwd
~/VSLAM/Builds/stella_vslam_examples/build
$ ls ../..
pangolin_viewer  socket_publisher  socket_viewer  stella_vslam  stella_vslam_examples

# EuRoC MAV dataset のダウンロード
$ wget -q \
    http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_03_medium/MH_03_medium.zip \
    -P ../dataset
$ unzip -q ../dataset/MH_03_medium.zip -d ../dataset

# monocular SLAM with any EuRoC sequence
$ ./run_euroc_slam \
    -v ./orb_vocab.fbow \
    -d ../dataset/mav0/ \
    -c ../../stella_vslam/example/euroc/EuRoC_mono.yaml
# stereo SLAM with any EuRoC sequence
$ ./run_euroc_slam \
    -v ./orb_vocab.fbow \
    -d ../dataset/mav0/ \
    -c ../../stella_vslam/example/euroc/EuRoC_stereo.yaml

TUM RGBD Dataset

# at the build directory of stella_vslam_examples
$ pwd
~/VSLAM/Builds/stella_vslam_examples/build
$ ls ../..
pangolin_viewer  socket_publisher  socket_viewer  stella_vslam  stella_vslam_examples

# TUM RGBD dataset のダウンロード
$ wget -q \
    https://vision.in.tum.de/rgbd/dataset/freiburg3/rgbd_dataset_freiburg3_calibration_rgb_depth.tgz \
    -P ../dataset
$ tar xzf ../dataset/rgbd_dataset_freiburg3_calibration_rgb_depth.tgz.zip \
    -C ../dataset

# TUM RGBD dataset の前処理
$ cd ../dataset/rgbd_dataset_freiburg3_calibration_rgb_depth
$ wget -q \
    https://svncvpr.in.tum.de/cvpr-ros-pkg/trunk/rgbd_benchmark/rgbd_benchmark_tools/src/rgbd_benchmark_tools/associate.py
$ python associate.py rgb.txt depth.txt
$ cd ../../build

# Tracking and Mapping

# monocular SLAM with rgbd_dataset_freiburg3_calibration_rgb_depth
$ ./run_tum_rgbd_slam \
    -v ./orb_vocab.fbow \
    -d ../dataset/rgbd_dataset_freiburg3_calibration_rgb_depth/ \
    -c ../../stella_vslam/example/tum_rgbd/TUM_RGBD_mono_3.yaml \
    --no-sleep \
    --auto-term \
    --map-db-out fr3_slam_mono.msg

# RGBD SLAM with rgbd_dataset_freiburg3_calibration_rgb_depth
$ ./run_tum_rgbd_slam \
    -v ./orb_vocab.fbow \
    -d ../dataset/rgbd_dataset_freiburg3_calibration_rgb_depth/ \
    -c ../../stella_vslam/example/tum_rgbd/TUM_RGBD_rgbd_3.yaml \
    --no-sleep \
    --auto-term \
    --map-db-out fr3_slam_rgbd.msg

# Localization

# monocular localization with rgbd_dataset_freiburg3_calibration_rgb_depth
$ ./run_tum_rgbd_slam --disable-mapping \
    -v ./orb_vocab.fbow \
    -d ../dataset/rgbd_dataset_freiburg3_calibration_rgb_depth/ \
    -c ../../stella_vslam/example/tum_rgbd/TUM_RGBD_mono_3.yaml \
    --no-sleep \
    --auto-term \
    --map-db-in fr3_slam_mono.msg

# RGBD SLAM with rgbd_dataset_freiburg3_calibration_rgb_depth
$ ./run_tum_rgbd_slam --disable-mapping \
    -v ./orb_vocab.fbow \
    -d ../dataset/rgbd_dataset_freiburg3_calibration_rgb_depth/ \
    -c ../../stella_vslam/example/tum_rgbd/TUM_RGBD_rgbd_3.yaml \
    --no-sleep \
    --auto-term \
    --map-db-in fr3_slam_rgbd.msg

# Localization with temporal mapping based odometry

# monocular localization with rgbd_dataset_freiburg3_calibration_rgb_depth
$ ./run_tum_rgbd_slam --temporal-mapping \
    -v ./orb_vocab.fbow \
    -d ../dataset/rgbd_dataset_freiburg3_calibration_rgb_depth/ \
    -c ../../stella_vslam/example/tum_rgbd/TUM_RGBD_mono_3.yaml \
    --no-sleep \
    --auto-term \
    --map-db-in fr3_slam_mono.msg

# RGBD SLAM with rgbd_dataset_freiburg3_calibration_rgb_depth
$ ./run_tum_rgbd_slam --temporal-mapping \
    -v ./orb_vocab.fbow \
    -d ../dataset/rgbd_dataset_freiburg3_calibration_rgb_depth/ \
    -c ../../stella_vslam/example/tum_rgbd/TUM_RGBD_rgbd_3.yaml \
    --no-sleep \
    --auto-term \
    --map-db-in fr3_slam_rgbd.msg

公開データセットを使ってstella_vslamの動作確認を行っている様子。

www.youtube.com

www.youtube.com

www.youtube.com

SocketViewerによる動作確認

$ git clone --recursive https://github.com/stella-cv/socket_viewer.git
$ cd socket_viewer
$ ls
app.js  Dockerfile  LICENSE  package.json  public  README.md  views
$ nodenv install 12.22.12
$ nodenv local 12.22.12
$ node -v
v12.22.12
$ npm install
....    ....
added 96 packages from 61 contributors and audited 96 packages in 4.292s

8 packages are looking for funding
  run `npm fund` for details

found 1 critical severity vulnerability
  run `npm audit fix` to fix them, or `npm audit` for details
$ ls
app.js  Dockerfile  LICENSE  node_modules  package.json  package-lock.json  public  README.md  views
$ node app.js
WebSocket: listening on *:3000
HTTP server: listening on *:3001
  

※上記は、Node.js環境としてnodenvを用いることを前提としている。

# at the build directory of stella_vslam_examples
$ pwd
~/VSLAM/Builds/stella_vslam_examples/build
$ ls ../..
pangolin_viewer  socket_publisher  socket_viewer  stella_vslam  stella_vslam_examples

$ ./run_kitti_slam \
    -v ./orb_vocab.fbow \
    -d ../dataset/dataset/sequences/00/ \
    -c ../../stella_vslam/example/kitti/KITTI_mono_00-02.yaml \
    --viewer socket_publisher

ここで、Webブラウザを起動してhttp://localhost:3001/へアクセスすると下のような画面になる。

前回stella_vslamを扱ったときは、パラメータを調整していくつかの動画への適応具合を観たり、ソースコードを眺めてプログラム実装の概要を理解することなどを行った。

改めて自己位置推定の研究を再開するにあって、stella_vslamの動作原理、プログラムソース実装、深い利用方法、改造方法の調査などを行っていくことになるだろう。また、stella_vslam以外にもSLAM実装は存在しているので、他のプログラムの調査も始めるつもりだ。