理解Gazebo中SDF描述的仿真世界

背景

系统

Ubuntu20.04

ROS版本

ROS2 Foxy
安装教程

Gazebo版本

Gazebo Garden
安装教程

提示

如果你直接复制下面各段的XML代码到自己的文件中,需要特别注意缩进的正确性,因为XML对缩进是严格要求的,子Tag必须相对于父Tag严格缩进,且同级别Tag的缩进要对齐。

原版教程

SDF worlds

SDF仿真世界

在本教程中,我们将学习如何使用 SDF格式构建我们的世界,以及如何向其中添加模型。打开你的文本编辑器,并随着本教程添加代码。你也可以从这里下载本教程完成的仿真世界。

定义一个仿真世界

每一个SDF格式的仿真世界都从这些Tag开始:

<?xml version="1.0" ?>
<sdf version="1.8">
    <world name="world_demo">
    ...
    ...
    </world>
</sdf>

前两个标签定义了 XML 和 SDF 的版本。然后我们有 <world></world>标签,其间包含所有内容。

物理属性描述

<physics name="1ms" type="ignored">
    <max_step_size>0.001</max_step_size>
    <real_time_factor>1.0</real_time_factor>
</physics>

physics 标签指定了动态引擎的类型和属性。我们选择名称为 1ms,因为步长为 1 毫秒。类型是动态引擎(物理库)的类型。选项包括 Ode、Bullet、Simbody 和 Dart。我们将其设置为 ignored,因为选择物理引擎的类型还不能通过此标签完成。
<max_step_size>是模拟中每个系统可以与世界状态交互的最大时间。值越小,计算越准确,但需要更多的计算能力。<real_time_factor>是模拟时间与实时时间的比率。

插件

插件是动态加载的代码块。例如:

<plugin
    filename="gz-sim-physics-system"
    name="gz::sim::systems::Physics">
</plugin>

物理插件对于模拟世界的动态非常重要。

<plugin
    filename="gz-sim-user-commands-system"
    name="gz::sim::systems::UserCommands">
</plugin>

UserCommands 插件负责创建模型、移动模型、删除模型和许多其他用户命令。

<plugin
    filename="gz-sim-scene-broadcaster-system"
    name="gz::sim::systems::SceneBroadcaster">
</plugin>

SceneBroadcaster插件显示了仿真世界场景。

GUI

现在让我们定义 GUI。在<gui>标签下,我们指定与 Gazebo 的 GUI 相关的任何内容。

<gui fullscreen="0">
    ...
    ...
</gui>

gazebo-gui 有一堆插件可供选择。我们将添加一些必要的插件,以使我们的仿真世界具有基本功能并运行起来。

<!-- 3D scene -->
<plugin filename="MinimalScene" name="3D View">
  <gz-gui>
    <title>3D View</title>
    <property type="bool" key="showTitleBar">false</property>
    <property type="string" key="state">docked</property>
  </gz-gui>

  <engine>ogre2</engine>
  <scene>scene</scene>
  <ambient_light>0.4 0.4 0.4</ambient_light>
  <background_color>0.8 0.8 0.8</background_color>
  <camera_pose>-6 0 6 0 0.5 0</camera_pose>
  <camera_clip>
    <near>0.25</near>
    <far>25000</far>
  </camera_clip>
</plugin>
<plugin filename="GzSceneManager" name="Scene Manager">
  <gz-gui>
    <property key="resizable" type="bool">false</property>
    <property key="width" type="double">5</property>
    <property key="height" type="double">5</property>
    <property key="state" type="string">floating</property>
    <property key="showTitleBar" type="bool">false</property>
  </gz-gui>
</plugin>

MinimalScene 和 GzSceneManager 负责显示仿真世界的 3D 场景。它具有以下属性(大多数 GUI 插件都有):

  • showTitleBar 如果为 true,则会在插件上方显示蓝色标题栏,并显示<title>标签中提到的名称。
  • state 是插件的状态,可以使用 docked 将其停靠在其位置,也可以将其浮动。

对于渲染引擎,我们可以选择 ogre 或 ogre2。
<ambient_light><background_color>指定场景的环境光和背景颜色。<camera_pose>指定相机的 X Y Z 位置,后跟其以 Roll Pitch Yaw 表示的旋转。

仿真世界控制插件

<!-- World control -->
<plugin filename="WorldControl" name="World control">
    <gz-gui>
        <title>World control</title>
        <property type="bool" key="showTitleBar">false</property>
        <property type="bool" key="resizable">false</property>
        <property type="double" key="height">72</property>
        <property type="double" key="width">121</property>
        <property type="double" key="z">1</property>

        <property type="string" key="state">floating</property>
        <anchors target="3D View">
        <line own="left" target="left"/>
        <line own="bottom" target="bottom"/>
        </anchors>
    </gz-gui>

    <play_pause>true</play_pause>
    <step>true</step>
    <start_paused>true</start_paused>
    <service>/world/world_demo/control</service>
    <stats_topic>/world/world_demo/stats</stats_topic>
</plugin>

World 控制插件负责控制仿真世界。它的一些属性如下:

  • <play_pause>如果为 true,我们将在左下角有播放/暂停按钮。
  • <stats_topic>标签指定发布仿真世界统计信息(如模拟时间和实时时间)的话题。
  • <start_paused>如果为 true,模拟将在 Gazebo 开始时暂停。

仿真世界状态插件

