LoginSignup
13
14

More than 5 years have passed since last update.

RaspberryPi3とZumoとROSで半永久自走式充放電ロボを作成したい_012日目_SLAM_ORB-SLAM2

Last updated at Posted at 2018-05-21

◆ 前回記事

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 の実行画像
ezgif.com-optimize (7).gif

◆ 参考にさせていただいた記事、謝辞

【公式】
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

  1. OS:Ubuntu 16.04
  2. CPU:第3世代 Intel Core i7-3517U(1.9GHz)
  3. MEM:16GB
  4. 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.下記コマンドを実行する。

Pangolinのインストール
$ 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とビルドを行う。

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

CMakeLists.txt編集
$ 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ノードをコンパイルする。

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

ORB_SLAM2のビルドは無事成功したようだ。
masked.png
masked.png

● サンプルデータによるシミュレーション

* ROS無し + シミュレーションデータ

まずは、 ROS無し でトライしてみる。

ROS無しでのORB_SLAM実行
$ 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無しでのORB_SLAMの実行画像
ezgif.com-optimize (5).gif

* ROS有り + シミュレーションデータ

では、次に ROS有り + シミュレーションデータ でトライしてみる。

サンプルデータのダウンロード_ZIP474MB_解凍後832MB
$ 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
Masterの実行
$ cd ~/catkin_wsos/ORB_SLAM2
$ source Examples/setup.bash
$ roscore
ROSとシミュレーションデータによるORB_SLAMの実行
$ 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無し の場合と比べてあまり違いを感じない。

■ ROS有りでのORB_SLAMの実行画像
ezgif.com-optimize (6).gif

ちなみに余談だが、ココまで、さも簡単に環境構築を進めているように見えるかもしれないが、実際は公式のチュートリアルどおりに環境構築を進めた結果、悪夢の Segmentation Fault が発生し、5回ほどゼロから環境を作り直し、ようやく動作させることに成功している。
公式チュートリアルどおりではうまくいかなかった。

● USBカメラによるSLAM

では、次に ROS有り + USBカメラ でリアルのカメラ画像を使用してトライしてみる。
まずは、USBカメラ連携用ROSパッケージのインストールと設定変更を行う。

USBカメラ連携用ROSパッケージ(OpenCVベース)のインストール
$ 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 を実行してみる。

Masterの起動
$ roscore
USBカメラ連携用ROSパッケージを起動
$ source devel/setup.bash
$ roslaunch video_stream_opencv webcam.launch
ORB_SLAM本体の実行
$ 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 へ続く

13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14