使用多台相机
本章节说明使用多台相机以提高拾取精度的方法。
程序示例 7.1
示例类型:
使用多台固定向下相机以提高拾取区域的精度
构成
- 机器人数量:1
- 送料器数量:1
- 送料器上的部件类型数量:1
- 配置位置数量:1
- 平台类型:平面
- 拾取区域:区域B
- 相机的方向
- 相机#1:向下固定。视野为送料器托盘全体。用于部件Blob序列
- 相机#2:向下固定。视野与区域B相同(托盘的一半)。用于部件检测序列
描述
将相机#1的视野设为映照送料器托盘全体。部件Blob序列使用相机#1。部件Blob序列用于根据托盘内的部件数与分布情况,确定送料器的振动类型。将相机#2的视野设为映照拾取区域B全体。为了有效地使用相机视野,需要将相机#2相对于相机#1旋转90度(也就是说,相机相互正交)。相机#2用于部件检测序列。
由部件检测序列检测的部件被用于生成部件坐标队列。由于视野大小为相机#1视野的一半,因此可大幅提高分辨率(mm/像素)。
此外,相机#1被用于判断送料器的振动方法,故此可使用分辨率低于相机#2的相机。比如,相机#1的分辨率为640×480像素,相机#2的分辨率为5472×3648像素。
通过缩窄视野,提高相机的分辨率,机器人的拾取精度得以提高。
翻转&分离的自动校准时,使用部件检测序列,确认找到可拾取的部件。部件检测序列被用于视野较小的相机时,如果未实施添加步骤,翻转&分离的自动校准则不会起到正确作用。
请实施下述某种方法:
跳过自动校准,手动调整翻转&分离校准参数。
创建仅用于自动校准且使用相机#1(较宽的视野)的临时性部件检测序列。
在本例中,使用相机#2(较窄的视野)的部件检测序列的名称为“PartSeq”。使用相机#1(较宽的视野)的临时性部件检测序列的名称为“PartSeqTemp”。“PartSeqTemp”时,使用Geometric对象搜索部件。
“PartSeqTemp”时,仅临时用于送料器的校准。作为部件检测视觉序列,选择“PartSeqTemp”(请参阅以下内容)。
切换为Part Feeding对话框的校准&测试页面,执行分离的自动校准。
完成所需的所有校准后,关闭校准&测试对话框。将部件检测视觉序列返还给“PartSeq”(使用较窄视野相机#2)。执行时,使用“PartSeq”的结果生成部件坐标队列。
无需特别代码。
样本代码
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Do While PF_QueLen(PartID) > 0
P0 = PF_QueGet(PartID)
Jump P0
On Gripper; Wait 0.2
Jump Place
Off Gripper; Wait 0.2
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
程序示例 7.2
示例类型:
使用固定向下相机与移动相机双方,提高拾取精度
构成
- 机器人数量:1
- 送料器数量:1
- 送料器上的部件类型数量:1
- 配置位置数量:1
- 平台类型:平面
- 拾取区域:全面
- 相机的方向
- 相机#1:向下固定。视野为送料器托盘全体。用于部件Blob序列与部件检测序列
- 相机#2:移动(J2轴)。视野略大于部件。拾取前获取部件的二次图像
描述
移动相机(轴2)被定义为“机械臂”(仅限于SCARA型机器人)。使用6轴机器人时,可对移动相机(轴6)定义工具(而非机械臂)。
将相机#2移动至部件上部,以替代发出直接将夹爪移动至部件坐标的命令。执行添加的视觉序列,通过部件确定准确的拾取位置。
移动相机的视野远小于固定向下相机,因此拾取精度得以提高。因为要进行将相机移动至部件上方所需的追加运作与视觉处理,整个循环时间会延长。
要自动定义机械臂时,切换为Epson RC+ - 工具 - 机器人管理器。选择机器人管理器中的[增设手臂]选项卡。在本例中,选择Arm 1,然后单击[Arm 向导]按钮。执行向导的各步骤。
有关向导的详细信息,请参阅以下手册。
“Vision Guide 8.0软件篇 - 设定相机设置位置的机械臂”
创建可对移动相机进行校准且可找到送料器上单一部件的视觉序列。为该序列时,在PF_Robot回调函数内执行 (VRun)。本例中的序列名称为“MobileCam”。未在上料对话框中选择“MobileCam”。部件Blob序列与部件检测序列使用相机#1,如通常一样,在上料对话框中进行选择。
样本代码
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Boolean found
Real x, y, u
Do While PF_QueLen(PartID) > 0
P0 = PF_QueGet(PartID)
Arm 1 'Select the Arm that is defined for the Mobile Camera
Jump P0 :Z(0) 'Position the Mobile camera over the part
VRun MobileCam
VGet MobileCam.Geom01.RobotXYU, found, x, y, u
Arm 0 'Select default robot arm
If found Then
Jump XY(x, y, PICKZ, u) /R
On Gripper; Wait 0.2
Jump Place
Off Gripper; Wait 0.2
EndIf
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
程序示例 7.3
示例类型:
使用多台固定相机以提高拾取精度
构成
- 机器人数量:1
- 送料器数量:1
- 送料器上的部件类型数量:1
- 配置位置数量:1
- 平台类型:平面
- 拾取区域:全面
- 相机的方向
- 相机#1:向下固定。视野为送料器托盘全体。用于部件Blob序列与部件检测序列
- 相机#2:向上固定。用于创建机器人夹爪保持部件的工具偏移
描述
相机#1位于送料器托盘之上,处于向下固定状态。相机#2处于向上固定状态。相机#1的视野覆盖送料器的托盘全体。部件Blob视觉序列与部件检测序列使用相机#1。
相机#2的视野略大于部件。机器人从送料器上拾取部件,然后它会将该部件移动至相机#2的上方。相机#2被用于动态创建夹爪保持部件的工具偏移。机器人使用新定义的工具偏移来配置部件。工具偏移用于对从送料器拾取的不准确性进行补偿。
相机#2仅被用于PF_Robot回调函数。未在Epson RC+ 8.0菜单 - [工具] - [上料] - [视觉]中设定相机#2的视觉序列。样本代码时,使用相机#2的VGet RobotToolXYU结果确定工具偏移。
该PF_Robot函数首先执行利用夹爪抓取部件的步骤。接下来,使用VGet RobotToolXYU获取工具偏移,并使用TLSet定义工具。然后,机器人使用新的工具偏移来配置部件。
在本例中,需要对向上固定相机进行校准。有关向上固定相机校准方法的详细信息,请参阅以下手册。
“Vision Guide 8.0软件篇 - 校准步骤:向上固定相机”
样本代码
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Boolean found
Real xTool, yTool, uTool
Do While PF_QueLen(PartID) > 0
P0 = PF_QueGet(PartID)
Tool 0 ' Select the correct Tool number for the Gripper
Jump P0
On Gripper; Wait 0.2
Jump upCam
VRun findPartInGripper
VGet findPartInGripper.Geom01.RobotToolXYU, found, xTool, yTool, uTool
If found Then
TLSet 1, XY(xTool, yTool, 0, 0)
Tool 1
Jump Place
Else
Jump reject ' Part not found in gripper - reject part
EndIf
Off Gripper; Wait 0.2
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend