OpenVSLAMのビルドと360度カメラサンプル実行まで


はじめに

「ここはどこ?あたすは誰?」「迷える子羊よ、vSLAMを使いなさい」という話が聖書にあったかどうかは定かではありませんが、本日は画像による自己位置推定のvisual SLAMを使えるようになろう、というお話です。しかも、360度カメラを使ったお話です。イメージはこちら:

OpenVSLAMは日本の産業技術総合研究所(AIST)が開発した、単眼、ステレオ、RGBDカメラ、360度カメラで動く、オープンソースのvisual SLAMソフトです。
特徴はなんといっても、360度カメラでも動くことではないでしょうか。
さて、そのOpenVSLAMですが、オリジナルは公開が中止になっていました。
ややや、なんてこった、と思って探すと、コミュニティがforkしているものは引き続き公開されています。
私は今回2種類のPCに入れて試したのですが、手間取った部分があったので、スクリプトを作って、これを実行すれば、ひとまず自分のPCで、サンプルの360度カメラ画像でVSLAMが動くようにしたので、共有いたします。

(2021.7.2追記)以下の内容は、mainにpull requestが取り込まれたので、openvslamをcloneしたあと、scripts/ubuntuにすでにスクリプトが入っています。

動作確認した環境

OS: Linux
Distribution: Ubuntu 20.04
GPU: GTX1060, RTX3070
ビルド環境: Docker 20.10.7

注意:
WSLを利用する場合は、Xwindowを使うため、こちらを参考にVcXsrvをインストールすると良いと思います。

install docker

今回、OpenVSLAMはDocker上で実行します。
もしまだdockerを入れていなければ、下記で入れておきましょう。
下記はスクリプトになっていますので、コピペして、install_docker.shなどと名前をつけて実行($sh ./install_docker.sh)すれば、1コマンドでインストールできます。

#!/bin/sh

# Uninstall old versions
sudo apt-get remove docker docker-engine docker.io containerd runc

# Set up the repository
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# Manage Docker as a non-root user
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

# Verify that Docker Engine is installed correctly by running the hello-world image.
docker run hello-world

reference official docker document, official post process

install nvidia GPU supported docker

NVIDIAのGPU搭載マシンであれば、こちらも入れましょう。なければスキップしていただいてもいいかと思いますが、検証はしていません。
以下を、install_nvidia_docker.shなどと命名して実行するだけで大丈夫です。

#!/bin/sh

# update repository
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

# install nvidia GPU support docker
sudo apt install -y nvidia-container-toolkit

reference nvidia-docker official page, nvidia-docker github page

trouble shoot

  • dockerコマンド発行時に、「Got permission denied while trying to connect to the Docker daemon socket」というエラーに遭遇した場合の対処法。
    • 私の場合はlogout, loginだけではうまく行かず、rebootが必要でした。

get source code

次に、Githubからサブモジュールを含めて、ソースコードをクローンします。
OpenVSLAMを配置したい、お好きなディレクトリに移って下記を実行して下さい。

git clone https://github.com/OpenVSLAM-Community/openvslam.git
cd openvslam
git submodule update -i --recursive

reference: openvslam community official document

download sample data to run tests

次に、Dockerを起動する前に、サンプル動作で必要なファイルをダウンロードしておきましょう。
以下をdownload_sampledata.shなどと名前をつけ、 先程クローンしたopenvslam ディレクトリの下に、 scripts/ubuntu というディレクトリを作り、そこに置いて実行してください。(現在これら一連のscriptを入れたPull requestが取り込まれています)

#!/bin/sh

TOPDIR=$PWD/../../ #openvslam directory

# create data directory to store downloaded data
mkdir $TOPDIR/dataset
mkdir $TOPDIR/vocab

# download an ORB vocabulary from GitHub
(
    cd ${TOPDIR}/vocab
    curl -sL "https://github.com/OpenVSLAM-Community/FBoW_orb_vocab/raw/main/orb_vocab.fbow" -o orb_vocab.fbow
)

