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

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

stella_vslam | Dockerによるビルドと動作確認

以前の記事でUbuntu 20.04上でのstella_vslamのビルドと動作確認を行ったが、stella_vslam用のDockerfileが在るので、Dockerを使ったビルドと動作確認もやってみた。

blog.ketus-ix.work

stella_vslamのドキュメントサイトに記載されている内容とほとんど同じだが、自分の備忘録として記事に書いておく。

stella-cv.readthedocs.io

以降の作業は、Ubuntu 20.04上でDocker-CE 24.0を使って行った。

Dockerのインストール

Dockerが導入済みでない場合は、インストールしておくこと。

NVIDIA GPU搭載PCの場合は、nivida-dockerもインストールしておくと、DockerコンテナでGPUが利用されるので動作速度が向上する。

stella_vslamのGitHubリポジトリから取得したファイルの中に、Dockerをインストールできるシェルスクリプトが収納されている。

Ubuntu上にDockerが未インストールの場合は、これらのシェルスクリプトを利用すると良い。

$ git clone --recursive https://github.com/stella-cv/stella_vslam.git
$ cd stella_vslam/scripts/ubuntu
$ ./install_docker.sh
# GPUを利用する場合は、下のコマンドも実行する
$ ./install_nvidia_docker.sh

サンプルデータセットの取得

stella_vslamのDockerコンテナ内で動作確認に使用するサンプルデータセットをダウンロードしておく。

この操作用のシェルスクリプトがstella_vslamのリポジトリに含まれている。

$ git clone --recursive https://github.com/stella-cv/stella_vslam.git
$ cd stella_vslam/scripts/ubuntu
$ ./download_sampledata.sh

PangolinViewer版stella_vslamのビルドと動作確認

Dockerイメージのビルド

$ mkdir -p ~/VSLAM/Docker
$ cd ~/VSLAM/Docker
$ git clone --recursive https://github.com/stella-cv/stella_vslam.git
$ cd stella_vslam
$ docker build -t stella_vslam-desktop -f Dockerfile.desktop . --build-arg NUM_THREADS=`expr $(nproc) - 1`

Dockerコンテナの起動

# ログインユーザからのX11ディスプレイへのアクセスを許可
$ xhost +local:
# コンテナの起動
$ docker run -it --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix:ro \
    --volume ~/VSLAM/Docker/stella_vslam/vocab:/vocab:ro \
    --volume ~/VSLAM/Docker/stella_vslam/dataset:/dataset:ro \
    stella_vslam-desktop
root@0b8206d0372f:/stella_vslam_examples/build# 

GPUを利用する場合は、docker runコマンドに--gpus allオプションを付加してコンテナを起動する。

なお、stella_vslamのリポジトリに上の操作をすべて実行するシェルスクリプトが含まれている。

下のコマンドを実行すると、サンプルデータセットの取得、PangolinViewer版stella_vslam Dockerイメージのビルド、同コンテナの起動まで行える。

$ git clone --recursive https://github.com/stella-cv/stella_vslam.git
$ cd stella_vslam/scripts/ubuntu
$ ./download_sampledata.sh
$ ./build_stella_vslam_docker.sh

Dockerコンテナでの動作確認

  • コンテナ stella_vslam-desktop
# At the /stella_vslam_examples/build directory
# pwd
/stella_vslam_examples/build
# ls /
bin   dataset  etc   lib    lib64  ...   ...   ...   stella_vslam           sys   usr   vocab
...   ...   ...   ...   ...  ...   ...   ...   ...   stella_vslam_examples  tmp   var
# ./run_video_slam \
    -v /vocab/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

SocketViewer版stella_vslamのビルドと動作確認

Dockerイメージのビルド

stella_vslam本体

$ cd ~/VSLAM/Docker
$ git clone --recursive https://github.com/stella-cv/stella_vslam.git
$ cd stella_vslam
$ docker build -t stella_vslam-socket -f Dockerfile.socket . --build-arg NUM_THREADS=`expr $(nproc) - 1`

socket-viewer

$ cd ~/VSLAM/Docker
$ git clone --recursive https://github.com/stella-cv/socket_viewer.git
$ cd socket_viewer
$ docker build -t stella_vslam-viewer .

Dockerコンテナの起動

socket-viewer

$ docker run --rm -it --name stella_vslam-viewer --net=host stella_vslam-viewer
WebSocket: listening on *:3000
HTTP server: listening on *:3001

先にsocket-viewerを起動し、ここで、Webブラウザからhttp://localhost:3001/へアクセスする。

stella_vslam本体

$ docker run --rm -it --name stella_vslam-socket --net=host \
    --volume ~/VSLAM/Docker/stella_vslam/vocab:/vocab:ro \
    --volume ~/VSLAM/Docker/stella_vslam/dataset:/dataset:ro \
    stella_vslam-socket
root@0b8206d0372f:/stella_vslam_examples/build# 

SocketViewer版stella_vslamでは、上の両方のdocker runコマンドに--net=hostオプションを付加してコンテナを起動するようにする。

Dockerコンテナでの動作確認

  • コンテナ stella_vslam-socket
# At the /stella_vslam_examples/build directory
# pwd
/stella_vslam_examples/build
# ls /
bin   dataset  etc   lib    lib64  ...   ...   ...   stella_vslam           sys   usr   vocab
...   ...   ...   ...   ...  ...   ...   ...   ...   stella_vslam_examples  tmp   var
# ./run_video_slam \
    -v /vocab/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 \
    --viewer socket_publisher

stella_vslamプログラムが起動すると、Webブラウザのウィンドウに下のようなグラフィック描画画面が表示される。

Dockerを使えばプラットホーム環境に影響を与えることなく、プログラムのビルドを行えるのが良い。一度Dockerコンテナを作成してしまうと、動作確認だけが目的ならこちらの方が楽だろう。

ただし、小生は現在stella_vslamの動作解析や改造が主たる作業なので、いまはDockerを積極的に利用していない。元ソースや改造完成版ソースでのビルド確認、特定のデータセットでの動作確認などではDockerを利用している。また、上のsocket-viewerサーバーを稼働させるときもDockerを使っている。小生のメインPCはMacParallels Desktopを利用しているが、適時これとDockerを使い分けている。サーバー系の開発では、仮想マシンやDockerコンテナを利用すると作業効率が上がる。