OSRFの自動車シミュレーションcar_demoを動かすまでの奮闘

#　環境
Ubuntu 16.04
ROS Kinetic
Gazebo9 (7)

##　前提
[元記事](https://qiita.com/kenichi-hamaguchi/items/f36eb04e880a59ab4c1b)の説明を前提にしているのでこちらからご覧ください。
元記事とのアプローチの異なる点についてまとめていきます。

car_demoを落としてきて、catkinワークスペースにファイルをまとめておいておいてからスタート。

# Gazeboのインストールまわり
ROS KineticではGazeboはver7を使っていますが、本シミュレーションではver8が必要です。
なお、筆者はこの発展の[citysim](https://bitbucket.org/osrf/citysim/overview)から始めたのでgazebo9を使っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188863/19bb3076-2b10-223e-5997-16102b0eb560.png)

## gazebo7を削除せずに(?)gazebo9のインストール
元記事ではgazebo7まわりを削除していましたが削除しなくてもインストール可能でした。（実際は無効にされてるのかもしれない）

参考にした記事は以下の通り。
- [gazebo9 in ros](http://gazebosim.org/tutorials?tut=ros_wrapper_versions)
- [gazebo intall](http://gazebosim.org/tutorials?tut=install_ubuntu&cat=install)

とりあえず手順をまとめると以下の通りになります。

```
sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'

wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -

sudo apt-get update

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

# コンパイルエラーへの対処
## ignition-msgs0まわり
コンパイルするとignition-msgs0がないと言われます。

まずは依存関係の解決。

```
sudo apt-get install libprotobuf-dev protobuf-compiler libprotoc-dev libignition-math3-dev
```

次に該当ファイルを[bitbucketのサイト](https://bitbucket.org/ignitionrobotics/ign-msgs/src/default/)からclone、checkoutする。超絶余談ですがHTTPで作業していたのでこの時点でSSHに変更せざるを得なくなりました。[該当記事はこちら](https://qiita.com/ossyaritoori/items/3c536bac1026da57fc51)。

```
hg clone ssh://hg@bitbucket.org/ignitionrobotics/ign-msgs
cd ign-msgs
hg pull && hg update ign-msgs0
```
buildする。

```
mkdir bulid
cd build
cmake ..
sudo make install
```
## gazeboのバージョン依存とかに関わる項
元記事にあるとおり、gazebo9でやっているのでバージョンの変更箇所でやはり怒られます。

でもGazeboのバージョンは共存できるって[ここ](http://answers.gazebosim.org/question/15894/can-more-than-one-version-of-gazebo-be-installed-on-the-same-system/)にあるしgazebo8もいれちゃおうとしましたが諸々のエラーが出て断念。

仕方がないのでソースコードをアップグレードしました。`gazebo_ros_block_laser.cpp`において以下の変更を行います。
エラーの箇所を探してください。

- 変更1

```c++
//last_update_time_ = this->world_->GetSimTime();
last_update_time_ = this->world_->SimTime();
```

- 変更2

```c++
void GazeboRosBlockLaser::OnStats( const boost::shared_ptr<msgs::WorldStatistics const> &_msg)
{
  this->sim_time_  = msgs::Convert( _msg->sim_time() );

  //math::Pose pose;
  //pose.pos.x = 0.5*sin(0.01*this->sim_time_.Double());
  gzdbg << "plugin simTime [" << this->sim_time_.Double() << "] update pose [" << 0.5*sin(0.01*this->sim_time_.Double()) << "]\n";
}
```

# 実行
joystickは接続していないのでコントローラで制御できるわけではないですが、キーボード上で一応操作できました。

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

ちょっと道幅が広すぎますね。さすがアメリカンといった感じ。（？？？）
![car_demo.png](https://qiita-image-store.s3.amazonaws.com/0/188863/5e2c1b1b-0202-8bd9-efdc-7d04ad2fa984.png)

ROSでもきちんと表示されてますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188863/3bee4186-e3fb-5f11-94c5-cbfc34a1bdfd.png)

自己位置同定とかも走っているのでlaunchファイルの詳細について暇があったら見ていきます。

## どうやって制御しているか？
cmd_velで制御しているのかと思いきやおそらく`/joy`の値を用いているかと思いきや該当するtopicが配信されてない．．．
どうやって制御しているのかよく調べておきます。[これ](http://gazebosim.org/tutorials?tut=drcsim_ros_cmds&cat=)とか参考になるかな？

```
$ rostopic list
/amcl_pose
/base_pose_ground_truth
/clicked_point
/clock
/diagnostics
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
/initialpose
/joint_states
/joy
/move_base_simple/goal
/particlecloud
/prius
/prius/back_camera/image_raw
/prius/back_camera/image_raw/compressed
/prius/back_camera/image_raw/compressed/parameter_descriptions
/prius/back_camera/image_raw/compressed/parameter_updates
/prius/back_camera/image_raw/compressedDepth
/prius/back_camera/image_raw/compressedDepth/parameter_descriptions
/prius/back_camera/image_raw/compressedDepth/parameter_updates
/prius/back_camera/image_raw/theora
/prius/back_camera/image_raw/theora/parameter_descriptions
/prius/back_camera/image_raw/theora/parameter_updates
/prius/back_camera/parameter_descriptions
/prius/back_camera/parameter_updates
/prius/back_camera_info
/prius/back_sonar/left_far_range
/prius/back_sonar/left_middle_range
/prius/back_sonar/right_far_range
/prius/back_sonar/right_middle_range
/prius/center_laser/scan
/prius/front_camera/image_raw
/prius/front_camera/image_raw/compressed
/prius/front_camera/image_raw/compressed/parameter_descriptions
/prius/front_camera/image_raw/compressed/parameter_updates
/prius/front_camera/image_raw/compressedDepth
/prius/front_camera/image_raw/compressedDepth/parameter_descriptions
/prius/front_camera/image_raw/compressedDepth/parameter_updates
/prius/front_camera/image_raw/theora
/prius/front_camera/image_raw/theora/parameter_descriptions
/prius/front_camera/image_raw/theora/parameter_updates
/prius/front_camera/parameter_descriptions
/prius/front_camera/parameter_updates
/prius/front_camera_info
/prius/front_left_laser/scan
/prius/front_right_laser/scan
/prius/front_sonar/left_far_range
/prius/front_sonar/left_middle_range
/prius/front_sonar/right_far_range
/prius/front_sonar/right_middle_range
/prius/left_camera/image_raw
/prius/left_camera/image_raw/compressed
/prius/left_camera/image_raw/compressed/parameter_descriptions
/prius/left_camera/image_raw/compressed/parameter_updates
/prius/left_camera/image_raw/compressedDepth
/prius/left_camera/image_raw/compressedDepth/parameter_descriptions
/prius/left_camera/image_raw/compressedDepth/parameter_updates
/prius/left_camera/image_raw/theora
/prius/left_camera/image_raw/theora/parameter_descriptions
/prius/left_camera/image_raw/theora/parameter_updates
/prius/left_camera/parameter_descriptions
/prius/left_camera/parameter_updates
/prius/left_camera_info
/prius/right_camera/image_raw
/prius/right_camera/image_raw/compressed
/prius/right_camera/image_raw/compressed/parameter_descriptions
/prius/right_camera/image_raw/compressed/parameter_updates
/prius/right_camera/image_raw/compressedDepth
/prius/right_camera/image_raw/compressedDepth/parameter_descriptions
/prius/right_camera/image_raw/compressedDepth/parameter_updates
/prius/right_camera/image_raw/theora
/prius/right_camera/image_raw/theora/parameter_descriptions
/prius/right_camera/image_raw/theora/parameter_updates
/prius/right_camera/parameter_descriptions
/prius/right_camera/parameter_updates
/prius/right_camera_info
/rosout
/rosout_agg
/tf
/tf_static
```