Gazebo结合ROS仿真时,如何编写机器人的URDF

译者的话:在用Gazebo做仿真应用时,您想用ROS控制机器人,又想让机器人既能在Gazebo中运行,又能在Rviz中运行,您需要用URDF描述机器人,而不是SDF。原因是Rviz的标配是URDF, 它不认SDF,只认URDF,而Gazebo的标配是SDF,为了兼顾URDF也能在Gazebo运行,您需要在URDF中加入一些专门用于Gazebo仿真的元素,看看这篇文章吧。

以下内容译自:Gazebo教材(Tutorial: Using a URDF in Gazebo)

统一机器人描述格式(Unified Robotic Description Format)(URDF) 是在ROS系统中描述机器人的XML文件格式,要想在Gazebo中使用URDF格式的文件,必须添加一些专门用于仿真的标签才能在 Gazebo中正常工作。 本教程解释了在Gazebo中使用URDF 格式文件的步骤,使您不必从头开始创建单独的 SDF 文件和复制描述格式。在底层,Gazebo 会自动将 URDF 转换为SDF。

背景

虽然URDF在ROS中可以用作描述机器人并且是标准格式,但它们其实缺乏许多功能,并且也没有新的版本以应对机器人不断变化的需求。URDF只能单独指定单个机器人的运动学和动力学特性。URDF无法指定机器人本身在世界中的姿态(pose)。它也称不上是一个通用的描述格式,因为它不能指定关节环(joint loops)(平行连杆(parallel linkage)),并且缺乏摩擦和其他属性。此外,它不能指定不是机器人的东西,例如灯光、高度图(heightmaps等。

在实现方面,由于URDF语法大量使用了XML属性,从而破坏了正确使用XML格式的方法,这反过来让URDF更加不灵活。URDF也没有向后兼容的机制。

为了解决这些问题或者缺点,一种称为仿真描述格式(Simulation Description Format)(SDF)的新格式应运而生。SDF可以对机器人以及机器人所处的世界所涉及的所有内容做完整描述。它是可扩展的,并且可以轻松添加和修改元素。SDF格式本身是使用 XML 描述的,用简单的升级工具就可以将旧版本迁移到新版本。它是一种可以用来描述自己的语言(语法和语义)。

让URDF也能在Gazebo中运行的步骤

以下步骤可以让URDF描述的机器人在Gazebo中正常工作。

必须的步骤

  1. 必须为每个<link>指定并配置<inertia>元素。

可选的步骤

  1. 为每个<link>添加一个<gazebo>元素
    1. 将视觉颜色转换为Gazebo格式
    2. 将 stl 文件转换为 dae 文件以获得更好的纹理效果
    3. 添加传感器插件
  2. 为每个<joint>添加一个<gazebo>元素
    1. 设置适当的阻尼(damping)动力学参数
    2. 添加执行器控制插件
  3. 为<robot>元素添加一个<gazebo>元素
  4. 如果机器人需要牢固地连接到world/base_link,要添加<link name="world"/>link。

元素<gazebo>

<gazebo>元素是对URDF的一个扩展,用于指定在 Gazebo 中进行仿真时所需要定义的其他属性。它指定在SDF中存在但在URDF中不存在的属性。<gazebo>元素中的任何元素都不是必需的,因为都会包含他们的缺省值。有三种不同类型的<gazebo>元素 - 一种用于<robot>标签,一种用于<link>标签,一种用于<joint>标签。 我们会讨论每种类型的<gazebo>元素中的属性和元素。

先决条件

让您的机器人在Gazebo中工作的第一步是从相应的ROS URDF Tutorials中获得一个有效的 URDF 文件。在继续使用 Gazebo 配置机器人之前,请在 Rviz 中查看 URDF,以测试您的 URDF。在本教程中,我们将使用一个名为 RRBot 的简单演示机器人。当然也可以使用您自己的机器人URDF。

获取 RRBot

RRBot,或“Revolute-Revolute机械手机器人,是一个简单的3连杆,具有2个关节臂。我们将用它来演示GazeboURDF的各种功能。它本质上是一个双倒摆,并在模拟器中演示了一些有趣的控制概念。

若要获取 RRBot,请将gazebo_ros_demos Github 存储库克隆到 catkin 工作区的文件夹中,然后重新生成工作区:

cd ~/catkin_ws/src/

git clone https://github.com/ros-simulation/gazebo_ros_demos.git

cd ..

catkin_make

在Rviz中查看机器人

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

roslaunch rrbot_description rrbot_Rviz.launch

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

 如果您看到的不是这个,尝试使用killall roscore杀死所有旧的 roscore 进程,并重新启动 Rviz

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

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

gazebo_ros_control教程将介绍如何通过从Gazebo直接发布/joint_state,同时使用 Rviz 监视仿真机器人的状态。在前面的示例中,Rviz 中的 RRBot 是从joint_states_publisher节点(带有滑块的窗口)获取的“假的”/joint_state的。

译者注:如果是Noetic版本的ROS,则需要改一下rrbot_Rviz.launch,否则带滑块的窗口不会出现,参见这篇文章

<arg name="use_gui" default="true" doc="Should the joint_state_publisher use a GUI for controlling joint states" />
<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" unless="$(arg use_gui)" />
<node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" if="$(arg use_gui)" />

检查 RRBot URDF

本教程的其余部分将介绍 RRBot URDF 的各个方面。 现在查看rrbot.xacro文件

rosed rrbot_description rrbot.xacro

请注意,我们使用 Xacro 使有些连杆和关节计算更容易。我们还包括两个附加文件:

  • rrbot.gazebo一个特定于Gazebo的文件,其中包含大多数特定于Gazebo的 XML元素,包括标签。
  • materials.xacro 一个简单的 Rviz 颜色文件,用于存储 rgba 值,不是真的必要,但是一个很好的习惯。

在Gazebo中显示机器人

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

roslaunch rrbot_gazebo rrbot_world.launch

在启动的Gazebo窗口中,你应该看到机器人直立。尽管默认情况下物理模拟器中没有故意的干扰,但是数值误差应该会开始累积,并在几秒钟后导致双倒立摆倒下。以下是RRBot摆动时的截图:

 最终摆动应该完全停止。我们鼓励您调整和测试 URDF 的各个方面,以帮助您了解有关模拟URDF机器人的更多信息。

URDF 文件的Header

Gazebo API以及URDF格式已经出现了许多修改,其中之一是不再需要 Gazebo xml 模式命名空间。如果您的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" >

您可以删除它们。根元素标签中所需要的只是机器人的名称,以及xacroxxml命名空间(如果您正在使用它):

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

<gazebo>元素的标签

如果使用没有<reference>属性的<gazebo>元素,则该<gazebo>元素将被用于整个机器人模型。下表列出了<robot>标签内部的<gazebo>元素:

Name

Type

Description

static

bool

如果设置为 true,则模型是不移动的。否则,将在动力学引擎中仿真模型。

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

将模型刚性固化在世界上

如果希望 URDF 模型永久附着到world框架(地平面),则必须创建一个“world” 连杆和一个将其固定到模型基座(the base of your)的关节。RRBot 通过以下方式达到此目的:

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

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

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

连杆(Link)

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

<collision>和<visual>元素

这些标签在 Gazebo 中的工作方式与在 Rviz 中基本相同。 但是,同时指定两者很重要,因为与某些ROS应用程序不同, 如果您没有明确指定<collision>元素,Gazebo 将不会将您的<visual>元素用作<collision>元素。相反,Gazebo 会将您的连杆视为对激光扫描仪和碰撞检测不可见

简化碰撞模型

您可以对collision元素和visual元素使用相同的geometrymeshes,但为了提高性能,我们强烈建议您为collision geometry使用简化的model/meshesBlender是一个很好的简化meshes的开源工具。另外也有一些闭源工具,例如Maya3DS Max,它们也可以简化meshes

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

标准 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 示例中,我们建立了名为rrbot.gazebo的文件,这个文件包含了所有gazebo标签。你可以在那里找到<link><material>元素。

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

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

STL和Collada文件

Rviz一样,Gazebo可以同时使用STLCollada文件。通常建议您使用 Collada.dae)文件,因为它们支持颜色和纹理,而对于 STL 文件,您只能具有纯色连杆。

