ROSでKobukiの3Dシミュレータを動かしてみる

[仮想マシン上で手軽にROSのサンプルを動かしてみる](http://qiita.com/ryskiwt/items/13451d46805ac2e9459c) からの続きです。
GazeboにあるKobuki(ルンバみたいなロボット)の3Dシミュレータを動かしてみます。（↓の黒いのが動きます）やっとロボットやってる人っぽくなってきました。

<img width="786" alt="スクリーンショット 2016-12-16 3.19.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/10c5ae91-ef1d-7965-dd6f-7c3c357da120.png">


kobukiシミュレータのインストール
--------------------

### Gazeboリポジトリの追加

一回最後までインストールして起動してみましたが、バージョンが合わず起動できませんでした。下記を参考に、先にリポジトリを追加＆アップデートしておきます。
参考：[Problem with Indigo and Gazebo 2.2 - ROS Answers: Open Source Q&A Forum](http://answers.ros.org/question/199401/problem-with-indigo-and-gazebo-22/)

```sh-session
$ sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu trusty main" > /etc/apt/sources.list.d/gazebo-latest.list'
$ wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
$ sudo apt-get update
```

### インストール

```sh-session
$ sudo apt-get install -y ros-indigo-kobuki-gazebo
```

### 起動（コマンドの確認だけ）

最後にまとめて起動するので、今はコマンドの確認だけ。

```sh-session
$ roslaunch kobuki_gazebo kobuki_playground.launch
```


操作プログラムの作成
--------------------

### パッケージの雛形作成

下記により、パッケージの雛形を作成します。`kobuki_sample`は作成するパッケージの名前なので任意です。`rospy`と`std_msgs`は依存パッケージを指定していますが、後から追加もできるのであまり気にしなくて良いです。

```sh-session
$ cd ~/catkin_ws/src
$ catkin_create_pkg kobuki_sample rospy std_msgs
```

### catkin_make

```sh-session
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
```

### 操作プログラムの作成

ソースコードは`<package>/scripts`配下に置くのがお作法のようです。

```sh-session
$ mkdir -p ~/catkin_ws/src/kobuki_sample/scripts
$ roscd kobuki_sample/scripts
$ vi sample.py
```

下記プログラムは、以下の書籍のプログラムを多少改変したものです。ちなみに、BSDライセンスです。Amazonの評価も高いですし、実際読みやすい＆分かりやすい入門書です。おすすめ。

<table  border="0" cellpadding="5"><tr><td valign="top"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4777519015/ryskiwt-22/ref=nosim/" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51LVUrFWxpL._SL160_.jpg" border="0" alt="ROSではじめるロボットプログラミング―フリーのロボット用「フレームワーク」 (I・O BOOKS)" /></a></td><td valign="top"><font size="-1"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4777519015/ryskiwt-22/ref=nosim/" target="_blank">ROSではじめるロボットプログラミング―フリーのロボット用「フレームワーク」 (I・O BOOKS)</a><br />小倉 崇 <br /><br />工学社  2015-06-25<br />売り上げランキング : 15436<br /><br /><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4777519015/ryskiwt-22/ref=nosim/" target="_blank">Amazonで詳しく見る</a></font> <font size="-2">by <a href="http://www.goodpic.com/mt/aws/index.html" >G-Tools</a></font></td></tr></table>


```py:sample.py
#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

# Node name
rospy.init_node("sample")

# Topic   : /mobile_base/commands/velocity
# Type    : Twist
# Options : queue_size=10
pub = rospy.Publisher("/mobile_base/commands/velocity", Twist, queue_size=10)

# Loop while not shutdown
while not rospy.is_shutdown():
	# construct Twist object
	vel  = Twist()
	
	# wait user input
	direction = raw_input("f: forward, b: backward, l: left, r: right q: quit > ")
	
	# decode commands
	if "f" in direction:
		vel.linear.x = +0.5 # forward
	
	if "b" in direction:
		vel.linear.x = -0.5 # backward
	
	if "l" in direction:
		vel.angular.z = +1.0 # rotate left
	
	if "r" in direction:
		vel.angular.z = -1.0 # rotate right
	
	if "q" in direction:
		break # quit program
	
	# print detail
	print vel
	
	# publish
	pub.publish(vel)
```

### 実行権限をつける

```sh-session
$ roscd kobuki_sample/scripts
$ chmod 755 sample.py
```

シミュレータを動かしてみる
--------------------

GUI環境で以下を実行。

```sh-session
$ roslaunch kobuki_gazebo kobuki_playground.launch
```

別ターミナルで以下を実行。

```sh-session
$ roscd kobuki_sample/scripts
$ ./sample.py
```

`fl`とか`rb`とかやると動く。


ちなみに
--------------------

[仮想マシン上で手軽にROSのサンプルを動かしてみる](http://qiita.com/ryskiwt/items/13451d46805ac2e9459c) の続きということで、下記のようにKobukiシミュレータと操作プログラムを別ホストにインストールしてみましたが、特に追加設定なく動作しました。このあたりを裏でよしなにやってくれるのは便利です。

- `192.168.33.10` : Kobukiシミュレータのインストール
- `192.168.33.11` : 操作プログラムの作成