Gazebo之SDF简介

1. 源由

Gazebo在Ardupilot开源3D模拟仿真上被广泛使用。

通过SDFormat(Simulation Description Format)构建Ardupilot仿真世界,并如何向其中添加模型。

2. SDF简介

Gazebo作为开源项目,为仿真带来了全新的方法,提供了完整的开发库和云服务工具箱,使仿真变得简单。

在高保真传感器数据流的现实环境中,快速迭代您的新物理设计。在安全的环境中测试控制策略,并在持续集成测试中利用仿真。

SDFormat(Simulation Description Format),有时缩写为 SDF,是一种 XML 格式,用于描述机器人模拟器、可视化和控制的对象和环境。

3. SDF世界

3.1 定义World

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

前两个标签定义了 XML 和 SDF 的版本。然后是 <world> </world> 标签,所有内容都在这对标签之间。

3.2 定义Physics

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

physics 标签指定了动态引擎的类型和属性。

  • 选择 name 1ms,因为步长是1毫秒。
  • type 是动态引擎(物理库)的类型。有 Ode、Bullet、Simbody 和 Dart 等选项。我们将其设置为 ignored,因为选择物理引擎的类型尚未通过此标签完成。
  • <max_step_size> 是仿真中每个系统与世界状态交互的最大时间。值越小,计算越精确,但需要更多的计算能力。
  • <real_time_factor> 是仿真时间与实际时间的比率。

3.3 定义Plugins

插件是一段动态加载的代码。

3.3.1 Physics plugin

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

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

3.3.2 UserCommands plugin

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

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

3.3.3 SceneBroadcaster plugin

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

SceneBroadcaster 插件显示我们的世界场景。

3.4 定义GUI

基于 Qt 构建,提供在开发机器人应用程序时有用的小部件,例如 3D 视图、绘图、仪表板等,并且可以在一个方便的统一界面中一起使用。

代码: gazebosim/gz-gui

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

Gazebo GUI 有许多插件可供选择。

  • camera_fps
  • camera_tracking
  • camera_tracking_config
  • grid_config
  • image_display
  • interactive_view_control
  • key_publisher
  • marker_manager
  • minimal_scene
  • navsat_map
  • plotting
  • point_cloud
  • screenshot
  • shutdown_button
  • tape_measure
  • teleop
  • topic_echo
  • topic_viewer
  • transport_scene_manager
  • world_control
  • world_stats
  • … …

添加一些必要的插件,以使我们的世界能够具有基本的功能并运行起来。

3.4.1 MinimalScene/GzSceneManager

MinimalScene 和 GzSceneManager 使我们的世界具备基本功能并运行起来的必要插件, 负责显示我们世界的 3D 场景。它具有以下属性(大多数 GUI 插件也具有这些属性):

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

对于渲染引擎,我们可以选择 ogre 或 ogre2。<ambient_light> 和 <background_color> 指定场景的环境光和背景色。<camera_pose> 指定摄像机的 X、Y、Z 位置,后跟其滚动、俯仰和偏航旋转。

<!-- 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>

3.4.2 World control plugin

负责控制整个世界。其一些属性如下:

  • <play_pause> 如果为 true,则在左下角会有播放/暂停按钮。
  • <stats_topic> 标签指定发布世界统计信息(如仿真时间和实际时间)的主题。
  • <start_paused> 如果为 true,则 Gazebo 启动时仿真将暂停。
<!-- 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>

3.4.3 World stats plugin

负责显示世界统计信息,包括 <sim_time><real_time><real_time_factor><iterations>

通过这些标签,我们可以选择要显示的值(展开右下角以查看这些值)。我们可以选择这些值将发布到哪个 <topic> 上。让我们尝试运行世界并监听该主题。

<!-- 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>

3.5 Entity tree plugin

在这个插件中,我们可以看到我们世界中的所有实体(仿真中的所有事物都被视为“实体”)。我们可以看到不同的模型、太阳以及它们的链接、视觉效果和碰撞。

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

