servoj(q, t=0.010, lookahead_time=0.1, gain=300)
该指令用于实时控制机器人的关节位置,在前瞻时间内利用时间间隔处理接收到的关节角度,并进行均值滤波,再将滤波的数据进行样条拟合,从而得到实时控制所需的关节位置。
其中q为joint类型数据,t为采样时间(s),lookahead为前瞻时间(s),lookahead/ t =运动队列长度,用于平滑数据。当前版本gain数据无作用
例如希望自行编写机器人实时轨迹并让机器人完成一个整圆的绘制,可以使用以下代码:
servoj1.script内容如下:
def checkPos(p,delta): # 检查当前位置与期望位置p的xyz三个方形偏差均小于delta,返回True p_curr = get_actual_tcp_pose() if (abs(p_curr[0]-p[0])<delta) and (abs(p_curr[1]-p[1])<delta) and (abs(p_curr[2]-p[2])<delta): return True else: return False def servojTest(pStart,r): movel(pStart) #移动到起点,即圆最上方点 pStart[2] = pStart[2] - r # 修改参考点为圆心 ptmp = pStart.copy() sample_t = 0.01 #采样时间,采样时间和每两次servoj之间发送的位置差 可以调节机器人运动速度 lookahead = 0.1 #lookahead/采样时间 = 队列长度10(用于平滑) for i in range(0,360): ptmp[1] = pStart[1]+r*sin(d2r(i)) ptmp[2] = pStart[2]+r*cos(d2r(i)) jtmp = get_inverse_kin(ptmp) #求逆 servoj(jtmp,sample_t,lookahead) #机器人会同步执行该语句,即该语句需要耗时sample_t的时长 while not checkPos(ptmp,2): # 如果当前位置与终点位置偏差大于2mm,一直发送最后一个点的位置 servoj(jtmp,sample_t,lookahead) stopj(3) #以3rad/s2 加速度停止运动 return True