【ROS2知识】将urdf用在Gazebo上

发布于:2022-12-22 ⋅ 阅读:(1038) ⋅ 点赞:(0)

目录

 前言

一、背景

二、转换为 Gazebo 的概述

2.1 必需的要点

2.2 可选的次要点

三、 元素

四、先决条件

4.1 获取RRBot项目

4.2 在 Rviz 中查看RRBot

4.3 检查 RRBot URDF

4.4 在凉亭中查看

五、URDF 文件的标题

5.1 标签的 元素

六、将模型严格固定到世界上

七、链接

八、单位注意事项

8.1 和 元素

8.2 简化碰撞模型

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

8.4 STL 和 Collada 文件

8.5 RRBot 元素示例

九、关节

9.1 RRBot 示例

9.2  Elements For Joints

十、验证 Gazebo 模型的工作原理

十一、在 Gazebo 中查看 URDF

十二、调整你的模型

十三、与世界分享您的机器人

十四、下一步


 前言

        统一机器人描述格式 (URDF) 是 ROS 中用于描述机器人所有元素的 XML 文件格式。要在 Gazebo 中使用 URDF 文件,必须添加一些额外的模拟特定标签才能与 Gazebo 正常工作。必要的步骤在 Gazebo 中成功使用基于 URDF 的机器人,使您不必从头开始创建单独的 SDF 文件和复制描述格式。在后台,Gazebo 将自动将 URDF 转换为 SDF。

一、背景

        虽然 URDF 在 ROS 中是一种有用且标准化的格式,但它们缺乏许多功能,并且尚未更新以应对机器人不断发展的需求。URDF 只能单独指定单个机器人的运动学和动态属性。机器人本身在一个世界中。它也不是一种通用的描述格式,因为它不能指定关节环(平行链接),并且它缺乏摩擦力和其他属性。灯光,高度图等。

        在实现方面,URDF 语法通过大量使用 XML 属性破坏了正确的格式,这反过来又使 URDF 更加不灵活。

        为了解决这个问题,创建了一种新的格式,称为模拟描述格式(SDF),用于 Gazebo,以解决 URDF 的缺点。SDF 是对从世界级别到机器人级别的所有内容的完整描述。SDF 格式本身是使用 XML 描述的,它有利于一个简单的升级工具将旧版本迁移到新版本。

        作者的目的是让 Gazebo 中尽可能完整地记录和​​支持 URDF,但读者需要了解这两种格式存在的原因以及两者的缺点。如果能多做一些工作就好了URDF 更新它们以满足机器人技术的当前需求。

二、转换为 Gazebo 的概述

        让 URDF 机器人在 Gazebo 中正常工作有几个步骤。以下是步骤概述,然后在本教程的其余部分进行详细说明:

2.1 必需的要点

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

2.2 可选的次要点

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

三、<gazebo> 元素

        <gazebo> 元素是 URDF 的扩展,用于指定 Gazebo 中用于模拟目的所需的附加属性。它允许您指定在 SDF 格式中找到但不包含在 URDF 格式中的属性。 <gazebo> 元素是必需的,因为会自动包含默认值。<gazebo> 元素有三种不同类型 - 一种用于 <robot> 标签,一种用于 <link> 标签,一种用于 <joint> 标签。在本教程中讨论每种类型的 <gazebo> 元素中的属性和元素。

四、先决条件

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

4.1 获取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 概述教程。

4.2 在 Rviz 中查看RRBot

        要检查一切是否正常,请在 Rviz 中启动 RRBot:

roslaunch rrbot_description rrbot_rviz.launch

你应该会看到我们的小机器人是这样的:

        如果您没有得到这个,请尝试使用 killall roscore 杀死所有旧的 roscore 进程并重新启动 RViz。

        您还应该能够使用 Joint State Publisher 窗口中的滑块来移动两个关节。

        重要的是,在将您的机器人转换为在 Gazebo 中工作时,您不会破坏 Rviz 或其他 ROS 应用程序功能,因此偶尔在 Rviz 中测试您的机器人以确保一切正常,这很好。

        Gazebo_ros_control 教程将解释如何使用 Rviz 通过直接从 Gazebo.bars 发布 /joint_states 来监控模拟机器人的状态。

4.3 检查 RRBot URDF

        本教程的其余部分将参考 RRBot URDF 的各个方面。继续查看 rrbot.xacro 文件:

