Skip to content

在Gazebo中使用URDF描述文件

ericwen edited this page Apr 11, 2019 · 17 revisions

教程:在Gazebo中使用URDF

  • 通用机器人描述格式(URDF)是ROS中用于描述机器人所有元素的XML文件格式。要在Gazebo中使用URDF文件,必须添加一些其他特定于模拟的标记才能与Gazebo一起正常工作。本教程介绍了在Gazebo中成功使用基于URDF的机器人的必要步骤,使您无需从头开始创建单独的SDF文件并复制描述格式。Gazebo会自动将URDF转换为SDF。

背景

  • 虽然URDF在ROS中是一种有用且标准化的格式,但它们缺乏许多功能,并且尚未更新以应对机器人技术不断变化的需求。URDF只能单独指定单个机器人的运动和动态属性。URDF无法在一个世界中指定机器人本身的姿势。 它也不是通用的描述格式,因为它不能指定关节循环(平行连接),并且它缺乏摩擦和其他属性。此外,它不能指定不是机器人的东西,例如灯光,高度图等。在实现方面,URDF语法在大量使用XML属性的情况下破坏了正确的格式,这反过来又使URDF更加不灵活。也没有向后兼容的机制。
  • 为了解决这个问题,创建了一种称为模拟描述格式(SDF)的新格式,用于Gazebo以解决URDF的缺点。 SDF是从世界级到机器人级的所有内容的完整描述。它具有可扩展性,可以轻松添加和修改元素。SDF格式本身使用XML进行描述,这有助于使用简单的升级工具将旧版本迁移到新版本。 它也是自我描述性的。
  • 本作者的目的是使URDF尽可能完整地记录并在Gazebo中得到支持,但是读者理解这两种格式存在的原因以及两者的缺点是相关的。如果将更多工作放入URDF来更新它们以满足机器人技术的当前需求,那将是一件好事。

转换为Gazebo的概述

  • 通过一些步骤可以使一个URDF机器人在Gazebo中正常工作。 以下是步骤的概述,然后在本教程的其余部分详细说明:

要求

  • 必须正确指定和配置每个元素中的元素。

可选的

为每个<link>添加<gazebo>元素
   将视觉颜色转换为Gazebo格式
   将stl文件转换为dae文件以获得更好的纹理
   添加传感器插件
为每个<joint>添加<gazebo>元素
   设置适当的阻尼动态
   添加执行器控制插件
为<robot>元素添加<gazebo>元素
如果机器人应严格连接到world / base_link,请添加<link name =“world”/>链接

元素

  • 元素是URDF的扩展,用于指定Gazebo中模拟所需的其他属性。 它允许您指定以SDF格式找到的未包含在URDF格式中的属性。 元素中的所有元素都不是必需的,因为将自动包含默认值。 有三种不同类型的元素 - 一个用于标记,一个用于标记,一个用于标记。 在本教程中,我们将讨论每种元素中的属性和元素。

先决条件

  • 让你的机器人在Gazebo工作的第一步是从相应的ROS URDF Tutorials获得一个可用的URDF文件。 在继续使用Gazebo配置机器人之前,通过在Rviz中查看URDF进行测试。 在本教程中,我们将使用名为RRBot的简单演示机器人。 随意跟随这个机器人或您自己的机器人。

获得RRBot

  • RRBot,或“Revolute-Revolute Manipulator Robot”,是一个简单的3连杆,2关节臂,我们将用它来演示Gazebo和URDF的各种功能。 它本质上是一个双倒立摆,并在模拟器中演示了一些有趣的控制概念。
  • 要获取RRBot,请将gazebo_ros_demos Github repo克隆到catkin工作区的/ src文件夹中并重建您的工作区:
cd ~/catkin_ws/src/
git clone https://github.com/ros-simulation/gazebo_ros_demos.git
cd ..
catkin_make
  • 如果其中任何一个不熟悉,请确保您已阅读以前的ROS概述教程

在RVIZ中查看

  • 要检查一切是否正常,请在Rviz中启动RRBot:
