前言
这是一个系列小文章,主要介绍在ROS-Gazebo中如何更好地使用SDF格式建模与仿真。众所周知,URDF是ROS的原生支持格式,但在某些情况下(尤其是Gazebo仿真时),使用SDF格式会更加合理。鉴于中文网络上几乎没有成体系的SDF介绍博文,因此我将自己在硕士期间关于SDF模型的使用经验稍作总结。如有谬误,还望友好地指出。
本系列规划如下内容,建议按顺序阅读。尤其是第一篇,以确认你是否有必要使用SDF建模:
- 为什么选择SDF?
- SDF规范文档与模型资源
- SDF的建模与使用
- ERB:模块化生成SDF模型
- SDF与URDF的相互转换
- 基于SDF的多机器人仿真
- 使用与编写自定义插件——以PID控制插件为例
1 什么是SDF?
SDF是一种XML格式,能够描述机器人、静态和动态物体、照明、地形甚至物理学的各方面的信息。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属性的定义与分析