Using a URDF model
教程:在Gazebo中使用URDF模型
通用机器人描述格式(URDF)是一种在ROS中使用的XML文件格式,他多用于描述机器人中所有元素的组成单元。为了在Gazebo中使用URDF文件,一些额外的仿真特征标签必须被合适的增加到机器人中。这个教程解释了必要的步骤去成功的使用你基于URDF的模型,节省你必须从一个个分开的SDF文件从头开始并重复描述的格式。Gazebo通过程序能够自动的将URDF格式转换成SDF格式。
背景
虽然URDF是ROS中有用的和标准化的格式,但是它们缺少许多特征,并且没有被更新以处理机器人技术的不断发展的需要。URDF只能单独指定单个机器人的运动和动态属性。URDF不能在一个世界中指定机器人本身的姿态。它也不是通用的描述格式,因为它不能指定关节环(平行连杆),并且它缺乏摩擦和其他属性。此外,它不能指定不是机器人的东西,例如灯光,高度图等。
在实现方面,URDF语法使用大量使用XML属性打破了正确的格式,这反过来使URDF更不灵活。也没有向后兼容的机制。
为了解决这个问题,创建了一个名为模拟描述格式(SDF)的新格式,用于Gazebo解决URDF的缺点。SDF是从世界级到机器人级的一切的完整描述。它是可扩展的,并且使添加和修改元素变得容易。SDF格式本身是使用XML描述的,这有助于简单的升级工具将旧版本迁移到新版本。 它也是自我描述的。
这是作者的意图使URDFs尽可能完全记录和支持在Gazebo,但与读者理解为什么两种格式同时存在和两者共同的缺点。如果更多的工作被放入URDFs以更新它们到机器人的当前需要会是很好的。
转换到Gazebo的综述
有一下几个步骤让一个URDF描述的机器人合适的工作在Gazebo中,下面是这些步骤的概述,这些将在剩下的教程中讲到。
要求
- 一个
<inertia>
元素和每一个<link>
(连杆)必须是明确的配置好的。
额外条件
- 给每一个连杆
<link>
加入一个<gazebo>
标签- 转换外观颜色到Gazebo的格式
- 转换STL文件到dae格式以得到更好的质地
- 加入传感器
- 给每一个关节
<joint>
加入<gazebo>
元素- 设置合适的动力学阻尼
- 加入驱动器控制单元
- 给
<robot>
加入<gazebo>
元素 - 给世界坐标系加入
<link name="world"
如果机器人是固定在世界坐标系上的。
<gazebo>
元素
<gazebo>
元素是URDF的扩展,用于在Gazebo中指定模拟目的所需的其他属性。它允许您指定在SDF格式中找到的属性,这些属性不包括在URDF格式中。<gazebo>
元素中的元素不是必需的,因为默认值将被自动包括。有三种不同类型的<gazebo>
元素 - 一个用于<robot>
标记,一个用于<link>
标记,一个用于<joint>
标记。在本教程中,我们将讨论每种类型的<gazebo>
元素中的属性和元素。
前期准备
使你的机器人在Gazebo中工作的第一步是从相应的ROS URDF教程中获得一个工作的URDF文件。在继续使用Gazebo配置机器人之前,通过在Rviz中查看来测试URDF。在本教程中,我们将使用一个名为RRBot的简单演示机器人。这个机器人或你自己的机器人并不妨碍最后的结果。
下载RRBot,
RRBot或"旋转-旋转机械臂机器人",是一个简单的三连杆,两关节(我们将使用这个来演示Gazebo和URDF的各种的特性。它本质上是一个双倒立摆,并在模拟器中演示一些有趣的控制概念。
为了得到RRBOT,下载the gazebo_ros_demos Github repo 到工作空间下的/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
如果你能够看到这个小机器人的话:
如果你看不到机器人的话,试着重启一下roscore(killall roscore
),并且重新启动Rviz。
你应该能够通过控制在Joint State Publisher上的滚动条来控制关节。
重要的是,当转换你的机器人到Gazebo工作时,你不会打破Rviz或其他ROS应用程序功能,所以最好偶尔测试你的机器人在Rviz,以确保一切仍然工作。
gazebo_ros_control教程将解释如何使用Rviz直接通过Gazebo发布/ joint_states来监视模拟机器人的状态。在前面的示例中,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中查看
roslaunch rrbot_gazebo rrbot_world.launch
启动Gazebo之后,应该能看到一个直立的倒立摆,但是因为一些累积误差,倒立摆不能够保持稳定,双倒立摆将会开始倒下。
最终双倒摆将会静止在稳定的位置,接下来可以继续探索和URDF模拟器相关的信息。
URDF文件的头
Gazebo中对API已经有了很多的更改,URDF格式也有了较大的变化。其中有一个是不在需要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
<robot name="rrbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<gazebo>
元素标签
如果一个<gazebo>
元素在没有reference=""
属性下被引用,那么它将被假定成对整个模型都适用。在<gazebo>
标签中的robot
里使用的元素用下列的表格展现。
名称 | 类型 | 描述 |
---|---|---|
static(静态) | bool | 如果被设置为True,那么模型是不可以移动的,否则模型将以动力学引擎作为仿真的基础 |
包含在一个<gazebo>
标签下的元素并且不在上述表格里的会被直接插入到SDF<model>
标签中来生成SDF.
这对于很多插件来说是非常有用的,比如在ROS Motor and Sensor Plugins
教程提到的。
把一个模型刚性固结到世界里
如果你希望你的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可以使用不标准的单位比如一些类似于重力常数的常量要手动更改,默认的g=9.81m/s^2,当描述质量时用kg。
<collision>和<visual>元素
这些标签在Gazebo中的作用和在Rviz里一样,最重要的是你需要明确这两个元素,因为不像一些ROS的应用,Gazebo不会使用你的<visual>
中的形状到<collision>
碰撞特性中去,如果你没有明确定义一个<collision>
元素。相反的,Gazebo将会把你的连杆当做"不可见的",也即对激光雷达和碰撞检测来说没有碰撞体积来对待。
简化碰撞模型
你可以为碰撞和视觉元素设置使用相同的几何或者网络,但是为了提高性能,我们强烈的建议你为碰撞模型设置简化的几何或者网络。
材质:使用合适的颜色和质地
一个标准的URDF文件可以明确颜色用下面的标签代码:(RRBot为例)
<material name="orange"/>
机器人的橙色外表在materials.xacro
文件中定义
<material name="orange">
<color rgba="${255/255} ${108/255} ${10/255} 1.0"/>
</material>
不幸的是,这种指定连杆颜色的方法并不能在Gazebo中适用,因为Gazebo采用的是OGRE的材质脚本来着色和给连杆添加纹理。就像下面这样:
<gazebo reference="link1">
<material>Gazebo/Orange</material>
</gazebo>
正如前面所提到的,在RRBot的例子中,我们选择将所有Gazebo特定的标记包含在名为rrbot.gazebo的辅助文件中,可以在那里找到<link>
和<material>
元素。
Gazebo中的默认材料可以在Gazebo的源代码中找到(路径gazebo/media/materials/scripts/gazebo.material) 如果要进行一些更加高级或者自定义的材料,你可以创建你自己的OGRE颜色或者纹理。参见:
STL 和 Collada 文件
和Rviz一样,Gazebo可以同时使用STL和Collada文件。通常建议您使用Collada(.dae)文件,因为他们支持颜色和纹理,而对于STL文件来说,只能有一个实心的彩色链接。
Inertial
元素
为了使Gazebo物理引擎正常工作,必须按照URDF链接元素页面上记录的提供<inertial>
元素。
对于在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>
原始标签表示此链接的质心。 通过将质心设置为RRBot的矩形链接的高度的一半,我们将质量定中心在中间。 你可以通过点击Gazebo的“View”菜单并选择“Wireframe”和“Mass of Mass”来目视检查您的URDF中Gushbo中的质心是否正确。
在本示例机器人中,质量和惯性矩阵都由值组成,因为该机器人没有真实世界对应物。
关节连杆的<gazebo>
元素
单独解释的元素的列表
Name | 类型 | 描述 |
---|---|---|
material | value | Material of visual element |
gravity | bool | Use gravity |
dampingFactor | double | 连杆的速度随着时间更新衰减,取前一时刻的速度值乘以(1-dampingFactor)+更新的速度乘以dampingfactor. |
maxVel | double | 最大接触的修正后的速度截断项 |
minDepth | double | 施加接触力之前的最小允许深度 |
mu1 | double | 摩擦系数μ,用于沿着接触表面的主触点方向,由开放式动力学引擎(ODE)定义(参见ODE用户指南中的参数说明) |
mu2 | double | 同上 |
fdir1 | string | 3元组指定碰撞局部参考系中mu1的方向。 |
kp | double | 用于刚性体触点的接触刚度 |
kd | double | 用于刚性体触点的接触阻尼 |
selfCollide | bool | 如果为true,则链接可能与模型中的其他链接发生冲突。 |
maxContacts | int | 两个实体之间允许的最大联系人数。此值覆盖物理中定义的max_contacts元素。 |
laserRetro | double | 激光传感器返回的强度值。 |
与<robot>
中的<gazebo>
元素类似,根据上面的表未被解析的任何任意的模块被插入到SDF中的关节元素中。这对插件来说特别的有用,正如在ROS电机和传感器插件教程中所讨论的那样。
RRBot中的元素为例
在RRBot中,两个非固定连接的连杆的摩擦系数被指定,使得如果发生碰撞,则更准确地模拟接触相互作用。
以下是示例链接的<gazebo>
标记:
<gazebo reference="link2">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Black</material>
</gazebo>
关节
确保您熟悉URDF联合文档。 然而,并非所有为URDF关节记录的元素适用于Gazebo:
- 需要
<origin>
,<parent>
和<child>
<calibration>
和<safety_controller>
不再需要- 在
<dynamics>
标签中,只有damping
属性是用在gazebo4之前的版本,Gazebo5之后的也使用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.7N m s / rad的粘滞阻尼系数的动力学元件,阻尼简单地是用于“减慢”移动接头的任何关节速度(在这种情况下是每个角速度的转矩)的反作用力的量 休息。
通过测试不同量的阻尼并观察摆动摆如何“现实”来确定0.7N m s / rad的值。 我们鼓励你现在使用这个值(增加/减少),以了解它如何影响物理引擎。
关节中的<gazebo>
元素
Name | 类型 | 描述 |
---|---|---|
stopCfm | double | 关节限制力混合 |
stopErp | double | 误差减小参数 |
provideFeedback | bool | 允许接头通过Gazebo插件发布其(力 - 扭矩) |
implicitSpringDamper | bool | 如果此标志设置为true,ODE将使用ERP和CFM来模拟阻尼。这是一种比默认阻尼标签更稳定的阻尼数值方法。不推荐使用cfmDamping元素,应将其更改为implicitSpringDamper。 |
cfmDamping | bool | 同上 |
fudgeFactor | double | 在关节限制下缩小关节运动的过量。应在零和一之间。 |
再次,类似于<机器人>和<链接>的
这对插件特别有用,如ROS电机和传感器插件教程中所讨论的。
验证 the Gazebo Model 能用
当Gazebo安装的时候,一个简单的工具也被安装,能够轻松的验证你的URDF是否能够被导入到SDF中,运行下面的command
# 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包中。 上一个教程使用roslaunch文件生成模型,介绍了使用ROS从该位置打开URDF到Gazebo的方法。 如果您还没有完成该教程,请立即进行。
从该教程,您应该有两个ROS包为您的自定义机器人:MYROBOT_description和MYROBOT_gazebo。 要查看你的机器人并在Gazebo中测试它,你现在应该可以运行类似:
roslaunch MYROBOT_gazebo MYROBOT.launch
应该能够启动Gazebo的服务端和GUI客户端,你的机器人也能在里面被看到。
调整你的模型
如果您的机器人模型在Gazebo中意外运行,可能是因为您的URDF需要进一步调整,以准确地在Gazebo中表示其物理。
有关Gazebo中可用的各种属性的更多信息,请参阅SDF用户指南,这些属性也可通过
分享你的模型
如果你有一个常用的机器人,其他人可能想在Gazebo中使用,你鼓励你添加你的URDF到Gazebo模型数据库。 它是一个在线服务器,Gazebo连接到从互联网下拉模型。 它的Mercurial存储库位于Bitbucket。 有关如何提交拉式请求以将robot添加到数据库中,请参阅Gazebo模型数据库文档。
下一步
您现在已经学习了如何使用包含带有Gazebo的URDF的ROS包,以及如何将您的自定义URDF转换为在Gazebo中工作。 您现在可以学习如何向URDF添加插件,以便控制机器人和模拟环境的不同方面。 请参阅ROS电机和传感器插件。