Help us understand the problem. What is going on with this article?

ROS講座37 gazebo worldを作成する

環境

この記事は以下の環境で動いています。

項目
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic
Gazebo 7.14.0

インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。

概要

gazeboの世界にはロボット以外にもいろいろな物体を置くことが出来ます。gazeboを起動した後にGUI上で物を配置することもできるのですが、gazeboのworldファイルを記述することで起動時から物を配置することが出来ます。
worldファイルはSDFというフォーマットで記述します。今回はこの書き方を紹介します。

worldファイルの記述

worldファイル

ROSではモデルを定義するのにurdfという形式で記述しますが、gazeboではsdfという形式を使用します。形式は違いますが、両方とも同じような設計思想で、ほぼ1対1で対応します。
全ての物体はmodelとして定義されます。worldファイルではこのmodelを呼び出したり環境の設定をします。記述は本来はいろいろと複雑なのですが、今回はモデルの呼び出しをするだけの単純な例を示します。

sim3_lecture/worlds/world_test1.world
<?xml version="1.0" ?>
<sdf version="1.5">
  <world name="default">
    <include>
      <uri>model://sun</uri>
    </include>
    <include>
      <uri>model://ground_plane</uri>
    </include>
    <include>
      <name>beer0</name>
      <uri>model://coke_can</uri>
      <static>true</static>
      <pose>2 1 0 0 0 0</pose>
    </include>
  </world>
</sdf>
  • <include>タグでモデルを呼び出します。初期状態では~/.gazebo/model以下にあるモデルのみを呼び出せます。
  • <uri>model://sun</uri>は呼び出すモデルを参照します。sunground_planeはデフォルトのgazeboワールドにもある要素です。とりあえず入れておきましょう。
  • <name>beer0</name>はモデルに名前を付けるタグです。省略可能ですが、同じモデルを複数呼び出すときは必須です。
  • <pose>1 0 0 0 0 0</pose>はモデルの出現位置を決めるタグです。順番にx軸位置、x軸位置、x軸位置、roll回転、pitch回転、yaw回転を表します。回転の単位はdegです。
  • <static>false</static>はモデルを固定するかどうかを決めるタグです。省略するとfalseになります。falseだと物理演算が適用されぶつかれば動きますし、重力の影響を受けます。trueにすると空間に固定されます。poseでz軸位置を1.0などと指定すれば、空中に浮きます。ぶつかっても動きません。

実行

いくつかの実行方法があります。

gazebo単体で起動

gazebo (worldファイル)とするとworldファイルを指定してgazeboを起動することができます。worldファイルのデバッグをするときなどに便利ですが、ROSと一緒に使うには不向きです。

worldを指定してgazeboを起動
roscd sim3_lecture/worlds/
gazebo world_test1.world 

sim3_world1.png

ちなみにこの方法で起動すると、ターミナルでCtrl+Cをしてgazeboを落とそうとすると時間がかかります。GUIの×ボタンを押しましょう。

ROSのlaunchから実行(フルパスで指定)

gazebo_rosパッケージにあるempty_world.launchのargのworld_nameでworldファイル名を指定します。しかしこれはフルパスまたはGAZEBO_RESOURCE_PATHに通っているworldファイルしか読み込んでくれません。

worldを指定してgazeboを起動
roscd sim3_lecture/worlds/
roslaunch gazebo_ros empty_world.launch world_name:=`pwd`/world_test1.world 

ROSのlaunchから実行(環境変数でパスを通す)

worldを指定してgazeboを起動
roscd sim3_lecture/worlds/
export GAZEBO_RESOURCE_PATH=$GAZEBO_RESOURCE_PATH:`pwd`
roslaunch gazebo_ros empty_world.launch world_name:=world_test1.world 

ROSのlaunchから実行(package.xmlでパスを通す)

ROSを使うならこの方法が一番です。

sim3_lecture/package.xmlに追加
  <exec_depend>gazebo_ros</exec_depend>

  <export>
    <gazebo_ros gazebo_media_path="${prefix}/worlds" />
  </export>
</package>

ファイルを編集したら以下を実行します。

worldを指定してgazeboを起動
roslaunch gazebo_ros empty_world.launch world_name:=world_test1.world 

coke缶が出てこないときは

coke_canがローカルに保存されている(~/.gazebo/models以下にcoke_canというディレクトリがある)場合でないと表示されません。
無いなら一度gazeboを開いてInsertタブ開いてその中から「Coke Can」を選んで配置してみてください。

参考

環境を作ろう
Gazebo + ROS で自分だけのロボットをつくる
Gazeboによるマニピュレータのシミュレーション

目次ページへのリンク

ROS講座の目次へのリンク

srs
ロボットを日々こつこつと製作しています。ロボットやROSやC++、pythonに関心があります。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした