#◆ 前回記事
RaspberryPi3とZumoとROSで半永久自走式充放電ロボを作成したい_011日目_SLAM_Karto SLAM_LiDAR(A1M8) の続き
#◆ はじめに
今回は ORB-SLAM2
を試行してみる。
今回 | 他記事 | アルゴリズム | 特徴 |
---|---|---|---|
008日目 | Gmapping | 一番有名らしい、ROS対応、loop closure有り | |
009日目 | Google Cartographer | 精度が高そう、ROS対応、loop closure有り | |
010日目 | Hector SLAM | 精度がいまいちっぽい、loop closure無し | |
011日目 | Karto SLAM | 単眼カメラでも動く、ROS対応、Visual-SLAM | |
★ | ORB-SLAM2 | 単眼カメラでも動く、Visual-SLAM | |
007日目 | mono-vo | 単眼カメラでも動く、Visual-SLAM | |
013日目 | VINS-Mono | 単眼カメラでも動く、ROS対応、Visual-SLAM、ドローン | |
ー | ー | CNN-SLAM | 単眼カメラでも動く、3D、アイデアのメモ情報しか見当たらなかったため検証対象外とする |
ー | ー | RGBD-SLAM-V2 | RGB-Dカメラ専用、検証対象外とする |
では、恒例のとおり、結果から先に公開。
こいつはスゴイ! と直感的に感じた。
単眼USBカメラ + ROS の構成にも関わらず、三次元で部屋の様子が綺麗に捉えられているのが分かるだろうか。
自宅の居間が。。。点の集まりでだけ立体的に再現されようとしている。。。
■ ROS + USBカメラ による ORB_SLAM の実行画像
#◆ 参考にさせていただいた記事、謝辞
【公式】
https://github.com/raulmur/ORB_SLAM2
【nnn112358さん】
ROSのORB_SLAM2を動かしてみた。 Qiita
【EnsekiTTさん】
【7Days自由研究】Visual SLAMとROSを使えるようになる話 Day-1 EnsekiTT Blog
【7Days自由研究】Visual SLAMとROSを使えるようになる話 Day-2 EnsekiTT Blog
【7Days自由研究】Visual SLAMとROSを使えるようになる話 Day-3 EnsekiTT Blog
【7Days自由研究】Visual SLAMとROSを使えるようになる話 Day-4 EnsekiTT Blog
【7Days自由研究】Visual SLAMとROSを使えるようになる話 Day-5 EnsekiTT Blog
【7Days自由研究】Visual SLAMとROSを使えるようになる話 Day-6 EnsekiTT Blog
【7Days自由研究】Visual SLAMとROSを使えるようになる話 Day-7【最終話】 EnsekiTT Blog
#◆ 作業に着手する前の前提条件
Raspbian Stretch+NCS(Neural Compute Stick)+YoloV2+Webカメラ+ROSによるリアルタイム複数動体検知環境の構築 と 002日目 から 011日目 の記事を参考に、全ての作業を実施済みであり、導入済みパッケージの種類と数の同期がとれていることを前提とする。
#◆ UbuntuPCでのシミュレーション
このフェーズで使用する検証環境は下記。
■ 検証用PC
- OS:Ubuntu 16.04
- CPU:第3世代 Intel Core i7-3517U(1.9GHz)
- MEM:16GB
- ROS kinetic
##● シミュレーション環境構築
1.下記コマンドを実行する。
$ sudo apt-get install libglew-dev
$ mkdir ~/catkin_wsos
$ export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/ros_dev/ORB_SLAM2/Examples/ROS
2.下記コマンドを実行する。
$ cd ~/catkin_wsos
$ git clone https://github.com/PINTO0309/Pangolin.git
$ cd Pangolin
$ mkdir build;cd build
$ cmake ..
$ make -j4
$ sudo make install
3.ORB_SLAM2のCloneとビルドを行う。
$ cd ~/catkin_wsos
$ git clone https://github.com/PINTO0309/ORB_SLAM2.git ORB_SLAM2
$ cd ORB_SLAM2
$ chmod +x build.sh
$ ./build.sh
4.下記コマンドを実行し、CMakeLists.txt を編集する。
【参考】 https://github.com/raulmur/ORB_SLAM2/issues/494
$ nano ~/catkin_wsos/ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
)
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
-lboost_system
)
5.ORB_SLAM2のROSノードをコンパイルする。
$ chmod +x build_ros.sh
$ ./build_ros.sh
$ cd ~/catkin_wsos/ORB_SLAM2/Examples
$ rosws init . /opt/ros/kinetic
$ rosws set ~/catkin_wsos/ORB_SLAM2/Examples/ROS -t .
$ cd ..
$ source setup.bash
$ cd ~/catkin_wsos/ORB_SLAM2/Examples/ROS
$ rosmake ORB_SLAM2
##● サンプルデータによるシミュレーション
###* ROS無し + シミュレーションデータ
まずは、 ROS無し
でトライしてみる。
$ mkdir ~/catkin_wsos/dataset;cd ~/catkin_wsos/dataset
$ wget https://vision.in.tum.de/rgbd/dataset/freiburg1/rgbd_dataset_freiburg1_xyz.tgz
$ tar -zxf rgbd_dataset_freiburg1_xyz.tgz
$ cd ~/catkin_wsos/ORB_SLAM2
$ ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml ../dataset/rgbd_dataset_freiburg1_xyz
むむっ・・・なんとか動いたぞ!
何やらスゴい匂いはビンビン伝わってくる。
まさか、単眼カメラで姿勢推定までやっているということなのか。 すごいな。
ただ、現時点ではいまいち活用の方法はピンときていない。
###* ROS有り + シミュレーションデータ
では、次に ROS有り + シミュレーションデータ
でトライしてみる。
$ cd ~/catkin_wsos
$ wget http://vmcremers8.informatik.tu-muenchen.de/lsd/LSD_room.bag.zip
$ unzip LSD_room.bag.zip;rm LSD_room.bag.zip
$ cd ~/catkin_wsos/ORB_SLAM2
$ source Examples/setup.bash
$ roscore
$ cd ~/catkin_wsos/ORB_SLAM2
$ source Examples/setup.bash
$ rosbag play ~/catkin_wsos/LSD_room.bag /image_raw:=/camera/image_raw
$ rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml
こちらも問題無く動いた。
シミュレーションデータでやっていることなので、 ROS無し
の場合と比べてあまり違いを感じない。
ちなみに余談だが、ココまで、さも簡単に環境構築を進めているように見えるかもしれないが、実際は公式のチュートリアルどおりに環境構築を進めた結果、悪夢の Segmentation Fault
が発生し、5回ほどゼロから環境を作り直し、ようやく動作させることに成功している。
公式チュートリアルどおりではうまくいかなかった。
##● USBカメラによるSLAM
では、次に ROS有り + USBカメラ
でリアルのカメラ画像を使用してトライしてみる。
まずは、USBカメラ連携用ROSパッケージのインストールと設定変更を行う。
$ cd ~/catkin_wsos
$ mkdir src;cd src
$ git clone https://github.com/PINTO0309/video_stream_opencv.git
$ cd ..
$ catkin_make
$ cp src/video_stream_opencv/launch/webcam.launch src/video_stream_opencv/launch/BK_webcam.launch
$ nano src/video_stream_opencv/launch/webcam.launch
下記のとおり編集する。
<arg name="camera_name" value="webcam" />
<arg name="visualize" value="true" />
<arg name="camera_name" value="camera" />
<arg name="visualize" value="false" />
では、設定が一通り終わったので ROS有り + USBカメラ
の構成で ORB_SLAM を実行してみる。
$ roscore
$ source devel/setup.bash
$ roslaunch video_stream_opencv webcam.launch
$ cd ~/catkin_wsos/ORB_SLAM2
$ source Examples/setup.bash
$ rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml
◆ はじめに へ掲載の画像のとおりの動きになった。
思いのほか部屋の様子がしっかりと再現されていて、ビックリしてしまった。
リソースの制約を度外視すれば、アルゴリズムの性能はすごく良さそう。
やり始めたら面白くなってきて、ついつい全てやりきってしまったが、RaspberryPiで処理させるにはあまりにも重量級の処理だったため、今回もRaspberryPiを使用した検証は見送る。
今回検証に使用した Corei7 クアッドコア機種 でもファンがウァンウァン唸りっぱなしだったので相当キツイと思う。
過去記事の YoloV2、TinyYolo、MobileNet-SSD の検証の際に、画像処理系はARMのCPU単体ではとても負荷が高いことが分かっていたため、ほぼ想定どおりの試行結果だった。
やりたいことに対しては三次元で周囲を捉える必要性は無く、とても面白いのだけれど、今回は採用を見送ることになると思う。
#◆ 本日のまとめ
- ORB-SLAMは、ものすごく目に訴えるものがある。
- 単眼カメラだけで姿勢推定までできてしまうものなの? ホントに凄すぎる。
- デプスカメラ や ステレオカメラ が無くてもここまでできるのか。
- 画像処理に強いGPUチップを積んだボードなら処理に耐えられるかもしれない。
- 少なくとも RaspberryPi にはほぼ対応不能ではないだろうか。
- ルート探索には不向きな感じがした。
- もっと高精度で高密度な三次元点群として捉えることができれば、かなり使えるものになるのかもしれない。
- 沢山のアルゴリズムを試行してきて感じ始めているのは、 「アルゴリズムは用途に応じて適材適所」 ということ。
- 他の何かと組み合わせて表現できると面白そう。
- 可視化部分だけを切り離せば、意外といける、のかもしれない。
#◆ 次回予告
次は VINS-Mono
にチャレンジしてみようと思う。
#◆ 次回記事
RaspberryPi3とZumoとROSで半永久自走式充放電ロボを作成したい_013日目_SLAM_VINS-Mono へ続く