目录
前言
统一机器人描述格式 (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 电机和传感器插件。