案例/模板说明
机械臂主控程序说明
以下为机械臂主控的四种应用形式的模板代码,注意对工控机返回的 err_code 进行判断。
座标移动基础模板
-------------------------------CartMove Basic Template-------------------------------------
V_HOME_POSE = {user=0,tool=1,coordinate={240, 560, 90, -153, -14, 16}, joint={80, -50, -100, 90, 90, -30}}
V_PLACE_POSE = {user=0,tool=1,coordinate={-230, 540, -120, 175, 30, 0}}
V_SCAN_POSE = {user=0,tool=1,coordinate={-100, 650, 240, -180, 0, 0}}
function xyzMain()
-- S1: 初始化
local err_code = 0
local return_token = 0
local ws_id = 0
local flow_name = "cart_basic.t"
local item_codename = "item1"
--IO operation
DO(1, OFF)
-- 切换任务流图 ,默认被注释掉,如果需求可以取消注释
-- do
-- err_code = xyzSwitchFlow(flow_name)
-- xyzCheckErrorCode(err_code)
-- end
-- S3: 切换成当前工件
do
err_code = xyzSwitchItem(ws_id, item_codename)
xyzCheckErrorCode(err_code)
end
-- S4: 运动到 home 位
-- 首先移动到 home 点。注意需要先定义 V_HOME_POSE 的关节角度值
-- 或者用使用其他点来替代 V_HOME_POSE
do
--Speed(V_J_SPEED)
--Accel(V_J_ACC)
--MoveJ(V_HOME_POSE)
--Sync()
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
Move(V_HOME_POSE)
Sync()
end
-- 如果是眼在机械臂上的应用形式,请把 eye_on_hand 赋值为 true
eye_on_hand = false
while(true)
do
-- S5: 眼在机械臂上
if eye_on_hand then
-- S6: 运动到拍照位姿
-- 注意: 需要先定义拍照位姿,
-- 可以直接修改 V_SCAN_POSE 或者使用其他点位来替换
--走到眼在手上的拍照点,并发送当前拍照点位姿给上位机
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
Move(V_SCAN_POSE)
Sync()
-- S7: 发送拍照位姿
err_code = xyzSendCurrentCartPose()
xyzCheckErrorCode(err_code)
end
-- S8: 请求抓取点位
--请求计算抓取点(自带拍照功能)
err_code, return_token = xyzReqGraspPose(ws_id)
xyzCheckErrorCode(err_code)
local grasp_pose = {}
local grasp_pose_num = 0
local pipeline_num = 0
local register_num = 0
-- S9: 获取抓取点位
err_code, grasp_pose, grasp_pose_num, pipeline_num, register_num = xyzGetGraspPose(return_token)
xyzCheckErrorCode(err_code)
if grasp_pose_num < 1 then
--当前无可抓取工件,进行下一次拍照请求
print("No grasp_pose, continue requesting")
Sleep(5000) --5S
goto Continue
end
-- S10: 运动到抓取点并抓取工件
-- 注意: 可能需要添加其他路径点作为过渡
do
Pick = {user=0,tool=1,coordinate=grasp_pose}
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
-- 移动到预抓取点,偏移值可以根据实际需求修改
Move(RP(Pick, {0, 0, 100}))
-- 运动到抓取点
Move(Pick)
Sync()
DO(1, ON)
-- 移回预抓取点,偏移值可以根据实际需求修改
Move(RP(Pick, {0, 0, 100}))
end
-- S11: 运动到放置点并放置工件
-- 注意: 可能需要添加其他路径点作为过渡
-- 注意: 首先需要定义放置点位姿,
-- 可以直接修改 V_PLACE_POSE 或者使用其他点来替换
do
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
Move(V_PLACE_POSE)
Sync()
DO(1, OFF)
end
end
end
-- S2: 连接到工控机
xyzMasterConnect()
xyzMain()
xyzMasterClose()
座标移动二次定位模板:
-------------------------------CartMove Reposition Template-------------------------------------
V_HOME_POSE = {user=0,tool=1,coordinate={240, 560, 90, -153, -14, 16}, joint={80, -50, -100, 90, 90, -30}}
V_PLACE_POSE = {user=0,tool=1,coordinate={-230, 540, -120, 175, 30, 0}}
V_BOARD_PLACE_POSE = {user=0,tool=1,coordinate={-100, 650, 240, -180, 0, 0}}
function xyzMain()
-- S1: 初始化
local err_code = 0
local return_token = 0
local flow_name = "cart_repo.t"
local item_codename = "item1"
local ws_id = 0 --相机1
local ws_id_2 = 1 --相机2
--IO operation
DO(1,OFF)
-- 切换任务流图 ,默认被注释掉,如果需求可以取消注释
-- do
-- err_code = xyzSwitchFlow(flow_name)
-- xyzCheckErrorCode(err_code)
-- end
-- S3: 机械臂外的相机切换成识别当前工件
do
err_code = xyzSwitchItem(ws_id, item_codename)
xyzCheckErrorCode(err_code)
end
--IO operation
DO(1,OFF)
-- S4: 运动到 home 位
-- 首先移动到 home 点。注意需要先定义 V_HOME_POSE 的关节角度值
-- 或者用使用其他点来替代 V_HOME_POSE
do
--Speed(V_J_SPEED)
--Accel(V_J_ACC)
--MoveJ(V_HOME_POSE)
--Sync()
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
Move(V_HOME_POSE)
Sync()
end
while(true)
do
local rough_grasp_pose = {}
local rough_grasp_pose_num = 0
local rough_pipeline_num = 0
local rough_register_num = 0
-- S5: 请求工件的抓取位姿
err_code, return_token = xyzReqGraspPose(ws_id)
xyzCheckErrorCode(err_code)
-- S6: 获取工件的抓取位姿
--相机1获取工件粗定位抓取点
err_code, rough_grasp_pose, rough_grasp_pose_num, rough_pipeline_num, rough_register_num = xyzGetGraspPose(return_token)
xyzCheckErrorCode(err_code)
-- S7: 处理是否识别到工件
--无工件,抓隔板
if rough_grasp_pose_num < 1 then
local board_grasp_pose = {}
local board_grasp_pose_num = 0
local board_pipeline_num = 0
local board_register_num = 0
-- S15: 没有识别到工件,机械臂外的相机切换识别隔板
--相机1拍隔板
err_code = xyzSwitchItem(ws_id, "board")
xyzCheckErrorCode(err_code)
-- S16: 请求隔板抓取位姿
err_code, return_token = xyzReqGraspPose(ws_id)
xyzCheckErrorCode(err_code)
-- S17: 获取隔板的抓取位姿
--相机1获取隔板抓取点
err_code, board_grasp_pose, board_grasp_pose_num, board_pipeline_num, board_register_num = xyzGetGraspPose(return_token)
xyzCheckErrorCode(err_code)
if board_grasp_pose_num < 1 then
-- no board
--无隔板,此时也可以换料框
goto err_exit
end
-- S18: 运动到隔板抓取位姿,并抓取隔板
-- 注意: 可能需要添加其他路径点作为过渡
--抓隔板
local P = {user=0,tool=1,coordinate=board_grasp_pose}
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
-- 移动到隔板预抓取点,偏移值可以根据实际需求修改
Move(RP(P, {0, 0, 100}))
-- move to board grasp pose
Move(P)
Sync()
DO(1,ON)
-- 移回隔板预抓取点,偏移值可以根据实际需求修改
Move(RP(P, {0, 0, 100}))
-- S19: 运动到隔板的放置位姿
-- 注意: 可能需要添加其他路径点作为过渡
--放置隔板
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
Move(V_BOARD_PLACE_POSE)
Sync()
DO(1,OFF)
-- S20: 机械臂外的相机切换成识别当前工件
err_code = xyzSwitchItem(ws_id, item_codename)
xyzCheckErrorCode(err_code)
else --有工件,二次定位
-- S8: 运动到拍照位姿
-- 注意: 需要实现定义拍照位,或者根据机械臂外相机提供的抓取点位来确定,
-- 可以直接修改 rough_grasp_pose 或者使用其他点位替换
--走到工件粗定位点
local P = {user=0,tool=1,coordinate=rough_grasp_pose}
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
Move(P)
Sync()
-- S9: 发送拍照位姿
--发送当前眼在手上的拍照点位姿给上位机
err_code = xyzSendCurrentCartPose()
xyzCheckErrorCode(err_code)
-- S10: 机械臂上的相机切换成识别当前工件
--相机2对工件进行精定位拍照
err_code = xyzSwitchItem(ws_id_2, item_codename)
xyzCheckErrorCode(err_code)
-- S11: 请求机械臂上的相机获取工件抓取位姿
err_code, return_token = xyzReqGraspPose(ws_id_2)
xyzCheckErrorCode(err_code)
local fine_grasp_pose = {}
local fine_grasp_pose_num = 0
local fine_pipeline_num = 0
local fine_register_num = 0
-- S12: 获取工件的抓取位姿
--获取工件精定位抓取点
err_code, fine_grasp_pose, fine_grasp_pose_num, fine_pipeline_num, fine_register_num = xyzGetGraspPose(return_token)
xyzCheckErrorCode(err_code)
if fine_grasp_pose_num < 1 then
-- no object
goto err_exit
end
-- S13: 运动到工件的抓取位姿并进行抓取
-- 注意: 可能需要添加其他路径点作为过渡
--抓工件
local P = {user=0,tool=1,coordinate=fine_grasp_pose}
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
-- 移动到工件预抓取点,偏移值可以根据实际需求修改
Move(RP(P, {0, 0, 100}))
-- move to grasp pose
Move(P)
Sync()
DO(2, ON)
-- 移回工件预抓取点,偏移值可以根据实际需求修改
Move(RP(P, {0, 0, 100}))
-- S14: 运动到工件的放置位姿
-- 注意: 可能需要添加其他路径点作为过渡
--放置工件
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
Move(V_PLACE_POSE)
Sync()
DO(2, OFF)
end
end
::err_exit:: do
print("Error_Exit. Please Check")
return
end
end
-- S2: 连接到工控机
xyzMasterConnect()
xyzMain()
xyzMasterClose()
轨迹移动同步模板:
-------------------------------TrajMove Sync Template-------------------------------------
-- 注意: 使用 Sync() 函数可以使程序等待机械臂完成运动指令
-- 注意: 使用 Sync() 函数可以使程序等待机械臂完成运动指令
-- 注意: 使用 Sync() 函数可以使程序等待机械臂完成运动指令
function xyzMain()
-- S1: 初始化
local err_code = 0
local ws_id = 0
local flow_name = "traj_sync.t"
local item_codename = "item1"
--IO operation
DO(1,OFF)
-- 切换任务流图 ,默认被注释掉,如果需求可以取消注释
-- do
-- err_code = xyzSwitchFlow(flow_name)
-- xyzCheckErrorCode(err_code)
-- end
-- S3: 切换成当前工件
do
err_code = xyzSwitchItem(ws_id, item_codename)
xyzCheckErrorCode(err_code)
end
-- S4: 运动到 home 位
-- 首先移动到 home 点。注意需要先定义 home 的关节角度值
-- 或者用使用其他点来替代 home
do
--local home = {joint={80, -50, -100, 90, 90, -30}}
--Speed(V_J_SPEED)
--Accel(V_J_ACC)
--MoveJ(home)
--Sync()
local home = {coordinate={240, 560, 90, -153, -14, 16}}
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
Move(home)
Sync()
end
while(true)
do
local pipeline_num = 0
local register_num = 0
local wp_num = 0
local wp_type = {}
local wp = {}
-- S5: 请求抓取和放置规划
err_code = xyzReqPickPlace(ws_id)
xyzCheckErrorCode(err_code)
-- S6: 获取 pick-in 轨迹
err_code, pipeline_num, register_num, wp_num, wp_type, wp = xyzGetPickin(ws_id)
xyzCheckErrorCode(err_code)
-- S7: 判断是否识别到工件
--if tote cleared, exit
if wp_num == 0 then
print("tote clear")
goto clear_tore_exit
end
-- S8: 执行 pick-in 轨迹
if xyzExecuteTraj(wp_num, wp_type, wp) ~= 0 then
print("Execute pick in error")
goto err_exit
end
Sync()
--IO operation
DO(1, ON)
-- S9: 获取 pick-out 轨迹
err_code, pipeline_num, register_num, wp_num, wp_type, wp = xyzGetPickout(ws_id)
xyzCheckErrorCode(err_code)
-- S10: 执行 pick-out 轨迹
if xyzExecuteTraj(wp_num, wp_type, wp) ~= 0 then
print("Execute pick out error")
goto err_exit
end
-- S11: 获取 place-in 轨迹
err_code, pipeline_num, register_num, wp_num, wp_type, wp = xyzGetPlacein(ws_id)
xyzCheckErrorCode(err_code)
-- S12: 执行 place-in 轨迹
if xyzExecuteTraj(wp_num, wp_type, wp) ~= 0 then
print("Execute place in error")
goto err_exit
end
Sync()
--IO operation
DO(1, OFF)
-- S13: 获取 place-out 轨迹
err_code, pipeline_num, register_num, wp_num, wp_type, wp = xyzGetPlaceout(ws_id)
xyzCheckErrorCode(err_code)
-- S14: 执行 place-out 轨迹
if xyzExecuteTraj(wp_num, wp_type, wp) ~= 0 then
print("Execute place out error")
goto err_exit
end
end
-- 处理其他异常情况
::err_exit:: do
print("Error_Exit. Please Check the error code")
return
end
::clear_tore_exit:: do
print("work done: tote has been cleared")
return
end
end
-- S2: 连接到工控机
xyzMasterConnect()
xyzMain()
xyzMasterClose()
轨迹移动异步模板:
-------------------------------TrajMove ASync Template-------------------------------------
-- 注意: 使用 Sync() 函数可以使程序等待机械臂完成运动指令
-- 注意: 使用 Sync() 函数可以使程序等待机械臂完成运动指令
-- 注意: 使用 Sync() 函数可以使程序等待机械臂完成运动指令
function xyzMain()
-- S1: 初始化
local err_code = 0
local ws_id = 0
local flow_name = "traj_async.t"
local item_codename = "item1"
--IO operation
DO(1,OFF)
-- 切换任务流图 ,默认被注释掉,如果需求可以取消注释
-- do
-- err_code = xyzSwitchFlow(flow_name)
-- xyzCheckErrorCode(err_code)
-- end
-- S3: 切换成当前工件
do
err_code = xyzSwitchItem(ws_id, item_codename)
xyzCheckErrorCode(err_code)
end
-- S4: 运动到 home 位
-- 首先移动到 home 点。注意需要先定义 home 的关节角度值
-- 或者用使用其他点来替代 home
do
--local home = {joint={80, -50, -100, 90, 90, -30}}
--Speed(V_J_SPEED)
--Accel(V_J_ACC)
--MoveJ(home)
--Sync()
local home = {coordinate={240, 560, 90, -153, -14, 16}}
SpeedS(V_TCP_SPEED)
AccelS(V_TCP_ACC)
Move(home)
Sync()
end
-- S5: 请求抓取和放置规划
err_code = xyzReqPickPlace(ws_id)
xyzCheckErrorCode(err_code)
while(true)
do
local pipeline_num = 0
local register_num = 0
local wp_num = 0
local wp_type = {}
local wp = {}
-- S6: 获取 pick-in 轨迹
err_code, pipeline_num, register_num, wp_num, wp_type, wp = xyzGetPickin(ws_id)
xyzCheckErrorCode(err_code)
-- S7: 判断是否识别到工件
--if tote cleared, exit
if wp_num == 0 then
print("tote clear")
goto clear_tore_exit
end
-- S8: 执行 pick-in 轨迹
if xyzExecuteTraj(wp_num, wp_type, wp) ~= 0 then
print("Execute pick in error")
goto err_exit
end
Sync()
--IO operation
DO(1, ON)
-- S9: 获取 pick-out 轨迹
err_code, pipeline_num, register_num, wp_num, wp_type, wp = xyzGetPickout(ws_id)
xyzCheckErrorCode(err_code)
-- S10: 执行 pick-out 轨迹
if xyzExecuteTraj(wp_num, wp_type, wp) ~= 0 then
print("Execute pick out error")
goto err_exit
end
Sync()
-- S11: 请求下一次的抓取和放置规划
-- request next pick and place plan in advance
err_code = xyzReqPickPlace(ws_id)
xyzCheckErrorCode(err_code)
-- S12: 获取本次 place-in 轨迹
err_code, pipeline_num, register_num, wp_num, wp_type, wp = xyzGetPlacein(ws_id)
xyzCheckErrorCode(err_code)
-- S13: 执行本次 place-in 轨迹
if xyzExecuteTraj(wp_num, wp_type, wp) ~= 0 then
print("Execute place in error")
goto err_exit
end
Sync()
--IO operation
DO(1, OFF)
-- S14: 获取本次 place-out 轨迹
err_code, pipeline_num, register_num, wp_num, wp_type, wp = xyzGetPlaceout(ws_id)
xyzCheckErrorCode(err_code)
-- S15: 执行本次 place-out 轨迹
if xyzExecuteTraj(wp_num, wp_type, wp) ~= 0 then
print("Execute place out error")
goto err_exit
end
end
-- 处理其他异常情况
::err_exit:: do
print("Error_Exit. Please Check the error code")
return
end
::clear_tore_exit:: do
print("work done: tote has been cleared")
return
end
end
-- S2: 连接到工控机
xyzMasterConnect()
xyzMain()
xyzMasterClose()