<inertial>元素

为了使 Gazebo 物理引擎正常工作,必须按照URDF link element 文档上的要求来写<inertial>元素。为了在 Gazebo 中连杆不被忽略,它们的质量必须大于零。此外,惯性矩(ixxiyyizz)为零的连杆可能会在任何有限扭矩作用下导致无限加速,应该尽可能避免。

Bing聊天:惯性矩是衡量物体抵抗旋转速率变化的一种方式。如果惯性矩为零,则物体将在任何有限力矩作用下经历无限加速。

需要确保每个连杆具有正确的值,只有这样才能在 Gazebo中获得准确的物理近似值。这可以通过对机器人部件进行各种测量完成,也可以使用包括近似这些值的功能的CAD软件(如Solidworks)来执行。对于初学者,您也可以随意编造这些值。

RRBot的第一个连杆的<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>

Origin标签表示此连杆的质心的位置。通过将质心位置设置为RRBot矩形连杆高度的一半,我们将质量放在中间。您可以通过单击 Gazebo “View”菜单并选择“Wireframe”“Center of Mass”来目视检查您的 URDF 中的质心的位置是否正确。

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

连杆的<gazebo>元素

单独解析的元素列表:

名字

类型

描述

material

Value

视觉元素材料

gravity

Bool

使用重力

