はじめに
ROS, Gazeboに車両モデルを導入したい!
調べてみると,次の2つのモデルが確認できました。
- Toyota prius
- Ford Escape (CAT Vehicle)
前者のpriusはOpen Source Robotics Foundation (OSRF)が公開しており,GAZEBOモデルのリポジトリにも入っています。トヨタとOSRFが連携したとかいうニュースがあったので,それ関係で作られたと思います(たぶん)。後者のCAT VehicleはCPS-VO(Cyber-Physical Systems Virtual Organization)という組織が作ったものらしいのですが,2017年以降の情報がなく,さらにIndigoにしか対応していないようで,ここをみるとKineticでコンパイルできないと書いていました。
私はKineticを使いたいので,priusを導入しようとしたのですが,このモデルはROS Kineticをフルインストールした時についてくるGabezo7には対応しておらず,Gazebo8以降のバージョンを導入する必要があります。そこで,本記事では,Gazebo7をアンインストールして,Gazebo8, またはGazebo9をインストールします。そのあとで,priusモデルの入ったcar_demoというパッケージを動かしてみます。
動かしてみた結果が下の動画です。左側がGazebo,右側がrvizの画面にそれぞれ対応します。車両の移動に伴って,LiDARの点群やカメラ画像が変化している様子が確認できます。
想定環境
- Ubuntu 16.04 LTS
- ROS Kinetic
- Gazebo7(作業前) -> Gazebo8, 9 (作業後)
注意事項
Gazeboのバージョンアップはリスキーです。自己責任でお願いします。Which combination of ROS/Gazebo versions to useを読んでおくといいと思います。
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を見てください。gitHubのリポジトリはosrf/car_demoになります。
なお,githubのREADMEに書いてある通り,これは仮想環境のdockerで動かせます。つまり,ローカルにROSやらGazeboやらが入っていなくても動かせるようになっています。しかし,2018年5月現在,ROSがnvidia-docker2に対応していないので,古いほうの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を参考にインストールしていきます(公式サイトで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 にしたがって,GAZEBOの最新版(執筆時はGAZEBO9)をインストールするシェルを実行します。
$ curl -ssL http://get.gazebosim.org | sh
私の環境では途中でエラーが起きました。どうもGPGキーを取得する箇所でサーバエラーが起きているようでした。いろいろ試しましたが,解決できなかったので,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の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の場合はここをスキップ)。インストール環境によって対応が異なるはずなので,根気よくエラーを潰していく必要があります。以下,私の環境で出たエラーとその対策(?)です。
-
car_demo/CMakeLists.txt の find_package (gazebo 8 REQUIRED) の8を9に書き換える。
-
car_demo/plugins/gazebo_ros_block_laser.cppがGAZEBOのバージョン違いの影響でエラーを吐き出してくる。gazebo_ros_block_laser.cpp no member GetSimTime #35などに書かれている。ひとまず2,3箇所ほどコメントアウトで対応。
-
ignition-msgs0がないため,エラーが起きていた。これのインストールが大変だった(未検証ですがignition-msgsのバージョンを書き換えるだけでいいかもしれません)。依存関係から,どうやら先にignition-math3とignition-toolをインストールする必要があるようです。その後,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を押してください。車両までカメラが寄ってくれます。
マップはかなり広いので,いろいろ遊べそうです。
備考:citysimについて
car_demoの発展版といえるcitysimというプロジェクトがあります。こちらはGazebo9で動くようです。そのうち動かしてみようと思います。