样例程序20:MM_S20_Viz_PlanAllVision
程序简介
功能说明 |
机器人先触发Mech-Viz工程运行,然后通过循环获取所有规划路径,进而通过循环进行抓取与放置操作。在本样例中,相机拍照一次,Mech-Viz会规划出全部视觉结果的抓取路径。通常用于一拍多抓的场景。 |
||
文件路径 |
Mech-Vision和Mech-Viz软件安装目录下 |
||
所需工程 |
Mech-Vision工程和Mech-Viz工程
![]() |
||
使用前提 |
此样例程序仅是示例程序。用户需根据实际情况在此基础上进行修改,请勿直接使用该程序。 |
程序解读
以下为MM_S20_Viz_PlanAllVision样例程序的代码及相关解释说明。
与MM_S2_Viz_Basic样例相比,本样例仅新增了通过循环获取所有规划路径并进行抓取与放置的功能(加粗部分的代码)。因此,下文不再重复解释与MM_S2_Viz_Basic样例相同部分的代码(详情请参考MM_S2_Viz_Basic样例说明)。 |
DEF MM_S20_Viz_PlanAllVision ( )
;---------------------------------------------------
; FUNCTION: trigger Mech-Viz project, plan all
; vision results and get all planned results using
; command 210
; 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_Viz(2,init_jps)
;get planned path
MM_Get_PlanData(0,3,pos_num,vis_pos_num,status)
;check whether planned path has been got from Mech-Viz successfully
IF status<> 2100 THEN
;add error handling logic here according to different error codes
;e.g.: status=2038 means no point cloud in ROI
halt
ENDIF
;save waypoints of the planned path to local variables one by one
FOR count=1 TO pos_num
MM_Get_PlanJps(count,3,pick_point[count],move_type[count],tool_num[count],speed[count])
ENDFOR
;parse pick cycle count, here suppose 3 points per planned path
pick_cnt = pos_num / 3
residual = pos_num - pick_cnt*3
;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)*3
Xpick_point1=pick_point[1+count]
Xpick_point2=pick_point[2+count]
Xpick_point3=pick_point[3+count]
;move to intermediate waypoint of picking
PTP pick_waypoint CONT Vel=50 % PDAT7 Tool[1] Base[0]
;follow the planned path to pick
PTP pick_point1 Vel=50 % PDAT1 Tool[1] Base[0]
PTP pick_point2 Vel=10 % PDAT2 Tool[1] Base[0]
;add object grasping logic here, such as "$OUT[1]=TRUE"
halt
PTP pick_point3 Vel=50 % PDAT3 Tool[1] Base[0]
;move to intermediate waypoint of placing
PTP drop_waypoint CONT Vel=100 % PDAT2 Tool[1] Base[0]
;move to approach waypoint of placing
LIN drop_app Vel=1 m/s CPDAT3 Tool[1] Base[0]
;move to placing waypoint
LIN drop Vel=0.3 m/s CPDAT4 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 CPDAT3 Tool[1] Base[0]
;move to intermediate waypoint of placing
PTP drop_waypoint CONT Vel=100 % PDAT2 Tool[1] Base[0]
ENDFOR
;finish pick and-place cycle, and jump back to camera capturing
GOTO RECAP
END
上述样例程序代码对应的流程如下图所示。

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