问题反馈

样例程序20:MM_S20_Viz_PlanAllVision

您正在查看最新版本(V2.1.0)的文档。如果您想查阅其他版本的文档,可以点击页面右上角“切换版本”按钮进行切换。

■ 如果您不确定当前使用的产品是哪个版本,请随时联系梅卡曼德技术支持。

程序简介

功能说明

机器人先触发Mech-Viz工程运行,然后通过循环获取所有规划路径,进而通过循环进行抓取与放置操作。在本样例中,相机拍照一次,Mech-Viz会规划出全部视觉结果的抓取路径。通常用于一拍多抓的场景。

文件路径

Mech-Vision和Mech-Viz软件安装目录下Communication Component/Robot_Interface/KUKA/sample/MM_S20_Viz_PlanAllVision

所需工程

Mech-Vision工程和Mech-Viz工程

Mech-Viz工程需满足以下配置:视觉移动步骤的复用视觉结果参数需处于勾选状态。
sample20 1

使用前提

  1. 已完成标准接口通信配置

  2. 已完成自动标定

此样例程序仅是示例程序。用户需根据实际情况在此基础上进行修改,请勿直接使用该程序。

程序解读

以下为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

上述样例程序代码对应的流程如下图所示。

sample20

下表为新增功能的逻辑解读。用户单击指令名称的超链接便可查看该指令的详细说明。

流程 代码及说明

获取规划路径

;get planned path
MM_Get_PlanData(0,3,pos_num,vis_pos_num,status)
  • MM_Get_PlanData:获取规划路径的指令。通过该指令获取的视觉移动路径点,除了包含位姿外,还将包含视觉移动规划数据或自定义数据(如有),而通过MM_Get_VizData指令获取的视觉移动路径点将不包含视觉移动规划数据或自定义数据。

  • 0:从Mech-Viz获取规划路径。

  • 3:预期返回的数据格式,即以“位姿(关节角形式),移动类型,末端工具编号,速度,Mech-Viz视觉移动规划数据,自定义数据项1,…,自定义数据项N”格式返回数据。

  • pose_num:该变量保存视觉系统返回的路径点个数。

  • vis_pose_num:该变量保存最后一个视觉移动路径点(抓取点)在总规划路径中的位置编号。

  • status:该变量保存指令执行的状态码。

通过循环转存规划路径

FOR count=1 TO pos_num
MM_Get_PlanJps(count,3,pick_point[count],move_type[count],tool_num[count],speed[count])
ENDFOR
  • 第1行:FOR表示以下为循环程序片段;count用于控制循环的次数(即count从1开始,每次循环后自增1,直到大于pose_num,结束循环);pose_num为MM_Get_PlanData指令的第三个参数,该参数表示视觉系统返回的路径点个数。

  • 第2行:MM_Get_PlanJps指令表示将某个路径点的关节角、移动类型、末端工具编号和速度分别转存到指定变量,因此整条指令表示将第count编号的路径点的关节角、移动类型、末端工具编号和速度依次转存到pick_point[count]、move_type[count]、tool_num[count]和speed[count]变量。

  • 第3行:结束FOR循环。

计算pick_cnt和residual

;parse pick cycle count, here suppose 3 points per planned path
pick_cnt = pos_num / 3
residual = pos_num - pick_cnt*3

本样例假设每次规划的抓取路径包含3个路径点,“pick_cnt = pos_num / 3”表示pose_num整除3的商,“pos_num - pick_cnt*3”表示pose_num整除3的余数。pick_cnt表示规划的总抓取次数。如果residual不为0,则表示某次规划的抓取路径点个数少于3,即路径规划出现异常,需重新进行规划。

判断规划路径是否出错

IF (pick_cnt<1) OR (residual<>0) THEN
   halt
   GOTO RECAP
ENDIF

如果抓取次数pick_cnt小于1,或residual不为0,则表示路径规划出现异常,用户需在此处添加处理逻辑,例如重新触发Mech-Viz工程并获取规划路径。

通过循环进行抓取和放置

   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

上述代码表示,在FOR循环中,机器人移动到每次规划的3个路径点,从而完成抓取操作,然后接着执行放置操作。i用于控制循环的次数,即i从1开始,每次循环后自增1,直到大于抓取次数pick_cnt,结束循环。每当i增加1,则count增加3,从而使[1+count]~[3+count]表示每次规划的3个路径点在总规划路径中的编号。

我们重视您的隐私

我们使用 cookie 为您在我们的网站上提供最佳体验。继续使用该网站即表示您同意使用 cookie。如果您拒绝,将使用一个单独的 cookie 来确保您在访问本网站时不会被跟踪或记住。