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パッケージで操作を行なっている。
Jetson nano上でもOpenVSLAMが動くことは確認したが、GPUを使うわけではないのでJetson nanoで動かす旨味はあまりない。
ROSのインストール
Jetson nano とホスト側のUbuntu環境へROSをインストールする。また、Jetson nano側のROSはPython3でROS Nodeを開発できるように設定を済ませておく必要がある。
Jetbot用ROSパッケージの準備
JetbotへJetbot用のROSパッケージを準備する。以下のリポジトリをJetson nano側のROSワークスペースにクローンしcatkin_makeしておく。
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でも問題なくインストールできる。
ポイントは以下の2つ。
- OpenCVは上記手順通りソースからビルドする
- SocketViewerでインストールする
- SocketViewer用のNode.js環境も構築する。
もちろんPangolinを選択しても問題はないが、それなりのビデオカードが必要になる。
OpenVSLAMのビルドまで完了したらROSパッケージのインストールを行う。こちらも公式の手順通りで問題ない。また、ビルドオプションはSocketViewerを選択する。image_transportパッケージのインストールも忘れずに実施する。
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 パッケージを利用してキャリブレーションをする。
実行
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の実行結果を確認することができる。
- 動画
動画だと実験環境のネットワークコンディションのせいでカクカクしているがもう少しスムーズに動く。また、途中でロストしているが、再度ローカライゼーションに成功している。
まとめ
Jetson nanoのGPUを使っていないので、あまりうまみはないが、ローカライゼーションさせれば何か面白いことができるかもしれない。CNN SLAMなどDNNを使ったSLAMを使うと状況が違うのかもしれない。