masato-ka's diary

日々思ったこととか、やったことの備忘録。

JetbotでOpenVSLAMを試してみた。

この記事にてついて

この記事ではJetbotを使ってOpenVSLAMを動かした内容をまとめている。SLAMの実行はJetson nanoではなく、別のホストマシンで実行した。ROSの設定方法や、動かし方を中心に記載している。

ROSで使える単眼SLAM

ORB_SLAM2とOpenVSLAMがROSパッケージのサンプルを同梱している。ORB_SLAM2のROSサンプルはSLAMのローカライゼーション結果(カメラの姿勢)もトピックに投げられるようになっている。OpenVSLAMはローカライゼーション結果はビュアーに表示されるのみだ。またORB_SLAMとOpenVSLAMは実行結果の表示にPangolinと呼ばれるOpenGLを使った3DViewerライブラリを利用する。そのためそれなりのビデオチップを搭載したマシンが必要になる。OpenVSLAMではPangolinを使わずにWEBブラウザのみで描画可能な表示モードが用意されている。今回はこれが決め手となり、OpenVSLAMを利用することにした。ちなみにORB_SLAM2はGPLv3でOpenVSLAMはBSDでそれぞれ公開されている。

環境構築

構成

SLAMの実行はVirtualBox上のUbuntu 18.04で実行した。物理マシンはMacBook Air 2018 メモリ16GBを利用。ROSのマスターはJetbot側にある。Jetbotで取得した画像はimage_procで圧縮し、/jetbot/image_rawへパブリッシュされる。ホスト側のUbuntuではimage_transferで画像をrawに戻してOpenVSLMAの入力に送っている。JetbotのコントロールゲームコントローラをホストUbuntuに接続し、ROSのJoyパッケージで操作を行なっている。

f:id:masato-ka:20190719083653j:plain

Jetson nano上でもOpenVSLAMが動くことは確認したが、GPUを使うわけではないのでJetson nanoで動かす旨味はあまりない。

ROSのインストール

Jetson nano とホスト側のUbuntu環境へROSをインストールする。また、Jetson nano側のROSはPython3でROS Nodeを開発できるように設定を済ませておく必要がある。

masato-ka.hatenablog.com

Jetbot用ROSパッケージの準備

JetbotへJetbot用のROSパッケージを準備する。以下のリポジトリをJetson nano側のROSワークスペースにクローンしcatkin_makeしておく。

github.com

cd ~/your_ros_workspace/src
git clone https://github.com/masato-ka/ros_jetbot.git
cd ../
catkin_make

image_procパッケージをインストールしていない場合はインストールしておく。

sudo apt-get install -y ros-melodic-image-proc

OpenVSLAMのインストール

ホスト側のUbuntu 18.04へOpenVSLAMをインストールする。以下のページの手順に進めればインストールできる。16.04 testedと書いているが、18.04でも問題なくインストールできる。

openvslam.readthedocs.io

ポイントは以下の2つ。

  1. OpenCVは上記手順通りソースからビルドする
  2. SocketViewerでインストールする
  3. SocketViewer用のNode.js環境も構築する。

もちろんPangolinを選択しても問題はないが、それなりのビデオカードが必要になる。

OpenVSLAMのビルドまで完了したらROSパッケージのインストールを行う。こちらも公式の手順通りで問題ない。また、ビルドオプションはSocketViewerを選択する。image_transportパッケージのインストールも忘れずに実施する。

openvslam.readthedocs.io

ORB特徴のボキャブラリーファイルをダウンロードする。ちなみに何に使うのかは理解してないのでこの辺りはどっかで調べる。

# download an ORB vocabulary from Google Drive
cd /path/to/openvslam/build/
FILE_ID="1wUPb328th8bUqhOk-i8xllt5mgRW4n84"
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 orb_vocab.zip
unzip orb_vocab.zip

またカメラパラメータのファイルを作っておく。Jetbotに使う広角レンズ(SainSmart IMX219)の場合

cd /path/to/openvslam/build/
vi jetbot_mono.yaml

でjetbot_mono.yamlを新規作成する。記載内容は以下の内容を記載する。

#==============#
# Camera Model #
#==============#

Camera.name: "Jetbot"
Camera.setup: "monocular"
Camera.model: "perspective"

Camera.fx: 1138.042594 
Camera.fy: 1152.150891 
Camera.cx: 314.573090 
Camera.cy: 273.959896 

Camera.k1: -2.663941 
Camera.k2: 5.967979 
Camera.p1: -0.053529 
Camera.p2: 0.031916 
Camera.k3: 0.0

Camera.fps: 5.0
Camera.cols: 640
Camera.rows: 480 

Camera.color_order: "RGB"

#================#
# ORB Parameters #
#================#

Feature.max_num_keypoints: 2000
Feature.scale_factor: 1.2
Feature.num_levels: 8
Feature.ini_fast_threshold: 20
Feature.min_fast_threshold: 7

カメラが違う場合はcamera_calibration パッケージを利用してキャリブレーションをする。

wiki.ros.org

実行

Jetbot側の準備

JetbotのROSモジュールを実行する。

export ROS_MASTER_URI=http://[Jetbot IP]:11311
export ROS_IP=[Jetbot IP]
roslaunch ros_jetbot jetbot.launch

ホスト側の準備

Jetbotコントロール用のjoy_nodeの立ち上げ

export ROS_MASTER_URI=http://[Jetbot IP]:11311#JetbotのIPを指定する
export ROS_IP=[Ubuntu IP]#Ubuntu VMのIP
rosparam set joy_node/dev [ゲームパットのデバイスパス]
rosrun joy joy_node

image_transportモジュールの起動

export ROS_MASTER_URI=http://[Jetbot IP]:11311#JetbotのIPを指定する
export ROS_IP=[Ubuntu IP]#Ubuntu VMのIP
 rosrun image_transport republish compresin:=/jetbot/image_color raw out:=/camera/image_raw

Viewersサーバの起動

cd /path/to/openvslam/viewer
node app.js

OpenVSLAM ROSモジュールを起動

export ROS_MASTER_URI=http://[Jetbot IP]:11311
export ROS_IP=[Jetbot IP]
 rosrun openvslam run_slam -v /path/to/openvslam/build/orb_vocab/orb_vocab.dbow2 -c /path/to/openvslam/build/jetbot_mono.yaml

実行結果の確認

http://[Ubuntu IP]:3001にアクセスするとOpenVSLAMの実行結果を確認することができる。

f:id:masato-ka:20190718233102p:plain
OpenVSLAM-Jetbot

  • 動画

動画だと実験環境のネットワークコンディションのせいでカクカクしているがもう少しスムーズに動く。また、途中でロストしているが、再度ローカライゼーションに成功している。


Visual SLAM with Jetbot

まとめ

Jetson nanoのGPUを使っていないので、あまりうまみはないが、ローカライゼーションさせれば何か面白いことができるかもしれない。CNN SLAMなどDNNを使ったSLAMを使うと状況が違うのかもしれない。