Gazeboをバージョンアップして、自動車を動かす

# はじめに
ROS, Gazeboに車両モデルを導入したい！
調べてみると，次の2つのモデルが確認できました。

* Toyota prius
    * [github car_demo](https://github.com/osrf/car_demo) 
    * [Simulated Car Demo](http://www.ros.org/news/2017/06/simulated-car-demo.html)
* Ford Escape (CAT Vehicle)
    * [CAT Vehicle Testbed](https://cps-vo.org/group/CATVehicleTestbed)

前者のpriusはOpen Source Robotics Foundation (OSRF）が公開しており，[GAZEBOモデルのリポジトリ](https://bitbucket.org/osrf/gazebo_models)にも入っています。トヨタとOSRFが連携したとかいうニュースがあったので，それ関係で作られたと思います（たぶん）。後者のCAT VehicleはCPS-VO（Cyber-Physical Systems Virtual Organization）という組織が作ったものらしいのですが，2017年以降の情報がなく，さらにIndigoにしか対応していないようで，[ここ](https://cps-vo.org/node/26602)をみるとKineticでコンパイルできないと書いていました。

私はKineticを使いたいので，priusを導入しようとしたのですが，このモデルはROS Kineticをフルインストールした時についてくるGabezo7には対応しておらず，Gazebo8以降のバージョンを導入する必要があります。そこで，本記事では，Gazebo7をアンインストールして，Gazebo8, またはGazebo9をインストールします。そのあとで，priusモデルの入ったcar_demoというパッケージを動かしてみます。

動かしてみた結果が下の動画です。左側がGazebo，右側がrvizの画面にそれぞれ対応します。車両の移動に伴って，LiDARの点群やカメラ画像が変化している様子が確認できます。
![car_demo](https://media.giphy.com/media/EPJwfjtKj2NIV1puew/giphy.gif)

## 想定環境
* Ubuntu 16.04 LTS
* ROS Kinetic
* Gazebo7(作業前) -> Gazebo8, 9 (作業後)

## 注意事項
Gazeboのバージョンアップはリスキーです。自己責任でお願いします。[Which combination of ROS/Gazebo versions to use](http://gazebosim.org/tutorials/?tut=ros_wrapper_versions)を読んでおくといいと思います。

> Warning!: Using this option, you won't be able to use any ROS Ubuntu package related to Gazebo from ROS deb repository. The equivalent of gazebo_ros_pkgs can be installed from debian packages, but all other software (such as turtlebot_gazebo) must be built from source. Thanks to catkin workspaces this is quite easy to do.

## 参考：car_demoとdocker起動について
詳しくは，公式の[Simulated Car Demo](http://www.ros.org/news/2017/06/simulated-car-demo.html)を見てください。gitHubのリポジトリは[osrf/car_demo](https://github.com/osrf/car_demo)になります。  
なお，githubのREADMEに書いてある通り，これは仮想環境のdockerで動かせます。つまり，ローカルにROSやらGazeboやらが入っていなくても動かせるようになっています。しかし，[2018年5月現在，ROSがnvidia-docker2に対応していない](http://wiki.ros.org/docker/Tutorials/Hardware%20Acceleration)ので，古いほうのnvidia-dockerを使う必要があります。お手軽に試してみたい人は，dockerと古いほうのnvidia-dockerを使ってやってみてください（bashファイルを2つ実行するだけで動きます）。本記事では，nvidia-docker2のダウングレードが嫌なので，頑張ってnative環境で動くようにします。

# Gazeboのバージョンアップ作業
まず，GAZEBOに関するパッケージを削除します（過不足ない削除方法がわからなかったので適当です）。

```
$ sudo apt-get purge ros-kinetic-desktop-full
$ sudo apt-get purge ros-kinetic-gazebo*
$ sudo apt-get purge --auto-remove gazebo7
```

以下，バージョン別に書いていきます。

### gazebo8のインストール
[car_demoのDockerfile](https://github.com/osrf/car_demo/blob/master/Dockerfile)を参考にインストールしていきます（公式サイトでgazebo8を入れる方法が見つかりませんでした）。失敗したときは，元のDockerfileをみて足りなそうなものを入れていってください。

```
$ echo "deb http://packages.osrfoundation.org/gazebo/ubuntu `lsb_release -cs` main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list
$ sudo wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install -y gazebo8 ros-kinetic-gazebo8-ros-pkgs
```

ターミナルでgazeboと打ち込んで，gazebo8が立ち上がればOK。

### gazebo9のインストール
公式サイトの [Install Gazebo using Ubuntu packages](http://gazebosim.org/tutorials?tut=install_ubuntu) にしたがって，GAZEBOの最新版（執筆時はGAZEBO9）をインストールするシェルを実行します。

```
$ curl -ssL http://get.gazebosim.org | sh
```

私の環境では途中でエラーが起きました。どうもGPGキーを取得する箇所でサーバエラーが起きているようでした。いろいろ試しましたが，解決できなかったので，[GPG error: http://packages.osrfoundation.org](https://askubuntu.com/questions/611221/gpg-error-http-packages-osrfoundation-org)を参考にGPGキーを直接取りに行きました。

```
$ echo "deb http://packages.osrfoundation.org/gazebo/ubuntu `lsb_release -cs` main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list
$ wget http://packages.osrfoundation.org/gazebo.key -O - | sudo tee apt-key add - 
```

その後，冒頭のシェルをローカルに落としてきて，問題の行を削除したシェルを実行するとうまくいきました。

起動確認します。ターミナルでgazeboと打ち込んで，gazebo9が立ち上がればOK。

さらに，[Which combination of ROS/Gazebo versions to use](http://gazebosim.org/tutorials/?tut=ros_wrapper_versions)のUsing a specific Gazebo version with ROSの節を参考に，rosと連携するためのパッケージをインストールします(もう入っているかも)

```
$ sudo apt-get install ros-kinetic-gazebo9-ros-pkgs
$ sudo apt-get install ros-kinetic-gazebo9-ros-control 
```

# car_demo を native環境 でビルド・実行する
必要なパッケージをインストールして，car_demoリポジトリをクローンします。

```
# Dockerfileに書いてあるパッケージをインストール
sudo apt-get install ros-kinetic-fake-localization ros-kinetic-joy
# 実行時のエラー文を見る限りこれも必要らしいのでインストール
sudo apt-get install ros-kinetic-robot-state-publisher
# car_demoを落としてくる
git clone https://github.com/osrf/car_demo
```

rosのワークスペースを作ります（すでにある場合はそちらで作業してください）

```
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
```

作成したcatkin_ws/srcの中に，クローンしたcar_demo内のパッケージ(car_demo, prius_description, prius_msgs)をフォルダごと移動させます。Gazebo8を使っている場合は，そのままビルドできると思います。

```
$ cd ~/catkin_ws/
$ catkin_make
```

gazebo9を使っている場合は，catkin_makeの前に追加作業が必要です(gazebo8の場合はここをスキップ）。インストール環境によって対応が異なるはずなので，根気よくエラーを潰していく必要があります。以下，私の環境で出たエラーとその対策（？）です。

1. car_demo/CMakeLists.txt の find_package (gazebo 8 REQUIRED) の8を9に書き換える。
1. car_demo/plugins/gazebo_ros_block_laser.cppがGAZEBOのバージョン違いの影響でエラーを吐き出してくる。[gazebo_ros_block_laser.cpp no member GetSimTime #35](https://github.com/osrf/car_demo/issues/35)などに書かれている。ひとまず2,3箇所ほどコメントアウトで対応。
1. [ignition-msgs0](https://bitbucket.org/ignitionrobotics/ign-msgs/downloads/)がないため，エラーが起きていた。これのインストールが大変だった（未検証ですがignition-msgsのバージョンを書き換えるだけでいいかもしれません）。依存関係から，どうやら先に[ignition-math3](https://bitbucket.org/ignitionrobotics/ign-math/downloads/?tab=tags)と[ignition-tool](https://bitbucket.org/ignitionrobotics/ign-tools/downloads/?tab=tags)をインストールする必要があるようです。その後，ignition-msgs0 をインストールします。インストール方法は，リンク先の対応するタグの圧縮ファイルを落としてきて，解凍し，解凍したフォルダ内で以下の操作をする。
 
    ```
    mkdir bulid
    cd build
    cmake ..
    sudo make install
    ```
    
さて，catkin_makeに成功すれば，いよいよ起動です。

```
source ~/catkin_ws/devel/setup.bash
roslaunch car_demo demo.launch
```

冒頭のアニメーションのようなGazeboとrvizの画面が出てくれば成功です。joystickを繋いでいない場合，起動時にエラー文が出てきますが，特に問題はないです。joystickがなくても，キーボードのWASDを使って車両を操作できます。Gazeboの画面上で，priusの位置がわからない場合は，左側のパネルからpriusモデルを選択し，move toを押してください。車両までカメラが寄ってくれます。

マップはかなり広いので，いろいろ遊べそうです。

![car_demo_map](https://media.giphy.com/media/yNi9IiesqnngHq0IQa/giphy.gif)

# 備考：citysimについて
car_demoの発展版といえるcitysimというプロジェクトがあります。こちらはGazebo9で動くようです。そのうち動かしてみようと思います。

* [bitBucket: citysim](https://bitbucket.org/osrf/citysim)
* [Vehicle and city simulation](http://gazebosim.org/blog/car_sim)