Gazebo/MoveIt のための 3D モデリング(12)Gazebo の静モデルの作成

著者:yamamoto.yosuke

Gazebo/MoveIt のための 3D モデリング(12)Gazebo の静モデルの作成

本シリーズ前回の記事 Gazebo/MoveIt のための 3D モデリング(11)形状データのエクスポート で Gazebo や MoveIt で利用できるデータ形式にエクスポートする手順を紹介しました.

今回はエクスポートしたメッシュデータファイルを Gazebo の静モデルとしてモデルファイルに組み込んで表示する方法を紹介します.

前回の記事の予告では「Gazebo/MoveIt のための 3D モデリング(12)Gazebo や MoveIt の静モデルの作成」と Gazebo と MoveIt の両方の作成方法を紹介する予定でしたが本記事では Gazebo モデルの作成を紹介して,次回に MoveIt の静モデルの作成を紹介します.

Gazebo モデル SDF ファイルの作成

今回紹介する Gazebo モデルを構成するファイル群は次のようなフォルダ構造にしています.

washing-machine
├── meshes
│   ├── base_link_blue-gray.stl
│   ├── base_link_dark-gray.stl
│   ├── base_link_gray-white.stl
│   ├── base_link_light-gray.stl
│   └── base_link.stl
├── model.config
└── model.sdf

Gazebo モデルは下記リンク先の GitHub リポジトリから入手可能です.

model.sdf

まずは Gazebo SDF モデルの本体のファイルとも言える model.sdf の中身を見てみます.XML データになっていて干渉チェック用のモデルを記述した collision や視覚表示用のモデルを記述した visual などの要素があります.

<?xml version="1.0" ?>
<sdf version="1.6">
  <model name="washing-machine">
    <!--static>true</static-->
    <pose>0 0 0 0 0 0</pose>
    <link name="base_link">
      <inertial>
        <mass>10.0</mass>
        <inertia>
          <ixx>1.000000</ixx>
          <ixy>0.000000</ixy>
          <ixz>0.000000</ixz>
          <iyy>1.000000</iyy>
          <iyz>0.000000</iyz>
          <izz>1.000000</izz>
        </inertia>
      </inertial>
      <collision name="collision">
        <geometry>
          <mesh>
            <uri>model://washing-machine/meshes/base_link.stl</uri>
            <scale>0.001 0.001 0.001</scale>
          </mesh>
        </geometry>
      </collision>
      <visual name="visual-gray-white">
        <geometry>
          <mesh>
            <uri>model://washing-machine/meshes/base_link_gray-white.stl</uri>
            <scale>0.001 0.001 0.001</scale>
          </mesh>
        </geometry>
        <material>
          <ambient>  0.95 0.95 0.95 1.0</ambient>
          <diffuse>  0.95 0.95 0.95 1.0</diffuse>
          <specular> 0.95 0.95 0.95 1.0</specular>
        </material>
      </visual>
      <visual name="visual-light-gray">
        <geometry>
          <mesh>
            <uri>model://washing-machine/meshes/base_link_light-gray.stl</uri>
            <scale>0.001 0.001 0.001</scale>
          </mesh>
        </geometry>
        <material>
          <ambient>  0.80 0.80 0.80 1.0</ambient>
          <diffuse>  0.80 0.80 0.80 1.0</diffuse>
          <specular> 0.80 0.80 0.80 1.0</specular>
        </material>
      </visual>
      <visual name="visual-dark-gray">
        <geometry>
          <mesh>
            <uri>model://washing-machine/meshes/base_link_dark-gray.stl</uri>
            <scale>0.001 0.001 0.001</scale>
          </mesh>
        </geometry>
        <material>
          <ambient>  0.45 0.45 0.45 1.0</ambient>
          <diffuse>  0.45 0.45 0.45 1.0</diffuse>
          <specular> 0.45 0.45 0.45 1.0</specular>
        </material>
      </visual>
      <visual name="visual-blue-gray">
        <geometry>
          <mesh>
            <uri>model://washing-machine/meshes/base_link_blue-gray.stl</uri>
            <scale>0.001 0.001 0.001</scale>
          </mesh>
        </geometry>
        <material>
          <ambient>  0.55 0.65 0.75 0.6</ambient>
          <diffuse>  0.55 0.65 0.75 0.6</diffuse>
          <specular> 0.55 0.65 0.75 0.6</specular>
        </material>
      </visual>
    </link>
  </model>
