気になっていた産総研の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くらい)です。
sudo swapoff - a
sudo fallocate - l 4G / swapfile
sudo chmod 600 / swapfile
sudo mkswap / swapfile
sudo swapon / swapfile
rootユーザにしていない場合適宜sudoを頭につける必要があります(ここではsudoで実行)。
ユーザーホームで作業します(jetsonの部分はご自分の環境によって適宜書き換えてください)。
OpenVSLAMのソースをリポジトリからクローンしておきます。
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
作業ディレクトリを作ってそこでパッケージ群をインストールします。
mkdir ~ / work - vslam
cd ~ / work - vslam
ソースからEigen をインストール
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 をインストール
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 の環境なので以下を実行
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をビルド
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 ………….
対処:見つかった場所から対象フォルダーへコピー
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
export LD_LIBRARY_PATH = / usr / local / lib
再度
make -j4
インストールを確認
cd ~ / openvslam / build
. / run_kitti_slam - h
SocketViewer用にサーバーをセットアップ
Dockerfile app.js package.json public views
added 88 packages from 60 contributors and audited 204 packages in 2.105s
found 0 vulnerabilities
Dockerfile app.js node_modules package-lock.json package.json public views
サーバーを起動
Dockerfile app.js node_modules package-lock.json package.json public views
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
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
# 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 なら以下のコードでテキストに落とせますが、倍ぐらいのサイズになります。
pip3 install msgpack - python
テキストに変換して書き出し ます。
# -*- 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を使用する場合
以下を追加
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 のビルド(幸いエラーは起きませんでした)
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)がこの展開で使えるか調査
mp4への変換
Leave a Reply