1.什么是URDF? URDF全称(United Robotics Description Format)统一机器人描述格式,是一个XML语法框架下用来描述机器人的语言格式,URDF在ROS界很流行。我们可以
- 通过URDF对机器人建模然后放到ROS里面进行仿真与分析
- 把一个URDF文件转换成simscape模型,在Simulink里面进行仿真分析或者控制器设计。
- 把simscape模型转化成urdf格式
2.URDF文件长啥样? URDF文件里面有着与XML语言格式。要定义好一个机器人,首先你得知道机器人有什么。一个机器人主要由连杆(link)和关节(joint)组成, URDF具有类似XML树状结构的,比如下面的例子:
<robot>
<link>
...
</link>
<link>
...
</link>
<joint>
...
</joint>
</robot>
上面的 link 与 joint 是 robot 下面的子分量(应该有比‘子分量’更好的描述),换句话说 joint 和 link 隶属于 robot 。知道了机器人的基本构成之后还不够,还需要知道基本组成部分的一些物理信息,例如连杆的质量属性,惯量属性,颜色,以及关节的种类,这到底是转动关节还是平动关节。因此 link 和 joint 也要有自己的子分量,比如 inertial 和 visual , visual 下面还可以再次细分子分量 geometry 和 material ,然后 material 下面还可以有自己的子分量,由此往复我们就可以用URDF来充分定义好一个机器人的各个信息。所以一个增加了这些额外信息的URDF文件内容例子如下
<robot>
<link>
<inertial>
...
</inertial>
<visual>
<geometry>
...
</geometry>
<material>
<color />
</material>
</visual>
</link>
...
</robot>
我们定义好了机器人的组成部分以及各个部分所具有的信息,接着还需要有属性描述这些量。比如 robot,link,joint 都有 name属性,一个用来辨识模块的字符串。 color 有 rgba 属性,用来定义连杆的外表颜色。添加了相关信息的URDF文件长这个样子:
<robot name = "linkage">
<link name = "root link">
<inertial>
...
</inertial>
<visual>
<geometry>
...
</geometry>
<material>
<color rgba = "1 0 0 1" />
</material>
</visual>
</link>
...
</robot>
把这些属性附上对应的数值之后,一个机器人的 urdf 模型中各个模块的外表和物理属性就建立好了。 接下来我们来描述关节连杆之间的关系。 3.URDF的层次结构以及动力学树 URDF文件里,就像XML一样,link 通过 joint 按一定的层次一个个联系在一起。 joint 通过 parent-child 关系把上下 link 联系起来,parent link可以同时作为其他 link 的child link,而child link也可以同时作为其他link的parent link,举例:
<parent> and <child> Joint Elements
<robot name = "linkage">
<joint name = "joint A ... >
<parent link = "link A" />
<child link = "link B" />
</joint>
<joint name = "joint B ... >
<parent link = "link A" />
<child link = "link C" />
</joint>
<joint name = "joint C ... >
<parent link = "link C" />
<child link = "link D" />
</joint>
</robot>
上述URDF语法建立了一个这样的连杆模型:
- 连杆A通过关节A连接着连杆B,连杆A是父连杆
- 连杆C通过关节B连接着连杆A,连杆A是父连杆
- 连杆D通过关节C连接着连杆C,连杆C是父连杆
我们可以通过connectivity graph来展示 link 之间的从属和连接关系,用圆代表link,箭头代表joint,joint 从 parent link流出,指向child link,于是上述URDF文件可以用图表示为:
描述好关系之后,一个加上上面所说的物理和外表属性,一个完整的机器人 URDF 模型就建立好了。 但是在URDF里面,模型的拓扑结构也受到着一定的限制:那就是URDF不能定义一个闭环的连杆模型。翻译成URDF说法就是:
- 一个child 只能有一个parent link
- 只有root link(也就是connectivity graph的起源)可以有多个分支
- 一个模型只能由一个root link
举例: Kinematic Loop URDF Example
<robot name = "linkage">
<joint name = "joint A ... >
<parent link = "link A" />
<child link = "link B" />
</joint>
<joint name = "joint B ... >
<parent link = "link A" />
<child link = "link C" />
</joint>
<joint name = "joint C ... >
<parent link = "link C" />
<child link = "link D" />
</joint>
<joint name = "joint D ... >
<parent link = "link B" />
<child link = "link D" />
</joint>
</robot>
上述URDF的连线图如下所示:
它有一个child link D具有两个parent link, 因此该模型不能用URDF来建模 4. URDF里必要的和可选的部分 URDF里面并不是所有的信息都需要定义,一些信息比如 link 下面的 inertial 信息就是可选的,可以定义也可以不定义。下面的例子中绿色代表可选的信息,可填可不填: