ROSとGazeboによる自律移動シミュレーション 〜モデル作成〜


# はじめに
前回までは主に自己位置推定アルゴリズムの動作確認を行ってきました。

- [拡張カルマンフィルタによる自己位置推定動作の可視化](https://qiita.com/Crafty_as_a_Fox/items/55448e2ed9ce0f340814)
- [パーティクルフィルタによる自己位置推定動作の可視化](https://qiita.com/Crafty_as_a_Fox/items/d70864ab555f91fef720)
- [Graph-Based SLAMを用いた軌跡推定シミュレーション](https://qiita.com/Crafty_as_a_Fox/items/d0874f0d697a1814cffb)

なので今回からは少しROSのシミュレータを使って自律移動ロボットを動かしていきたいと思います。

# Gazeboシミュレータ
Gazeboはオープンソースで使用可能なロボットアプリケーション開発のための動力学シミュレータです。Gazeboについての詳細は以下の記事が参考になると思いますので、ここでは割愛します。

- [Gazebo + ROS で自分だけのロボットをつくる](https://qiita.com/RyodoTanaka/items/c3014fd6d0f06d12814f)

# モデルとなるロボット
今回シミュレータで作成したいロボットはこれです。
![vehicle1](https://farm9.staticflickr.com/8136/29983598960_4a01cd1490_b.jpg)

これは私がSLAM開発用に作った簡素な対向２輪型移動ロボットです。
作り方は私のGitHubに載せているので参考にしてみてください。

- [SLAMロボット車体制作マニュアル](https://github.com/takuyani/SLAM-Robot_Docs/blob/master/Hardware/Assembly_Manual/Assembly_Manual_JP.md)

ちなみに、画像を見ていただくとわかると思いますが、センサはまだ何も取り付けていません（笑）

# ロボットモデルの作成
以下のサイトを参考にして作成してみました。
- [ROSで始めるロボティクス](http://bril-tech.blogspot.jp/2016/10/ros1-robot-operating-system.html)
- [Gazebo + ROS で自分だけのロボットをつくる](https://qiita.com/RyodoTanaka/items/c3014fd6d0f06d12814f)
- [ロボット記述言語](http://forestofazumino.web.fc2.com/ros/ros_urdf_xacro.html)

センサはASUSのXtion Pro Liveを取り付けてみました。

※Xtion Pro Live
ASUS製のRGBDセンサの名称。RGBのカラー画像と距離(Depth)情報が取得できるセンサです。
現在、Xtion Pro Liveは生産終了となっており、後継のXtion 2が販売されているみたいです。

車体はURDFで作成しXtion Pro LiveはGitHub上で先駆者が作成したものを流用させていただきました。
Gazeboを使うとセンサの動作までシミュレーションすることができます。
例えば、今回使用するXtion Pro Liveのモデルでは、モデル環境内のカラー画像と距離情報が取得できます。
もちろん、車体も制御することが可能で、並進速度[m/s]と回転速度[rad/s]を与えることでモデル環境内で動きまわることができます。
この車体の制御には[ros_control](http://wiki.ros.org/ros_control)というものを使用します。
ros_controlについては以下の記事に詳しく書かれています。

- [Gazebo + ROS で自分だけのロボットをつくる 5. GazeboとROSの連携](https://qiita.com/RyodoTanaka/items/6fa7e45f98b55376a95b)
- [ros_controls/ros_controllers の制御の仕組み (position/effort/velocity_controllers の基礎)](https://qiita.com/MoriKen/items/78b0ad8c1eae257646dd)

実際に私もros_controlを使用してみたのですが、かなり奥が深いです。なのでひとまず、先駆者達が作成したものをそのまま使用してみることにしました。  
試行錯誤の末、作成されたモデルはGazeboとRvizで描写できるようになりました。

**＜Gazebo＞**
![slambot_model_04](https://farm5.staticflickr.com/4447/37236781390_2646290337.jpg)
![slambot_model_01](https://farm5.staticflickr.com/4470/37463882552_03ffe0c054.jpg)
![slambot_model_05](https://farm5.staticflickr.com/4468/37236781310_c1b101f371.jpg)

**＜Rviz＞**
![slambot_model_03](https://farm5.staticflickr.com/4483/37236781710_ce305cdde5.jpg)
![slambot_model_02](https://farm5.staticflickr.com/4478/37447161626_057fc14821.jpg)

今回作成したパッケージはGitHubに上げています。

- [SLAM-Robot_Code/slambot_sim/slambot_description](https://github.com/takuyani/SLAM-Robot_Code/tree/dff50c32d7fe9c5e9242a0e00bd23770e87249ae)
  - config
     - controller.yaml ・・・　joint_state_controllerとdiff_drive_controllerのパラメータ設定ファイル
  - launch ・・・　launchファイル
  - src ・・・　ソースコード
  - urdf ・・・　URDF形式のロボット記述ファイルが含まれています
  - world ・・・　Willow Garage社オフィスの仮想3次元空間。Gazeboで使用。


実行には以下のlaunchファイルを起動します。

- **gazebo.launch** ・・・ gazeboシミュレータ起動用(gazebo起動)
- **display.launch** ・・・ シミュレーション結果の可視化用(Rviz起動)

※上記の画像ではカフェのような空間が表示されていますが、現在はWillow Garage社オフィスが表示されるようになってます。

上記２つのlaunchを起動後、「/slambot_host/cmd_vel」に並進・回転速度コマンドを与えるとモデルのロボットが動き出します。この「/slambot_host/cmd_vel」へPublishするためのノードももちろん作成しています。今回はキーボード操作とPS4のコントローラでの操作用の２つのノードを作成しました。パッケージは[vehicle_teleop](https://github.com/takuyani/SLAM-Robot_Code/tree/develop/vehicle_teleop)になります。詳しい仕様方法は同パッケージ内のREADME.mdを参照してください。

# 作成したロボットモデルを動かしてみよう！
実際に作成したモデルを動かしてみます。
（画像をクリックするとYouTubeへジャンプします。）
[![robot_model](https://farm5.staticflickr.com/4539/38237935664_42750de5bb_b.jpg)](https://www.youtube.com/watch?v=gVg74mhLd_A)

# さいごに
なんとかモデルのロボットをシミュレータ内で動かせるようになったので、次回は本格的にSLAMのシミュレーションを行っていこうと思います。