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

# 目次
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 (地図生成)
 1. [ROSで遊んでみる](http://qiita.com/MoriKen/items/74cbff9198f82f2b7ea8)
 2. [ソフトウェア構成をみる](http://qiita.com/MoriKen/items/65ac41abca9fdf6051be)
 3. [原理をみる(応用編)](http://qiita.com/MoriKen/items/0f2550a2adbdcd3da04e)
 4. 原理をみる(準備編 その1)
 5. 原理をみる(準備編 その2)

# はじめに
[Navigation Stack を理解する - 3.1 amcl: ROSで遊んでみる]の続きです．amcl が加わって，どのように内部構成が変わったのかを見てみます．

- ROS Wiki の図中
![01_位置づけ1.png](https://qiita-image-store.s3.amazonaws.com/0/110138/1f09797a-2a60-9fa6-4b8d-568dac4422f7.png)

- 導入部で示したパッケージの図中
![02_位置づけ2.png](https://qiita-image-store.s3.amazonaws.com/0/110138/9dfa4487-ab6f-52a2-e62c-9a438dc7e0bf.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)

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

```bash
$ rqt_graph
```

![24.png](https://qiita-image-store.s3.amazonaws.com/0/110138/9b7a5d78-dfae-1d55-7ec3-a20ebac9baf4.png)

[2.1 move_base: ソフトウェア構成をみる](http://qiita.com/MoriKen/items/d5cd6208143d6c40caff)とそんなに大差はなさそうですね．でもやっぱりごちゃついてるので，ここも例によってまとめたものを見てみます．

## 簡易版rqt_graph を見る
下記がamcl付きの図になります．

![11_簡易rqt_graph.png](https://qiita-image-store.s3.amazonaws.com/0/110138/82fbb65b-64ce-a8c1-7d5f-51c4d63d1da5.png)

比較のため，[2.1 move_base: ソフトウェア構成をみる](http://qiita.com/MoriKen/items/d5cd6208143d6c40caff)の時の図を再掲します．
![09_rqt_graph風.png](https://qiita-image-store.s3.amazonaws.com/0/110138/17e715d7-6e27-5b73-68f8-a00056060242.png)

これらの図を元に，今回追加された要素の部分を強調するように描いたものが下図です．
![12_簡易rqt_graph_new.png](https://qiita-image-store.s3.amazonaws.com/0/110138/610c5ed4-5157-95c0-0763-9ab57b4cae93.png)

ここまで来れば一目瞭然です．
誤差が乗ったオドメトリ結果を，LRFと地図の情報を元に補正するフローがポコっと追加されただけです．

経路計画は[2.1 move_base: ソフトウェア構成をみる](http://qiita.com/MoriKen/items/d5cd6208143d6c40caff)と全く同様に行われます．ただし，精度の良い自己位置情報を使うという点が改善点されています．

![13_odom補正イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/110138/09446249-e6db-9364-597b-0e94c2c696fa.png)

![14_odom補正イメージ_rviz.png](https://qiita-image-store.s3.amazonaws.com/0/110138/b822158c-151c-f103-03e1-1e6e4602c8c3.png)

## おわりに
はい，以上です．外見的なソフトウェア構造については，以上が変更点です．
むしろ，頑張っているのはamcl の中身です．amclではパーティクルフィルタを活用した自己位置推定を行っているのですが，とても技巧的で興味深い特長を色々持っています．

次項でその原理を追っていきます．理論的な導出は[S Thrun, et al., "Probabilistic Robotics", the MIT Press, 2005.](http://www.probabilistic-robotics.org/)でなされているので，ここではその結論だけを拝借し，イラストをたくさん用いた説明を行うことで，挙動を直感的に理解することを支援するような記述にしようと思います．

Next: [3.3 amcl: 原理をみる (準備編)](https://qiita.com/MoriKen/items/239f69df2921cc64bd62)
Prev: [3.1 amcl: ROSで遊んでみる](http://qiita.com/MoriKen/items/87be494f048ea03fdab8)

## 参考文献
2. [ROS Wiki.](http://wiki.ros.org)
3. ["husky_navigation", github.](http://wiki.ros.org/husky_navigation/)