Jetson Nano(4GB) でOpenVSLAMを試してみる(1/3)


気になっていた産総研の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くらい)です。

 

rootユーザにしていない場合適宜sudoを頭につける必要があります(ここではsudoで実行)。

ユーザーホームで作業します(jetsonの部分はご自分の環境によって適宜書き換えてください)。

OpenVSLAMのソースをリポジトリからクローンしておきます。

 


OpenVSLAMは前提になるパッケージやライブラリがかなりあります。
まずはそれらをセットアップしておきます。

 


作業ディレクトリを作ってそこでパッケージ群をインストールします。

ソースからEigenをインストール

 

ソースからOpenCVをインストール

 

ソースから custom FBoWをインストール

 

g2oをインストール

 

SocketViewerを使うので、ソースから socket.io-client-cppをインストール

 

SocketViewerを使うので、 Protobufをインストール

Ubuntu 18.04 の環境なので以下を実行

 


Build Instructions

SocketViewerを使ってみます。

openvslamのディレクトリに移動してSocketViewerをビルド

makeでエラーが発生した場合

なにぶんにも依存パッケージが多いので、実行するたびに違ったエラーに遭遇しました。
個々のパッケージによってはダウンロード時点でアップデートされていたり、変更が加えられていたりする可能性もあります。

今回はこの2つでした。
エラー1:以下のようなヘッダーファイルが見つからないエラー
fbow/vocabulary.h:No such file or directory ………….

対処:見つかった場所から対象フォルダーへコピー

 

エラー2:共有オブジェクトが見つからないエラー
/usr/local/bin/protoc: error while loading shared libraries: libprotoc.so.17: cannot open shared object file: No such file or directory

対処:パスをexport

 

再度
make -j4

インストールを確認

 


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}の前に$があります。無ければ追記しておいてください。

 

Step3

環境地図作成

 

こんな感じです(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 なら以下のコードでテキストに落とせますが、倍ぐらいのサイズになります。

テキストに変換して書き出し ます。

でも一覧しても分からないです。要調査です。

 


Pangolin Viewerを使用する場合

以下を追加

Build Instructions

Socket Viewer をビルド済みの場合はbuildフォルダーを削除するか改名しておきます。

Pangolin Viewer のビルド(幸いエラーは起きませんでした)

 


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への変換

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*