【ROS-Gazebo】SDF机器人描述格式解析

770
0
2020年5月12日 10时00分

什么是SDF?

 

SDF是一种XML格式,能够描述机器人、静态和动态物体、照明、地形甚至物理学的各方面的信息。SDF可以精确描述机器人的各类性质,除了传统的运动学特性之外,还可以为机器人定义传感器、表面属性、纹理、关节摩擦等;SDF还提供了定义各种环境的方法。包括环境光照、地形,OpenStreetMaps 中的街道以及The Prop Shop中提供的任何模型。

 

SDF Home​sdformat.org

 

【ROS-Gazebo】SDF机器人描述格式解析插图

SDF定义机器人

 

【ROS-Gazebo】SDF机器人描述格式解析插图(1)

SDF定义环境

 

SDF和URDF的区别

 

SDF和URDF都是基于XML的机器人描述格式。区别在于URDF只能描述单个机器人的运动和动态属性,而无法描述环境信息,也不支持多机器人、闭链(并联)机器人;SDF是相对更新的格式,它可以包含从世界环境到机器人属性相关的全部信息,且支持闭链结构。

 

尽管SDF格式具备更明显的优点,Gazebo官方也主推SDF格式,甚至已经下架了部分关于URDF的教程。但到目前为止,大多数网络上能找到的中文ROS教程仍然是基于URDF的,部分插件工具也只支持URDF。因此,在选择机器人描述格式时,如果对自己的开发能力有信心且有长期做Gazebo仿真开发的打算,或必须要用到闭链结构的机器人,推荐使用SDF格式;如果是刚入门的新手,还是建议采用教学资源更加丰富的URDF/XACRO格式建立自己的机器人

 

SDF格式规范

 

世界环境(world)的基本结构

 

前面说到,SDF既可以描述环境信息,也可以描述机器人本身的信息。我们以一个典型的世界文件 example.world看一看SDF世界环境文件的基本结构。为了便于浏览,下面的文件中我删除了三级以上的标签,完整的文件见我的项目:

 

XM522706601/robotics_tutorial_for_zhihu​github.com

<sdf version='1.6'>
  <world name='default'>
    <model name='ground_plane'>
      定义地面环境
    </model>
    <light name='sun' type='directional'>
      定义环境光照
    </light>
    <gui fullscreen='0'>
      定义界面参数,如用户相机视角的相关参数
    </gui>
    <gravity> 定义重力加速度 </gravity>
    <magnetic_field> 定义磁场 </magnetic_field>
    <atmosphere type='adiabatic'/> 定义大气环境
    <physics name='default_physics' default='0' type='ode'>
      定义物理参数,主要是仿真求解参数
    </physics>
    <scene>
      定义场景参数,包括环境、背景、阴影等
    </scene>
    <spherical_coordinates>
      定义球坐标系,包括类型、海拔、经度、纬度、航向角等(作用暂未知)
    </spherical_coordinates>
    <model name='unit_box'>
      自定义机器人或物体模型
    </model>
    <state world_name='default'>
      定义世界状态,包括仿真时间、真实时间、墙上时间以及各模型的位姿参数等
    </state>
  </world>
</sdf>

 

可以看到,SDF格式的环境文件对环境参数做了详细的定义。而更多的机器人或者物体模型,可以利用<model>标签来插入。

 

模型标签(model)的基本结构

 

我们的机器人或者其它物体都是以模型标签<model>进行定义并插入到环境中的。下面以一个简单的正方体为例,说明<model>标签的基本结构。

 

<model name='unit_box'>
  <pose frame=''>0.357849 -0.310577 0.5 0 -0 0</pose>
  <link name='link'>
    <inertial>
      惯性参数,包括质量、惯量等
    </inertial>
    <collision name='collision'>
      碰撞参数,用于碰撞检测
    </collision>
    <visual name='visual'>
      可视化参数,用于显示
    </visual>
    <self_collide>是否检测自碰撞</self_collide>
    <enable_wind>是否受到风的影响</enable_wind>
    <kinematic>运动学</kinematic>
  </link>
</model>

 

SDF格式中的<model>标签和URDF的<robot>标签结构基本一致,但细节略有不同。每个标签的细节信息,我们可以查阅官方规范文档:http://sdformat.org/spec ,文档分层图表的形式进行说明,查询十分方便。

 

【ROS-Gazebo】SDF机器人描述格式解析插图(2)

SDF官方规范文档

 

SDF文件的使用

 

SDF格式的world文件既可以利用终端单独加载到gazebo中,也可以利用ros的launch文件进行启动。举例说明,先将example.world下载到Documents目录下。

 

(1)终端加载

 

打开一个新终端,执行如下命令:

cd ~/Documents/

gazebo example.world

 

即可启动gazebo并加载example.world文件:

 

【ROS-Gazebo】SDF机器人描述格式解析插图(3)

 

(2)roslaunch加载

 

在大型项目中,我们更习惯用launch文件一次性加载模型、控制器、节点等文件。SDF文件同样可以在launch文件中加载。在launch文件中添加如下代码:

 

<launch>
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="<your_world>.world"/>
  </include>
</launch>

 

<your_world>即为world文件所在的完整路径,例如:

 

<launch>
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="~/Documents/example.world"/>
  </include>
</launch>

 

然后用roslaunch启动launch文件即可。

 

参考文献

 

[1] http://sdformat.org/

[2] Gazebo学习随记2 SDF和XML

[3] Gazebo学习总结之制作一个模型及导入网格

发表评论

后才能评论