気になっていた産総研のOpenVSLAMを使ってみます。
自己位置推定と環境地図の作成です。GPSなどが使えない屋内で「自分は今どこにいるの?」的な場合に使います。
OpenVSLAMはいくつかのSLAMの中で、カメラなどを使うVisual SLAMの一種です。
なお、OpenVSLAMはORB-SLAM2との兼ね合いから現在は公開停止になっていますが、以下の条件の元なら問題ないだろうということで使ってみます。
「ORB-SLAM2に基づく派生ソフトウェアであるとして、GPLv3ライセンスに従って利用する」
上記のGitHubは現在カラッポでなんのドキュメントもありません。チュートリアルなどはここ参照。
マニュアル(Web)(PDF版)に基づいてそのまま実行すれば、ほぼほぼOKですが、一部実行できなかった部分を修正しています。
今回はこのマニュアルのInstallationからSimple Tutorialのさわり部分までをJetson Nanoでやってみます。
ビルドログを拾ってみると、結構CUDAをとりこんでいるのでJetsonを使う意義はあるかな?
こんな感じ。
全天球カメラ(リコー THETA S)で撮った動画を使ってmappingとlocalizationをやってみます。
ViewerはPangolinとSocketの2種類が紹介されていますが、使うのはSocketViewerにします。
Ubuntu 18.04.の環境にインストールしていきます(jetpack 4.5.1)。
Nano(4GB)の場合、Swapの拡張は必須(4GBくらい)です。
1 2 3 4 5 |
sudo swapoff -a sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile |
rootユーザにしていない場合適宜sudoを頭につける必要があります(ここではsudoで実行)。
ユーザーホームで作業します(jetsonの部分はご自分の環境によって適宜書き換えてください)。
1 |
cd /home/jetson |
OpenVSLAMのソースをリポジトリからクローンしておきます。
1 2 3 |
git clone https://github.com/OpenVSLAM-Community/openvslam.git cd openvslam git submodule update -i --recursive |
OpenVSLAMは前提になるパッケージやライブラリがかなりあります。
まずはそれらをセットアップしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
sudo apt update -y sudo apt upgrade -y --no-install-recommends # basic dependencies sudo apt install -y build-essential pkg-config cmake git wget curl unzip # g2o dependencies sudo apt install -y libatlas-base-dev libsuitesparse-dev # OpenCV dependencies sudo apt install -y libgtk-3-dev sudo apt install -y ffmpeg sudo apt install -y libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavresample-dev # eigen dependencies sudo apt install -y gfortran # other dependencies sudo apt install -y libyaml-cpp-dev libgoogle-glog-dev libgflags-dev # (if you plan on using SocketViewer) # Protobuf dependencies sudo apt install -y autogen autoconf libtool # Node.js curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - sudo apt install -y nodejs |
作業ディレクトリを作ってそこでパッケージ群をインストールします。
1 2 |
mkdir ~/work-vslam cd ~/work-vslam |
ソースからEigenをインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 |
wget -q https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.bz2 tar xf eigen-3.3.7.tar.bz2 rm -rf eigen-3.3.7.tar.bz2 cd eigen-3.3.7 mkdir -p build && cd build cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ .. make -j4 sudo make install |
ソースからOpenCVをインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
cd ~/work-vslam wget -q https://github.com/opencv/opencv/archive/3.4.0.zip unzip -q 3.4.0.zip rm -rf 3.4.0.zip cd opencv-3.4.0 mkdir -p build && cd build cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DENABLE_CXX11=ON \ -DBUILD_DOCS=OFF \ -DBUILD_EXAMPLES=OFF \ -DBUILD_JASPER=OFF \ -DBUILD_OPENEXR=OFF \ -DBUILD_PERF_TESTS=OFF \ -DBUILD_TESTS=OFF \ -DWITH_EIGEN=ON \ -DWITH_FFMPEG=ON \ -DWITH_OPENMP=ON \ .. make -j4 sudo make install |
ソースから custom FBoWをインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
cd ~/work-vslam git clone https://github.com/OpenVSLAM-Community/FBoW.git cd FBoW mkdir build && cd build cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ .. make -j4 sudo make install |
g2oをインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
cd ~/work-vslam git clone https://github.com/RainerKuemmerle/g2o.git cd g2o git checkout 9b41a4ea5ade8e1250b9c1b279f3a9c098811b5a mkdir build && cd build cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DCMAKE_CXX_FLAGS=-std=c++11 \ -DBUILD_SHARED_LIBS=ON \ -DBUILD_UNITTESTS=OFF \ -DG2O_USE_CHOLMOD=OFF \ -DG2O_USE_CSPARSE=ON \ -DG2O_USE_OPENGL=OFF \ -DG2O_USE_OPENMP=ON \ .. make -j4 sudo make install |
SocketViewerを使うので、ソースから socket.io-client-cppをインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
cd ~/work-vslam git clone https://github.com/shinsumicco/socket.io-client-cpp.git cd socket.io-client-cpp git submodule init git submodule update mkdir build && cd build cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DBUILD_UNIT_TESTS=OFF \ .. make -j4 sudo make install |
SocketViewerを使うので、 Protobufをインストール
Ubuntu 18.04 の環境なので以下を実行
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sudo apt install -y libprotobuf-dev protobuf-compiler wget -q https://github.com/google/protobuf/archive/v3.6.1.tar.gz tar xf v3.6.1.tar.gz cd protobuf-3.6.1 ./autogen.sh ./configure \ --prefix=/usr/local \ --enable-static=no make -j4 sudo make install |
Build Instructions
SocketViewerを使ってみます。
openvslamのディレクトリに移動してSocketViewerをビルド
1 2 3 4 5 6 7 8 9 10 11 12 13 |
cd ~/openvslam mkdir build && cd build cmake \ -DUSE_PANGOLIN_VIEWER=OFF \ -DUSE_SOCKET_PUBLISHER=ON \ -DUSE_STACK_TRACE_LOGGER=ON \ -DBUILD_TESTS=ON \ -DBUILD_EXAMPLES=ON \ .. make -j4 |
makeでエラーが発生した場合
なにぶんにも依存パッケージが多いので、実行するたびに違ったエラーに遭遇しました。
個々のパッケージによってはダウンロード時点でアップデートされていたり、変更が加えられていたりする可能性もあります。
今回はこの2つでした。
エラー1:以下のようなヘッダーファイルが見つからないエラー
fbow/vocabulary.h:No such file or directory ………….
対処:見つかった場所から対象フォルダーへコピー
1 2 3 4 |
sudo cp /home/jetson/openvslam/3rd/FBoW/include/fbow/vocabulary.h /usr/local/include/fbow sudo cp /home/jetson/openvslam/3rd/FBoW/include/fbow/type.h /usr/local/include/fbow sudo cp /home/jetson/openvslam/3rd/FBoW/include/fbow/bow_vector.h /usr/local/include/fbow sudo cp /home/jetson/openvslam/3rd/FBoW/include/fbow/bow_feat_vector.h /usr/local/include/fbow |
エラー2:共有オブジェクトが見つからないエラー
/usr/local/bin/protoc: error while loading shared libraries: libprotoc.so.17: cannot open shared object file: No such file or directory
対処:パスをexport
1 |
export LD_LIBRARY_PATH=/usr/local/lib |
再度
make -j4
インストールを確認
1 2 3 |
cd ~/openvslam/build ./run_kitti_slam -h |
SocketViewer用にサーバーをセットアップ
1 2 |
cd ~/openvslam/viewer ls |
Dockerfile app.js package.json public views
1 |
npm install |
added 88 packages from 60 contributors and audited 204 packages in 2.105s
found 0 vulnerabilities
1 |
ls |
Dockerfile app.js node_modules package-lock.json package.json public views
サーバーを起動
1 2 |
cd ~/openvslam/viewer ls |
Dockerfile app.js node_modules package-lock.json package.json public views
1 |
node app.js |
WebSocket: listening on *:3000
HTTP server: listening on *:3001
ブラウザーを開いて、http://127.0.0.1:3001 にアクセスします。
Simple Tutorial
どんなことができるのか見てみましょう
Running the following commands will give a feel for what OpenVSLAM can do.
次のコマンドを実行すると、OpenVSLAM ができることを実感できます。
つまり、「OpenVSLAM 」ってどんな感じ….ということ。
Step1
1 |
cd ~/openvslam/build |
Step2
コピペする場合の注意:下記のコードで{CODE}の前に$があります。無ければ追記しておいてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# download an ORB vocabulary from GitHub 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 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 |
Step3
1 2 3 |
# run tracking and mapping ./run_video_slam -v ./orb_vocab.fbow -m ./aist_living_lab_1/video.mp4 -c ../example/aist/equirectangular.yaml --frame-skip 3 --no-sleep --map-db map.msg |
環境地図作成
こんな感じです(Nanoだと2FPSくらい)。
リコーのTHETA Sを使って撮影した360度全天球動画を使って、環境地図を作成します。
特徴点を抽出しながら、方向や距離をマッピングしています(ただこの距離に単位があるかは不明、IMUやオドメトリなどを使っていれば有なんですが)。
最終的にはこうなります。
注:run_video_slamを走らせている場合、終了は正しくメニュの [Terminate]ボタンをクリックして行ってください。そうしないとデータとしてmap.msgが作成されません。
その場合、次のrun_video_localizationで以下のエラーが発生します。
[C] cannot load the file at map.msg
エラーが解消しない場合は、上記Step2を対象フォルダーやファイルを削除した後、一から再実行
Localization(自己位置推定) を走らせてみます。
./run_video_localization -v ./orb_vocab.fbow -m ./aist_living_lab_2/video.mp4 -c ../example/aist/equirectangular.yaml --frame-skip 3 --no-sleep --map-db map.msg
こんな感じです。
mappingで使った動画とは違う動画を使って、どこを移動してしているか推定しています。
mappingに無い場所に行くと自己位置をロスト(tracking lost)していますね。
でもその後relocalizationできてます…..。
注:以下の画像ではtracking lostが3か所で起きていますが、Videoをフルフレームでmappingしたmap.msgデータの場合はtracking lostが起きるの一か所のみです。これは以下の例で使ったmap.msgが途中でTerminateした不十分なmappingデータだからだと思われます。
動画に写っているのがどこなのか、グリーンの移動体が推定された位置です。
データについて
マッピングデータはmap.msg というファイルに保存されています(今回の場合だいたい62MBくらいのサイズ)。
フォーマットはMessagePackという形式(JSONのような仕様らしい)ですが、シリアライズされたバイナリになっているので普通に開いても分かりません。
Python なら以下のコードでテキストに落とせますが、倍ぐらいのサイズになります。
1 |
pip3 install msgpack-python |
テキストに変換して書き出し ます。
1 2 3 4 5 6 7 8 9 10 11 |
# -*- coding: UTF-8 -*- import msgpack s = "" for msg in msgpack.Unpacker(open('map.msg', 'rb')): s = s + str(msg) f = open('map.txt', 'w') f.write(s) f.close() |
でも一覧しても分からないです。要調査です。
Pangolin Viewerを使用する場合
以下を追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
sudo apt install -y libglew-dev cd ~/work-vslam git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin git checkout ad8b5f83222291c51b4800d5a5873b0e90a0cf81 mkdir build && cd build cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ .. make -j4 sudo make install |
Build Instructions
Socket Viewer をビルド済みの場合はbuildフォルダーを削除するか改名しておきます。
Pangolin Viewer のビルド(幸いエラーは起きませんでした)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
cd ~/openvslam mkdir build && cd build cmake \ -DUSE_PANGOLIN_VIEWER=ON \ -DINSTALL_PANGOLIN_VIEWER=ON \ -DUSE_SOCKET_PUBLISHER=OFF \ -DUSE_STACK_TRACE_LOGGER=ON \ -DBUILD_TESTS=ON \ -DBUILD_EXAMPLES=ON \ .. make -j4 |
Next
Running on Docker
Jetson Nano(4GB) のDockerコンテナでOpenVSLAMを試してみる(2/3)
Next2
Running on ROS
Next3
ArUcoなどを使ってGPS無しで緯度・経度を推定
Appendix
PDF版マニュアルで例示されているデータセットを使う場合のコマンド
ただし4.3.3 のTUM RGBD dataset のコマンドはマニュアルとは異なります。
4.1 SLAM with Video Files
run_video_slam / run_video_localization
4.2 SLAM with Image Sequences
run_image_slam / run_image_localization
4.3 SLAM with Standard Datasets
4.3.1 KITTI (Karlsruhe Institute of Technology and Toyota Technological Institute) Odometry dataset
run_kitti_slam
4.3.2 EuRoC MAV (European Rocketry Challenge Micro Aerial Viecle) dataset
run_euroc_slam / run_euroc_localization
4.3.3 TUM RGBD (Technische Universität München RGBD) dataset
run_tum_rgbd_slam
4.4 SLAM with UVC (USB Video Class) camera
run_camera_slam / run_camera_localization
Appendix2
VRなどでリコーのTHETA S を使ったことのある方はお気づきだと思いますが、ここでシレっとSで撮った動画と言ってしまっていますが、Sの動画はEquirectangular形式ではなくDual-Fisheyeです。Equirectangular形式の動画はTHETA V からしか対応していないはず。
従ってそのままでは使えません。変換が必要です。
この方のブログも参考にしてみてください。
注:OpenVSLAMはFisheyeにも対応してるようですが、単眼(Monocular)です。Dual-Fisheyeには対応していないようです。
Fisheyes Datasets を使う場合の注意
configファイルは../example/aist/fisyeye.yamlを使います(スペルが変ですが、ファイル名はそうなっています)。
orb_vocab.fbowもマニュアルで指定されたものを新規にダウンロードして使いましょう(途中でtracking lostします)。
課題
Google StreetView (indoor)がこの展開で使えるか調査
Leave a Reply