rosed rrbot_description rrbot.xacro

        请注意,我们使用 Xacro 来简化一些链接和关节计算。

  • rrbot.gazebo 一个 Gazebo 特定文件,包括我们的大多数 Gazebo 特定 XML 元素,包括标签
  • material.xacro 一个简单的 Rviz 颜色文件,用于存储 rgba 值,不是必需的,但很好的约定

4.4 在凉亭中查看

        您还应该能够在 Gazebo 中启动 RRBot:

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">

5.1 标签的 <gazebo> 元素

        如果在没有 reference="" 属性的情况下使用 <gazebo> 元素,则假定 <gazebo> 元素用于整个机器人模型。:

Name Type Description
static bool

如果设置为 true,则模型是不可移动的。

        <gazebo> 标签中不在上表中的元素直接插入到生成的 SDF 的 SDF <model> 标签中。这对插件特别有用,如 ROS 电机和传感器插件教程中所述。

六、将模型严格固定到世界上

        如果您希望您的 URDF 模型永久连接到世界框架(地平面),您必须创建一个“世界”链接和一个将其固定到模型底部的关节。RRBot 通过以下方式完成此操作:

  <!-- Used for fixing robot to Gazebo 'base_link' -->
  <link name="world"/>

  <joint name="fixed" type="fixed">
    <parent link="world"/>
    <child link="link1"/>
  </joint>

但是,如果您有移动底座或其他移动机器人,则不需要此链接或关节。

七、链接

        确保您熟悉 URDF 链接元素。以下是来自 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: Standard Units of measure and Coordinate Conventions, Gazebo 中的单位应以米和千克为单位指定。如果手动更改重力等常数,Gazebo 可以使用英制单位,但默认重力为 9.81 m /s^2. 指定质量时,使用千克单位。

8.1 <collision> 和 <visual> 元素

        这些标签在 Gazebo 中的工作原理与 Rviz 中的基本相同。尽管指定两者很重要,因为与某些 ROS 应用程序不同,如果您没有明确指定 <collision>,Gazebo 将不会使用您的 <visual> 元素作为 <collision> 元素> 元素。相反,Gazebo 会将您的链接视为对激光扫描仪和碰撞检查“不可见”。

8.2 简化碰撞模型

        您可以为碰撞和视觉元素使用相同的几何体或网格,但为了提高性能,我们强烈建议您为碰撞几何体使用简化的模型/网格。Blender 是一个很好的简化网格的开源工具。工具,例如 Maya 和 3DS Max,它们也可以简化网格。

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

        标准 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 的辅助文件中。您可以在其中找到 <link> 和 <material> 元素。

        Gazebo 中默认可用的材料可以在 Gazebo 源代码中找到,地址为:        gazebo/media/materials/scripts/gazebo.material。

        对于更高级或自定义的材料,您可以创建自己的 OGRE 颜色或纹理。

8.4 STL 和 Collada 文件

         和 Rviz 一样,Gazebo 可以同时使用 STL 和 Collada 文件。通常建议您使用 Collada (.dae) 文件,因为它们支持颜色和纹理,而使用 STL 文件,您只能使用纯色链接。

【1】 <惯性> 元素
        为了让 Gazebo 物理引擎正常工作,必须按照 URDF 链接元素页面上的文档提供 <inertial> 元素。惯性(ixx、iyy、izz)在任何有限扭矩应用下都可能导致无限加速。

        需要确定每个链接的正确值才能在 Gazebo 中获得准确的物理近似值。这可以通过对机器人零件进行各种测量来执行,或者使用包含近似这些值的功能的 CAD 软件(如 Solidworks)来执行。对于初学者,你也可以把值补上。

        来自 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矩形链接高度的一半,我们将质心置于中间。您可以在URDF中直观地检查您的质心是否正确在 Gazebo 中,单击 Gazebo 的“视图”菜单并选择“线框”和“质量中心”。

        在这个示例机器人中,质量和惯性矩阵都是由值组成的,因为这个机器人没有现实世界的对应物。

<gazebo> 链接元素单独