</sdf>

STL ファイルは単位の情報を持っていません.本シリーズの記事では Rhinoceros 上で 単位 [mm] にてモデルを作成してメッシュを出力したので, [mm] での数値を Gazebo 上の単位 [m] に変換するために mesh 要素の scale の (X,Y,Z) に全て 0.001 (=1/1000) を設定しています.適切なスケーリングを忘れたり,不要なスケーリングをしてしまったりするとモデルにメッシュは読み込めているのにありえない大きさのメッシュになってしまって目視できなくなるようなことがあるので注意が必要です.

visual 要素は色ごとに複数作成して各色のメッシュのファイルをそれぞれの uri 要素に記述して materialambient(=環境反射率) diffuse(=拡散反射率) specular(=鏡面反射率) の数値を RGBA(=赤,緑,青,透明度) の順で設定します.(「透明度」は数値的には「不透明度」を意味するように思うのですが「透明度」と一般的には言われているようです.)

collision 要素はメッシュに洗濯機全体の閉じたメッシュ群である base_link.stl ファイルを使用しています.

inertialmass(=質量) inertia(=慣性モーメント) は今回はメッシュの確認が主な目的ですので適当な値を設定しました.精度良く物理シミュレーションを行いたい場合は適切な値を設定する必要があります.

model.config

model.config ファイルの中身も XML データ形式で記述されていて当該 Gazebo モデルのメタ的な情報を記述しています.

<?xml version="1.0"?>

<model>
  <name>washing-machine</name>
  <version>1.0</version>
  <sdf version="1.6">model.sdf</sdf>
  
  <author>
    <name>Tokyo Opensource Robotics Kyokai Association</name>
    <email>info@opensource-robotics.tokyo.jp</email>
  </author>
  
  <description>
    A Model Example of a Washing Machine.
  </description>
  
</model>

SDF モデルファイルの Gazebo への読み込み

Gazebo の 3D モデルをシミュレーション空間上に読込・表示する方法は主に次の3つの方法があります.

  1. .gazebo/models フォルダにコピー
  2. world ファイルを作成
  3. プログラムで配置(Spawn)

表示方法-1 .gazebo/models フォルダにコピー

本記事における SDF モデルフォルダ washing-machine をホームディレクトリ直下の隠しフォルダ .gazebo/models 内にコピーして Gazebo のウインドウ内の操作で読み込みます.
( USERNAME の部分は各自のユーザ名に読み替えてください.)

/home/USERNAME/.gazebo/models
├── ambulance
│   ├── materials
│   │   └── textures
│   │       └── ambulance.png
│   ├── meshes
│   │   ├── ambulance.mtl
│   │   └── ambulance.obj
│   ├── model.config
│   └── model.sdf
  :
(中略)
  :
└── washing-machine
    ├── meshes
    │   ├── base_link_blue-gray.stl
    │   ├── base_link_dark-gray.stl
    │   ├── base_link_gray-white.stl
    │   ├── base_link_light-gray.stl
    │   └── base_link.stl
    ├── model.config
    └── model.sdf

.gazebo/models 内にモデルをコピーすると Gazebo ウィンドウ内に挿入するモデルの選択肢の1つとして提示されるようになります.

  1. Gazebo を起動
    コマンド入力は $ gazebo
  2. Gazebo ウィンドウ
    → Insert タブ
    → /home/USERNAME/.gazebo/models
    → washing-machine をクリック
  3. Gazebo の 3D 空間内の地面上の1点を
    クリックして洗濯機モデルを配置

(図: クリックで拡大)

このような Gazebo 内に手作業でモデルを読み込む方法でもシミュレーションはできるのですが,自動的に読み込む手段として world ファイルを作成する方法や launch ファイル内やプログラムからモデルを読み込んで Gazebo に表示させる方法があります.自動的に読み込む方がモデルを用いた Gazebo シミュレーションでロボットを動作させるような段階では毎回手作業でモデルを Gazebo 空間内に読み込む必要がなく楽です.

表示方法-2 world ファイルを作成

前項目の「表示方法-1 .gazebo/models フォルダにコピー」は Gazebo を起動するたびにモデルを配置する必要があります.モデルの確認には十分ですが Gazebo のシミュレーションでロボットの動作を同じ環境で何度も試行するには向いていません.そこで Gazebo 環境の定義をする world ファイルを読み込むことで常に同じ環境を再現することができます.

world ファイルも XML 形式のデータです.

<?xml version="1.0" ?>
<sdf version="1.4">
  <world name="default">
    <include>
      <uri>model://ground_plane</uri>
    </include>
    <include>
      <uri>model://sun</uri>
    </include>
    <include>
      <uri>model://washing-machine</uri>
      <name>washing-machine</name>
      <pose>0 0 0 0 0 0</pose>
    </include>
    
<!--
    <include>
      <uri>model://washing-machine-dae</uri>
      <name>washing-machine-dae</name>
      <pose>0 1.0 0 0 0 0</pose>
    </include>
-->
    
  </world>
</sdf>

上記 world ファイルでは ground_plane と sun,washing-machine モデルを Gazebo 空間に配置しています.16〜22行 はコメントアウト行で後述の dae ファイルを利用した場合の Gazebo モデルを配置する設定でそれを無効にしています.

world ファイルを読み込んで Gazebo を起動する launch ファイルを作成します.

<launch>
  
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name"   value="$(find 3dmodeling-examples)/worlds/washing-machine.world"/>
    <arg name="paused"       value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui"          value="true"/>
    <arg name="recording"    value="false"/>
    <arg name="debug"        value="true"/>
  </include>
  
</launch>

今回作例を置いている ROS パッケージ内での world ファイルや launch ファイルのディレクトリ構造は次のようになっています.

3dmodeling-examples/
├── CMakeLists.txt
├── images
│   ├── front_view_win.png
│   ├── left_view_win.png
│   ├── top_view_win.png
│   ├── washing-machine_catalogue.pdf
│   └── washing-machine_catalogue.png
├── launch
│   ├── spawn-washingmachine.launch
│   └── world-washingmachine.launch
├── LICENSE
├── models
│   ├── gazebo_models
│   │   ├── washing-machine
│   │   │   ├── meshes
│   │   │   │   ├── base_link_blue-gray.stl
│   │   │   │   ├── base_link_dark-gray.stl
│   │   │   │   ├── base_link_gray-white.stl
│   │   │   │   ├── base_link_light-gray.stl
│   │   │   │   └── base_link.stl
│   │   │   ├── model.config
│   │   │   └── model.sdf
│   │   └── washing-machine-dae
│   │       ├── meshes
│   │       │   ├── base_link.dae
│   │       │   └── base_link.stl
│   │       ├── model.config
│   │       └── model.sdf
│   ├── urdf
│   │   ├── meshes
│   │   │   └── washing-machine
│   │   │       ├── base_link.dae
│   │   │       └── base_link.stl
│   │   └── washing-machine.urdf
│   └── washing-machine.3dm
├── package.xml
├── README.md
└── worlds
    └── washing-machine.world

また,この際に必要なことが Ubuntu の環境変数に world や Gazebo のモデルのあるディレクトリのパスを通しておくことです.ROS パッケージの package.xml に Gazebo モデルへのパスと実行依存関係を記述します.

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>urdf</build_depend>
  
  <build_export_depend>urdf</build_export_depend>
  
  <exec_depend>urdf</exec_depend>
  <exec_depend>gazebo_ros</exec_depend>

  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <gazebo_ros gazebo_model_path="${prefix}/models/gazebo_models"/>
    <gazebo_ros gazebo_media_path="${prefix}/worlds"/>
  </export>
  
