Navigation Stack を理解する - 4.2 gmapping: ソフトウェア構成をみる

# 目次
1. [導入](http://qiita.com/MoriKen/items/0b75ab291ab0d95c37c2)
2. move_base (ナビゲーション)
 3. [ROSで遊んでみる](http://qiita.com/MoriKen/items/8387b279e968368783f1)
 4. [ソフトウェア構成をみる](http://qiita.com/MoriKen/items/d5cd6208143d6c40caff)
3. amcl (自己位置推定)
 4. [ROSで遊んでみる](http://qiita.com/MoriKen/items/87be494f048ea03fdab8)
 4. [ソフトウェア構成をみる](http://qiita.com/MoriKen/items/26483e86fb556f0dc5ce)
 5. [原理をみる (準備編)](http://qiita.com/MoriKen/items/239f69df2921cc64bd62)
 6. [原理をみる (応用編)](http://qiita.com/MoriKen/items/dfb6eb168649873589f0)
4. gmapping (地図生成)
 4. [ROSで遊んでみる](http://qiita.com/MoriKen/items/74cbff9198f82f2b7ea8)
 4. [ソフトウェア構成をみる](http://qiita.com/MoriKen/items/65ac41abca9fdf6051be) ← いまココ
 6. [原理をみる(応用編)](http://qiita.com/MoriKen/items/0f2550a2adbdcd3da04e)
 5. 原理をみる(準備編 その1)
 5. 原理をみる(準備編 その2)

# はじめに
[Navigation Stack を理解する - 4.1 gmapping: ROSで遊んでみる](http://qiita.com/MoriKen/items/74cbff9198f82f2b7ea8)の続きです．amcl の自己位置推定問題から，SLAM問題になって，どのように内部構成が変わったのかを見てみます．構成上は，ほんの少しの違いです．

- ROS Wiki の図中
![01_位置づけ1.png](https://qiita-image-store.s3.amazonaws.com/0/110138/626cde1f-f8cb-d4a4-bf2d-451d95696144.png)


- 導入部で示したパッケージの図中
![02_位置づけ2.png](https://qiita-image-store.s3.amazonaws.com/0/110138/1b13d5d8-bebf-5927-eede-5f907b6ca4d8.png)

# 環境
- OS: Ubuntu 14.04
- ROS: Indigo
- モデル：[Husky](http://wiki.ros.org/Robots/Husky)
- パッケージ：[husky_navigation](http://wiki.ros.org/husky_navigation)
- チュートリアル：[Husky AMCL Demo](http://wiki.ros.org/husky_navigation/Tutorials/Husky%20AMCL%20Demo)
![husky-grass](http://wiki.ros.org/Robots/Husky?action=AttachFile&do=get&target=husky-grass.png)

# 位置づけ
実は，ここで紹介する["ros-perception/slam_gmapping", github.](https://github.com/ros-perception/slam_gmapping)のエンジン部分では，["gmapping", OpenSLAM](http://openslam.org/gmapping)を使っているのです．OpenSLAM はSLAMに関する開発成果を共有する場となっており，そのうち実績のあるものを活用しているのです．

gmapping で採用されているSLAMは，格子ベースのFastSLAM 2.0です．["gmapping", OpenSLAM](http://openslam.org/gmapping)によると，下記論文を基に実装されているとのことです．

- [Grisetti, Giorgio, Cyrill Stachniss, and Wolfram Burgard. "Improved techniques for grid mapping with rao-blackwellized particle filters." IEEE transactions on Robotics 23.1 (2007): 34-46.](http://www2.informatik.uni-freiburg.de/~grisetti/pdf/grisetti06tro.pdf)

# rqt_graph をベースにソフトウェアの構成を見る
## 素のrqt_graph を見る
まずは例によってrqt_graph を見てみます．

```bash
$ rqt_graph
```
![11_rqt_graph.png](https://qiita-image-store.s3.amazonaws.com/0/110138/6b8ab64b-2eef-2775-004b-c640ee94ce15.png)

比較のため，amcl 側のrqt_graphも見てみます．
![24.png](https://qiita-image-store.s3.amazonaws.com/0/110138/9b7a5d78-dfae-1d55-7ec3-a20ebac9baf4.png)

もうほとんど同じですね．主には，mapトピックからのびる矢印の方向が違う程度です．まとめる必要性も無さそうなほどですが，体裁を整えるという意味でも，簡易版に進んでみます．

## 簡易版rqt_graph を見る
下図がgmapping付きのものです．

![12_簡易rqt_graph.png](https://qiita-image-store.s3.amazonaws.com/0/110138/386aa3ff-d999-a28d-33c1-3f5a0c434709.png)

ソフトウェア構成的には，は[3.2 amcl: ソフトウェア構成をみる](http://qiita.com/MoriKen/items/26483e86fb556f0dc5ce)と比べると，mapトピックの矢印の向きが変わっただけです．

挙動の観点から言うと，move_base はこの作成途中の地図を使ってナビゲーションをしており，slam_gmapping は自分で作成途中の地図を使って自己位置推定もしています．（mapトピックからの矢印がslam_gmappingに伸びてはいませんが，内部的にはその情報を持っているから当然可能です．）

## おわりに
え，こんなもん？ええ，こんなもんです．これまで扱ってきた`move_base`と`amcl`の構成が分かっていることが前提ですが，たったこれだけの要素であの複雑そうなSLAMを使えるようにしてくれるフレームワーク(ROS)とエンジン(OpenSLAM gmapping)が偉いんです．

次項でその原理を追っていきます．amcl の時と同様に，理論的な導出については文献でなされているものとして，結論を拝借してリバースエンジニアリングをして挙動を理解してくことを試みます．

それでは．

Next: [4.3 gmapping: 原理をみる(応用編)](http://qiita.com/MoriKen/items/0f2550a2adbdcd3da04e)
Prev: [4.1 gmapping: ROSで遊んでみる](http://qiita.com/MoriKen/items/74cbff9198f82f2b7ea8)

## 参考文献
2. [ROS Wiki.](http://wiki.ros.org)
3. ["husky_navigation", github.](http://wiki.ros.org/husky_navigation/)
1. ["ros-perception/slam_gmapping", github.](https://github.com/ros-perception/slam_gmapping)
2. ["gmapping", OpenSLAM](http://openslam.org/gmapping)