本文在Ubuntu18.04 + ROS melodic环境下完成,其他ROS版本类似。
一、urdf简介
urdf是ROS用于描述机器人所有元素的模型文件,采用XML格式书写。
- urdf:统一机器人描述格式;
- xacro:升级版的urdf,简化了urdf模型,用于复杂机器人的建模。xacro语法请参考:
- https://link.zhihu.com/?target=https%3A//wiki.ros.org/xacro
- 使用前先下载软件包:
-
$ sudo apt-get install ros-melodic-urdf $ sudo apt-get install ros-melodic-xacr
urdf所有的标签:
详细使用方法请参考:
https://link.zhihu.com/?target=https%3A//wiki.ros.org/urdf/XML
常用标签有<robot>,<link>,<joint>,语法如下:<robot name="my_robot"> <link> ......</link> <link>......</link> ...... <joint>......</joint> <joint>......</joint> </robot>
-
二、urdf与gazebo
除了上述的标签,要在gazebo中使用urdf模型,还必须添加一些特定用于仿真的标签。而gazebo在后台会自动将urdf转换为sdf。要使urdf在gazebo中正常工作,需要注意以下几点:
(1)必须的部分(Required)
- 必须正确指定和配置每个<link>标签中的<inertia>元素
(2)可选的部分(Optional)
- 为每个<link>标签添加<gazebo>元素
- 将视觉颜色转换为gazebo格式
- 将stl文件转换为dae文件以获得更好的纹理
- 添加传感器插件
- 为每个<joint>标签添加<gazebo>元素
- 设置适当的阻尼动力学
- 添加执行器控制插件
- 为<robot>标签添加<gazebo>元素
- 如果将机器人固定在world/base_link,需要添加<link name="world"/>连杆
(3)<gazebo>元素
<gazebo>元素是urdf的扩展,用于指定在gazebo中进行仿真所需的其他属性。<gazebo>元素内的所有元素都不是必需的,因为将自动包含默认值。
<gazebo>元素有三种不同类型:一种用于<robot>标签,一种用于<link>标签,另一种用于<joint>标签。如果使用<gazebo>元素而没有reference=""属性,则假定<gazebo>元素适用于整个机器人模型。
三、urdf标签详解
1、<robot>标签
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" >
-
您可以删除它们。在<robot>标签中,您需要的只是机械手的名称,如果使用xacro,则还可以选择xacro的xml名称空间:
-
<robot name="rrbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
-
如果使用<gazebo>元素而没有reference =""属性,则假定<gazebo>元素适用于整个机器人模型。下表列出了<robot>标签内<gazebo>元素。
-
2、<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中应以m和kg为单位。 如果手动更改重力等常数,则gazebo可能会与英制单位一起使用,但默认情况下,重力为9.81 m/ s^2。 指定质量时,请以kg为单位。
-
(1)<collision>和<visual>元素
这些标签在gazebo中的工作原理与在rviz中相同。不过,务必同时指定两者,如果您未明确指定<collision>元素,则gazebo不会将<visual>元素用作<collision>元素。 相反,当使用激光扫描仪检测物体时,gazebo会将您的连杆视为“不可见”,即检测不到。
- 简化碰撞模型
我们可以简化碰撞模型,可以为<collision>和<visual>元素使用相同的几何图形或网格,但是为了提高性能,强烈建议您为碰撞几何图形提供简化的模型/网格。 Blender是简化网格的一个很好的开源工具。 有许多封闭源工具,例如Maya和3DS Max,它们也可以简化网格。
- 材料:使用适当的颜色和纹理
标准urdf可以使用诸如RRBot中的标签指定的颜色:
-
<material name="orange"/>
-
使用自定义的橙色:
-
<material name="orange"> <color rgba="${255/255} ${108/255} ${10/255} 1.0"/> </material>
-
不幸的是,这种指定连杆颜色的方法在gazebo中不起作用,必须为每个连杆指定一个gazebo材料标签,例如:
-
<gazebo reference="link1"> <material>Gazebo/Orange</material> </gazebo>
-
如前所述,在RRBot示例中,我们选择将所有gazebo的特定标签包含在名为rrbot.gazebo的辅助文件中。您可以在其中找到<link>和<material>元素。
gazebo中的默认可用材料可以在gazebo源代码中找到,该源代码在gazebo/media/ materials/scripts/gazebo.material。
对于更高级或自定义的材料,您可以创建自己的OGRE颜色或纹理:The <material> SDF documentation 、OGRE materials documentation。
- STL和Collada文件
像在rviz中一样,gazebo可以同时使用STL和Collada文件。通常建议您使用Collada(.dae)文件,因为它们支持颜色和纹理,而对于STL文件,您只能使用纯色连杆。
(2)<inertial>元素
为了使gazebo物理引擎正常工作,必须提供<inertial>元素。为使连杆在gazebo中不被忽略,连杆的质量必须大于零。 另外,主惯性矩(ixx,iyy,izz)为零的连杆在任何有限转矩应用下都可能导致无限加速。
为在gazebo中获得精确的物理近似值,需要确定每个连杆的正确值。 这可以通过对机器人零件进行各种测量,或使用诸如Solidworks之类的CAD软件来实现,这些软件包含用于近似这些值的功能。
RRBot第一个<link>的<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>
-
原点标签表示此连杆的质心。 通过将质心设置为RRBot矩形连杆高度的一半,我们将质心居中。 您可以在gazebo内通过单击“View”菜单并选择“Wireframe”和“Center of Mass”来直观地检查您的质心是否正确。
(3)用于<link>标签的<gazebo>元素
-
2、<joints>标签
首先,确保您熟悉urdf joint文档。 其次,并非为所有元素都适用于gazebo。
- <origin>,<parent>和<child>是必需的
- <calibration>和<safety_controller>被忽略
- 在<dynamics>元素中,只有阻尼属性用于gazebo4和更早版本。 Gazebo5及更高版本也使用了摩擦特性。
- <limit>元素中的所有属性都是可选的
以下是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的值是通过测试不同的阻尼量并观察摆动摆的“真实性”来确定的。我们可以通过增加/减少该值,以了解它如何影响物理引擎。
用于<joints>标签的<gazebo>元素:
-
四、验证gazebo模型能够工作
安装了gazebo后,可以使用一个简单的工具来检查您的urdf是否可以正确转换为sdf。 只需运行以下命令:
# gazebo2 and below $ gzsdf print MODEL.urdf # gazebo3 and above $ gz sdf -p MODEL.urdf
这将显示输入urdf生成的sdf,以及有关sdf所需信息丢失的任何警告。
五、在gazebo中查看urdf模型
上一教程,我们已经学会如何在gazebo中查看RRBot。对于自己的定制机器人,我们要如何导入gazebo中进行仿真呢?
下一个教程,我们将学习如何使用roslaunch启动gazebo并导入urdf模型。
六、urdf其他注意事项
如果您希望将urdf模型永久地附加到世界框架(地平面),则必须创建一个“world”连杆和一个将其固定到模型base连杆的关节。 RRBot通过以下步骤完成此任务:
-
<!-- Used for fixing robot to Gazebo 'base_link' --> <link name="world"/> <joint name="fixed" type="fixed"> <parent link="world"/> <child link="link1"/> </joint>
-
但是,如果您有移动基座或其他移动机器人,则不需要此连杆和关节。
评论(0)
您还未登录,请登录后发表或查看评论