roslaunch rrbot_description rrbot_rviz.launch
  • 你应该看到我们的小机器人如此:(我就不放图片了,Fixed Frame要选/link1,具体参见原网址 )
  • 如果你没有得到这个,尝试使用killall roscore杀死所有旧的roscore进程并重新启动RViz。
  • 您还应该能够使用Joint State Publisher窗口中的滑块来移动两个关节。
  • 重要的是,在将您的机器人转换为Gazebo工作时,您不会破坏Rviz或其他ROS应用程序功能,因此偶尔在Rviz中测试您的机器人以确保一切仍然有效是很好的。
  • gazebo_ros_control教程将通过直接从Gazebo发布/joint_states来解释如何使用Rviz监视模拟机器人的状态。 在前面的示例中,Rviz中的RRBot从假的joint_states_publisher节点(带有滑块的窗口)获取其/ joint_states

检查RRBot URDF

  • 本教程的其余部分将引用RRBot URDF的各个方面。 继续,现在查看rrbot.xacro文件:
rosed rrbot_description rrbot.xacro
  • 请注意,我们正在使用Xacro使一些链接和联合计算更容易。 我们还包括两个额外的文件:
  • rrbot.gazebo是一个Gazebo特定文件,包含我们大多数特定于Gazebo的包含标签的XML元素
  • materials.xacro一个简单的Rviz颜色文件,用于存储rgba值,不是必需的,但是一个很好的习惯

在Gazebo中查看

  • 您还应该能够将RRBot启动到Gazebo中:
roslaunch rrbot_gazebo rrbot_world.launch
  • 在启动的Gazebo窗口中,您应该看到机器人直立。 尽管默认情况下物理模拟器中没有故意干扰,但数值误差应该开始增加并导致双倒立摆在几秒钟后下降。 以下是RRBot的中间截图:(图片见原网址)
  • 最终手臂应该完全停止。 我们鼓励您在以下教程中调整和测试URDF的各个方面,以帮助您了解有关模拟URDF机器人的更多信息。

URDF文件的标题

  • 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" >
  • 你可以删除它们。 您在根元素标记中需要的只是机器人的名称,如果您使用的话,还可以选择xacro的xml命名空间:
<robot name="rrbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
  • 标签的元素
  • 如果使用没有reference =“”属性的元素,则假定元素用于整个机器人模型。 标记内的元素列在下表中:
Name Type Description
static bool 如果设置为true,则模型不可移动。 否则,模型在动力学引擎中模拟
  • (译者注:这个表格用markdown语法写的时候一定要注意,语句上面空一行,不然表格不生效)
  • 标记中不在上表中的元素将直接插入到生成的SDF的SDF 标记中。 这对于插件特别有用,如ROS电机和传感器插件教程中所述。

严谨地将模型推向世界(译者注:即可在Gazebo空间中,很多教程都是将导入Gazebo的模型称为world)

  • 如果您希望将URDF模型永久地附加到世界框架(地平面),则必须创建“world”link以及将其固定到模型基础的关节。 RRBot通过以下方式实现此目的:
  <!-- Used for fixing robot to Gazebo 'base_link' -->
  <link name="world"/>

  <joint name="fixed" type="fixed">
    <parent link="world"/>
    <child link="link1"/>
  </joint>
  • 但是,如果您有移动基座或其他移动机器人,则不需要此链接或关节。

Links

  • 确保您熟悉URDF link元素。
  • 以下是RRBot的示例链接:
 <!-- 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中的单位应以米和千克为单位。 如果重力等常数手动更改,则Gazebo可能与英制单位一起使用,但默认重力为9.81 m / s ^ 2。 指定质量时,请使用千克单位。

和元素

  • 这些标签在Gazebo中与Rviz中的标签基本相同。 尽管如此,重要的是指定两者,因为与一些ROS应用程序不同,如果没有明确指定元素,Gazebo将不会将元素用作元素。 相反,Gazebo会将您的link视为对激光扫描仪和碰撞检查“不可见”。
  • 简化碰撞模型
  • 您可以对碰撞元素和视觉元素使用相同的几何图形或网格,但为了提高性能,我们强烈建议您为碰撞几何体提供简化的模型/网格。 Blender是一个用于简化网格的开源工具。 有许多闭源工具,如Maya和3DS Max,它们也可以简化网格。
  • 材料:使用适当的颜色和纹理
  • 标准URDF可以使用RRBot中的标记指定颜色:
