CSロボットシステムにはパレタイジング アプリが組み込まれています。
下記のようにティーチングした 4 つのコーナーポイントを使用し、各行/列の番号を設定して、パレタイジングを自動的に完了します。
次のリンクからコードを直接ダウンロードし、実際のプロセスに応じてスクリプト内で変更できます。
ダウンロードリンク:
手順:
1. 添付ファイルをインポートします:default.configuration.variables、pallet4.task、および Pallet4ponit.script
2. 4 つのポイントを時計回りまたは反時計回りに設定します。Waypoint_1 ~ Waypoint_4 は正方形トレイのスタックポイントです。 そして、それらをパレタイジングタスクツリーの前に割り当てる、MoveJ コマンドの前に IF false を使用することをお勧めします。
3.「pPick_p」ポイントはピックポイントで、「Ctrl_base_frame」は通常基盤座標として設定されます。
var1= PalletDemo(掴み取り_p,ウェポイント_1_p,ウェポイント_2_p,ウェポイント_3_p,ウェポイント_4_p,0.2,2,2,2,Ctrl_base_frame)
下の図のように:
4.このプログラムを実行すると、パレタイジングを実現できます。ここに Pallet4ponit.script を添付します。
# author: chenliao@elibot.cn
# Mar.22, 2023
#******************
# ユーザー修正用
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、p30、p40 は 4 ポイント、p10 から p20 までが行方向、p10 から p40 までが列です。
# p10、p20、p30、p40 の座標はベース座標に基づいています。
# スタックポイント数は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) # get the current layer number
no_in_layer = curr_no %(no_row*no_col) # get the ordinal number in current layer
curr_row = (no_in_layer) % no_row # get the ordinal number in row(starts from 0)
curr_col = (no_in_layer) //no_row # get the ordinal number in col(starts from 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
# ユーザー座標からベース座標に座標を転送します
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]):
#グローバル変数「pall_count」は、現在のパレット数をリアルタイムで保存するために使用されます。
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