九州工業大学 CIR-KIT Blog

九工大自律移動ロボット製作プロジェクトCIR-KITの技術系ブログ

No.3-4:環境をつくろう ! (Modelの集合化 編)

gazebo_logo

検証日時

02/03/2015 (Tue)

概要

Gazeboのチュートリアル第三弾「Build a World」。 このチュートリアルでは、シミュレーション中の環境をどのように構築するかについて説明します。
今回はその「Population of models」編です。
公式サイトを適当に翻訳しただけですので、あしからず。

レベル

INTERMEDIATE

環境
PC : Lenovo ThinkPad X240
Prosessor : Intel Core i7-4600U (2.10GHz, 4MB, 1600MHz)
RAM : PC3-12800 DDR3L (8GB)
OS : Ubuntu 14.04 LTS 64bit
Kernel : 3.13.0-44-generic
Gazebo : Version 5.0.1
参考

GAZEBO Tutorial-Build a World

はじめに

このチュートリアルでは、SDFの<population>タグを使ってどのようにしてモデルを集合化するかを説明します。集合は個々のモデルによって構成されています。
モデルの集合を追加することは以下のようなパラメータをいちいち定義する問題であるということです。

  • モデル : 机や缶など

  • いくつかの集合の一部となる物体

  • 集合を入れておくコンテナの形状と寸法 : 箱、円柱などです。これらのパラメータを知るには、SDFのAPIをご覧ください。

  • 集合のポジションと原点

  • 集合に含まれる物体の配置 : ランダム、グリッド

詳しい説明は、<population>タグとそのパラメータについてのSDF APIをチェックしてください。

物体の集合を作る

  1. チュートリアル用のディレクトリを作りましょう。
1
2
mkdir ~/tutorial_model_population
cd ~/tutorial_model_population
  1. 作ったディレクトリに、以下のような内容で、can_population.worldを作成してください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    <?xml version="1.0" ?>
    <sdf version="1.5">
      <world name="default">
        <!-- A global light source -->
        <include>
          <uri>model://sun</uri>
        </include>
        <!-- A ground plane -->
        <include>
          <uri>model://ground_plane</uri>
        </include>
        <!-- Testing the automatic population of objects -->
        <population name="can_population1">
          <model name="can1">
            <include>
              <static>true</static>
              <uri>model://coke_can</uri>
            </include>
          </model>
          <pose>0 0 0 0 0 0</pose>
          <box>
            <size>2 2 0.01</size>
          </box>
          <model_count>10</model_count>
          <distribution>
            <type>random</type>
          </distribution>
        </population>
      </world>
    </sdf>

また、coke_cam modelより、coke_canのモデルを取得し、~/.gazebo/models/に置いておきましょう。
その後、Gazeboを立ち上げましょう。

1
gazebo can_population.world

すると、ソーダの缶の集合がバラバラに置いてあるのが確認できるでしょう。缶は2 x 2 x 0.01 [m]の大きさの箱に収まるようにしてあります。
より深く理解するために、先ほどのcan_population.worldに他の要素を追加してみましょう。

1
2
3
4
5
6
7
    <population name="can_population1">
      <model name="can1">
        <include>
          <static>true</static>
          <uri>model://coke_can</uri>
        </include>
      </model>

ここまでで、<population>タグを使い、どのようにして集合の要素を決定するかがわかりました。すべての集合は、同一でない、個々の名前を持つ必要があり、nameの部分で定義されています。populationタグの中では、<model>タグを使ってモデルを選択できます。集合のそれぞれの要素は、重複しない名前でシミュレーションに挿入されます。また、その名前というのは、サフィックス_clone_i(iは集合の要素の個数で決定されます)によって名付けられます。Gazeboには以下のようなモデルのリストと共に、物体が表示されます。 model_list 集合の最も一般的なタイプは、木や岩、建物などの動かない物体で構成されています。<population>タグはそのような静的なモデルで使用することをおすすめます。また、より詳しい定義が必要で、数が少ない、ロボットの様な動的物体には使用しないことをおすすめします。

1
2
3
4
  <pose>0 0 0 0 0 0</pose>
  <box>
    <size>2 2 0.01</size>
  </box>

上記のコードは物体をどこに設置するのかについて定義しています。今回は、すべての物体は、2 2 0.01の3Dの箱の中にスポーンします。また、原点(0, 0, 0)を(0, 0, 0)にセンタリングしてあります。続いて、<box>について説明します。<cylinder>の部分では、半径、長さを定義することができます。<cylinder>パラメータについて詳しく知りたい場合は、SDF Specificationをチェックしてみてください。<pose>要素では、集合の場所のフレームを定義しています。

1
  <model_count>10</model_count>

上記部分では、集合に、何個の物体を定義するかを決定します。正の数字であれば何でも良いですが、数を大きくすると、パフォーマンスに大きな影響を及ぼすといういうことを念頭に置いておいてください。

1
2
3
  <distribution>
    <type>random</type>
  </distribution>

上記に示す<distribution>要素では、物体をどのように配置するかを定義します。

Distributionの種類

  • random : モデルをランダムに配置します。物体同士がぶつかる可能性があることを覚えておいてください。

  • uniform : 偽似2Dグリッドパターンに沿ってモデルを配置します。K-Meansを使うことにより、解決に近づき、範囲内に定義された物体の数を定義できます。

  • grid : モデルを2Dのグリッドパターン上に配置します。この配置は行、列, 物体間距離を定義する必要があります。<model_count>要素は、この配置では無視されるということを覚えておいてください。シミュレーションに挿入される物体は行と列の数を掛けあわせた数と一致します。

  • linear-x : X軸に沿ってモデルが並びます。

  • linear-y : Y軸に沿ってモデルが並びます。

  • linear-z : Z軸に沿ってモデルが並びます。

もっとたくさんの例を確認したいならば、population.worldファイルをGazeboと共に立ち上げてください。
もちろん、その場合には、以下のように入力しましょう。:

1
  gazebo worlds/population.world

以下のキャプチャは、population.worldを実行した様子です。 gazebo_population