样例程序19:MM_S19_Vis_PlanAllVision
程序简介
功能说明 |
机器人先触发Mech-Vision工程运行,然后通过循环获取所有规划路径,进而通过循环进行抓取与放置操作。在本样例中,相机拍照一次,Mech-Vision会规划出全部视觉结果的抓取路径。通常用于一拍多抓的场景。 |
文件路径 |
Mech-Vision和Mech-Viz软件安装目录下 |
所需工程 |
|
使用前提 |
此样例程序仅是示例程序。用户需根据实际情况在此基础上进行修改,请勿直接使用该程序。 |
程序解读
以下为MM_S19_Vis_PlanAllVision样例程序的代码及相关解释说明。
与MM_S3_Vis_Path样例相比,本样例仅新增了通过循环获取所有规划路径并进行抓取与放置的功能(加粗部分的代码)。因此,下文不再重复解释与MM_S3_Vis_Path样例相同部分的代码(详情请参考MM_S3_Vis_Path样例说明)。 |
DEF MM_S19_Vis_PlanAllVision ( )
;---------------------------------------------------
; FUNCTION: trigger Mech-Vision project, plan all
; vision results and get all planned paths
; Mech-Mind, 2023-12-25
;---------------------------------------------------
;set current tool no. to 1
BAS(#TOOL,1)
;set current base no. to 0
BAS(#BASE,0)
;move to robot home position
PTP HOME Vel=100 % DEFAULT
;initialize communication parameters (initialization is required only once)
MM_Init_Socket("XML_Kuka_MMIND",873,871,60)
RECAP:
;move to image-capturing position
LIN camera_capture Vel=1 m/s CPDAT1 Tool[1] Base[0]
;trigger Mech-Viz project
MM_Start_Vis(1,0,2,init_jps)
;get planned path from NO.1 Mech-Vision project; 2nd argument (1) means getting pose in JPs
MM_Get_Vispath(1,1,pos_num,vis_pos_num,status)
;check whether planned path has been got from Mech-Vision successfully
IF status<> 1103 THEN
;add error handling logic here according to different error codes
;e.g.: status=1003 means no point cloud in ROI
;e.g.: status=1002 means no vision results
halt
ENDIF
;save waypoints of the planned path to local variables one by one
FOR count=1 TO pos_num
MM_Get_Jps(count,pick_point[count],label[count],toolid[count])
ENDFOR
;parse pick cycle count, here suppose 5 points per planned path
pick_cnt = pos_num / 5
residual = pos_num - pick_cnt*5
;check if parsed data is valid; if not, retry to get planned path or add some error handling logic
IF (pick_cnt<1) OR (residual<>0) THEN
halt
GOTO RECAP
ENDIF
;repeatedly run pick-and-place cycle using for-loop
FOR i=1 TO pick_cnt
count=(i-1)*5
Xpick_point1=pick_point[1+count]
Xpick_point2=pick_point[2+count]
Xpick_point3=pick_point[3+count]
Xpick_point4=pick_point[4+count]
Xpick_point5=pick_point[5+count]
;follow the planned path to pick
;move to approach waypoint of picking
PTP pick_point1 CONT Vel=50 % PDAT1 Tool[1] Base[0]
PTP pick_point2 Vel=50 % PDAT2 Tool[1] Base[0]
PTP pick_point3 Vel=10 % PDAT3 Tool[1] Base[0]
;add object grasping logic here, such as "$OUT[1]=TRUE"
halt
PTP pick_point4 Vel=50 % PDAT5 Tool[1] Base[0]
PTP pick_point5 CONT Vel=50 % PDAT6 Tool[1] Base[0]
;move to intermediate waypoint of placing
PTP drop_waypoint CONT Vel=100 % PDAT4 Tool[1] Base[0]
;move to approach waypoint of placing
LIN drop_app Vel=1 m/s CPDAT2 Tool[1] Base[0]
;move to placing waypoint
LIN drop Vel=0.3 m/s CPDAT3 Tool[1] Base[0]
;add object releasing logic here, such as "$OUT[1]=FALSE"
halt
;move to departure waypoint of placing
LIN drop_app Vel=1 m/s CPDAT2 Tool[1] Base[0]
;move to intermediate waypoint of placing
PTP drop_waypoint CONT Vel=100 % PDAT4 Tool[1] Base[0]
ENDFOR
;finish pick and-place cycle, and jump back to camera capturing
GOTO RECAP
END
上述样例程序代码对应的流程如下图所示。

下表为新增功能的逻辑解读。用户单击指令名称的超链接便可查看该指令的详细说明。
流程 | 代码及说明 |
---|---|
通过循环转存规划路径 |
|
计算pick_cnt和residual |
本样例假设每次规划的抓取路径包含5个路径点,“pos_num / 5”表示pose_num整除5的商,“pos_num - pick_cnt*5”表示pose_num整除5的余数。pick_cnt表示规划的总抓取次数。如果residual不为0,则表示某次规划的抓取路径点个数少于5,即路径规划出现异常,需重新进行规划。 |
判断规划路径是否出错 |
如果抓取次数pick_cnt小于1,或residual不为0,则表示路径规划出现异常,用户需在此处添加处理逻辑,例如重新触发Mech-Vision工程并获取规划路径。 |
通过循环进行抓取和放置 |
上述代码表示,在FOR循环中,机器人移动到每次规划的5个路径点,从而完成抓取操作,然后接着执行放置操作。i用于控制循环的次数,即i从1开始,每次循环后自增1,直到大于抓取次数pick_cnt,结束循环。每当i增加1,则count增加5,从而使[1+count]~[5+count]表示每次规划的5个路径点在总规划路径中的编号。 |