dampingFactor

double

指数速度衰减 - 取值并将上一个连杆(link)速度乘以(1-阻尼因子)

maxVel

double

最大接触校正速度截断项。

Bing聊天:这个参数用于控制碰撞检测的行为。它是最大接触校正速度截断项的一部分,用于限制接触校正速度的最大值。这个参数的值越大,接触校正速度就会越快,但也可能会导致模拟不稳定。

minDepth

double

施加接触校正脉冲前的最小允许深度

【译者注:这个参数用于控制碰撞检测的行为。它是最小允许深度的一部分,该深度是在应用接触校正脉冲之前允许的最小深度。这个参数的值越小,接触校正脉冲就会越快,但也可能会导致模拟不稳定。】

mu1

Double

沿接触面的主接触方向μ的摩擦系数,由开放式动态引擎(ODE)定义(参见ODE用户指南中的参数说明))

【译者注:这个参数用于控制碰撞检测的行为。它是Open Dynamics EngineODE)定义的接触表面上主要接触方向的摩擦系数μ(请参阅ODE用户指南中的参数描述)。】

mu2

FDIR1

String

这个参数用于控制碰撞检测的行为。它是指在碰撞本地参考系中指定mu1方向的3元组。

kp

double

刚体接触的接触刚度kp和阻尼kd,如ODE所定义(ODE使用erpcfm,但erp / cfm与刚度/阻尼之间存在映射)

kd

selfColide

Bool

如果为 true,则连杆可能会与模型中的其他连杆发生碰撞。

maxContacts

Int

两个实体之间允许的最大接触数。此值覆盖物理定义的max_contacts元素

laserRetro

double

激光传感器返回的强度值。

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

RRBot 元素示例

在RRBot中,指定了两个非固定连杆的摩擦系数,以便在发生碰撞时更准确地模拟接触交互。以下是连杆的<gazebo>标签示例:

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

关节

确保您熟悉 URDF joint文档。但是,并非所有的URDF joint元素都适用于Gazebo

  • <origin>,<parent>和<child>都是必需的
  • <calibration>和<safety_controller>已经被忽略了
  • 在dynamics标签中,只有damping属性用于 Gazebo 4 及更早版本。 Gazebo 5及以上也使用<friction>属性
  • <limit>标签中的所有属性都是可选的

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的粘性阻尼系数的动力学元素,阻尼只是任何关节(joint)速度(在本例中是角速度的扭矩)的反向力量的数值,用于将移动关节(joint)“减速”到静止状态。

通过测试不同数值的阻尼并观察摆动摆看起来有多“逼真”,决定了0.7 N * m * s / rad的值。我们鼓励您现在试试这个值(增加/减少)以了解它如何影响物理引擎。

关节的<gazebo>元素

Name

Type

Description

stopCfm

double

joint stop constraint force mixing (CFM)error reduction parameter (ERP)是由ODE使用的两个参数。CFM是用于控制约束力的混合参数,而ERP是用于控制约束力的误差修正参数。

CFMERP的值越大,模拟结果越稳定,但也会导致模拟结果不真实。

stopErp

provideFeedback

bool

允许关节通过 Gazebo 插件发布其力矩或扭矩数据

implicitSpringDamper

bool

如果将此标志设置为true,则ode将使用erpcfm来模拟阻尼。这是一种比默认阻尼标记更稳定的数值方法。cfmdamping元素已弃用,应更改为implicitspringdamper

springStiffness

double

弹簧刚度(N/m)。

springReference

double

弹簧的平衡位置。

cfmDamping

fudgeFactor

double

在关节电机的joint limit限制下,将过量的比例缩小到应介于 0 1 之间。

<gazebo>元素的<robot><link>类似,任何未根据上表解析的任意块(blob)都将插入到sdf中相应的<joint>元素中。这对于插件特别有用,正如在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

名词翻译:

  1. Topic:主题

    Pose:姿态

    Twist:扭曲

    Model:模型

    Link:连杆

    Joint:关节

    Body:物体

    Object:对象

    Spawn:生成

    Force:力

    Wrenches :扭矩

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值