CS机器人自带码垛包,采用如上示教4个角点,设置每行/列个数自动完成码垛。
对于以上的代码简化实现,可以直接下载以下链接的代码,并根据实际工艺在脚本中修改。
链接:https://pan.baidu.com/s/1lmBxH6k3nqSe-b1o1cDkWw
提取码:9e8i
1. 导入附件的default.configuration.variables,pallet4.task和Pallet4ponit.script
2. 全局变量pall_count用于实时保存当前码垛个数
3. 码垛关键点路点_1到路点_4设置位置如下图,即p1到p2为第一个方向,p1到p4为第二个方向
4. 实例函数PalletDemo参数包括:
抓取位置,
码垛关键点1,
码垛关键点2,
码垛关键点3,
码垛关键点4,
每一层高度(例如下图的0.2m)
第一个方向个数(例如下图的4,对应上图第一个方向为4个)
第二个方向个数(例如下图的3,对应上图第二个方向为3个)
高度方向个数(例如下图的2)
参考用户坐标系(可以不使用,默认参考base),若使用了参考坐标系,高度方向沿着坐标系方向的z方向,前置点沿着坐标系方向的z方向
4点计算码垛位置代码如下:
#****************** # 用户修改区 def GripperClose(): # 用户根据实际编写 sleep(0.1) def GripperOpen(): # 用户根据实际编写 sleep(0.1) # 用户修改区 #****************** def pallet(curr_no,p10,p20,p30,p40,height,no_row,no_col,no_layer,user = [0,0,0,0,0,0]): # 输入当前码垛个数,第一到第四个点,其中p10-p20为row方向,p10-p40为col方向 # p10,p20,p30,p40基于base # 码垛个数从0开始 # height为层高,可以是负数 # no_row:第一个方向的个数 # no_col: 第二个方向的个数 # no_layer: 高度方向个数 p1 = p10.copy() p2 = p20.copy() p3 = p30.copy() p4 = p40.copy() p1_in_user = pose_trans(pose_inv(user),p1) p2_in_user = pose_trans(pose_inv(user),p2) p3_in_user = pose_trans(pose_inv(user),p3) p4_in_user = pose_trans(pose_inv(user),p4) curr_layer = curr_no //(no_row*no_col) #获取在第几层 no_in_layer = curr_no %(no_row*no_col) #获取在该层第几个 curr_row = (no_in_layer) % no_row # 获取第几行(从0开始) curr_col = (no_in_layer) //no_row # 获取第几列(从0开始) if no_row==1 : no_row=2 if no_col==1: no_col =2 outpos1 = interpolate_pose(p1_in_user,p2_in_user,curr_row/(no_row-1)) outpos2 = interpolate_pose(p4_in_user,p3_in_user,curr_row/(no_row-1)) outpos3 = interpolate_pose(outpos1,outpos2,curr_col/(no_col-1)) outpos3[2] = outpos3[2] + height*curr_layer # 把用户坐标系下的值转会base下并返回 return pose_trans(user,outpos3) def Offs(p, x, y, z): p1 =p.copy() p1[0] = p1[0]+x p1[1] = p1[1]+y p1[2] = p1[2]+z return p1 def OffsInUser(p, x, y, z,user=[0,0,0,0,0,0]): p1 =p.copy() p1_in_user = pose_trans(pose_inv(user),p1) p1_in_user[0] = p1_in_user[0]+x p1_in_user[1] = p1_in_user[1]+y p1_in_user[2] = p1_in_user[2]+z return pose_trans(user,p1_in_user) def PalletDemo(pPick,p1,p2,p3,p4,height,no_row,no_col,no_layer,user=[0,0,0,0,0,0]): global pall_count movej(get_inverse_kin(pPick),r=0) #pall_count = 0 while (pall_count<(no_row*no_col*no_layer)): movej(get_inverse_kin(pPick),r=0) GripperClose() # 抓取动作 pallet_pose = pallet(pall_count, p1, p2, p3, p4,height,no_row, no_col,no_layer,user) pre_pose = OffsInUser(pallet_pose, 0, 0, 0.15,user) movej(get_inverse_kin(pre_pose),v=d2r(200),r=0.2) movel(Offs(pallet_pose, 0, 0, 0),v=0.2,r=0) # 放置 GripperOpen() movel(pre_pose,v=0.5,r=0.2) pall_count =pall_count+1 #完成码垛,结束循环 pall_count = 0 movej(get_inverse_kin(pPick),r=0) return True