多攝影機的使用

本章說明如何使用多個攝影機提高拾取精度。

程式範例 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+ - 工具 - 機器人管理器。選擇機器人管理器的[增設型手臂]標籤。在此範例中,選擇手臂1,然後點擊[增設型手臂設定精靈]按鈕。執行精靈的各個步驟。
如需精靈的詳細資訊,請參閱以下手冊。
「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 Software - 校準步驟:朝上固定的攝像機」

範例程式碼
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