以前の記事でUbuntu 20.04上でのstella_vslamのビルドと動作確認を行ったが、stella_vslam用のDockerfileが在るので、Dockerを使ったビルドと動作確認もやってみた。
stella_vslamのドキュメントサイトに記載されている内容とほとんど同じだが、自分の備忘録として記事に書いておく。
以降の作業は、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はMacでParallels Desktopを利用しているが、適時これとDockerを使い分けている。サーバー系の開発では、仮想マシンやDockerコンテナを利用すると作業効率が上がる。