# download a sample dataset from Google Drive
(
    cd $TOPDIR/dataset
    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 aist_living_lab_1.zip
    unzip aist_living_lab_1.zip

# download a sample dataset from Google Drive
    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 aist_living_lab_2.zip
    unzip aist_living_lab_2.zip
)

reference official openvslam doc

build OpenVSLAM

いよいよOpenVSLAMをビルドします。今回は設定が楽なのでDockerを使います。
以下を、build_openvslam.sh などと名前をつけ、openvslam/scripts/ubuntu の下に置いて実行してください。

#!/bin/sh

TOPDIR=$PWD/../../ #openvslam directory

( 
    cd $TOPDIR

    # Building Docker Image
    docker build -t openvslam-desktop -f Dockerfile.desktop . --build-arg NUM_THREADS=7

    # Starting Docker Container
    # before launching the container, allow display access from local users
    xhost +local:
    # launch the container
    docker run -it --rm --gpus all -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix:ro --volume ${TOPDIR}/dataset:/dataset:ro --volume ${TOPDIR}/vocab:/vocab:ro openvslam-desktop
)

注意:

  1. 一番最後の「docker run -it --rm --gpus all ...」のところは、GPUがなければ、「--gpu all」を消して実行すれば行けるかもしれません(公式ページには、--gpuはデフォルトでは付いていませんでした。しかし、ちらっと試しましたところできなかったので、何とも言えません)
  2. 2回目以降、Dockerを立ち上げる際は、最後の行の「docker run -it ...」だけ実行すれば良いですが、その際、データが何故かトップディレクトリではなく、一つ上のディレクトリにマウントされているので、次節のサンプルを実行する際は、下記コマンドで実行して下さい。
./run_video_slam -v ../vocab/orb_vocab.fbow -m ../dataset/aist_living_lab_1/video.mp4 -c ../example/aist/equirectangular.yaml --frame-skip 3 --no-sleep --map-db map.msg

run sample

ここまでを実行すると、Dockerの中に入っている状態で、"root@*****:/openvslam/build#"のようなターミナル画面が出ているはずです。
その表示されているターミナルに以下を打てば、ウィンドウが2つ立ち上がり、冒頭でもお見せした、以下の写真のようなサンプルデータのデモが実行され始めるはずです。

# run tracking and mapping
./run_video_slam -v /vocab/orb_vocab.fbow -m /dataset/aist_living_lab_1/video.mp4 -c ../example/aist/equirectangular.yaml --frame-skip 3 --no-sleep --map-db map.msg

補足:
real time性はなくても、できるだけ精度よく実行したい場合は、" --frame-skip 3 --no-sleep"を消して実行すれば良いです。

ウィンドウの動きが止まったら、ウィンドウの左側にある、Terminateボタンを押します。 すると、"map.msg"が、現在のディレクトリに保存されます。これを用いて次はTrackingのデモが実行できます。以下のコマンドをDockerのターミナルに打つと、下の写真のような、Trackingのデモが開始されます。

# run localization
./run_video_localization -v /vocab/orb_vocab.fbow -m /dataset/aist_living_lab_2/video.mp4 -c ../example/aist/equirectangular.yaml --frame-skip 3 --no-sleep --map-db map.msg

run OpenVSLAM on your own video

ご自分の360 mp4動画で試す場合は、dataset/の下に、パノラマ画像に変換された360動画を入れ、exampleの下のaist/equirectangular.yamlをコピーして、画像サイズをご自分のmp4ファイルのものに変えて、 scripts/ubuntu/build_openvslam_docker.shを実行後、上記run sampleのmp4動画とyamlファイルを書き換えればOK。
Richo theta Z1で試した結果のキャプチャがこちら。(画像が荒くてすみません)

終わりに

やっぱりvslamは、結果が3次元なので見栄えがして面白いですよね。萌えー。
次回は、vslamの真価である、リアルタイムにvslamを実行することを、公開されているROS版で実施してご報告したいと思います。チャオ!