三浦研究所

社会人エンジニア1年目が考える日々の研鑽、日常について書き、お互いに刺激しあえるようなブログを目指しています。

OpenVSLAM を簡単に動かせる Docker Image を作ってみた

今回はVSLAMの中でも少し前に話題になったOpenVSLAMを実装してみました。
この記事を読むことで、自身のカメラを用いてOpenVSLAMを動かすことができるようになります。

QuickStart

githubのリポジトリは以下のもので、ドキュメントを見ながらであればサンプルの実装は可能です。

github.com

openvslam.readthedocs.io

しかし、今回私がしたかったことは、サンプルではなく、自身の撮影した動画や、カメラを用いて、OpenVSLAMを実装することでした。
そのため、公式で用意されているDocker Imageを改良したものを作りました。
また、Docker内でUSBカメラが使える必要があったので、私が以前実装したこちらの内容が参考になっています。

www.takeshi-1222.com

実装

では、実際にどのようにして動かしていくのかについて、書いていきます。
今回のデモでは、自身のカメラ(/dev/video1)を使用する場合のデモとなっており、実行したら一撃でカメラを有効にしてSLAMが始まるものになっています。
まずは私のgitリポジトリをクローンしてきます。

github.com

$ git clone https://github.com/1222-takeshi/openvslam.git

次にDocker Imageをダウンロードし、Docker Containerを作成、実行します。
今回、容易にOpenVSLAMを実装するために最初に少し、手間が必要となってしまいます。
host, usbcamという2つのコンテナを起動するため、install-host.sh, install-usbcam.shのそれぞれを実行します。

$ ./install-host.sh

これでDocker Containerが起動しますが、ctrl+z、exitで一旦コンテナから出てください。 同様にinstall-usbcam.shも実行、exitをします。

ここまでで、Docker Containerができているはずなので、以下のコマンドを実行します。

$ ./ros-dev.sh

これで、数秒待っていると以下のような画面が表示されます。 これが出れば成功です。 f:id:bamboomush:20201211162508p:plain

最初は左側のpointcloudが表示されないと思うので、その場合は、Follow Cameraを2回クリックすることで表示されると思います。 実装時に何かわからないことがあればコメント等で言っていただければと思います。

トラブルシューティング

今回は/dev/video1にカメラがついている場合のデモだったのですが、そうではないケースが多いかと思います。 その場合は以下のようにinstall-host.shとinstall-usbcam.shを変更すればできるかと思います。  

install-host.sh

before
#!/bin/bash
docker pull mtakeshi1222/openvslam:host

docker run -it \
        --gpus all \
        --env="DISPLAY" \
        --env="QT_X11_NO_MITSHM=1" \
        --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
        --device=/dev/video1 \
        --name=host \
        mtakeshi1222/openvslam:host

exit
after
#!/bin/bash
docker pull mtakeshi1222/openvslam:host

docker run -it \
        --gpus all \
        --env="DISPLAY" \
        --env="QT_X11_NO_MITSHM=1" \
        --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
        --device=/dev/video0:/dev/video1 \
        --name=host \
        mtakeshi1222/openvslam:host

exit

install-usbcam.sh

before
#!/bin/bash
docker pull mtakeshi1222/openvslam:usbcam

docker run -it \
        --gpus all \
        --env="DISPLAY" \
        --env="QT_X11_NO_MITSHM=1" \
        --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
        --device=/dev/video1 \
        --name=usbcam \
        mtakeshi1222/openvslam:usbcam

exit
after
#!/bin/bash
docker pull mtakeshi1222/openvslam:usbcam

docker run -it \
        --gpus all \
        --env="DISPLAY" \
        --env="QT_X11_NO_MITSHM=1" \
        --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
        --device=/dev/video0:/dev/video1 \
        --name=usbcam \
        mtakeshi1222/openvslam:usbcam

exit

上記の変更では、ホストPCの/dev/video0をDockerでは/dev/video1として読み込まれるように指定しています。 また、カメラパラメータの変更等については、以下の記事を参考にしていただければと思います。

www.takeshi-1222.com