-
Notifications
You must be signed in to change notification settings - Fork 11
在Gazebo中使用URDF描述文件
ericwen edited this page Apr 11, 2019
·
17 revisions
- 通用机器人描述格式(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来更新它们以满足机器人技术的当前需求,那将是一件好事。
- 通过一些步骤可以使一个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,或“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中启动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.xacro文件:
rosed rrbot_description rrbot.xacro
- 请注意,我们正在使用Xacro使一些链接和联合计算更容易。 我们还包括两个额外的文件:
- rrbot.gazebo是一个Gazebo特定文件,包含我们大多数特定于Gazebo的包含标签的XML元素
- materials.xacro一个简单的Rviz颜色文件,用于存储rgba值,不是必需的,但是一个很好的习惯
- 您还应该能够将RRBot启动到Gazebo中:
roslaunch rrbot_gazebo rrbot_world.launch
- 在启动的Gazebo窗口中,您应该看到机器人直立。 尽管默认情况下物理模拟器中没有故意干扰,但数值误差应该开始增加并导致双倒立摆在几秒钟后下降。 以下是RRBot的中间截图:(图片见原网址)
- 最终手臂应该完全停止。 我们鼓励您在以下教程中调整和测试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电机和传感器插件教程中所述。
- 如果您希望将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>
- 但是,如果您有移动基座或其他移动机器人,则不需要此链接或关节。
- 确保您熟悉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中,指定了两个非固定链接的摩擦系数,以便在发生碰撞时模拟更准确的接触相互作用。 以下是示例链接的标记:
<gazebo reference="link2">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Black</material>
</gazebo>
- 确保您熟悉URDF joint documentation。 但是,并非URDF关节记录的所有元素都适用于Gazebo:
<origin>,<parent>和<child>是必需的
忽略<calibration>和<safety_controller>
在<dynamics>标签中,只有damping property用于gazebo4及更早版本。 Gazebo5及以上使用friction property。
<limit>标记中的所有属性都是可选的
- 以下是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的值。 我们鼓励您现在使用此值(增加/减少它)以了解它如何影响物理引擎。
名字 | 类型 | 描述 |
---|---|---|
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后,可以使用一个简单的工具来检查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中查看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
原文链接,翻译:谷歌翻译、文岩
Stay hungry,stay foolish.