【ROS2要素】xml、GDF、URDF的关系

发布于:2022-12-24 ⋅ 阅读:(665) ⋅ 点赞:(0)

一、提要 

        本文主要介绍在ROS-Gazebo中如何更好地使用SDF格式建模与仿真。众所周知,URDF是ROS的原生支持格式,但是rviz不能提供复杂物理场景;因此在较复杂场景、带有物理属性(如风、摩擦力)的时候,采用Gazebo仿真时,因此使用SDF格式会更加合理。鉴于中文网络上几乎没有成体系的SDF介绍博文,此文就权当狗尾续貂之作吧。

二、什么是SDF?

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

三、举例说明urdf和xml

       以实现Model为例说明,urdf应用xml文本模型,也就是语法相同。

1)Model 模型

一个模型数据库会拥有的文件

  1. database.config:有关数据库的元数据,从CMakeList自动填充『本地不需要』
  2. model文件夹

一个模型【放在一个文件夹】会有的文件

  1. mdoel.config 模型的元数据  『必需』
  2. model.sdf      模型的SDF描述     『必需』
  3. plugins          插件源文件和头文件的目录
  4. model.sd.erb/meshes/materials

2)Model.config格式

固定开头

<?xml version>

<model>

  1. <name>名字
  2. <version>版本
  3. <sdf>描述模型的SDF文件的名字
  4. <author>作者
    • <name>名字
    • <email>邮件
  5. <description>介绍模型
    • 模型是什么
    • 插件干了什么
  6. <depend>
    • <uri>模型依赖关系的URI
    • <version>该模型的版本

3)Model.sdf格式

  1. <?xml version ?>  xml的版本
  2. <sdf version>  sdf的版本,和config里<sdf>的版本要一样呀
  3. <model name> 模型的名字
  4. <pose> 在世界中的位置 x y z pitch yaw roll
  5. <static> 选择模型是否固定
  6. <link>链接 包含模型的一个主体的物理属性,尽量减少模型中链接数量以提高性能和稳定
    • <collision>: 用于碰撞检查,一个link可以有多个碰撞元素
      • <geometry> 物体
        • <box> | <sphere> | <cylinder>形状名字
          • <size> x y z长度 | <radius>半径 | <radius> & <length>
      • <surface> 平面
        • <friction>设置地面摩擦力
          • <ode> <mu> <slip>
    • <visual>: 可视化
      • <geometry> 几何形状
        • <box>形状名字
          • <size> x y z长度
    • <inertial>: 惯性元素,描述了link的动态特性,例如质量和转动惯量矩阵
      • <mass> 质量
      • <inertia> !!!注意这两单词不一样呀
    • <sensor>: 从world收集数据用于plugin
    • <light>: 光源
  7. <joint>关节 关节连接两个link,用于旋转轴和关节限制等
  8. <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仿真插件

 参考文章:

【ROS-Gazebo】为什么选择SDF? - 知乎

SDF学习笔记1(使用sdf创建模型,在.world 中查看)_磊磊哈哈的博客-CSDN博客_sdf模型