本シリーズ前回の記事 Gazebo/MoveIt のための 3D モデリング(11)形状データのエクスポート で Gazebo や MoveIt で利用できるデータ形式にエクスポートする手順を紹介しました.
今回はエクスポートしたメッシュデータファイルを Gazebo の静モデルとしてモデルファイルに組み込んで表示する方法を紹介します.
今回紹介する 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 リポジトリから入手可能です.
まずは Gazebo SDF モデルの本体のファイルとも言える model.sdf
の中身を見てみます.XML データになっていて干渉チェック用のモデルを記述した collision
や視覚表示用のモデルを記述した visual
などの要素があります.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | <? 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
要素に記述して material
の ambient
(=環境反射率) diffuse
(=拡散反射率) specular
(=鏡面反射率) の数値を RGBA(=赤,緑,青,透明度) の順で設定します.(「透明度」は数値的には「不透明度」を意味するように思うのですが「透明度」と一般的には言われているようです.)
collision
要素はメッシュに洗濯機全体の閉じたメッシュ群である base_link.stl ファイルを使用しています.
inertial
の mass
(=質量) inertia
(=慣性モーメント) は今回はメッシュの確認が主な目的ですので適当な値を設定しました.精度良く物理シミュレーションを行いたい場合は適切な値を設定する必要があります.
model.config
ファイルの中身も XML データ形式で記述されていて当該 Gazebo モデルのメタ的な情報を記述しています.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <? 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 > |
Gazebo の 3D モデルをシミュレーション空間上に読込・表示する方法は主に次の3つの方法があります.
本記事における 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つとして提示されるようになります.
$ gazebo
(図: クリックで拡大)
このような Gazebo 内に手作業でモデルを読み込む方法でもシミュレーションはできるのですが,自動的に読み込む手段として world ファイルを作成する方法や launch ファイル内やプログラムからモデルを読み込んで Gazebo に表示させる方法があります.自動的に読み込む方がモデルを用いた Gazebo シミュレーションでロボットを動作させるような段階では毎回手作業でモデルを Gazebo 空間内に読み込む必要がなく楽です.
前項目の「表示方法-1 .gazebo/models フォルダにコピー」は Gazebo を起動するたびにモデルを配置する必要があります.モデルの確認には十分ですが Gazebo のシミュレーションでロボットの動作を同じ環境で何度も試行するには向いていません.そこで Gazebo 環境の定義をする world ファイルを読み込むことで常に同じ環境を再現することができます.
world ファイルも XML 形式のデータです.
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 | <? 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 ファイルを作成します.
1 2 3 4 5 6 7 8 9 10 11 12 | < 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 モデルへのパスと実行依存関係を記述します.
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | < 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
にてビルドと環境設定を行った場合の例です.
world ファイルを読み込むように作成した launch ファイルを実行して Gazebo を起動します.
前項目の「表示方法-2 world ファイルを作成」では world ファイルでモデルの配置が決められた状態で Gazebo を起動していました. Spawn を行うことで既に実行されている Gazebo シミュレーション空間内に位置・姿勢を指定してモデルを配置することができます.
次に Spawn を用いた場合の launch ファイルの例を示します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | < 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
を実行してみます.
world ファイルを読み込んで Gazebo を起動したときと異なる位置に配置しています.
Gazebo で dae ファイルを用いて色付きモデルを表示することも可能ですが,STL ファイルを用いて SDF ファイル内で色設定をした方が Gazebo 表示状態を確認してから SDF ファイル内で色や透明度の調整が可能ですので意図した表示になるように思います.
上の図の状態は先述の washing-machine.world
ファイル内のコメントアウトを行っている 16行目 と 22行目 を削除してファイルを保存し, world ファイルを読み込んで Gazebo を実行すると表示されます.
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 | <? 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 のモデルファイルに組み込んで表示を行う様子を紹介する予定です.
コメントを投稿するにはログインしてください。
著者について