</package>

package.xml に記述した内容を有効にするためにビルドしてワークスペースの環境設定 source devel/setup.bash をします.次のコマンドは Gazebo モデルを含んだワークスペース robotmodels_ws にてビルドと環境設定を行った場合の例です.

robotuser@robotuser-PC:~/robotmodels_ws$ catkin_make
robotuser@robotuser-PC:~/robotmodels_ws$ source devel/setup.bash

world ファイルを読み込むように作成した launch ファイルを実行して Gazebo を起動します.

$ roslaunch 3dmodeling-examples world-washingmachine.launch

表示方法-3 プログラムで配置(Spawn)

前項目の「表示方法-2 world ファイルを作成」では world ファイルでモデルの配置が決められた状態で Gazebo を起動していました. Spawn を行うことで既に実行されている Gazebo シミュレーション空間内に位置・姿勢を指定してモデルを配置することができます.

次に Spawn を用いた場合の launch ファイルの例を示します.

<launch>
  
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="paused"       value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui"          value="true"/>
    <arg name="recording"    value="false"/>
    <arg name="debug"        value="true"/>
  </include>
  
  <!-- Spawn a robot into Gazebo -->
  <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" 
        args="-file $(find 3dmodeling-examples)/models/gazebo_models/washing-machine/model.sdf -sdf -x 0.0 -y 2.0 -z 0.0 -R 0.0 -P 0.0 -Y 0.0 -model washing-machine" />
  
</launch>

Gazebo が empty_world.launch で実行開始された後 spawn_model を用いて Gazebo シミュレーション空間上の ( 0.0, 2.0, 0.0 ) の位置に配置しています.

spawn-washingmachine.launch を実行してみます.

$ roslaunch 3dmodeling-examples spawn-washingmachine.launch

world ファイルを読み込んで Gazebo を起動したときと異なる位置に配置しています.

Gazebo モデルにおける STL ファイルと DAE ファイルの表示比較

Gazebo で dae ファイルを用いて色付きモデルを表示することも可能ですが,STL ファイルを用いて SDF ファイル内で色設定をした方が Gazebo 表示状態を確認してから SDF ファイル内で色や透明度の調整が可能ですので意図した表示になるように思います.

上の図の状態は先述の washing-machine.world ファイル内のコメントアウトを行っている 16行目 と 22行目 を削除してファイルを保存し, world ファイルを読み込んで Gazebo を実行すると表示されます.

<?xml version="1.0" ?>
<sdf version="1.4">
  <world name="default">
    <include>
      <uri>model://ground_plane</uri>
    </include>
    <include>
      <uri>model://sun</uri>
    </include>
    <include>
      <uri>model://washing-machine</uri>
      <name>washing-machine</name>
      <pose>0 0 0 0 0 0</pose>
    </include>
    
<!--
    <include>
      <uri>model://washing-machine-dae</uri>
      <name>washing-machine-dae</name>
      <pose>0 1.0 0 0 0 0</pose>
    </include>
-->
    
  </world>
</sdf>

Gazebo シミュレーションの様子をデモンストレーションなどで見せるような場合に,DAE ファイルを使った Gazebo モデルで見た目がいまいちに感じたら STL ファイルと SDF ファイル内での色指定を試してみてはいかがでしょうか.

今回の記事はここまでです.


本シリーズ次回の記事は

「Gazebo/MoveIt のための 3D モデリング(13)MoveIt の静モデルの作成」

として,前回エクスポートしたメッシュデータファイルを MoveIt のモデルファイルに組み込んで表示を行う様子を紹介する予定です.

Gazebo/MoveIt のための 3D モデリング(11)形状データのエクスポート
Gazebo/MoveIt のための 3D モデリング(13)MoveIt の静モデルの作成

著者について

yamamoto.yosuke administrator

コメントを投稿するにはログインしてください。