方案部署
本节将介绍如何进行高反光圆盘方案部署,总体流程如下图所示。
视觉系统硬件搭建
视觉系统硬件搭建是将硬件设备(相机和工控机)集成到实际工作环境中,以支持视觉系统的正常运行。
在该阶段,你需要完成视觉系统硬件的安装与连接。详细信息请参考视觉系统硬件搭建。
机器人通信配置
机器人通信配置前,需先获取方案。请单击此处查看方案获取方法。
-
打开Mech-Vision软件。
-
在Mech-Vision欢迎页中单击从案例库新建按钮,打开案例库。
-
进入案例库中的典型案例分类,单击右上角的 图标以获取更多资源,并在弹出的窗口中单击确定按钮。
-
获取案例资源后,选择有序工件拣选分类下的高反光圆盘,在下方填写方案名称和路径,最后单击创建按钮,并在弹出的窗口中单击确定按钮下载高反光圆盘方案。
下载完成后,在Mech-Vision中将自动打开该方案。
在配置视觉工程前,需要完成梅卡曼德视觉系统与机器人侧(机器人、PLC 或上位机)的通信对接。
高反光圆盘方案使用标准接口通信,具体操作方法请参考标准接口通信配置。
手眼标定
手眼标定是指建立相机坐标系与机器人坐标系对应关系的过程,将视觉系统确定的物体位姿转换为机器人坐标系下的位姿,从而引导机器人精准完成抓取任务。
请参考机器人手眼标定操作指南完成手眼标定。
每次安装相机后,或标定后相机与机器人的相对位置发生变化时,都需要重新进行手眼标定。 |
视觉工程配置
完成通信配置和手眼标定后,即可使用Mech-Vision进行视觉工程配置。
视觉工程配置的流程如下图所示。
连接相机并采集图像
-
连接相机。
打开Mech-Eye Viewer,找到待连接的相机,单击连接按钮。
-
调节相机参数。
为确保相机采集到的2D图像清晰,点云无缺失,需调节相机参数。参数调节方法请参考LSR L相机参数参考指南。
-
采集图像。
相机连接成功且设置参数组后,即可开始采集工件图像。单击界面上方的 按钮,进行单次图像采集,此时即可查看采集到的工件2D图像和点云,确保2D图像清晰,点云无缺失且边缘清晰。合格的工件2D图像和点云分别如下图中左图、右图所示。
-
在Mech-Vision中连接相机。
单击从相机获取图像步骤,在界面右下角步骤参数中关闭虚拟模式,然后单击选择相机按钮。
在弹出的窗口中单击某相机编号右侧的 图标,该图标变为 后,代表相机连接成功。相机连接成功后,单击右侧的参数组下拉框选择标定的参数组,如下图所示。
以上设置完成后即已连接真实相机,无需调节其他参数。单击从相机获取图像步骤右侧的 图标运行该步骤,如无报错即表示相机连接成功,并可正确采集图像。
3D工件识别
高反光圆盘方案使用3D工件识别步骤识别工件。单击3D工件识别步骤界面的配置向导按钮,打开3D工件识别工具进行相关配置。总体配置流程如下图所示。
识别工件
高反光圆盘方案需要使用深度学习辅助识别工件。先从工件库中制作工件的点云模板,然后在3D工件识别工具中使用深度学习辅助识别并设置匹配相关参数,用于匹配点云模板。
-
制作工件模板。
单击打开工件库按钮,打开工件库,通过示教法设置抓取点,然后利用相机采集点云生成点云模板。
使用示教法设置对称性工件的抓取点时,为提高抓取精度,识别的工件位姿的X轴朝向和用示教法设置的抓取点位姿的X轴朝向应尽量一致。 -
导入并选择深度学习模型包(可单击此处下载),设置ROI,并在推理配置窗口中设置置信度阈值,高于该阈值的结果将被保留。
设置ROI时,为了使深度学习的辅助识别达到更好的效果,同时防止物料位置波动,应保留约1/3托盘尺寸的余量。 -
-
开启识别工件右侧的高级模式开关。
-
避免误匹配:将调整位姿设置为调整X轴朝向,并将X轴朝向的角度设置为0°,使得匹配输出工件位姿的X轴朝向和物体中心点的X轴朝向尽量一致。
-
输出-最大结果输出个数:将该参数值设置为托盘满载时的工件数量。本方案中将最大输出结果个数设置为18。
-
上述参数设置完成后,单击运行步骤按钮,匹配效果如下图所示。
调整位姿
获取工件位姿后,需使用调整位姿V2步骤对位姿进行调整。单击调整位姿V2步骤界面的配置向导按钮,打开位姿调整工具进行位姿调整相关配置。总体配置流程如下图所示。
-
位姿转换。
为了输出工件在机器人坐标系下的位姿,需勾选将位姿转换至机器人坐标系,将工件位姿从相机坐标系转换至机器人坐标系。
-
将方向调整设置为自动对齐,应用场景设置为Z轴对齐(上下料),使机器人能够按照指定方向抓取工件,避免碰撞。
-
位姿排序。
将排序类型设置为“Z”形平面排序,因来料方向固定,需选择通过拖拽器设置的方式来设置参考位姿,参考位姿的X轴应与托盘平行。将行的方向设置为参考位姿X轴正方向,列的方向设置为参考位姿Y轴正方向,以保证抓取顺序最优。
-
角度过滤。
为了减少后续路径规划耗时,需根据位姿Z轴和参考方向之间的夹角过滤明显不可抓取的工件。本教程中,需把最大角度差设置为30°。
-
通用设置。
将设置新增端口数量设置为1,该步骤将新增输入和输出端口各一个,连接3D工件识别步骤输出的抓取点信息,并将其输出到路径规划步骤。
路径规划
完成工件识别后,即可使用Mech-Vision的路径规划步骤进行路径规划,然后编写机器人程序用于抓取工件。
单击选中路径规划步骤,然后单击配置向导按钮,进入路径规划工具页面,了解如何进行规划路径。
路径规划的配置流程如下图所示。
配置场景物体
配置场景物体的目的是还原真实现场场景,以此来辅助用户规划机器人运动路径。具体操作方法请参考配置场景物体。
在确保抓取可行性的基础上,应在严格还原真实作业环境的前提下配置场景物体。本方案中场景物体配置情况如下图所示
配置末端工具
配置末端工具的目的是在三维仿真空间中显示末端工具的模型,并用于碰撞检测。具体操作方法请参考配置末端工具。
|
调整工作流程
场景物体和末端工具配置完成后,即可根据实际需求调整路径规划步骤中路径规划工具的工作流程。抓取工件时的工作流程如下图所示。
其中,筐上方固定点1和2是两个定点移动,这两个点为机器人程序中实际示教点位,不对外发送路径点,其他3个移动点将对外发送路径点,合计共发送3个路径点。
仿真与测试
单击工具栏中的仿真按钮,即可对搭建完成的路径规划工具中的工程进行仿真,以测试视觉系统是否已成功搭建。
将工件有序摆放在托盘上,然后单击路径规划工具工具栏的仿真按钮模拟抓取工件。每次抓取成功后需重新布置工件,循环仿真抓取10次。若10次仿真抓取均能顺利进行,即可判定视觉系统可正常工作。
若仿真过程中出现异常,请参考方案部署常见问题解决问题。
机器人抓放
机器人程序编写
若仿真效果满足预期,即可编写ABB机器人抓放程序。
ABB机器人样例程序MM_S3_Vis_Path可以基本满足本典型案例所需要的功能。你可以在样例程序基础上进行修改。关于MM_S3_Vis_Path程序的解释详细,请参考样例程序解读。
修改说明
基于样例程序,请参考如下步骤修改程序文件:
-
指定工控机IP地址和端口号。将MM_Init_Socket指令中的IP地址和端口号修改为工控机实际IP地址和端口号,确保与视觉系统中的设置一致。
修改前 修改后(示例) MM_Init_Socket "127.0.0.1",50000,300;
MM_Init_Socket "127.0.3.5",50000,400;
-
设置DO端口执行抓取的信号,以闭合夹具抓取工件。注意,DO指令应根据现场实际使用的DO端口号设置。
修改前 修改后(示例) !add object grasping logic here, such as "setdo DO_1, 1;" Stop;
!add object grasping logic here, such as "setdo DO_2, 0;" setdo DO_2, 0;
-
设置DO端口执行放置的信号,以放置工件。注意,DO指令应根据现场实际使用的DO端口号设置。
修改前 修改后(示例) !add object releasing logic here, such as "setdo DO_1, 0;" Stop;
!add object releasing logic here, such as "setdo DO_2, 1;" setdo DO_2, 1;
参考:修改后的样例程序
MODULE MM_S3_Vis_Path
!----------------------------------------------------------
! FUNCTION: trigger Mech-Vision project and get planned path
! Mech-Mind, 2023-12-25
!----------------------------------------------------------
!define local num variables
LOCAL VAR num pose_num:=0;
LOCAL VAR num status:=0;
LOCAL VAR num toolid{5}:=[0,0,0,0,0];
LOCAL VAR num vis_pose_num:=0;
LOCAL VAR num count:=0;
LOCAL VAR num label{5}:=[0,0,0,0,0];
!define local joint&pose variables
LOCAL CONST jointtarget home:=[[0,0,0,0,90,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
LOCAL CONST jointtarget snap_jps:=[[0,0,0,0,90,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
LOCAL PERS robtarget camera_capture:=[[302.00,0.00,558.00],[0,0,-1,0],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
LOCAL PERS robtarget drop_waypoint:=[[302.00,0.00,558.00],[0,0,-1,0],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
LOCAL PERS robtarget drop:=[[302.00,0.00,558.00],[0,0,-1,0],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
LOCAL PERS jointtarget jps{5}:=
[
[[-9.7932,85.483,6.0459,-20.5518,-3.0126,-169.245],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-9.653,95.4782,-4.3661,-23.6568,-2.6275,-165.996],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-9.653,95.4782,-4.3661,-23.6568,-2.6275,-165.996],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-9.653,95.4782,-4.3661,-23.6568,-2.6275,-165.996],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-9.7932,85.483,6.0459,-20.5518,-3.0126,-169.245],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]]
];
!define local tooldata variables*LOCAL PERS tooldata gripper1:=[TRUE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]];
PROC Sample_3()
!set the acceleration parameters
AccSet 50, 50;
!set the velocity parameters
VelSet 50, 1000;
!move to robot home position
MoveAbsJ home\NoEOffs,v3000,fine,gripper1;
!initialize communication parameters (initialization is required only once)
MM_Init_Socket "127.0.3.5",50000,400;
!move to image-capturing position
MoveL camera_capture,v1000,fine,gripper1;
!open socket connection
MM_Open_Socket;
!trigger NO.1 Mech-Vision project
MM_Start_Vis 1,0,2,snap_jps;
!get planned path from NO.1 Mech-Vision project; 2nd argument (1) means getting pose in JPs
MM_Get_VisPath 1,1,pose_num,vis_pose_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
Stop;
ENDIF
!close socket connection
MM_Close_Socket;
!save waypoints of the planned path to local variables one by one
MM_Get_Jps 1,jps{1},label{1},toolid{1};
MM_Get_JPS 2,jps{2},label{2},toolid{2};
MM_Get_JPS 3,jps{3},label{3},toolid{3};
!follow the planned path to pick
!move to approach waypoint of picking
MoveAbsJ jps{1},v1000,fine,gripper1;
!move to picking waypoint
MoveAbsJ jps{2},v1000,fine,gripper1;
!add object grasping logic here, such as "setdo DO_2, 0;"
setdo DO_2, 0;
!move to departure waypoint of picking
MoveAbsJ jps{3},v1000,fine,gripper1;
!move to intermediate waypoint of placing
MoveJ drop_waypoint,v1000,z50,gripper1;
!move to approach waypoint of placing
MoveL RelTool(drop,0,0,-100),v1000,fine,gripper1;
!move to placing waypoint
MoveL drop,v300,fine,gripper1;
!add object releasing logic here, such as "setdo DO_2, 1;"
setdo DO_2, 1;
!move to departure waypoint of placing
MoveL RelTool(drop,0,0,-100),v1000,fine,gripper1;
!move back to robot home position
MoveAbsJ Home\NoEOffs,v3000,fine,gripper1;
ENDPROC
ENDMODULE
抓取测试
为保证实际生产的稳定运行,需要运行修改后的样例程序,引导机器人测试抓取工件。具体方法请参考测试标准接口通信的操作。
进行抓取测试前,请先示教如下点位。
名称 | 变量 | 解析 |
---|---|---|
Home点 |
home |
示教的初始位。初始位应远离待抓取物体及周边设备,且不遮挡相机视野。 |
输入Mech-Vision工程的位姿 |
snap_jps |
用户自定义的关节角数据。 |
拍照点 |
camera_capture |
示教的相机拍照位。拍照位指相机采集图像时机器人所在的位置。在此位置,机器人手臂应不遮挡相机视野。 |
放置的过渡点 |
drop_waypoint |
过渡点用于保证机器人平滑移动,同时避免一些不必要的碰撞。 |
放置点 |
drop |
放置工件的目标点。 |
工具数据 |
gripper1 |
机器人在移动时所使用的末端工具。 |
完成示教后,将工件摆放在下表所列场景中,使用机器人测试低速抓取。本方案中,若工件有序码放,且无其他异常来料情况,只需在真实场景中进行抓取测试即可。