Gazebo模型表面纹理设定为自定义图片的方法

本文详细介绍了如何在Gazebo中将模型的表面纹理设置为自定义图片,包括单一纹理和多纹理应用,以及scripts和materials文件的使用。还提供了models.sdf和material文件的源码解析。
摘要由CSDN通过智能技术生成

   本文主要介绍,将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仿真中,用来表示一个立方体状的物体,具有不同的碰撞和外观效果。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕羽★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值