前言

这是一个系列小文章,主要介绍在ROS-Gazebo中如何更好地使用SDF格式建模与仿真。众所周知,URDF是ROS的原生支持格式,但在某些情况下(尤其是Gazebo仿真时),使用SDF格式会更加合理。鉴于中文网络上几乎没有成体系的SDF介绍博文,因此我将自己在硕士期间关于SDF模型的使用经验稍作总结。如有谬误,还望友好地指出。

本系列规划如下内容,建议按顺序阅读。尤其是第一篇,以确认你是否有必要使用SDF建模:

1 什么是SDF?

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

SDF描述的机器人

 

SDF描述的地形

2 SDF和URDF有什么区别?

以下基本摘自官方说明[2]

URDF(Unified Robot Description Format)在ROS中是一种功能强大且标准化的机器人描述格式,但依然缺少许多功能。例如,

  • URDF只能单独定义单个机器人的运动学和动力学特性;
  • 无法定义机器人本身在世界中的姿态;
  • 不能定义闭链结构(并联机器人);
  • 缺乏摩擦和等更丰富的动力学特性;
  • 不能定义非机器人物体,例如灯光,高度图等。

在实现方面,URDF语法大量使用XML的属性(Attribute)特性,使得URDF更加不灵活。 也没有向后兼容的机制。

为了解决以上问题,开发人员创建了一种称为SDF(Simulation Description Format)的新格式,专门供Gazebo使用。

SDF完整描述了从世界级到机器人级的所有内容。 它具有良好的可扩展性。 SDF格式使用XML元素而非属性来自我描述(因为属性往往难以阅读和维护[3]),这有助于使用简单的升级工具将旧版本迁移到新版本。 SDF也是具有自描述性的格式。

3 我应该使用哪种格式?

尽管目前有一些SDF与URDF的之间的转换方法(我在后面的文章里会讲到),但往往十分复杂且易出错。因此,我建议刚开始就根据自己的需求选择最合适的模型格式。对此我有以下建议:

3.1 必须使用URDF的情况

  • 使用Rviz对机器人进行可视化

3.2 必须使用SDF的情况

  • 研究并联机器人,或机器人中存在闭链结构

3.3 建议使用URDF的情况

  • 新手,面临毕业压力想快点做出可展示的成果
  • 使用Solidworks建模,想方便地导出用于ROS的三维模型

关于第2条:有专用的Solidworks插件,可以将装配体直接导出成URDF模型。如果想要SDF模型,只能手动导出网格文件,再在SDF中引用。

3.4 建议使用SDF的情况

  • 想深入研究ROS-Gazebo仿真,使仿真的动力学特性更加真实
  • 想开发自己专用的Gazebo仿真插件

参考资料

[1] SDF官方网站

[2] Gazebo教程:如何使用URDF

[3] XML属性的定义与分析