背景
系统
Ubuntu20.04
ROS版本
ROS2 Foxy
安装教程
Gazebo版本
Gazebo Garden
安装教程
提示
如果你直接复制下面各段的XML代码到自己的文件中,需要特别注意缩进的正确性,因为XML对缩进是严格要求的,子Tag必须相对于父Tag严格缩进,且同级别Tag的缩进要对齐。
原版教程
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>
现在你有了一个自定义的仿真世界,下一个教程将教你如何向机器人添加传感器,使其能够与周围的世界进行交互。