前言
一般的URDF格式只支持串联结构机器人的定义,无法定义并联机器人。但在开发中并联结构(闭环)非常常见,怎么才能在仿真中表示出来并联结构比较重要。本文展示一种利用URDF文件与SDF语法表示并联结构的方法,该方法仅适用于支持SDF格式的仿真环境(根据笔者目前的经验,只有Gazebo满足此条件)。
背景
我们有一个双足机器人,它的单腿膝关节依靠位于髋部的电机和四连杆结构驱动。我们想要用URDF文件来描述这个具有并联结构的机器人。
机器人腿部四连杆结构
在探索如何表示并联结构时,笔者了解到了SDF格式,该格式是URDF格式的升级版,支持描述并联结构。立即可以想到的方案就是将URDF格式整个转为SDF格式,但是笔者在实际执行这个方案时发现其过于繁琐,URDF和SDF中对于相对位置的描述逻辑略有不同,所以直接沿用URDF文件中的xyz坐标和rpy角度得到的SDF文件呈现出来的效果与URDF并不一致。那么有没有替代性的解决方案呢?URDF和SDF实际都是用标签语言来描述结构,有可能会出现URDF中调用SDF语法、SDF中调用URDF语法的方案。经过一番搜索后笔者发现了本文介绍的方法:使用<gazebo>
标签。
方法
SDFormat官方给出的URDF的SDF扩展文档中只展示了利用标签给已有的link或者joint添加SDF独有的特性,但是我们是可以在标签内按SDF的语法写SDF的标签的,并不只是给URDF做补充。Gazebo在导入URDF文件时,会先将其转换为SDF格式,笔者推测,URDF格式在转为SDF格式时,标签会被去掉,其内的语句会自动按SDF格式重新组织。
1. 从SW中导出两个串联结构
为了合并出最后的并联结构,我们需要首先得到两个串联结构的URDF文件。这两个串联结构分别包括了四连杆结构中的两部分,如下图:
四连杆的两部分(分别用红色和蓝色示意)
2. 合并两个串联结构
两个串联结构的URDF结构树分别如下:
其中的*_calf1与*_calf2实际为一个连杆,但是父节点不同。