【CSJP008】 4点をティーチングしてパレタイジングの実現

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


点击显示全文
赞同0
发表评论
分享

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