本文主要介绍,将Gazebo模型表面纹理设定为自定义图片的方法,本文以较简单的长方体模型为例进行介绍,分为单一纹理介绍、多纹理介绍、xxx.material和models.sdf文件源码介绍三部分
一、将Gazebo模型全部表面纹理设定为某张自定义图片
1、首先,根据需求的尺寸,使用gazebo创建所需要的模型,比如下面的演示中我创建了一个1x0.9x3.1的长方形模型,并将其保存为MUYU_1x0.9x3.10(这里的名字随意)
–
2、打开刚刚保存的模型文件夹MUYU_1x0.9x3.10,可以发现里面有两个文件,如下所示,我们需要修改的是models.sdf文件

在对models.sdf文件修改前,我们要做一些准备工作,即使用我们自定义的图片创建一个纹理,在MUYU_1x0.9x3.10文件夹下创建一个新的文件夹,取名为materials
然后在materials文件夹下,再创建两个文件夹,分别取名为scripts和textures,分别用于存放自定义的纹理文件和对应的图片文件
将准备好的图片,放到textures文件夹下,这里我准备了以下名为xk1.png的图片文件
原图如下:
接下来使用以上图片来创建自定义纹理文件,在scripts文件夹下,创建名为xxx.material的文件,其中xxx部分名字随意即可,后面也用不到,这里,我创建了名为xk1.material,打开该文件,然后将下面的语句复制到文件中,其中material JZX/xk1语句中的JZX/xk1是该纹理的名字,可随意命名,但要记住,后面要用到。语句texture xk1.png中的xk1.png即前面存放在textures文件夹下图片的名字,这两处语句大家需要根据自己的实际情况修改,其余的可保持不变。
material JZX/xk1
{
receive_shadows on
technique
{
pass
{
ambient 1.0 1.0 1.0 1.0
texture_unit
{
texture xk1.png
}
}
}
}
–
3、到这里,我们已经成功使用我们自定义的图片创建了自定义的纹理文件,接下来就是将该纹理应用到,我们前面创建的模型中,打开models.sdf文件,找到设置模型纹理的语句,如下面红框所示:
将其修改为以下语句,其中MUYU1_1x0.9x3.10是之前创建模型时保存的名字,JZX/xk1是上一步时使用自定义图片创建的纹理的名字,大家需要根据实际情况进行修改。修改完成后保存文件
<uri>model://MUYU1_1x0.9x3.10/materials/scripts</uri>
<uri>model://MUYU1_1x0.9x3.10/materials/textures/</uri>
<name>JZX/xk1</name>
4、打开gazebo,添加之前创建的模型,发现模型的表面已经成功修改为我们使用自定义图片创建的纹理了,如下所示:
二、将Gazebo模型某个表面纹理设定为某张自定义图片
以上方法会将,模型的每个面都设定为该纹理,若采用上面例子中所示的类纹理图片,视觉效果还可以,若我们想要显示某张景物图片或者一些文字,就需要注意模型的比例与图片比例的问题,除非采用正方形模型以及长宽近似的图片,才能保证在每个面上图片都不会因为比例失调而使内容发生形变,所以一种处理方法是,仅将整个模型的各个面设定为一种纹理,然后在想要显示内容的表面再贴一层薄模型,将该薄模型的纹理设定为所需的图片,如下所示:
gazebo模型使用自定义图片作为纹理过程演示
三、xxx.material和models.sdf文件源码介绍
(1)xxx.material文件,以下面的程序为例
material JZX/xk1
{
receive_shadows on
technique
{
pass
{
ambient 1.0 1.0 1.0 1.0
texture_unit
{
texture xk1.png
}
}
}
}
1. material JZX/xk1
:这一行定义了一个名为 “JZX/xk1” 的材质。在Gazebo中,材质用于定义模型的外观和表现。“JZX/xk1” 是这个材质的名称,它可以用来将这个材质应用于一个或多个模型。
2. {}
:大括号中包含了材质的定义,所有的材质属性都将在这里描述。
3. receive_shadows on
:这一行指示该材质的模型要接收阴影,意味着当光源照射到该模型时,它会产生阴影效果。
4. technique
:这是一个技术(technique)块,通常用于定义多个渲染效果或通道。一个材质可以包含多个技术,每个技术可以用于不同的渲染情况。
5. {}
:技术的定义也用大括号包围起来,包含了一个或多个通道(pass)。
6. pass
:这是渲染通道的定义。渲染通道描述了如何渲染一个模型,包括光照、纹理和其他效果。
7. {}
:通道的定义同样使用大括号包围。
8. ambient 1.0 1.0 1.0 1.0
:这一行设置了环境光照的属性。具体来说,这是一个白色环境光,RGBA颜色分量分别为1.0、1.0、1.0和1.0。这意味着模型在没有其他光源照射时,会呈现出白色的环境光照效果。
9. texture_unit
:这是用于定义纹理的块。
10. {}
:纹理单元的定义也用大括号包围。
11. texture xk1.png
:这一行指定了用于模型的纹理图像。具体地,它引用了名为 “xk1.png” 的纹理文件,该文件将被应用到模型上,以赋予模型外观的纹理效果。
(2)models.sdf文件,以下面的程序为例
<?xml version='1.0'?>
<sdf version='1.7'>
<model name='MUYU_1x1x3.1'>
<pose>-1.37016 -1.00011 0 0 -0 0</pose>
<link name='Wall_0'>
<collision name='Wall_0_Collision'>
<geometry>
<box>
<size>1 0.9 3.1</size>
</box>
</geometry>
<pose>0 0 1.55 0 -0 0</pose>
</collision>
<visual name='Wall_0_Visual'>
<pose>0 0 1.55 0 -0 0</pose>
<geometry>
<box>
<size>1 0.9 3.1</size>
</box>
</geometry>
<material>
<script>
<uri>model://MUYU_1x1x3.1/materials/scripts</uri>
<uri>model://MUYU_1x1x3.1/materials/textures/</uri>
<name>JZX/xk1</name>
</script>
<ambient>1 1 1 1</ambient>
</material>
<meta>
<layer>0</layer>
</meta>
</visual>
<pose>-0.869838 -0.449895 0 0 -0 0</pose>
</link>
<link name='Wall_2'>
<collision name='Wall_2_Collision'>
<geometry>
<box>
<size>1 0.1 3.1</size>
</box>
</geometry>
<pose>0 0 1.55 0 -0 0</pose>
</collision>
<visual name='Wall_2_Visual'>
<pose>0 0 1.55 0 -0 0</pose>
<geometry>
<box>
<size>1 0.1 3.1</size>
</box>
</geometry>
<material>
<script>
<uri>model://MUYU_1x1x3.1/materials/scripts</uri>
<uri>model://MUYU_1x1x3.1/materials/textures/</uri>
<name>JZX/MUYU1</name>
</script>
<ambient>1 1 1 1</ambient>
</material>
<meta>
<layer>0</layer>
</meta>
</visual>
<pose>-0.870162 -0.950105 0 0 -0 0</pose>
</link>
<static>1</static>
</model>
</sdf>
这是一个Gazebo中的SDF(Simulation Description Format)文件,用于描述一个名为 “MUYU_1x1x3.1” 的模型。SDF文件用于配置和定义物体、环境和场景等信息。详细介绍如下:
1. <sdf version='1.7'>
:这是SDF文件的开头,指定了SDF文件的版本。在这里,版本为1.7。
2. <model name='MUYU_1x1x3.1'>
:定义了一个模型,该模型的名称为 “MUYU_1x1x3.1”。
3. <pose>-1.37016 -1.00011 0 0 -0 0</pose>
:定义了模型的初始位置和方向。这里的值依次表示X、Y、Z坐标位置和绕X、Y、Z轴的旋转角度(以弧度表示),其中X轴是模型的前进方向,Y轴是模型的左右方向,Z轴是模型的上下方向。
4. <link name='Wall_0'>
:定义了一个链接(link)的名称为 “Wall_0”。链接是模型的组成部分,可以具有碰撞(collision)和可视化(visual)属性。
- <collision name='Wall_0_Collision'>
:定义了碰撞属性,用于模拟物体的碰撞行为。
- <geometry>
:定义了碰撞几何体的类型。
- <box>
:表示碰撞几何体是一个立方体。
- <size>1 0.9 3.1</size>
:指定了立方体的尺寸,分别为X轴方向1个单位、Y轴方向0.9个单位和Z轴方向3.1个单位。
- <pose>0 0 1.55 0 -0 0</pose>
:定义了碰撞几何体的位置和方向,以与模型的相对坐标系相关联。
- <visual name='Wall_0_Visual'>
:定义了可视化属性,用于渲染模型的外观。
- <pose>0 0 1.55 0 -0 0</pose>
:定义了可视化几何体的位置和方向,以与模型的相对坐标系相关联。
- <geometry>
:定义了可视化几何体的类型,这里也是一个立方体。
- <box>
:表示可视化几何体是一个立方体。
- <size>1 0.9 3.1</size>
:指定了立方体的尺寸,与碰撞几何体尺寸相同。
- <material>
:定义了可视化材质属性。
- <script>
:指定了材质的属性脚本。
- <uri>model://MUYU_1x1x3.1/materials/scripts</uri>
:材质脚本的URI,用于引用材质属性脚本文件。
- <uri>model://MUYU_1x1x3.1/materials/textures/</uri>
:材质纹理的URI,用于引用材质纹理文件所在的目录。
- <name>JZX/xk1</name>
:指定了使用的材质的名称,可能是用于给模型赋予纹理和颜色效果的材质。
- <ambient>1 1 1 1</ambient>
:设置了材质的环境光照属性,这里是全白色环境光。
- <meta>
:定义了链接的元数据信息,这里设置了图层为0。
- <pose>-0.869838 -0.449895 0 0 -0 0</pose>
:定义了链接的位置和方向,以与模型的相对坐标系相关联。
5. <link name='Wall_2'>
:类似地,这个链接定义了另一个名为 “Wall_2” 的链接,它也包括碰撞、可视化、材质等属性。
- <collision name='Wall_2_Collision'>
:定义了碰撞属性,这里是一个立方体。
- <visual name='Wall_2_Visual'>
:定义了可视化属性,也是一个立方体。
- <material>
:指定了使用的材质的名称为 “JZX/MUYU1”,可能是用于给模型赋予不同的纹理和颜色效果的材质。
- <pose>-0.870162 -0.950105 0 0 -0 0</pose>
:定义了链接的位置和方向。
6. <static>1</static>
:这行指定了模型是否是静态的,这里的值为1表示模型是静态的,不会受到物理仿真的影响。
总之,这个SDF文件定义了一个名为 “MUYU_1x1x3.1” 的模型,包括两个链接 “Wall_0” 和 “Wall_2”,每个链接具有碰撞和可视化属性,以及对应的材质属性。这个模型可能用于Gazebo仿真中,用来表示一个立方体状的物体,具有不同的碰撞和外观效果。