透传(外部实时控制)在JBI与LUA中的使用


透传(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
点击显示全文
赞同0
发表评论
分享

手机扫码分享
0
698
收藏
举报
收起
登录
  • 密码登录
  • 验证码登录
还没有账号,立即注册
还没有账号,立即注册
注册
已有账号,立即登录
选择发帖板块
举报
请选择举报理由
举报
举报说明