ROS2環境上のGazeboでTurtlebot3のシミュレーション

#ROS2環境上のGazeboのシミュレーションを行う
##経緯
現在私が所属しているサークルでは主にROS1を利用し開発、大会に参加しています。
しかし、Python2系のサポート終了やROS1におけるroscoreを介しての通信、分散処理などの難しさなどからROS2への移行に関して議論を行っている最中です。
もし、すぐに移行をすることが決定した場合はノウハウを持つメンバーがごく一部と限られてしまうため、ROS2の勉強を行うことにしました。
(それにCrystalって響きがかっこいい笑)
(Dashingもいい)

###追記
Dashingでも動作することを確認済みです.

##実行環境
ROS2の最新バージョンであるCrystalはUbuntu上では18でのみ動作するようです。
そのため、それに合わせた環境を利用します。
![Screenshot from 2019-01-23 10-54-56.png](https://qiita-image-store.s3.amazonaws.com/0/238812/1e3b016e-f097-612b-fbd3-3548b36fc6c8.png)
もし、環境の構築ができていない場合は [Installing ROS2 via Debian Packages](https://index.ros.org/doc/ros2/Installation) を参考に構築してください。
私はバイナリパッケージをインストールするのがおすすめです。

#Gazebo
##環境構築
まずやらなくてはならないのはgazebo_ros_pkgsのインストールです。
gazebo_ros_pkgsは名前から想像できる通りGazebo関連のパッケージです。

```
$ sudo apt install ros-crystal-gazebo-ros-pkgs
```
これを実行することでROS2環境上でgazeboを動かすための依存パッケージを一発ですべてをインストールしてくれます。
以下がros2環境上でGazeboを動かすための必要パッケージだそうです。
![Screenshot from 2019-01-23 11-09-04.png](https://qiita-image-store.s3.amazonaws.com/0/238812/c144af23-f4ea-763b-d650-5227a729afd3.png)
思った以上に少なかった。

##動作テスト
ひとまず、適切にパッケージがインストールされたかを確認します。
シミュレーションの実行は以下のコマンドで可能です。
以下のワールドを選んだのはなんとなく見た目がいいからです。

```
$ gazebo /opt/ros/crystal/share/gazebo_plugins/worlds/gazebo_ros_joint_state_publisher_demo.world
```
今回はテストでアームの動きを取得してみます。
コマンドを実行するとシミュレーションが開始されるはずです。
![Screenshot from 2019-01-23 11-16-07.png](https://qiita-image-store.s3.amazonaws.com/0/238812/c90c188c-a3b0-928e-37bb-0ddbdf8ddc86.png)
では、Topicが認識できているかを確認してみましょう。
ROS2ではパッケージの実行やTopicの監視などをros2コマンドでできるところがかなり便利です。

```
$ ros2 topic list
```
![Screenshot from 2019-01-23 11-17-18.png](https://qiita-image-store.s3.amazonaws.com/0/238812/9d35de26-fc20-41e0-39f8-c005df983fd6.png)
認識できているようです。更に、/demo/join_states_demo を取得してみましょう。

```
ros2 topic echo /demo/join_states_demo
```
上のコマンドで状態を取得できます。
![Screenshot from 2019-01-23 11-21-23.png](https://qiita-image-store.s3.amazonaws.com/0/238812/92ef9f6c-5da4-559f-6a3f-4b33383f5e9d.png)
見た感じちゃんとトピックを取得できているようです。
次回はプログラムを組んで取得してみます。

#Turtlebot3
##モデルの導入
ここからはサークルで主に使用しているTurtlebot3のシミュレーションを行います。
まずは以下のディレクトリ移動してください。
![Screenshot from 2019-01-23 11-43-38.png](https://qiita-image-store.s3.amazonaws.com/0/238812/61b76d97-35df-857c-aefc-0dbac15d14f2.png)
そこにはモデルやワールドを保持しているディレクトリが存在します。
カレントディレクトリにて以下を実行してください。

```
$ sudo git clone -b ros2 https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
```
ここで重要なのはブランチをros2と指定することです。もしくは
```git checkout ros2```
でブランチの変更をします。
すると gazebo-9 ディレクトリ内は以下のようになっているはずです。
![Screenshot from 2019-01-23 11-59-54.png](https://qiita-image-store.s3.amazonaws.com/0/238812/88690aa3-a492-57fc-5639-a4a6bee7323e.png)
まずはワールドファイルを移動します。

```
$ sudo mv turtlebot3_simulations/turtlebot3_gazebo/worlds/turtlebot3_ros2_demo.world ./worlds
```
次にワールドを構築するモデルを移動します。

```
$ sudo mv turtlebot3_simulations/turtlebot3_gazebo/models/turtlebot3_world ./models
```
更にTurtlebot3のモデルを移動します。

```
$ sudo mv turtlebot33_simulations/turtlebot3_gazebo/models/turtlebot3_burger ./models
```
これでモデルの追加はできました。

##テスト
では以下を実行してください。

```
$ gazebo /usr/share/gazebo-9/worlds/turtlebot3_ros2_demo.world
```
するとトピックが立ち上がります。
![Screenshot from 2019-01-23 12-09-47.png](https://qiita-image-store.s3.amazonaws.com/0/238812/1aa29550-0b74-1e26-bdca-bfeb5760c31b.png)
そしてシミュレーションが始まります。
![Screenshot from 2019-01-23 12-10-34.png](https://qiita-image-store.s3.amazonaws.com/0/238812/b21e3ad4-fa6c-34b4-5e4e-9ed6300851fc.png)
![Screenshot from 2019-01-23 12-11-06.png](https://qiita-image-store.s3.amazonaws.com/0/238812/6697b82f-b281-a018-b050-ce6126e3fe8d.png)
では、Gazeboがオドメトリをパブリッシュしているかを確認してみましょう。

```
$ ros2 topic echo /odom
```
![Screenshot from 2019-01-23 15-56-13.png](https://qiita-image-store.s3.amazonaws.com/0/238812/4a79e22b-4479-7621-128b-384ab7ccf376.png)
できているようです。
ひとまず環境構築はできました。

#結論
かなりのパッケージがROS2に対応をして、ROS1よりも使いやすくなってきていると思います。
そして、ROS1のときよりも動作がとても軽くなっているという印象を受けました。
CrystalこそROS2の時代の幕開けではないでしょうか？

#次回
[次回](https://qiita.com/l1sum/items/bc93a7c0ce9fb291fca4)は /cmd_vel に速度を渡してTurtlebot3を動かしてみます。