「ROS + MoveIt! でハンドリングしたい！ 1. Moveit!ってなに？

# 謝辞
「Moveit!使ってハンドリングしよう」
という内容の記事ですが，ROS Advent Calendar 2017, 2018 どちらにも投稿予告してました．
が，，，結局投稿できずじまいでした．
関係者の皆様，本当に申し訳ありませんでした．
言い訳だけさせていただくと
私が初めてMoveit!を触り，リポジトリを整備したあたりから，本家のMoveit!リポジトリが大幅にドキュメント整備やアップデートがあったため，正直記事を書く前に追い続けるのが大変だったというのがあります．
それなら途中報告的に記事を書けばよかっただけだと反省しております．すみません．
で，やっとある程度コードを追って，好き勝手できるようになった（本当に...？）ので，まとめ記事を書きます．
よろしくお願いします．

# はじめに
ROSを使っていると必ずお世話になるであろういくつかの有力なパッケージがあると思います．その中でも，マニピュレーションをやっている方にとって必須と言っても良いのが[MoveIt!](http://qiita.com/MoriKen/items/ccd1fed1643e8d681e23)だと思います．とても強力なライブラリで使わない手は無いのですが，意外と設定が大変だったりするのではないかなぁ？と思います．少なくとも私は結構手こずりました．
そんなMoveit!ですが，数年前はドキュメントも少なく，正直とっつきづらい感じでした．
が，最近はドキュメントが整備され，日本語の情報も増えています．
というわけで，実機が無くてもMoveit!使って遊んでおきたい(ハンドリングしたい）！
と思います．
すでにMoveit!を触った事があって，より詳しい事を知りたいという方は
[TORK](https://opensource-robotics.tokyo.jp/)が作成している，[神テキスト](https://github.com/tork-a/tork_moveit_tutorial/releases/download/0.0.5/tork_moveit_tutorial-0.0.5.pdf)をご覧ください.
洋書でもここまでMoveit!について懇切丁寧に説明されているものは存在しないと思います...！
なお，ROSのインストールから書かれているぐらい，初診者の方でも対応可能な内容です．
初心者から上級者まで，とりあえずダウンロードする事を激しくおすすめします．
上記テキストをご覧になる方でも，本記事でしか触れない内容としては

- Gazebo上での吸着グリッパの再現


だと思いますので，3章をご覧ください．
というわけで，本記事では，

1. **[Moveit!ってなに？](https://qiita.com/RyodoTanaka/items/1a2f3a427c8800b5cecd) ←今ココ**
1. アームロボットモデルを作る
1. 吸着プラグイン・把持プラグインについて 
1. Moveit!の設定ファイルを作成
1. GUIを使ってモーションプランニング
1. Pythonコードから動かしてみる
1. Smachをつかってみる
1. これからのMoveit!

という手順で触れていきたいと思います．

# MoveIt!ってそもそもなに？
この記事を読んでいる方は大体ご存知だと思いますが,一応どんなものか簡単にまとめておきたいと思います．
Moveit!はロボットの動作計画を行う際に必要になる機能をいろいろ詰め込んだ便利なフレームワークです．
主にロボットアームのモーションプランニングに使用されていることが多いようですが，Navigationとかの動作計画もできます．[Moveit! の公式ページ](http://moveit.ros.org/)の冒頭に載っている記述だと，

- モーションプランニング
- マニピュレーション
- 移動ロボットのマニピュレーション
- 3D 環境認識
- 運動学（順運動学・逆運動学）
- 制御・ナビゲーション

に使えるよ！ということになっています．
Moveit!を利用すれば，最先端のモーションプランニング環境が手に入ると行っても過言ではありません．
もはや使うしかないですね！

# プランニングアルゴリズムは何を使うの？
Moveit!で主に実装されているプランニングアルゴリズムには以下のものがあります．
#### OMPL
[Open Motion Planning Library (OMPL)](http://ompl.kavrakilab.org/)に実装されているアルゴリズムを利用することができます．OMPL自体は，Moveit!とは独立したプロジェクトであり，乱数ベースの探索アルゴリズムライブラリとしてオープンソースで公開されています．Moveit!では主に[RRTConnect](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.2.2971&rep=rep1&type=pdf)を使うことが多いかと思います．というか，デフォルト設定ではこれを使うようになっています．

#### SBPL
[Search Based Planning Library (SBPL)](http://www.sbpl.net/Software)に実装されているアルゴリズムを利用することができます．このライブラリでは，探索ベースのアルゴリズムを利用することが可能で，例えばA*アルゴリズムを利用することが可能です．

#### CHOMP
[Covariant Hamiltonian Optimization for Motion Planning (CHOMP)](https://www.ri.cmu.edu/pub_files/2009/5/icra09-chomp.pdf)というアルゴリズムで，最適化アルゴリズムの一種です．モーションプランニングでは有名なアルゴリズムです．

#### STOMP
[Stochastic Trajectory Optimization for Motion Planning (STOMP)](https://personalrobotics.ri.cmu.edu/files/courses/papers/Kalakrishnan11-stomp.pdf)というアルゴリズムで，こちらも最適化アルゴリズムの一種です．CHOMPと同様，有名なアルゴリズムです．

#### どれを使うのか？
アルゴリズムの中身をすべて説明するのはとても大変なので，ここでは割愛します．
CHOMP，STOMPについては，初期値の与え方によっては成功確率が低くなるなど，モーションプランニングについてある程度勉強しておかないと調整法とかがわかりづらいです．
また，Moveit!のデフォルトの設定ではOMPLを利用する設定になっているので，本記事ではOMPLを利用することにします．

# まとめ
ということで，Moveit!ってなんだろうか？というのをなんとなく紹介しました．
本当は，逆運動学ライブラリとか，強力なGUIとか他にも便利な機能がたくさん詰まっているのですが，そのあたりは使いながら覚えていきたいと思います．というわけで，次回はMoveit!で動かすアームロボットのモデル作成です．

# 参考文献
1. http://moveit.ros.org/
2. http://moveit.ros.org/documentation/planners/
3. http://wiki.ros.org/sbpl
2. https://www.ri.cmu.edu/pub_files/2009/5/icra09-chomp.pdf
3. https://personalrobotics.ri.cmu.edu/files/courses/papers/Kalakrishnan11-stomp.pdf