2.4 人形机器人的分割方法和控制程序
2.4.1 分割方法
人形机器人是由许多连杆通过关节连接而成的机器人,因此分析的第一步是将机器人按照关节和连杆进行分割。图2.14给出了两种分割方法。
图2.14a体现了在断开的连杆的一侧包括关节的方法,图2.14b体现了在机身或靠近机身的连杆中包括关节的方法。在计算机模拟中,图2.14a的分割法更加有利。因为在这种情况下,除了机身以外的所有连杆都必然包含一个关节,所以用相同的算法处理所有连杆很容易,而且在现有的模型上添加新的关节也很简单。图2.14b的方法会让各连杆包含不同数量的关节,程序因此变得更加复杂。
将这样分割的连杆正确地连接在一起,就能再现人形机器人的构造。连杆之间的连接关系可以用图2.15的树状结构 [9] 来表示。或者也可以把连杆的连接关系比喻成以身体为始祖的家谱,认为其后代沿着远离身体的方向相连。
图2.14 人形机器人的分割法。图a中除躯体以外的所有连杆都必须有一个关节,而图b中不同连杆的关节个数各不相同。从编程的角度来看,图a的方法更好
但是,由于每个连杆中保留的子连杆数量不同,这种表达方式不适合用于编程,原因与之前在人形机器人分割法中指出的相同。
因此,试着将同样的家族关系用图2.16的方式重新表达。每个连杆必须有两支,左下支记“子(孩子即子项)”,右下支记为“妹(妹妹)” [10] 。例如,RARM的右下分支LARM、RLEG、LLEG就是它的妹妹。RARM的母辈是右上的BODY,它的直系子项是左下的RHAND。也就是说,它们表示了表面上不同但实际上与图2.15完全相同的连杆之间的家族关系。另外,不存在“子”和“妹”的分支记为“0”。
图2.15 人形机器人连杆之间的树状结构1
图2.16 人形机器人连杆之间的树状结构2
2.4.2 控制程序
接下来考虑如何在实际的计算机程序中处理这些信息。将图2.16转化为表2.2。为了唯一地指定连杆,将BODY的ID设为1,其余按逻辑关系的顺序进行编号。
表2.2 各分支的数量
在Matlab的命令窗口中直接输入上面信息,显示如下 [11] 。
≫是Matlab的命令提示。uLINK是本书使用的结构序列的名称,大部分数据都存储在这里。在第一行中,uLINK被声明为全局变量,从而可以在其余程序中调用。uLINK(1)表示与ID为1的连杆相对应,用句号点隔开,指定数据字段(name, sister, child)并代入值。
同样地,如果输入uLINK(2)以后的信息,就可以交互地进行以下操作 [12] 。
如果输入的最后不用分号(;)输入变量名,Matlab就会显示存储的信息。利用这样存储的ID,可以自由地从树状结构中提取数据。也就是说,上述代码建立了关于机器人构造的一种数据库。
显示数据结构中保存的所有连杆名称的程序PrintLinkName.m如图2.17所示。
图2.17 PrintLinkName.m,显示所有连杆的名称
该程序检查自变量中给出的ID,如果不是0:(1)显示自己的名称;(2)用妹妹的ID执行PrintLinkName;(3)用孩子的ID执行PrintLinkName。保存为PrintLinkName.m之后,在Matlab命令行输入PrintLinkName(1),就会输出BODY连杆以下的树状结构中存在的链接名称一览。在某个函数中执行该函数本身被称为递归调用(recursivecall)。每调用一次就会移动到树状结构下面,最后一定会到达表示数据不存在的0,因此不会陷入无限循环。
使用递归调用的技巧,可以简单地编写求出总连杆质量的程序(见图2.18)。预先在uLINK中追加m这一数据字段来设置各连杆的质量。
图2.18 TotalMass.m,用于计算总连杆质量
如果自变量中给出的ID为0,则不存在连杆,因此程序返回0kg(第4行)。如果ID为0以外的量,则返回自身、妹妹连杆以下的合计质量、女儿连杆以下的合计质量之和(第6行)。从命令行输入TotalMass(1)后程序会自动扫描整个树状结构,计算出BODY连杆以下的总质量。这与通常的先数出整体的连杆个数,然后用for循环求和的方法相比,是非常高明的做法。