<material name="orange"/>
  • 单独定义颜色橙色,例如在文件materials.xacro中:
<material name="orange">
    <color rgba="${255/255} ${108/255} ${10/255} 1.0"/>
  </material>
  • 不幸的是,这种指定链接颜色的方法在Gazebo中不起作用,因为它采用OGRE的材质脚本来着色和纹理化链接。 相反,必须为每个链接指定Gazebo材质标记,例如:
<gazebo reference="link1">
    <material>Gazebo/Orange</material>
  </gazebo>
  • 如前所述,在RRBot示例中,我们选择将所有Gazebo特定标记包含在名为rrbot.gazebo的辅助文件中。 你可以在那里找到和元素。
  • Gazebo中的默认可用材料可以在gazebo / media / materials / scripts / gazebo.material的Gazebo源代码中找到。
  • 对于更高级或自定义的材质,您可以创建自己的OGRE颜色或纹理。请看:
[The <material> SDF documentation](http://sdformat.org/spec?ver=1.5&elem=material)
[OGRE materials documentation](http://wiki.ogre3d.org/Materials)
  • ** STL和Collada文件**
  • 与Rviz一样,Gazebo可以同时使用STL和Collada文件。 通常建议您使用Collada(.dae)文件,因为它们支持颜色和纹理,而对于STL文件,您只能使用纯色链接。
  • ** 元素**
  • 要使Gazebo物理引擎正常工作,必须按照URDF link element页面上的说明提供元素。 对于在Gazebo中不被忽略的链接,它们的质量(译者注:即标签)必须大于零。 此外,零主惯性力矩(ixx,iyy,izz)的链路可能会在任何有限扭矩应用下导致无限加速。
  • 需要确定每个链接的正确值才能在Gazebo中获得准确的物理近似值。 这可以通过对机器人部件进行各种测量,或者使用包括用于近似这些值的特征的Solidworks之类的CAD软件来执行。 对于初学者,您也可以使值更高。
  • RRBot第一个链接的示例惯性元素:
 <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>
  • origin标记表示此链接的质心。 通过将质心设置为RRBot矩形链节高度的一半,我们将质量集中在中间。 您可以通过点击Gazebo的“View”菜单并同时选择“Wireframe”和“Center of Mass”来直观地检查Gazebo中URDF中的质心是否正确。
  • 在这个示例机器人中,质量和惯性矩阵都是由值组成的,因为这个机器人没有现实世界的对应物。
  • Elements For Links
  • 单独解析的元素列表:
名字 类型 描述
material value 视觉元素的材料
gravity bool 使用重力
dampingFactor double 链路速度的指数速度衰减 - 取值并将前一个链路速度乘以(1-dampingFactor)
maxVel double 最大接触校正速度截断项
minDepth double 施加接触校正脉冲之前的最小允许深度
mu1 double 开放动力学引擎(ODE)定义的沿接触面的主要接触方向的摩擦系数μ(参见ODE用户指南中的参数说明)
mu2 double 同上
fdir1 string 3元组指定碰撞局部参考系中mu1的方向
kp/kd double 接触刚度k_p和阻尼k_d用于由ODE定义的刚体接触(ODE使用erp和cfm但是在erp / cfm和刚度/阻尼之间存在映射)
selfCollide bool 如果为true,则链接可能与模型中的其他链接发生冲突
maxContacts int 两个实体之间允许的最大联系数。 此值将覆盖物理中定义的max_contacts元素
laserRetro double 激光传感器返回的强度值
  • 与的元素类似,任何未根据上表解析的任意blob都将插入到SDF中相应的元素中。 这对于插件特别有用,如ROS电机和传感器插件教程中所述。

RRBot Example of element

  • 在RRBot中,指定了两个非固定链接的摩擦系数,以便在发生碰撞时模拟更准确的接触相互作用。 以下是示例链接的标记:
 <gazebo reference="link2">
    <mu1>0.2</mu1>
    <mu2>0.2</mu2>
    <material>Gazebo/Black</material>
  </gazebo>

Joints

<origin>,<parent>和<child>是必需的
忽略<calibration>和<safety_controller>
在<dynamics>标签中,只有damping property用于gazebo4及更早版本。 Gazebo5及以上使用friction property。
<limit>标记中的所有属性都是可选的

RRBot Example

  • 以下是RRBot中使用的joint:
<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的值。 我们鼓励您现在使用此值(增加/减少它)以了解它如何影响物理引擎。

Elements For Joints

名字 类型 描述
stopCfm/stopErp double ODE使用的联合停止约束力混合(cfm)和误差减少参数(erp)
provideFeedback bool 允许关节通过Gazebo插件发布其扳手数据(力 - 扭矩)(译者注:wrench data我不知道怎么翻译,先用直译)
implicitSpringDamper/cfmDamping bool 如果此标志设置为true,则ODE将使用ERP和CFM来模拟阻尼。 这是一种比默认阻尼标签更稳定的阻尼数值方法。 不推荐使用cfmDamping元素,应将其更改为implicitSpringDamper
fudgeFactor double 缩放在joint limits下的joint motor的多余部分。 应介于0和1之间
  • 同样,类似于和的元素,任何未根据上表解析的任意blob都将插入到SDF中相应的元素中。 这对于插件特别有用,如ROS电机和传感器插件教程中所述。

验证Gazebo模型的工作

  • 安装Gazebo后,可以使用一个简单的工具来检查URDF是否可以正确转换为SDF。 只需运行以下命令:
 # gazebo2 and below
  gzsdf print MODEL.urdf
  # gazebo3 and above
  gz sdf -p MODEL.urdf
  • 这将显示从输入URDF生成的SDF以及有关生成SDF所需的缺失信息的任何警告。
  • 注意:在Gazebo 1.9及更高版本中,一些调试信息已移至您可以查看的日志文件:
  cat ~/.gazebo/gzsdf.log

在Gazebo中查看URDF

  • 在本教程的开头已经介绍了在Gazebo中查看RRBot。 对于您自己的自定义机器人,我们假设其URDF位于子文件夹/ urdf中名为MYROBOT_description的ROS包中。 使用ROS从该位置打开URDF到Gazebo的方法在前面的教程Using roslaunch Files to Spawn Models中有所介绍。 如果您尚未完成该教程,请立即执行此操作。
  • 从该教程中,您应该为自定义机器人提供两个ROS包:MYROBOT_description和MYROBOT_gazebo。 要查看您的机器人并在Gazebo中测试它,您现在应该可以运行如下操作:
roslaunch MYROBOT_gazebo MYROBOT.launch
  • 这应该启动Gazebo服务器和GUI客户端,并在您的机器人内部自动启动。

调整你的模型

  • 如果您的机器人模型在Gazebo中出现意外行为,可能是因为您的URDF需要进一步调整才能在Gazebo中准确地表示其物理特性。 有关Gazebo中可用的各种属性的更多信息,请参阅SDF用户指南,这些属性也可通过标签在URDF中获得。

与世界分享您的机器人

  • 如果你有一个通用的机器人,其他人可能想在Gazebo中使用,我们鼓励你将你的URDF添加到Gazebo模型数据库。 它是Gazebo连接的在线服务器,用于从互联网上下载模型。 它的Mercurial存储库位于Bitbucket。 有关如何提交拉动请求以将机器人添加到数据库的信息,请参阅Gazebo Model Database文档。

下一步

  • 你已经学会了在Gazebo中使用带有URDF文件的ROS包,并且知道怎样在Gazebo中使自定义URDF文件工作。现在你已经准备好学习给你的URDF文件添加插件,使你机器人在不同方面和不同的模拟环境都能被控制。参考ROS Motor and Sensor Plugins

原文链接,翻译:谷歌翻译、文岩