<!-- World statistics -->
<plugin filename="WorldStats" name="World stats">
    <gz-gui>
        <title>World stats</title>
        <property type="bool" key="showTitleBar">false</property>
        <property type="bool" key="resizable">false</property>
        <property type="double" key="height">110</property>
        <property type="double" key="width">290</property>
        <property type="double" key="z">1</property>

        <property type="string" key="state">floating</property>
        <anchors target="3D View">
        <line own="right" target="right"/>
        <line own="bottom" target="bottom"/>
        </anchors>
    </gz-gui>

    <sim_time>true</sim_time>
    <real_time>true</real_time>
    <real_time_factor>true</real_time_factor>
    <iterations>true</iterations>
    <topic>/world/world_demo/stats</topic>

</plugin>

World stats 插件负责显示仿真世界统计信息,<sim_time><real_time><real_time_factor><iterations>
使用这些标签,我们可以选择显示哪些值(展开右下角以查看这些值)。我们可以选择这些值将发布到哪个<topic>上。让我们尝试运行世界并监听该主题。
运行仿真世界:

gz sim world_demo.sdf

按下播放按钮,在另一个终端上监听消息:

gz topic -e -t /world/world_demo/stats

消息应该看起来像这样:
在这里插入图片描述

实体树

<!-- Entity tree -->
<plugin filename="EntityTree" name="Entity tree">
</plugin>

在这个插件中,我们可以看到仿真世界中的所有实体(仿真中的所有内容都被视为“实体”)。我们可以看到不同的模型、太阳以及它们的链接、视觉效果和碰撞。
在这里插入图片描述
它是空白的,因为我们还没有向仿真世界添加任何东西。
有一堆有用的 gz-gui 插件,例如 Transform control插件,它允许我们操作世界的不同组件,并平移和旋转实体。查看本教程,了解如何操作模型。
也可以从 GUI 中使用 Gazebo 右上角的插件下拉菜单添加插件。现在我们已经完成了 GUI,让我们向我们的世界添加不同的元素。不要忘记添加关闭标签</gui>

光线

<light type="directional" name="sun">
    <cast_shadows>true</cast_shadows>
    <pose>0 0 10 0 0 0</pose>
    <diffuse>0.8 0.8 0.8 1</diffuse>
    <specular>0.2 0.2 0.2 1</specular>
    <attenuation>
        <range>1000</range>
        <constant>0.9</constant>
        <linear>0.01</linear>
        <quadratic>0.001</quadratic>
    </attenuation>
    <direction>-0.5 0.1 -0.9</direction>
</light>
  • <light>指定了世界中的光源。光的<type>可以是点、定向或聚光灯。
  • <pose>是光元素相对于在 relative_to 属性中提到的Frame的位置(x,y,z)和方向(roll,pitch,yaw);在我们的例子中(relative_to 属性被忽略),它是相对于仿真世界而言的。
  • <cast_shadows>为 true 时,光将投射阴影。<diffuse><specular>是漫射和镜面光颜色。
  • <attenuation>指定了光衰减属性,它们是:
    • <range>是光的范围。
    • <constant>是常数衰减因子,1 表示不衰减,0 表示完全衰减。
    • <linear>是线性衰减因子,1 表示在距离上均匀衰减
    • <quadratic>是二次衰减因子。它为衰减添加曲率。
    • <direction>是光的方向,仅适用于聚光灯和定向光。

添加模型

我们可以使用已经构建的模型,而不是构建自己的模型。Gazebo Fuel 托管了数百个模型,可以轻松添加到 Gazebo 仿真世界中。模型可以按如下方式添加。

生成模型

要将来自 fuel 的各种模型添加到你的仿真世界,请查看本教程

包含模型 URI

将模型添加到你的仿真世界的另一种方法是使用模型链接。访问 Gazebo Fuel 网站。选择你喜欢的模型并单击模型描述页面上的 <> 图标。这将复制一个 SDF 片段到你的剪贴板,然后将其粘贴到你的仿真世界中,就在</world>标签的正上方,如下所示:

<include>
    <uri>
    https://fuel.gazebosim.org/1.0/OpenRobotics/models/Coke
    </uri>
</include>

下载模型

以前的方法是在运行时下载你的模型。为了永久保存模型,你可以从 fuel 下载模型,然后像这样引用它:

<include>
    <uri>
    model://Coke
    </uri>
</include>

我们需要将 GZ_SIM_RESOURCE_PATH 环境变量设置为我们模型的父文件夹。例如,如果我们的目录看起来像这样:

world_tutorial<br/>
├── Coke <br/>
└── world_demo.sdf

然后我们必须将其设置为 world_tutorial 目录,如下所示:

export GZ_SIM_RESOURCE_PATH="$HOME/world_tutorial"

运行你的仿真世界:

gz sim world_demo.sdf

你应该在仿真世界的原点看到模型。
在这里插入图片描述
你也可以使用<pose>标签设置它的坐标。如果你想生成同一个模型的多个实例,你必须使用<name>标签给它们不同的名称。

    <include>
        <name>Coke0</name>
        <pose>0 0 0 0 0 0</pose>
        <uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Coke</uri>
    </include>
    <include>
        <name>Coke1</name>
        <pose>0 0.1 0 0 0 0</pose>
        <uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Coke</uri>
    </include>

在这里插入图片描述
现在你有了一个自定义的仿真世界,下一个教程将教你如何向机器人添加传感器,使其能够与周围的世界进行交互。

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值