Name Type Description
material value Material of visual element
gravity bool Use gravity
dampingFactor double Exponential velocity decay of the link velocity - takes the value and multiplies the previous link velocity by (1-dampingFactor).
maxVel double maximum contact correction velocity truncation term.
minDepth double minimum allowable depth before contact correction impulse is applied
mu1 double Friction coefficients μ for the principal contact directions along the contact surface as defined by the Open Dynamics Engine (ODE) (see parameter descriptions in ODE's user guide)
mu2
fdir1 string 3-tuple specifying direction of mu1 in the collision local reference frame.
kp double Contact stiffness k_p and damping k_d for rigid body contacts as defined by ODE (ODE uses erp and cfm but there is a mapping between erp/cfm and stiffness/damping)
kd
selfCollide bool If true, the link can collide with other links in the model.
maxContacts int Maximum number of contacts allowed between two entities. This value overrides the max_contacts element defined in physics.
laserRetro double intensity value returned by laser sensor.

        类似于 <robot> 的 <gazebo> 元素,任何未根据上表解析的任意 blob 都将插入到 SDF 中相应的 <link> 元素中。这对于插件特别有用,如 ROS Motor 中所述和传感器插件教程。

8.5 RRBot 元素示例

        在 RRBot 中,指定了两个非固定链接的摩擦系数,以便在发生碰撞时模拟更准确的接触相互作用。

  <gazebo reference="link2">
    <mu1>0.2</mu1>
    <mu2>0.2</mu2>
    <material>Gazebo/Black</material>
  </gazebo>

九、关节

确保您熟悉 URDF 联合文档。

  • <origin>、<parent> 和 <child> 是必需的
  • <calibration> 和 <safety_controller> 被忽略
  • 在 <dynamics> 标记中,只有阻尼属性用于gazebo4 及更早版本。
  • <limit> 标签中的所有属性都是可选的

9.1 RRBot 示例

        以下是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 的值是通过测试不同的阻尼量并观察摆动钟摆出现的“真实性”来确定的。我们鼓励您现在使用这个值(增加/减少它)来感受一下了解它如何影响物理引擎。

9.2 <gazebo> Elements For Joints

Name Type Description
stopCfm double Joint stop constraint force mixing (cfm) and error reduction parameter (erp) used by ODE
stopErp
provideFeedback bool Allows joints to publish their wrench data (force-torque) via a Gazebo plugin
implicitSpringDamper bool If this flag is set to true, ODE will use ERP and CFM to simulate damping. This is a more stable numerical method for damping than the default damping tag. The cfmDamping element is deprecated and should be changed to implicitSpringDamper.
springStiffness double Spring stiffness in N/m.
springReference double Equilibrium position for the spring.
cfmDamping
fudgeFactor double Scale the excess for in a joint motor at joint limits. Should be between zero and one.

        同样,类似于 <robot> 和 <link> 的 <gazebo> 元素,任何未根据上表解析的任意 blob 都将插入到 SDF 中相应的 <joint> 元素中。如 ROS Motor 和传感器插件教程。

十、验证 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 包中。从该位置打开 URDF 到 Gazebo 的方法使用ROS 已在上一教程使用 roslaunch 文件生成模型中进行了介绍。

        从该教程中,您应该有两个用于自定义机器人的 ROS 包:MYROBOT_description 和 MYROBOT_gazebo。要查看您的机器人并在 Gazebo 中对其进行测试,您现在应该能够运行如下内容:

roslaunch MYROBOT_gazebo MYROBOT.launch

        这应该会同时启动 Gazebo 服务器和 GUI 客户端,同时您的机器人会自动在其中生成。

十二、调整你的模型

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

十三、与世界分享您的机器人

        如果您有一个其他人可能想在 Gazebo 中使用的通用机器人,我们鼓励您将您的 URDF 添加到 Gazebo 模型数据库。它是 Gazebo 连接到的在线服务器,用于从互联网上下载模型。在 GitHub 上。参见 Gazebo模型数据库文档,了解如何提交拉取请求以将您的机器人添加到数据库中。

十四、下一步

        您现在已经学习了如何在 Gazebo 中使用包含 URDF 的 ROS 包,以及如何将您的自定义 URDF 转换为在 Gazebo 中工作。您现在已经准备好学习如何将插件添加到您的 URDF,以便您的机器人和模拟环境的不同方面可以被控制。请参阅 ROS 电机和传感器插件。


网站公告

今日签到

点亮在社区的每一天
去签到