本人所做的机器人项目涉及到机器人的自动化分拣领域,前两篇博客介绍了上位机与控制器的一些通讯问题,这些是信息传递的媒介,而最终还需要利用采集的物料信息,进行抓取,即对传送带上的物料进行动态分拣,因此本文介绍实现动态抓取的功能–飞锯(Flying-Saw),这是Twincat软件自带的功能,而我们在此基础上进行开发,实现基于传送带的动态抓取。
1.飞锯(Flying-Saw)功能的介绍1
飞锯是指从轴可以同步到正在运动的主轴,并与主轴同步运行以完成一个加工周期。
这种同步到主轴的运动,意味着工件可以在传输的过程中进行加工,一些工厂需要在工件运输的过程中进行加工,例如切割正在运输的木板,并且保证动态切割时方向垂直于木板,如图1所示。
飞锯功能的介绍在官方文档的介绍已经很清楚,在此不具体叙述,重点介绍实际应用。
2.飞锯功能在机器人动态抓取方面的应用
机器人动态抓取的项目需要在运动的传送带上抓取正在被输送的物料,如示意图图2,同时,由于物料在运动状态下被抓取,为了保证抓取准确性,需要有合适的算法进行抓取点的计算,我们在项目开发过程中用了两种方式进行抓取:
一是利用机器人运动参数,传送带速度以及相机拍摄物料的时刻和对应的位置坐标,求解出机器人和物料某一时刻的相遇点,进而执行抓取;
二是利用倍福的飞锯功能的速度同步,在机器人抓取时使其沿传送带方向的轴与传送带轴速度进行耦合叠加,到达物料上方时解耦并执行抓取,也能保证抓取的准确性。

本文主要介绍第二种方式,以直角坐标机器人为例,本人做了一个简易的流程图图3以供参考。

以下主要介绍应用飞锯功能进行动态抓取的关键步骤:
1).首先建立axis
下图中X,Y,Z,和Q1轴对应的是四轴坐标机器人的四个实际轴,需要链接plc变量和实际I/O,而X_1只链接plc,作为nc通道的x轴;Axis_band链接实际传送带轴,也是飞锯速度同步的主轴,Axis_slave链接plc虚轴,也是飞锯速度同步的虚轴。(Ps:执行飞锯功能时X轴是X_1和Axis_slave两个轴的速度叠加)
2).速度耦合
抓取动态的物体,需要进行速度叠加,即速度耦合,因此我们将与传送带进行同步的从轴Axis_slave和执行G代码插补nc通道的轴X_1进行耦合,输出的速度赋给实际io轴,如下:
fb_GEARMutil:MC_GearInMultiMaster;//声明速度耦合功能块
fb_GEARMutil(
Master1:=aAxis_xchannel , //执行G代码插补nc通道的轴X_1对应的变量
Master2:=aAxis_slave ,
Master3:= ,
Master4:= ,
Slave:=aAxis[0] , //实际IO轴
Enable:=b_gearin , //上升沿触发
GearRatio1:= 1,
GearRatio2:=1 ,
GearRatio3:=0 ,
GearRatio4:=0 ,
Acceleration:= ,
Deceleration:= ,
Jerk:= ,
BufferMode:= ,
Options:= ,
InGear=> ,
Busy=> ,
Active=> ,
CommandAborted=> ,
Error=> ,
ErrorID=> );
3).速度同步
接下来设置速度同步的功能块,速度加速度等参数按照轴参数进行设置。
fb_gearin_velo:MC_GearInVelo;//声明速度同步功能块
fb_gearin_velo(
Master:= aAxis_band ,
Slave:=aAxis_slave ,
Execute:=b_flygear , //上升沿触发
RatioNumerator:= 1,
RatioDenominator:=1 ,
SyncMode:= ,
Velocity:=400,
Acceleration:=15000 ,
Deceleration:=15000,
Jerk:= 30000,
BufferMode:= ,
Options:= ,
StartSync=> ,
InSync=> ,
Busy=> ,
Active=> ,
CommandAborted=> ,
Error=> ,
ErrorID=> );
4).执行抓取逻辑程序
执行抓取逻辑程序流程如图3所示,当物料进入抓取范围时,判断进入时触发主从轴同步。
b_flygear:=TRUE;
IF fb_gearin_velo.InSync THEN
Grab_start:=TRUE;//抓取执行标识位
END_IF
同步完成后执行G代码,当G代码运行到物料上方位置时,触发M函数执行从轴停止动作,取消同步。
fb_stop:mc_stop;//声明轴停止功能块
fb_stop(
Axis:=aAxis_slave ,
Execute:=b_stop ,//上升沿触发
Deceleration:=4633.33 ,
Jerk:=36697.1 ,
Options:= ,
Done=> ,
Busy=> ,
Active=> ,
CommandAborted=> ,
Error=> ,
ErrorID=> );
IF fb_stop.Done THEN
fb_stop(Axis:=aAxis_slave,Deceleration:=4633.33 ,Execute:=FALSE );
b_stop:=FALSE;
END_IF
随后机器人继续执行后续G代码,完成一整个抓放动作。
其中图3流程图中最后的框图中,还需要执行记录从轴位置动作,目的是为了方便下一次的绝对定位,因为我们项目G代码采用的时绝对定位,直线插补的方式,执行的是nc通道的轴X_1,而实际x轴的位置等于从轴axis_slave和通道中轴X_1的和,经过一次抓取后axis_slave的位置有相对偏移,却又无法在轴耦合的情况下置0位,若需要运动到实际位置,需要对X_1运行的目标位置作一定的偏移,我们用R参数记录axis_slave的位置,下一次抓取的实际目标位置减去该R参数,即为X_1轴运动的目标位置。
3.总结
通过运用飞锯功能的速度同步,在执行抓取前使x轴与传送带的速度进行同步,实现物料的动态抓取定位,免于设计计算动态抓取点的算法。
由于项目程序涉及产权保护,因此未全部进行上传,仅对应用飞锯功能的主要步骤进行阐述,建议先了解附录1内的飞锯功能介绍,方便理解。