透传(transparent transformation)是艾利特机器人EC系列中高阶的运动指令接口,允许用户自己设计并运行一段固定或者实时变化的路径。这项功能使用户可以完全控制运动路径的插补方式与运动速度,也可以在搭载了传感器和控制器的情况下实时控制机器人的运动,为用户在运动控制部分提供了较大的自由度。
例如,希望机器人从P001走到P000,并按照上图画一个圆(圆的点位由lua程序实时计算),返回P000,最后回到P001,可以使用以下的代码。
JBI示例代码中的相关术语解释如下图
以下为JBI示例代码:
NOP SETJOINT P001 -36.0659,-109.1445,91.6433,-72.5008,90.0004,53.8916 // P001 上方点 SETJOINT P000 -36.0662,-110.6173,98.9087,-78.2932,90.0004,53.8916 // P000 开始点 SET D001 50 //D001 圆的半径 SET D002 0.02 // 设置透传采样时间 SET D003 0.2 // 设置透传lookahead时间 SET B000 0 MOVJ P001 VJ=10% CR=0.000MM ACC=50 DEC=50 MOVJ P000 VJ=10% CR=0.000MM ACC=50 DEC=50 // 走到开始点P000 TTINIT T=0.02S LOOKAHEAD=0.2S SMOOTHNESS=1.0 // 初始化, // T表示采样时间,即机器人在执行TTTARGETJOINT指令时, // 每xx秒从对应位置变量处获取位置并存入透传队列最后 // 队列最前的数据会被剔除 // LOOKAHEAD表示前瞻时间,LOOKAHEAD/T 得到队列长度 // 例如0.2/0.02=10,即队列长度为10,机器人会对队列内的位置数据进行平滑处理 // SMOOTHNESS表示平滑度,范围0-1 // TTSTARTJOINT P000 // 检查当前位置是否是P000,如果是开始透传运动 // 机器人在开始透传时,会用当前位置将队列内所有数据填满 SET B000 2 // lua开始计算并将最新的数据填入V001 LABEL *TT // 透传的循环 TTTARGETJOINT V001 // 按照设定的采样时间,从V001获取新位置数据并填入队列 // 此时若有新数据进入队列,机器人就会运动 JUMP *TT IF B000 = 2 // lua重将B002置为非2,机器人停止透传运动 TTSTOP MOVJ P001 VJ=10% CR=0.000MM ACC=50 DEC=50 SET B000 0 END
lua计算圆轨迹与控制机器人运动代码如下:
--Author:chenliao@elibot.cn
sleep(0.3) function TT_circle_move() local r = get_global_variable("D001") --获取半径 local t_sample = get_global_variable("D002") --获取采样时间 local t_lookahead = get_global_variable("D003") --获取lookahead时间 local jStart = {get_global_variable("P000")} --获取开始位置的joint local pStart = get_fwd_kinematics(jStart) -- 获取开始位置的笛卡尔坐标 pStart[1] = pStart[1] + r --沿着x方向偏移半径,获得圆心坐标 Pout = {pStart[1], pStart[2], pStart[3], pStart[4], pStart[5], pStart[6]} -- 实际输出的位置 for i = 1, 360, 1 do -- 圆分割为360份,每一度给一个最新位置 Pout[1] = pStart[1] - r * math.cos(math.rad(i)) Pout[2] = pStart[2] + r * math.sin(math.rad(i)) set_global_variable("V001", Pout[1], Pout[2], Pout[3], Pout[4], Pout[5], Pout[6]) sleep(t_sample) -- 延时 -- 可以通过该延时,调整机器人的速度 -- 理论上,机器人应该在t_sample时间上到达新的点 -- 此处的sleep时间不需要与JBI中设置的采样时间一致 -- 此处的sleep时间一般大于等于JBI中的采样时间 end set_global_variable("B000", 0) end set_global_variable("B000", 0) while true do B000 = get_global_variable("B000") if (B000 == 2) then -- JBI中将B000设置为2,lua开始计算 TT_circle_move() end sleep(0.1) end