引言

在上一节中,我们讲述了机器人的位移和旋转,在讲述机器人的移动时,我们保持机器人的姿态不变;在控制机器人旋转时,我们设置机器人的位置为定值。今天我们来看一个特殊的例子,那就是当我们的旋转不是绕着机器人身上的某个关节(某连杆坐标系),而是绕着机器人末端工具的上的某一点,这时如果我们想要绕着这个不是关节的点旋转时,该如何操作呢?请看后面分解。

前言-旋转表示

在讲述变旋转中心的旋转之前,我们首先对仅旋转时,位置设定为定值这个设定进行升级,原因是在一个完整的机器人运动的过程中,机器人不仅需要完成单一的旋转或者位移,而是各种旋转和位移的组合,在这种情况下,如果在旋转时,仍采用reset初始化时的位置,将会产生错误的影响。因此我们需要重新定义函数,实现这个过程。

我们的程序分为三部分,第一部分是获取更新的位置和姿态:

self.posture = np.array(p.getLinkState(self.UR5, 6)[5],dtype=float).reshape(4,1)
self.position = np.array(p.getLinkState(self.UR5,6)[4],dtype=float).reshape(3,1)

第二部分是得到经过旋转后的新的位置和姿态,由于我们希望在机器人整个旋转过程中位置不变,因此我们可以通过重新定义一个变量,并判断是否为空,来不断给位置赋初值。当我们需要直行位移的任务时,将会将self.fixed_position设置为[0.0]:

def update_control_r(self, e):
     self.posture_need = get_position_r(self.posture,e)
     if any(self.fixed_position):
         self.position_need = self.fixed_position
     else:
         self.fixed_position = self.position
         self.position_need = self.fixed_position

第三部分就是旋转:

def revolove(self,e):
    self.update_control_r(e)
    self.go()

姿态设置

接下来就是正式的变旋转中心旋转的部分了。由于变旋转中心的变化主要体现在坐标系的原点位置变化,这里需要确定变化的范围。由于我们目前能控制的是机器人的末端坐标系,而旋转坐标系位于轴上,因此我们首先通过urdf文件,并使用绘制连杆坐标系工具辅助,得到以下坐标:

从机器人的URDF文件可以看出,工具坐标系和末端连杆坐标系之间y轴的距离为0.0823。

为了确定轴的位置,用白色debug线辅助:

得到轴开始处离末端连杆坐标系原点距离为0.088m,而轴长为0.1m,因此旋转坐标系原点的位置取值范围为[0.088,0.188]。

如下为距离0.188时的debugline:

对于姿态的设置,虽然旋转坐标系相对于工具坐标系并无位移和旋转,而工具坐标系与末端连杆坐标系有旋转和位移关系,但是我们duck不bee按照工具坐标系来,因为可以把工具坐标系忽略,因为前面我们也已经将受力值转移到末端连杆坐标系了,所以位移也按照末端连杆坐标系就可以。所以对于姿态来说,新的姿态和欧拉角E相同即可,不需要额外设置,只需要将欧拉角转为四元数。

    Q = pybullet.getQuaternionFromEuler(E)
    return [tem[0], tem[1], tem[2]],Q

位置设置

而既然姿态是这样设置的,那么位置的设置就至关重要了。因为从运动学的角度来说,我们需要

1、旋转坐标系移动到末端连杆坐标系y轴上t点处,当然姿态不变;

2、然后绕着旋转坐标系旋转E(欧拉角);

3、然后再经过正向运动学的逆过程得到末端连杆出的位置。

成果展示

以下分别展示绕着连杆坐标系x轴,中心点为0,0.05,0.1时的旋转场景。

May the force be with you!