在机器人应用中,最常见的就是搬运任务。门型框式轨迹是搬运任务的基础,各种形式的运动轨迹都是由门型框轨迹为基础变化而来,而上下料、码垛等复杂搬运任务都是将这些门型框变化而来的运动轨迹串联而成的。
当机器人需要将一个物体从点A移动到点B时,为了避免物体受到摩擦、碰撞,机器人从点A拿取物体后需要将物体垂直向上提起一段距离再进行移动,提起后的位置为点A’。为了尽可能减少搬运时间,机器人应直接将物体先移动到目标的点B的上方,即点B’,然后轻轻放置于点B。因此形成了门型的轨迹:A -> A’ -> B’ -> B。而为了下一次抓取,机器人一般会反向沿着同样轨迹回到A点,即B->B’->A’->A。这个轨迹能有效避免机器人使用的夹具对已经放置于点B的物体以及对处于A点待机的下一个物体造成位移。根据实际情况,有时候机器人可以使用轨迹B->A’->A或轨迹B->B’->A乃至轨迹B->A回到拿取位置。
首先从基础的拿取以及复位轨迹开始讲解,即轨迹A -> A’ -> B’ -> B与轨迹B->B’->A’->A。如上图,A -> A’、B’ -> B、B->B’、A’->A四条路径都应为直线,最大程度避免了对物体照成位移、摩擦、碰撞等负面影响。而A’ -> B’与 B’->A’两条路径则不一定为直线,对于大部分机器人来说,直线虽然是最短的路线但不一定是最快的路线,通常使用关节插补能保证机器人最效率、最舒适地完成运动路径,也能够回避潜在的奇异点以及目标点存在多解等问题。
艾利特机器人使用P变量以及V变量保存坐标信息。
因此,推荐使用P变量记录点A’与点B’的位置,用V变量记录点A与点B的位置。
将轨迹种类和变量都规划好后,即可开始制作程序的雏形。任务的需求是:V1 ->P1 -> P2 -> V2->P2->P1->V1循环,流程明细后则是:
从流程6回到流程1循环。
艾利特EC系列所需的JBI程序如下:
物品的搬运当然离不开物体的取放。艾利特机器人适配多种夹爪、气爪。艾利特的工程师们已经为生态合作的设备写好了需要的脚本,用户只需要调用特定的开合夹爪(开关气爪)用的JBI子程序或者输出特定的变量就可以控制手爪。假设机器人装配了On Robot的VGC10气爪,在程序中合适的位置加入控制夹爪的子程序指令后,程序变为如下:
此时,将示教器转到自动(Play)模式,将循环模式更改为连续循环就可以开始重复抓取放下作业。然而实际运行起来后,结果其实多半不会像想象的那么流畅。这个程序以及运作方式还有很多细节需要优化。
可选细节优化:
首先是第一个优化点:程序首次次运行的时候,机器人直接就从当前位置移动到点V1了,这很容易造成拿取物体被位移甚至碰撞,因此需要保证第一次运行的时候,机器人处在待机位置P1。最简单的方案是将上图中的第九行程序剪切粘贴至第一行(程序中实际为第二行,并会将原本的程序从第二行向下挤),但为了后续的其他优化,这里采取另一种方案:追加一个MOVJ P001的指令,并让其他部分的程序循环。
循环的方式可以使用While循环指令,也可以用Label标签指令+If指令+Jump跳转指令完成与While循环同样的效果。下图中的例子将会一直循环拿取取放任务,所以自动模式下不用设置连续循环,使用单次循环即可。
第三行While 1=1的部分可以根据实际需求进行调整,增加一个停止任务的功能。比如变量M600置1时停止任务。即将While条件改为While M600 <> 1(或While M600 = 0),并使用按钮连接输入端口,通过EC内置的用户PLC控制M600或者SDK端口等手段即可自由控制停止任务。
第二个优化点:机器人节拍过长,不仅速度不快,运动过程中每到一个点还会停一下。首先解决每到一个点还会停一下的问题。搬运任务中需要停下来的仅有拿取点和放置点而已,其他位置需要圆滑地快速度过,可以通过修改CR参数而达到这一目的。简单来说CR就是往下一个点交融的半径,并不会影响下一个目标点运动的后半段动作,因此取放点和程序最后一个点以外的点都可以将CR尽可能地设置得大一点。(较新的版本会提示用户可以设置的最大值)
接着把系统运行程序的速度调到100%。而在JBI程序中,先把各行MOV指令的加速度都调至最大。减速度则是取放位调低一点,其他位置调至最大。MOVL指令的速度可以先调至1000mm/s,如果测试时觉得不够快可以逐渐增加500mm/s直到满意为止的方式调试。下图中是直接调到了最大值的3000mm/s。MOVJ的速度调试推荐从30%开始,然后调试时以15%的幅度边增加边测试直到满意为止。下图是直接调到了最大值的100%。
第三个优化点:拿取时可能会出现气爪还未抓住物体,机器人就已经移开了的情况,放置时也可能会出现气爪还未松开物体,机器人就已经移开了的情况,导致物体掉落损坏。可以通过添加等待指令避免机器人过早移开。既可以等待一定时间,也可以等待手爪的反馈信号。一般来说调动的控制气爪的子程序中会内置等待指令,用户也可以直接调节子程序里面的参数。
至此,一个以门型框轨迹为基础的搬运程序就完成了。当然,根据实际需求还有很多可以调整和优化的地方。
其他优化举例:
举例1. 比如加装感应器确认物体到达拿取位置后,机器人才会去执行拿取任务;以及通过感应器确认上次搬运的物体已经离开放置区后,机器人再执行放置任务。假设两个感应器分别连接到了X004和X005上。可以对程序添加Wait指令确认拿取区和放置区的状态。
这种简单的信号等待用法也可以应用在包括但不限于以下场景:
举例2. 每次调用打开或关闭夹爪(启动或关闭气爪)的子程序时,子程序都会重新初始化相关Lua脚本,因此每次打开夹爪或关闭夹爪都会花不少等待时间,因此将子程序中初始化脚本的指令单独提取出作为独立子程序,在主程序运行一次即可,让后续打开或关闭夹爪的子程序不再需要初始化脚本,提高节拍速度。
举例3. 需要拿取的物体可能会被随机摆放,因此需要视觉系统辅助机器人定位。照相机通过脚本与机器人完成数据交换。固定在机器人上的照相机需要机器人移动到特定位置后发送特定指令,然后机器人会收到计算完成的反馈信号、目标坐标、目标上方坐标。下图例子中反馈信号为D001和D010,拿取目标坐标为P005,拿取目标坐标上方为P006。
NOP //Initialize Camera SET D001 0.0 SET D010 0 STARTLUA INDEX=2 //Wait Camera Ready WHILE M#(600)<>1 DO SET D001 0.0 SET D010 0 TIMER T=2.0 S WAIT D010=1 TIMER T=2.0 S //Move To photo taking point MOVJ P011 VJ=100% PL=0 TIMER T=1.0 S SET D001 5 WAIT D001=0 TIMER T=5.0 S //Pick Up MOVJ P006 VJ=100% CR=0.0MM ACC=50 DEC=50 MOVL P005 AV=50.0MM/S PL=0 #CALL JOB:VG10_A_GRIP TIMER T=0.5 S MOVL P006 V=3000MM/S CR=100.0MM ACC=100 DEC=100 //Place MOVJ P002 VJ=100% CR=100.0MM ACC=100 DEC=100 MOVL V002 V=3000MM/S CR=0.0MM ACC=100 DEC=50 #CALL JOB:VG10_A_RELEASE TIMER T=0.5 S MOVL P002 V=3000MM/S CR=100.0MM ACC=100 DEC=100 MOVJ P001 VJ=100% CR=0.0MM ACC=100 DEC=100 ENDWHILE END