本ブログの最初の記事でstella_vslam = OpenVSLAMのビルドについて書いたが、あれから1年経って、現在のstella_vslamの状況がどうなっているのか知りたくなった。
stella_vslamは産業技術総合研究所のOpenVSLAMのコミュニティフォークだが、いまではこちらの方が活動が活発で、OpenVSLAMと言えば、現在ではstella_vslamのことを指すと言っても良い。stella_vslamはオリジナルのOpenVSLAMに追加されている機能があったり変更されている部分も多く、いまも更新が続いている。自己位置推定(SLAM)を始めるなら、このstella_vslamの研究から取りかかるのがベストな選択だと言える。
以前の記事ではUbuntu 18.04でビルドを行ったが、stella_vslamドキュメントサイトの情報が更新されており、いまの最新版ではUbuntu 20.04でのビルド手順が記載されている。それで、stella_vslamのビルドと動作確認をもう一度やりなおしてみることにした。
以降は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用のサンプルデータセットが置いてあるので、ここから入手できる。
上に置いてあるのは、元は産総研(AIST)のOpenVSLAMサイトに在ったものではないだろうか。産総研の許可を得てstella_vslam側へ移したのだろう。
以前の記事を書いたときは上のリンクサイトは存在していなくて、産総研のオリジナルのデータセットを入手する方法が判らなかった。
公開データセットの入手
公開データセットを利用してstella_vslamの動作確認を行うこともできる。各データセットの配布元は以下のサイトになる。
KITTI Odometry Dataset
EuRoC MAV dataset
http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/
TUM RGBD Dataset
https://vision.in.tum.de/rgbd/dataset/freiburg3/rgbd_dataset_freiburg3_calibration_rgb_depth.tgz
以前の記事では、これらの中からKITTI Odometry Datasetを利用したが、このデータセットはKITTIのサイトでアカウント登録をしないとダウンロードできない。
サンプルデータセットによる動作確認
# 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の動作確認を行っている様子。
公開データセットによる動作確認
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の動作確認を行っている様子。
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実装は存在しているので、他のプログラムの調査も始めるつもりだ。