一、提要
本文主要介绍在ROS-Gazebo中如何更好地使用SDF格式建模与仿真。众所周知,URDF是ROS的原生支持格式,但是rviz不能提供复杂物理场景;因此在较复杂场景、带有物理属性(如风、摩擦力)的时候,采用Gazebo仿真时,因此使用SDF格式会更加合理。鉴于中文网络上几乎没有成体系的SDF介绍博文,此文就权当狗尾续貂之作吧。
二、什么是SDF?
SDF是一种XML格式,能够描述机器人、静态和动态物体、照明、地形甚至物理学的各方面的信息。SDF可以精确描述机器人的各类性质,除了传统的运动学特性之外,还可以为机器人定义传感器、表面属性、纹理、关节摩擦等;SDF还提供了定义各种环境的方法。包括环境光照、地形等。
三、举例说明urdf和xml
以实现Model为例说明,urdf应用xml文本模型,也就是语法相同。
1)Model 模型
一个模型数据库会拥有的文件
- database.config:有关数据库的元数据,从CMakeList自动填充『本地不需要』
- model文件夹
一个模型【放在一个文件夹】会有的文件
- mdoel.config 模型的元数据 『必需』
- model.sdf 模型的SDF描述 『必需』
- plugins 插件源文件和头文件的目录
- model.sd.erb/meshes/materials
2)Model.config格式
固定开头
<?xml version>
<model>
- <name>名字
- <version>版本
- <sdf>描述模型的SDF文件的名字
- <author>作者
- <name>名字
- <email>邮件
- <description>介绍模型
- 模型是什么
- 插件干了什么
- <depend>
- <uri>模型依赖关系的URI
- <version>该模型的版本
3)Model.sdf格式
- <?xml version ?> xml的版本
- <sdf version> sdf的版本,和config里<sdf>的版本要一样呀
- <model name> 模型的名字
- <pose> 在世界中的位置 x y z pitch yaw roll
- <static> 选择模型是否固定
- <link>链接 包含模型的一个主体的物理属性,尽量减少模型中链接数量以提高性能和稳定
- <collision>: 用于碰撞检查,一个link可以有多个碰撞元素
- <geometry> 物体
- <box> | <sphere> | <cylinder>形状名字
- <size> x y z长度 | <radius>半径 | <radius> & <length>
- <box> | <sphere> | <cylinder>形状名字
- <surface> 平面
- <friction>设置地面摩擦力
- <ode> <mu> <slip>
- <friction>设置地面摩擦力
- <geometry> 物体
- <visual>: 可视化
- <geometry> 几何形状
- <box>形状名字
- <size> x y z长度
- <box>形状名字
- <geometry> 几何形状
- <inertial>: 惯性元素,描述了link的动态特性,例如质量和转动惯量矩阵
- <mass> 质量
- <inertia> !!!注意这两单词不一样呀
- <sensor>: 从world收集数据用于plugin
- <light>: 光源
- <collision>: 用于碰撞检查,一个link可以有多个碰撞元素
- <joint>关节 关节连接两个link,用于旋转轴和关节限制等
- <plugin>插件 用于控制模型
四、SDF和URDF有什么区别?
4.1 URDF和SDF优缺点
URDF(Unified Robot Description Format)在ROS中是一种功能强大且标准化的机器人描述格式,但依然缺少许多功能。例如,
- URDF只能单独定义单个机器人的运动学和动力学特性;
- 无法定义机器人本身在世界中的姿态;
- 不能定义闭链结构(并联机器人);
- 缺乏摩擦和等更丰富的动力学特性;
- 不能定义非机器人物体,例如灯光,高度图等。
在实现方面,URDF语法大量使用XML的属性(Attribute)特性,使得URDF更加不灵活。 也没有向后兼容的机制。
为了解决以上问题,开发人员创建了一种称为SDF(Simulation Description Format)的新格式,专门供Gazebo使用。
SDF完整描述了从世界级到机器人级的所有内容。 它具有良好的可扩展性。 SDF格式使用XML元素而非属性来自我描述(因为属性往往难以阅读和维护[3]),这有助于使用简单的升级工具将旧版本迁移到新版本。 SDF也是具有自描述性的格式。
4.2 应用经验
- 要点1 : sdf是用于gazebo仿真的;urdf是描述机器人整体状态,ros系统也是通过该文件来构建机器人的一切信息.当需要使用urdf做仿真时候,系统会自动将urdf文件装换为sdf格式加载到gazebo里面的.
- 要点2: sdf文件、urdf文件和xacro文件都是模型文件。
xacro文件是urdf文件的改进版,urdf文件只能在rviz等中显示,不能在仿真器中显示出来。
xacro文件可以在gazebo仿真器中显示出来,相对urdf文件,xacro文件增加了更多的属性设置标签。
sdf文件和urdf文件、xacro文件都可以加载dae等三维模型文件。
- 要点3:sdf和urdf、xacro的区别是:
ros和gazebob 不能 使得sdf模型动起来、sdf模型有自己的行为
ros和gazebob 能 使得urdf、xacro模型动起来、urdf、xacro模型有自己的行为,当前,sdf文件和urdf、xacro文件之间还不能自动转换,只能根据实体手动转换。
- 要点4:sdf加载dae等三维模型文件 :
urdf、xacro文件加载dae等三维模型文件:world文件加载dae等三维模型文件:(其实就是sdf加载dae文件)
五、使用哪种格式更合理?
尽管目前有一些SDF与URDF的之间的转换方法(我在后面的文章里会讲到),但往往十分复杂且易出错。因此,我建议刚开始就根据自己的需求选择最合适的模型格式。对此我有以下建议:
5.1 必须使用URDF的情况
- 我要使用Rviz对我的机器人进行可视化
5.2 必须使用SDF的情况
- 我研究并联机器人,或机器人中存在闭链结构
5.3 建议使用URDF的情况
- 我是新手,面临毕业压力想快点做出可展示的成果
- 我使用Solidworks建模,想方便地导出用于ROS的三维模型
关于第2条:有专用的Solidworks插件,可以将装配体直接导出成URDF模型。如果想要SDF模型,只能手动导出网格文件,再在SDF中引用。
5.4建议使用SDF的情况
- 我想深入研究ROS-Gazebo仿真,使仿真的动力学特性更加真实
- 我想开发自己专用的Gazebo仿真插件
参考文章: