使用多台相机

本章节说明使用多台相机以提高拾取精度的方法。

程序示例 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. 创建仅用于自动校准且使用相机#1(较宽的视野)的临时性部件检测序列。
    在本例中,使用相机#2(较窄的视野)的部件检测序列的名称为“PartSeq”。使用相机#1(较宽的视野)的临时性部件检测序列的名称为“PartSeqTemp”。“PartSeqTemp”时,使用Geometric对象搜索部件。
    “PartSeqTemp”时,仅临时用于送料器的校准。作为部件检测视觉序列,选择“PartSeqTemp”(请参阅以下内容)。

  3. 切换为Part Feeding对话框的校准&测试页面,执行分离的自动校准。

  4. 完成所需的所有校准后,关闭校准&测试对话框。将部件检测视觉序列返还给“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