3.6 定义Light

  • 指定世界中的光源。光源的 可以是点光源、方向光源或聚光灯。
  • 是光源相对于 relative_to 属性中指定的框架的位置(x, y, z)和方向(滚动、俯仰、偏航);在我们的例子中(relative_to 属性被忽略)是相对于世界的。
  • <cast_shadows> 如果为 true,光源将投射阴影。 是漫反射光和镜面反射光的颜色。
  • 指定光源的衰减特性,包括:
    • 是光源的范围。
    • 是常数衰减系数,1 表示从不衰减,0 表示完全衰减。
    • 是线性衰减系数,1 表示在整个距离内均匀衰减。
    • 是二次衰减系数,为衰减添加曲率。
    • 是光源的方向,仅适用于聚光灯和方向光。
<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>

4. models

可以使用已经构建好的模型,而不是自己构建模型。Gazebo Fuel 提供了数百个可以轻松添加到 Gazebo 世界中的模型。可以按以下方式添加模型。

4.1 模型链接

访问 Gazebo Fuel 网站,选择你喜欢的模型,然后点击模型描述页面上的 <> 图标。这将把一个 SDF 代码片段复制到你的剪贴板,然后将其粘贴到你的世界中的关闭 标签的正上方,如下所示:

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

4.2 模型下载

前面的方法在运行时下载你的模型,然后像这样引用它:

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

从 Gazebo Fuel 下载模型保存模型,如果如下所示目录:

world_tutorial
├── Coke
└── world_demo.sdf

同时需要将 GZ_SIM_RESOURCE_PATH 环境变量设置为模型的父文件夹。

$ export GZ_SIM_RESOURCE_PATH=`pwd`

5. SDF测试

测试资料:SnapLearnGazebo/lesson_01_sdf

5.1 运行SDF(模型下载本地)

$ export GZ_SIM_RESOURCE_PATH=`pwd`
$ gz sim world_demo_local.sdf

5.2 运行SDF(模型网络连接)

$ export https_proxy=http:192.168.1.10:808
$ gz sim world_demo_uri.sdf

6. 参考资料

【1】ArduPilot开源代码之ROS2Humble+CartographerSLAM+SITL+Gazebo
【2】ArduPilot飞控之Gazebo + SITL + MP的Jetson Orin环境搭建
【3】ArduPilot飞控之ubuntu22.04-Gazebo模拟
【4】PX4模块设计之七:Ubuntu 20.04搭建Gazebo模拟器

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Gazebo的世界文件(.world)转换为STL文件,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Gazebo仿真软件,并且有一个你想要转换的Gazebo世界文件。 2. 打开终端或命令提示符,并导航到包含你的Gazebo世界文件的目录。 3. 使用以下命令将Gazebo世界文件转换为COLLADA格式(.dae): ``` gz sdf -p your_world.world > your_world.dae ``` 这将使用Gazebo命令行工具(gz)将世界文件转换为COLLADA格式,并将其保存为一个新的COLLADA文件。 4. 一旦你有了COLLADA文件,你可以使用COLLADA转换工具来将其转换为STL格式。有一些开源软件可以帮助你完成这个任务,例如MeshLab、Blender等。你可以在它们的官方网站上找到并下载。 5. 安装和启动选择的COLLADA转换工具后,导入你的COLLADA文件。具体的导入方法可能因软件而异,请查阅相关工具的文档或教程以获取详细说明。 6. 一旦成功导入COLLADA文件,你可以执行导出操作将其转换为STL格式。在导出选项中,选择输出为STL文件,并指定保存路径和文件名。 7. 点击导出按钮后,转换工具将根据COLLADA文件生成相应的三角网格,并将其保存为STL文件。这个过程可能需要一些时间,具体取决于COLLADA文件的大小和复杂度。 完成上述步骤后,你将获得一个STL文件,其中包含了根据Gazebo世界文件生成的几何网格。这个STL文件可以用于各种目的,例如3D打印、CAD建模等。记得在转换过程中,根据你的需求调整相应的参数和选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值