Navigation Stack を理解する - 4.1 gmapping: ROSで遊んでみる

# 目次
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 の子分的存在の一つである，[gmapping](http://wiki.ros.org/gmapping) について記述します．いわゆるSLAM 問題の部分で，本投稿記事の中で理解に一番苦しむところです^^;

やりたいことは，地図生成と自己位置推定を同時に実行することです．前節amclでは，地図が天から降ってきたことを前提としてことを進めていましたが，ここでは地図も作っちゃうよ，というお話です．

さて，ソフトウェア構成内の位置づけとしては，下記の図に示すとおりです．

- ROS Wiki の図中
![01_位置づけ1.png](https://qiita-image-store.s3.amazonaws.com/0/110138/f97011ee-6ca7-bcec-5a72-3242e27dfa73.png)

- 導入部で示したパッケージの図中
![02_位置づけ2.png](https://qiita-image-store.s3.amazonaws.com/0/110138/cb1e686e-910d-43cd-ed2d-2ec4df3cb4e8.png)

導入でも説明したとおり，gmapping はnavigation stack の中にあるパッケージではありません．slam_gmapping というメタパッケージの配下にあるのです．別にこれである必要性はないのですが，一番広く使われているということでgmapping について記述している，という位置づけです．

# 環境
- 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)

# Husky Gmapping Demo について
[gmapping](http://wiki.ros.org/gmapping) を使ったSLAMを体感します．こんどは地図がない状態からスタートです．

![03_チュートリアル位置づけ.png](https://qiita-image-store.s3.amazonaws.com/0/110138/39d4ef61-6311-0221-1226-f93511776366.png)

# ROSで遊んでみる
遊んでみましょう．

## インストール
[Navigation Stack を理解する - 2.1 move_base: ROSで遊んでみる](http://qiita.com/MoriKen/items/8387b279e968368783f1) でインストールしたパッケージで十分です．

## 各種launch ファイルの起動
i. Husky シミュレータの起動（gazebo）

```bash
$ roslaunch husky_gazebo husky_playpen.launch
```
![01.png](https://qiita-image-store.s3.amazonaws.com/0/110138/9507065d-fb12-948f-94e6-099662e1fdff.png)

ii. ビジュアライザの起動（rviz）

```bash
$ roslaunch husky_viz view_robot.launch
```

iii. gmapping の起動

```bash
$ roslaunch husky_navigation gmapping_demo.launch
```

amcl の時と同様に，ワールド座標系の原点は /map フレームとしておきます．初期状態では，地図が存在しないことが分かります．
![03_初期状態.png](https://qiita-image-store.s3.amazonaws.com/0/110138/6427bee7-bb32-9a59-66d2-b8eaad9273e5.png)

vi. 地図の保存
後述するような方法でロボットを色々と動かした後，地図を作成した後，地図を保存します．

```bash
$ rosrun map_server map_saver -f <filename>
```

## SLAM を体感する
[Navigation Stack を理解する - 2.1 move_base: ROSで遊んでみる](http://qiita.com/MoriKen/items/8387b279e968368783f1) と同じ要領で目標を設定すれば，動きます．move_base, amcl とも異なる挙動をするのが見て取れます．

### 地図が徐々に作成されていく
move_base では地図が作られることはないので，ずっと見通しが悪いままです．一方amcl だと最初から地図があるのでチートだろ！となるわけです．でもgmapping では，少しずつ地図が作られている様子を確認することができます．

![04_地図作成過程.png](https://qiita-image-store.s3.amazonaws.com/0/110138/8e56d7a3-151b-ace4-5809-9c34a3c88d64.png)

特性上，一回通っただけで綺麗に地図を作るのは難しいです．隙間ができて気になるときは，何回かそこを通らせれば綺麗な地図ができます．
![05_地図作成過程2.png](https://qiita-image-store.s3.amazonaws.com/0/110138/8cae2887-8dcc-f915-0728-43d83e05072e.png)

こんな要領で色々なところをロボットに走らせます．まずは特徴がある狭い範囲でしっかり足固めをして，足固めしたところからじわりじわりと広げていくように探索をすると，うまく地図が繋がります．

いきなり突拍子もないところから探索をすると，どことどこが繋がっているのかよくわからなくなり，地図がずれやすくなってしまいます．

そんなことをひたすら繰り返しているうちに，地図が完成します．いやー，綺麗に作れると安心しますね^^
![05.png](https://qiita-image-store.s3.amazonaws.com/0/110138/42718912-faa8-742c-36f1-8f4cc922fc30.png)


## おわりに
遊べるのはこんなところです．とっても簡単に遊ぶことができます．もちろん頑張っているのはgmapping なのですが．引き続き次項以降でその辺りを紐解いていきます．

Next: [4.2 gmapping: ソフトウェア構成をみる](http://qiita.com/MoriKen/items/65ac41abca9fdf6051be)
Prev: [3.4 amcl: 原理をみる (応用編)](http://qiita.com/MoriKen/items/dfb6eb168649873589f0)

## 参考文献
1. [S Thrun, et al., "Probabilistic Robotics", the MIT Press, 2005.](http://www.probabilistic-robotics.org/)
2. [ROS Wiki.](http://wiki.ros.org)
3. ["ros-planning/navigation", github.](https://github.com/ros-planning/navigation)
3. ["husky_navigation", github.](http://wiki.ros.org/husky_navigation/)