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

#<font color="#08088A">◆ 前回記事</font>
[RaspberryPi3とZumoとROSで半永久自走式充放電ロボを作成したい\_012日目_SLAM_ORB-SLAM2](https://qiita.com/PINTO/items/5ffdb0484b07d78ab38f)　の続き
#<font color="#08088A">◆ はじめに</font>
今回は **`VINS-Mono`** を試行してみる。
ドローンを使用した空中での自己位置推定を想定したアルゴリズムのようだ。

いよいよSLAM検証祭り最終回。
Visual-SLAMは **[やりたいこと](https://qiita.com/PINTO/items/31df88d0b11189a5ba62)** の要件には合わないことがわかってきたが、せっかくなので最後までしっかり検証しようと思う。
**ちなみに当方、ドローンは所持していない。**

|今回|他記事|アルゴリズム|特徴|
|:-:|:--|:---|:---|
||**[008日目](https://qiita.com/PINTO/items/9aa737c284dc4e8212f1)**|**[Gmapping](https://github.com/ros-perception/slam_gmapping/tree/hydro-devel/gmapping)**|一番有名らしい、ROS対応、loop closure有り|
||**[009日目](https://qiita.com/PINTO/items/4845c438cac05eda4d1e)**|**[Google Cartographer](https://github.com/googlecartographer/cartographer)**|精度が高そう、**[ROS対応](https://github.com/googlecartographer/cartographer_ros)**、loop closure有り|
||**[010日目](https://qiita.com/PINTO/items/b3eb7205baf9c55de81b)**|**[Hector SLAM](https://github.com/tu-darmstadt-ros-pkg/hector_slam)**|精度がいまいちっぽい、loop closure無し|
||**[011日目](https://qiita.com/PINTO/items/7939b1e53e23a9458c1d)**|**[Karto SLAM](https://www.kartorobotics.com/)**|単眼カメラでも動く、**[ROS対応](https://github.com/ros-perception/slam_karto)**、Visual-SLAM|
||**[012日目](https://qiita.com/PINTO/items/5ffdb0484b07d78ab38f)**|**[ORB-SLAM2](https://github.com/raulmur/ORB_SLAM2)**|単眼カメラでも動く、Visual-SLAM||
||**[007日目](https://qiita.com/PINTO/items/c5d69c0c0c58d4ded3f8)**|**[mono-vo](https://github.com/PINTO0309/mono-vo)**|単眼カメラでも動く、Visual-SLAM|
|★||**[VINS-Mono](https://github.com/PINTO0309/VINS-Mono)**|単眼カメラでも動く、ROS対応、Visual-SLAM、ドローン|
|ー|ー|**[CNN-SLAM](https://github.com/Lishunkai/CNN-SLAM)**|単眼カメラでも動く、3D、アイデアのメモ情報しか見当たらなかったため検証対象外とする|
|ー|ー|**[RGBD-SLAM-V2](http://wiki.ros.org/rgbdslam)**|RGB-Dカメラ専用、検証対象外とする|

#<font color="#08088A">◆ 参考にさせていただいた記事、謝辞</font>
**【公式】
https://github.com/HKUST-Aerial-Robotics/VINS-Mono**

#<font color="#08088A">◆ 作業に着手する前の前提条件</font>
**[Raspbian Stretch+NCS(Neural Compute Stick)+YoloV2+Webカメラ＋ROSによるリアルタイム複数動体検知環境の構築](https://qiita.com/PINTO/items/b084fe3dc716c42e2867)** と **００２日目** から **０１２日目** の記事を参考に、全ての作業を実施済みであり、導入済みパッケージの種類と数の同期がとれていることを前提とする。

#<font color="#08088A">◆ UbuntuPCでのシミュレーション</font>
このフェーズで使用する検証環境は下記。

■ 検証用PC

1. OS：Ubuntu 16.04
2. CPU：第3世代 Intel Core i7-3517U(1.9GHz)
3. MEM：16GB
4. ROS kinetic

##<font color="#0B3B39">● シミュレーション環境構築</font>

```shell:VINS-MonoのCloneとビルド_91MB
$ sudo apt install libceres-dev libceres1
$ cd ~/catkin_ws/src
$ git clone https://github.com/PINTO0309/VINS-Mono.git
$ cd ../
$ catkin_make
$ source devel/setup.bash
```

```shell:サンプルデータとグランドトゥルースデータのダウンロード_1.5GB+1.6GB
$ wget http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_05_difficult/MH_05_difficult.bag
$ wget http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_05_difficult/MH_05_difficult.zip
$ unzip MH_05_difficult.zip;rm MH_05_difficult.zip
```

■ bagファイルの中身
![masked.png](https://qiita-image-store.s3.amazonaws.com/0/194769/3b4db732-7c68-54af-1696-02117b4b5304.png)

##<font color="#0B3B39">● ドローン飛行シミュレーションデータによるSLAM</font>

```shell:VINS-Mono本体の起動
$ roslaunch vins_estimator euroc.launch
```

```shell:rvizの起動
$ roslaunch vins_estimator vins_rviz.launch
```

```shell:シミュレーションデータのプレイバック
$ rosbag play MH_05_difficult.bag
```

**って・・・ <font color="red">うぉぉ！！ すごい！！</font>**
Visual-SLAMの中でも最も素晴らしいと感じた。
"地図" ではないけど、軌道はすごい精度で推定してプロットできている気がする。
bagファイルに記録されている情報に、単眼カメラ画像だけではなく慣性情報(IMU)も含まれているため、若干反則気味だけど。。。

■ シミュレーションデータによるデモ
![ezgif.com-optimize (8).gif](https://qiita-image-store.s3.amazonaws.com/0/194769/7c61b238-c25f-11d4-575a-e6aa630a1b4b.gif)

グランドトゥルース(実際に実機が移動した軌跡)も一緒に描画したいときは、 **`rosbag play`** を実行する直前で下記を実行しておく。
グランドトゥルースは赤い線で描画される。

```shell:グランドトゥルースデータの読み込み
$ roslaunch benchmark_publisher publish.launch sequence_name:=MH_05_difficult
```

##<font color="#0B3B39">● ARのデモ</font>
なんのことだか分からないが、公式チュートリアルに 「ARデモ」 というセクションがあったので一応実行してみる。

```shell:ARデモデータのダウンロード
$ cd ~/catkin_ws
$ wget -O ar_box.bag https://www.dropbox.com/s/s29oygyhwmllw9k/ar_box.bag?dl=0
```
■ bagファイルの情報
![masked.png](https://qiita-image-store.s3.amazonaws.com/0/194769/e43722d4-156a-111c-ed50-9fc1d71c9a2b.png)

```shell:ARデモ本体の起動
$ roslaunch ar_demo 3dm_bag.launch
```

```shell:rvizの起動
$ roslaunch ar_demo ar_rviz.launch
```

```shell:シミュレーションデータのプレイバック
$ rosbag play ar_box.bag
```

著しく本題とはかけ離れるけど、 **おもしろい！！**

■ AR用シミュレーションデータによるデモ
![ezgif.com-optimize (10).gif](https://qiita-image-store.s3.amazonaws.com/0/194769/ad8303fd-f2c2-ef5d-7771-f69926ab49c8.gif)

これまでの作業経過により、自作したロボットからIMUをパブリッシュする仕組みは構築済みのため、単眼カメラからの映像入力＋IMUの組み合わせで、立体的な動きをトレースすることも可能となりそうだ。
ただ、要件上は立体的な自己位置推定は不要なため、RaspberryPiによる検証はスキップする。

#<font color="#08088A">◆ 本日のまとめ</font>

- 段々と回を重ねるごとに組み合わせ次第でどういうことができるかが分かってきた。 依然として理論は分からないけど。
- VINS-Mono は想像よりも負荷が高くなさそうだ。
- VINS-Mono は mono-vo のアルゴリズムに慣性情報を足して、立体軌道をプロットできるようにした強化版アルゴリズム、というイメージかな。
- CNN-SLAM は実行環境が見当たらなかったため、急遽検証を取りやめる。
- SLAM祭り、猛烈に大変だったけど楽しかった。 少しだけ達成感。

#<font color="#08088A">◆ 次回予告</font>
次回は **`Google CartoGrapher`** を使用し、遠隔制御で走行させたロボットから地図データを収集して、我が家の１フロア分の地図を完成させてみたい。

#<font color="#08088A">◆ 次回記事</font>
[RaspberryPi3とZumoとROSで半永久自走式充放電ロボを作成したい_014日目_SLAM_自律走行の前準備_ロボット再構成と自宅の地図作成 【"沼" 突入中】](https://qiita.com/PINTO/items/fb0d44b2bb9455800667)　へ続く