ORB-SLAM2をビルド済みコンテナーイメージを使って素早く試してみる


はじめに

この記事ではJetson上でコンテナーイメージを使ってORB-SLAM2を実行する手順を説明します。
手順を実行すると以下のような画面が立ち上がり、ORB-SLAM2を試すことが出来ます。

今回は以下にあるコンテナーイメージを使用します。
ビルド済みであるため、ビルドで苦労することはありません。

今回するコンテナーイメージ

Dockerfileはこちらのリポジトリにあります。
https://github.com/dusty-nv/jetson-containers

環境

Jetson Nano 4G
Jetpack 4.6
Webカメラ:logicool C505

手順

1. Default Runtimeの設定

/etc/docker/daemon.jsonを以下のように変更します。
変更後、Jetsonを再起動( sudo reboot )します。

{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    },

    "default-runtime": "nvidia"
}

2. コンテナーの起動

コンテナーから画面を表示出来るようにX Windowの設定を行います。
また、Webカメラがコンテナーから参照出来るようにdeviceオプションで設定します。

sudo xhost +si:localuser:root
sudo docker run -it --rm --network host \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix/:/tmp/.X11-unix \
-v `pwd`:/scripts \
--device /dev/video0:/dev/video0:mwr \
--name orb-slam2 \
dustynv/ros:foxy-slam-l4t-r32.6.1

上記のコマンドを実行すると以下のようにコンテナーが起動されます。
not found librealsense2は、ここでは無視します。

3. ORB-SLAM2を起動

コンテナーのプロンプトから以下のコマンドを実行します。

export LD_LIBRARY_PATH=/tmp/pangolin/build/src:/opt/ORB_SLAM2_CUDA/Thirdparty/DBoW2/lib:/opt/ORB_SLAM2_CUDA/lib:$LD_LIBRARY_PATH
ros2 run ros2_orbslam mono /opt/ORB_SLAM2_CUDA/Vocabulary/ORBvoc.txt /opt/ORB_SLAM2_CUDA/Examples/RGB-D/TUM1.yaml

上記のコマンドを実行すると以下のようにORB-SLAM2の画面が表示されます。
カメラ映像がまだ入力されないため、Currnet FrameのWindowは黒い状態です。

4. Webカメラを起動

コンテナーに接続して、Webカメラ(v4l2_camera_node)を起動します。
新しいターミナルを立ち上げて、以下のようなコマンドを実行します。

sudo docker ps # 起動しているコンテナーを確認
sudo docker exec -it orb-slam2 bash # orb-slam2という名前のコンテナーに接続
ros2 topic list  # トピックを確認。/cameraトピックを確認出来るはず。
ros2 run v4l2_camera v4l2_camera_node -r image_raw:=camera # cameraトピックにカメラの映像をpublishするように起動する

コンテナーに接続して、トピックを確認すると/cameraトピックがあることを確認できます。

v4l2_camera_nodeを起動すると以下のような出力が出ます。
ERRORとWARNが出ていますが、カメラ映像は取得出来ているはずです。

カメラの映像がORB-SLAM2に読み込まれて処理されている様子が確認できます。