Edited at

ROS講座90 gazeboモデルでメッシュを使う、テクスチャを使う


環境

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

項目

CPU
Core i5-8250U

Ubuntu
16.04

ROS
Kinetic

Gazebo
7.14.0

インストールについてはROS講座02 インストールを参照してください。

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


概要

今まで単純な直方体で模様の無いモデルをgazebo内で作ってきました。今回はメッシュの使い方、テクスチャの適用の仕方を説明します。


メッシュの使い方(stlファイルを使う)

room1というメッシュをgazeboの中に投入します。stlファイルは以下のようにroom1モデルのディレクトリの直下に置きます。

sim3_lecture/

├── models/

│   └── room1/

│   ├── model.config

│   ├── model.sdf

│   └── room_mesh.stl

└── worlds/

└── world_test3.world


ソースコード


sim3_lecture/models/room1/model.sdf

<?xml version='1.0'?>

<sdf version="1.4">
<model name="room1">
<pose>0 0 0.5 0 0 0</pose>
<link name="link">
<inertial>
<mass>1.0</mass>
<inertia>
<ixx>0.083</ixx>
<ixy>0.0</ixy>
<ixz>0.0</ixz>
<iyy>0.083</iyy>
<iyz>0.0</iyz>
<izz>0.083</izz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<mesh>
<uri>model://room1/room_mesh.stl</uri>
</mesh>
</geometry>
</collision>
<visual name="visual">
<geometry>
<mesh>
<uri>model://room1/room_mesh.stl</uri>
</mesh>
</geometry>
</visual>
</link>
</model>
</sdf>

このように<geometry>要素の中の<mesh>要素の中の<uri>要素でファイルを指定します。model://(モデル名)/(ファイル名)のように指定します。


テクスチャを張る

以下のようにモデルの中のmaterialstというディレクトリの中に画像とテクスチャようのORGEスクリプトを入れます。

sim3_lecture/

├── models/

│   ├── box2/

│   │   ├── materials/

│   │   │   ├── test_texture.material

│   │   │   └── texture1.png

│   │   ├── model.config

│   │   └── model.sdf

└── worlds/

└── world_test3.world


ソースコード

以下がスクリプトです。TestTextureという名前のテクスチャを定義してテクスチャのファイルとscaleを選択しています。このscaleは1面あたりに何枚分貼るかという指定です。大きい面には大きくテクスチャが張られます。


sim3_lecture/models/box2/materials/test_texture.material

material TestTexture

{
technique
{
pass
{
texture_unit
{
// Relative to the location of the material script
texture texture1.png
// Repeat the texture over the surface (4 per face)
scale 0.5 0.5
}
}
}
}

テスクチャの画像ファイルは以下のようなものを使いました。

以下が本体のsdfファイルです。


sim3_lecture/models/box2/model.sdf

<?xml version='1.0'?>

<sdf version="1.4">
<model name="box2">
<pose>0 0 0.5 0 0 0</pose>
<link name="link">
<inertial>
<mass>1.0</mass>
<inertia>
<ixx>0.083</ixx>
<ixy>0.0</ixy>
<ixz>0.0</ixz>
<iyy>0.083</iyy>
<iyz>0.0</iyz>
<izz>0.083</izz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
<material>
<script>
<uri>model://box2/materials/test_texture.material</uri>
<name>TestTexture</name>
</script>
</material>
</visual>
</link>
</model>
</sdf>

<material>要素の中の<script>要素の中で<uri>でファイル名を指定して<name>でテクスチャの名前を指定します。


実行

以下のように表示されます。

roslaunch gazebo_ros empty_world.launch world_name:=world_test3.world


コメント

stlファイルにテクスチャを適用しようとするとうまく表示されません。daeファイルを作ってその中でテクスチャを適用するしかないみたいです。


参考

Gazebo: Color And Texture Models

textureの使い方


目次ページへのリンク

ROS講座の目次へのリンク