本文在Ubuntu18.04 + ROS melodic环境下完成,其他ROS版本类似。

一、urdf简介

urdf是ROS用于描述机器人所有元素的模型文件,采用XML格式书写。

  • urdf:统一机器人描述格式;
  • xacro:升级版的urdf,简化了urdf模型,用于复杂机器人的建模。xacro语法请参考:
  • https://link.zhihu.com/?target=https%3A//wiki.ros.org/xacro
  • 使用前先下载软件包:
  • $ sudo apt-get install ros-melodic-urdf
    $ sudo apt-get install ros-melodic-xacr
    urdf所有的标签:

    详细使用方法请参考:
    https://link.zhihu.com/?target=https%3A//wiki.ros.org/urdf/XML
    常用标签有<robot>,<link>,<joint>,语法如下:
    <robot name="my_robot">
      <link> ......</link>
      <link>......</link>
      ......
      <joint>......</joint>
      <joint>......</joint>
    </robot>

  • 二、urdf与gazebo

    除了上述的标签,要在gazebo中使用urdf模型,还必须添加一些特定用于仿真的标签。而gazebo在后台会自动将urdf转换为sdf。要使urdf在gazebo中正常工作,需要注意以下几点:

    (1)必须的部分(Required)

    • 必须正确指定和配置每个<link>标签中的<inertia>元素

    (2)可选的部分(Optional)

    • 为每个<link>标签添加<gazebo>元素
    • 将视觉颜色转换为gazebo格式
    • 将stl文件转换为dae文件以获得更好的纹理
    • 添加传感器插件
    • 为每个<joint>标签添加<gazebo>元素
    • 设置适当的阻尼动力学
    • 添加执行器控制插件
    • <robot>标签添加<gazebo>元素
    • 如果将机器人固定在world/base_link,需要添加<link name="world"/>连杆

    (3)<gazebo>元素

    <gazebo>元素是urdf的扩展,用于指定在gazebo中进行仿真所需的其他属性。<gazebo>元素内的所有元素都不是必需的,因为将自动包含默认值。

    <gazebo>元素有三种不同类型:一种用于<robot>标签,一种用于<link>标签,另一种用于<joint>标签。如果使用<gazebo>元素而没有reference=""属性,则假定<gazebo>元素适用于整个机器人模型。

    三、urdf标签详解

    1、<robot>标签

    gazebo和所需的urdf格式已进行了许多API更改,其中之一不再需要gazebo xml-schema命名空间。 如果您的urdf具有以下内容:

  • <robot xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor"
           xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller"
           xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface"
           xmlns:xacro="http://playerstage.sourceforge.net/gazebo/xmlschema/#xacro"
           name="pr2" >

  • 您可以删除它们。在<robot>标签中,您需要的只是机械手的名称,如果使用xacro,则还可以选择xacro的xml名称空间:

  • <robot name="rrbot" xmlns:xacro="http://www.ros.org/wiki/xacro">

  • 如果使用<gazebo>元素而没有reference =""属性,则假定<gazebo>元素适用于整个机器人模型。下表列出了<robot>标签内<gazebo>元素。


  • 2、<link>标签以下是RRBot的<link>示例:
    <!-- Base Link -->
    <link name="link1">
      <collision>
        <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
        <geometry>
          <box size="${width} ${width} ${height1}"/>
        </geometry>
      </collision>
    
      <visual>
        <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
        <geometry>
          <box size="${width} ${width} ${height1}"/>
        </geometry>
        <material name="orange"/>
      </visual>
    
      <inertial>
        <origin xyz="0 0 1" rpy="0 0 0"/>
        <mass value="1"/>
        <inertia
          ixx="1.0" ixy="0.0" ixz="0.0"
          iyy="1.0" iyz="0.0"
          izz="1.0"/>
      </inertial>
    </link>

  • 注意:根据ROS REP 103规定的标准计量单位和坐标公约,gazebo中应以mkg为单位。 如果手动更改重力等常数,则gazebo可能会与英制单位一起使用,但默认情况下,重力为9.81 m/ s^2。 指定质量时,请以kg为单位

  • (1)<collision>和<visual>元素

    这些标签在gazebo中的工作原理与在rviz中相同。不过,务必同时指定两者,如果您未明确指定<collision>元素,则gazebo不会将<visual>元素用作<collision>元素。 相反,当使用激光扫描仪检测物体时,gazebo会将您的连杆视为“不可见”,即检测不到。

    • 简化碰撞模型

    我们可以简化碰撞模型,可以为<collision>和<visual>元素使用相同的几何图形或网格,但是为了提高性能,强烈建议您为碰撞几何图形提供简化的模型/网格。 Blender是简化网格的一个很好的开源工具。 有许多封闭源工具,例如Maya和3DS Max,它们也可以简化网格。

    • 材料:使用适当的颜色和纹理

    标准urdf可以使用诸如RRBot中的标签指定的颜色:

  • <material name="orange"/>

  • 使用自定义的橙色:

  • <material name="orange">
      <color rgba="${255/255} ${108/255} ${10/255} 1.0"/>
    </material>

  • 不幸的是,这种指定连杆颜色的方法在gazebo中不起作用,必须为每个连杆指定一个gazebo材料标签,例如:

  • <gazebo reference="link1">
      <material>Gazebo/Orange</material>
    </gazebo>

  • 如前所述,在RRBot示例中,我们选择将所有gazebo的特定标签包含在名为rrbot.gazebo的辅助文件中。您可以在其中找到<link>和<material>元素。

    gazebo中的默认可用材料可以在gazebo源代码中找到,该源代码在gazebo/media/ materials/scripts/gazebo.material

    对于更高级或自定义的材料,您可以创建自己的OGRE颜色或纹理:The <material> SDF documentation OGRE materials documentation

    • STL和Collada文件

    像在rviz中一样,gazebo可以同时使用STL和Collada文件。通常建议您使用Collada(.dae)文件,因为它们支持颜色和纹理,而对于STL文件,您只能使用纯色连杆。

    (2)<inertial>元素

    为了使gazebo物理引擎正常工作,必须提供<inertial>元素。为使连杆在gazebo中不被忽略,连杆的质量必须大于零。 另外,主惯性矩(ixx,iyy,izz)为零的连杆在任何有限转矩应用下都可能导致无限加速。

    为在gazebo中获得精确的物理近似值,需要确定每个连杆的正确值。 这可以通过对机器人零件进行各种测量,或使用诸如Solidworks之类的CAD软件来实现,这些软件包含用于近似这些值的功能。

    RRBot第一个<link>的<inertial>示例::

  • 
    
    <inertial>
      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
      <mass value="1"/>
      <inertia
        ixx="1.0" ixy="0.0" ixz="0.0"
        iyy="1.0" iyz="0.0"
        izz="1.0"/>
    </inertial>

  • 原点标签表示此连杆的质心。 通过将质心设置为RRBot矩形连杆高度的一半,我们将质心居中。 您可以在gazebo内通过单击“View”菜单并选择“Wireframe”和“Center of Mass”来直观地检查您的质心是否正确。

    (3)用于<link>标签的<gazebo>元素

  • 2、<joints>标签

    首先,确保您熟悉urdf joint文档。 其次,并非为所有元素都适用于gazebo。

    • <origin>,<parent>和<child>是必需的
    • <calibration>和<safety_controller>被忽略
    • 在<dynamics>元素中,只有阻尼属性用于gazebo4和更早版本。 Gazebo5及更高版本也使用了摩擦特性。
    • <limit>元素中的所有属性都是可选的

    以下是RRBot中使用的关节:

  • <joint name="joint2" type="continuous">
      <parent link="link2"/>
      <child link="link3"/>
      <origin xyz="0 ${width} ${height2 - axel_offset*2}" rpy="0 0 0"/>
      <axis xyz="0 1 0"/>
      <dynamics damping="0.7"/>
    </joint>

  • 请注意,动力学元件的粘性阻尼系数为0.7 N*m*s/rad,阻尼只是一个简单的反作用力,用于“减慢”运动关节的任何关节速度(在此情况下为单位角速度的扭矩)。

    0.7 N*m*s/rad的值是通过测试不同的阻尼量并观察摆动摆的“真实性”来确定的。我们可以通过增加/减少该值,以了解它如何影响物理引擎。

    用于<joints>标签的<gazebo>元素:

  • 四、验证gazebo模型能够工作

    安装了gazebo后,可以使用一个简单的工具来检查您的urdf是否可以正确转换为sdf。 只需运行以下命令:

      # gazebo2 and below
      $ gzsdf print MODEL.urdf
      # gazebo3 and above
      $ gz sdf -p MODEL.urdf

    这将显示输入urdf生成的sdf,以及有关sdf所需信息丢失的任何警告。

    五、在gazebo中查看urdf模型

    上一教程,我们已经学会如何在gazebo中查看RRBot。对于自己的定制机器人,我们要如何导入gazebo中进行仿真呢?

    下一个教程,我们将学习如何使用roslaunch启动gazebo并导入urdf模型。

    六、urdf其他注意事项

    如果您希望将urdf模型永久地附加到世界框架(地平面),则必须创建一个“world”连杆和一个将其固定到模型base连杆的关节。 RRBot通过以下步骤完成此任务:

  • <!-- Used for fixing robot to Gazebo 'base_link' -->
    <link name="world"/>
    
    <joint name="fixed" type="fixed">
      <parent link="world"/>
      <child link="link1"/>
    </joint>

  • 但是,如果您有移动基座或其他移动机器人,则不需要此连杆和关节。