複数カメラの使用

本章では、複数のカメラを使用してピック精度を向上させる方法について説明します。

プログラム例 7.1

例タイプ:
ピック領域の精度を向上させるための複数の固定下向きカメラの使用

構成

  • ロボットの数:1
  • フィーダーの数:1
  • フィーダー上のパーツの種類数:1
  • 配置場所の数:1
  • プラットフォーム種類:平面
  • ピックエリア:領域B
  • カメラの向き
    • カメラ#1:下向き固定。視野はフィーダートレイ全体。パーツブローブシーケンスで使用
    • カメラ#2:下向き固定。視野は領域Bと同じ(トレイの半部)。パーツ検出シーケンスで使用

解説
カメラ#1の視野は、フィーダートレイ全体が映るように設定します。パーツブローブシーケンスはカメラ#1を使用します。パーツブローブシーケンスは、トレイ内のパーツの数と分布に基づいて、フィーダーの振動種類を決定するのに使用されます。カメラ#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:下向き固定。視野はフィーダートレイ全体。パーツブローブシーケンス、およびパーツ検出シーケンスで使用
    • カメラ#2:モバイル(J2軸)。視野はパーツよりやや大きい。ピック前にパーツの二次画像を取得

解説
モバイルカメラ(軸2)には「アーム」が定義されます(スカラロボットのみ)。 6軸ロボットを使用している場合は、モバイルカメラ(軸6)には(アームではなく)ツールを定義できます。
グリッパーがパーツ座標に直接移動するように命令する代わりに、カメラ#2がパーツの上部に移動します。追加のビジョンシーケンスが実行され、パーツのより正確なピック位置が決定されます。
モバイルカメラの視野は、固定下向きカメラよりもはるかに小さいため、ピックの精度が向上します。パーツ上にカメラを移動するために必要な追加動作とビジョン処理のために、全体的なサイクルタイムは長くなります。
アームを自動的に定義するには、Epson RC+ - ツール - ロボットマネージャーに移動します。 ロボットマネージャーの[増設アーム]タブを選択します。この例では、Arm 1を選択し、[増設アーム設定ウィザード]ボタンをクリックします。ウィザードの各ステップを実行します。
ウィザードの詳細は、以下のマニュアルを参照してください。
"Vision Guide 8.0ソフトウェア編 - カメラ設置位置のアーム設定"


モバイルカメラをキャリブレーションし、フィーダー上の単一のパーツを見つけることができる、ビジョンシーケンスを作成します。このシーケンスは、PF_Robotコールバック内で実行(VRun)します。この例では、シーケンスは「MobileCam」という名称です。 パーツフィーディングダイアログでは「MobileCam」は選択しません。パーツブローブシーケンスとパーツ検出シーケンスはカメラ#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:下向き固定。視野はフィーダートレイ全体。パーツブローブシーケンスおよびパーツ検出シーケンスで使用
    • カメラ#2:上向き固定。ロボットのグリッパーに保持されたパーツのツールオフセットを作成するために使用

解説
カメラ#1はフィーダートレイの上にあり、下向き固定です。 カメラ#2は上向き固定です。カメラ#1の視野は、フィーダーのトレイ全体をカバーします。パーツブローブビジョンシーケンスとパーツ検出シーケンスは、カメラ#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