2.URDF 统一机器人描述格式
URDF:
我们要跑的是虚拟机仿真,到后面需要再虚拟化仿真的环境里看到一个是实在的、可以看得到的小小的机器人模型,那么想在虚拟机仿真环境当中将其可视化出来,那么我们必然要对这个机器人的形态进行具体的描述,这样才能够将其显示出来,而实现这个显示的方式就是使用基于XML文件格式的URDF(Unified Robot Description Format)来对机器人的外观进行描述,从而让系统理解并构建出我们想要的机器人仿真模型。
XML:
XML(Extensible Markup Language),可拓展标记语言,它是一种规范格式,虽名带语言两字,但实际并不是一种编程语言。其是一种**包含了数据以及数据格式说明的文本格式规范。**通过这个文件我们可以将各种各样的数据以我们想要的方式进行分类与分装,从而便于程序的调用及解析。其本质是一种数据及数据说明(数据的分类)的 “容器”。使用XML定义的一个最简单的URDF模型可以像下面这样:
<?xml version="1.0"?>
<robot name="test_bot"> <!--定义一个robot标签,代表我们描述的是机器人的建模描述文件,使用name属性命名-->
<link name="base_link"> <!--link 代表机器人的一个关键组成部分,稍后进行描述-->
<visual> <!--代表可视部分-->
<geometry> <!--几何形状-->
<cylinder length="0.18" radius="0.06"/> <!--圆柱体,高度0.18,半径0.06-->
</geometry>
</visual>
</link>
</robot>
对于基于XML的机器人统一建模描述语言的 URDF 来说,其所含标签的标签名及其意义已被统一固定好,以便进行统一的程序调用。在仿真过程中,仿真器可以通过这些含有一定意义的标签及标签名来获取到到我们想要的数据并对机器人模型进行渲染及初始化。
URDF的重要标签:
用于描述机器人的标签定义众多,接下来我们对其中的几个我们暂时需要用到的大类的标签进行讲解。(标签之间可以进行嵌套,大标签下还能嵌套子标签,用于更加颗粒化的描述)
首先是 Link 与 Joint,Link和Joint在URDF里共同负责对机器人的外形形态进行描述。
1.Link——机器人部件描述标签:
Link代表着机器人的各个部分的描述信息,如机器人躯体、机器人的各项传感器等,都可以看作一个个的 “Link”。我们一般将机器人的躯体Link名称定义为 “base_link”。”base_link”的示例代码如下:
<!-- base link -->
<link name="base_link"> <!-- 代表我们描述的是机器人的躯体 -->
<visual> <!-- 描述机器人的可视部分 -->
<origin xyz="0 0 0.0" rpy="0 0 0"/><!-- 描述机器人中心坐标系的位置。xyz: Link的坐标系几何中心位置,默认为几何中心。rpy:坐标系的旋转角度 -->
<geometry><!-- 描述机器人的几何形状 -->
<cylinder length="0.12" radius="0.10"/><!-- 圆柱体,高度0.12,半径0.10 -->
</geometry>
</visual>
</link>
<link>
:用于描述机器人身上的部件。有name一个属性,代表着部件的名称。
其下子标签(下方的箭头符号同样代表此含义):
① <visual>
:用于描述机器人部件的外观形式信息。
↓
<geometry>
:用于描述部件的几何形状。
↓
<box>
:长方体。有size一个属性,代表长方体的长宽高值。
<cylinder>
:圆柱体。有radius、length两个属性,代表圆柱体的半径值及高度值。
<sphere>
:球体。有radius一个属性,代表球体的半径值。
<mesh>
:来自第三方的模型文件。有filename一个属性,代表模型文件所在的地址。
<origin>
:用于描述部件的坐标系框架基于部件的相对位置。有xyz、rpy两个属性,分别代表几何中心坐标系位于几何体坐标的何处位置与几何中心坐标系的旋转角度。默认全都为0。
<material>
用于描述部件的颜色、透明度及纹理材质等外观。有name一个属性,代表这个材质的名称。
↓
<color>
:用于描述材质的颜色及透明度。有rgba一个属性,其中rgb代表着三色通道,a代表材质的透明度
<texture>
:指定纹理图像。有filename一个属性,代表纹理图像文件的路径地址。
② <collision>
:用于描述机器人部件的物理碰撞信息。
↓
<geometry>
:定义碰撞框架的几何形状。
↓
<box>
:长方体。有size一个属性,代表长方体的长宽高值。
<cylinder>
:圆柱体。有radius、length两个属性,代表圆柱体的半径值及高度值。
<sphere>
:球体。有radius一个属性,代表球体的半径值。
<mesh>
:来自第三方的模型文件。有filename、scale两个属性,代表模型文件所在的地址及模型的缩放比例。
<origin>
:用于描述碰撞框架的坐标系框架基于部件的相对位置。有xyz、rpy两个属性,分别代表几何中心坐标系位于几何体坐标的何处位置与几何中心坐标系的旋转角度。默认全都为0。
<material>
:不常见,因为碰撞元素主要用于物理仿真,而不是可视化,但有时仍会包含此项来对碰撞元素进行可视化从而检查碰撞框架大小设置的合理性。
③ <inertial>
:用于描述机器人部件的物理惯性属性方面的信息。
↓
<origin>
:如上类似。
<mass>
:部件的重量(质量)。有vaule一个属性,用于描述质量的数值,以kg为单位。
<inertia>
:用于定义链接的惯性矩阵。惯性矩阵描述了物体绕其质心旋转的抵抗力矩。属性包括ixx、ixy、ixz、iyy、iyz、izz等惯性张量的分量。这些值通常以 kg·m² 为单位。
2.Joint——机器人关节描述标签:
Joint描述了机器人部件之间相连件的信息,即 “连接件”、“关节”的形式。Join的作用是负责对两个Link之间的连接进行描述,其主要的描述属性为父部件、子部件名字、连接属性、父子的相对位置、父子之间的旋转轴等。其实际使用示例如下:
附:使用下方的URDF描述语言使用RVIZ2可视化工具显示出来后的效果,应如图所示
<?xml version="1.0"?>
<robot name="fishbot">
<!-- base link -->
<link name="base_link">
<visual>
<origin xyz="0 0 0.0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.12" radius="0.10"/> <!-- 一个大圆柱体 -->
</geometry>
</visual>
</link>
<!-- laser link --> <!-- 在这里我们添加一个激光雷达传感器部件,即又添加了一个Link -->
<link name="laser_link"> <!-- Link的name是很重要的,是定义其内数据含义及区别于其他Link的关键 -->
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.02" radius="0.02"/> <!-- 一个小圆柱体 -->
</geometry>
<material name="black"> <!-- 新标签,用于描述部件的颜色及透明度 -->
<color rgba="0.0 0.0 0.0 0.5" /> <!-- R G B 及透明度 -->
</material>
</visual>
</link>
<!-- laser joint --> <!-- 对机器人关节————joint 的描述标签 -->
<joint name="laser_joint" type="fixed"> <!-- type:fixed 代表这个关节固定,不可旋转或移动 -->
<parent link="base_link" /> <!-- 描述Joint关节的所处于的根部件(父部件) -->
<child link="laser_link" /> <!-- 描述Joint关节的所连接的另一端部件(子部件) -->
<origin xyz="0 0 0.075" /> <!-- 描述父子之间的相对位置关系 -->
</joint>
</robot>
<joint>
:用于描述机器人部件与部件之间的关节。有name、type两个属性,分别代表关节的名称和关节的类型。type属性有以下值:
revolute: 旋转关节,绕单轴旋转,角度有上下限,比如舵机0-180。
continuous: 旋转关节,可以绕单轴无限旋转,比如自行车的前后轮。
fixed: 固定关节,不允许运动的特殊关节。
prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限。
planer: 平面关节,允许在xyz,rxryrz六个方向运动。
floating: 浮动关节,允许进行平移、旋转运动。
其下子标签:
① <parent>
:用于描述关节所连接的父部件。有link一个属性,代表父部件的link名称。
② <child>
:用于描述关节所连接的子部件。有link一个属性,代表子部件的link名称。
③ <origin>
:父子部件之间的位置关系。有xyz、rpy两个属性,属性作用类似如上。基于父坐标系进行作用。
④ <axis>
:围绕旋转的关节轴。有xyz一个属性,定义关节的旋转轴在哪个方向之上。
下一章讲解RVIZ2可视化工具的初步使用