プログラム例 8.1

例タイプ:
イメージバッファーとImageOp、 SubtractAbsの使用

構成

  • ロボットの数:1
  • フィーダーの数:1
  • フィーダー上のパーツの種類数:1
  • 配置場所の数:1
  • カメラの向き:フィーダー#1上の固定下向きカメラ

解説
バックライトをオンにしても、トレイの角に影ができることがあります。ブローブオブジェクトのサーチウィンドウにトレイの角が含まれていて、しきい値が適切に調整されていない場合、影が誤ってパーツとして識別される可能性があります。
パーツブローブビジョンシーケンスは、個々のパーツまたはパーツの総数を検出するために使用されます。パーツブローブビジョンシーケンスが影をパーツと見なす場合、システムは振動の方法について誤った決定を下すか、システムがトレイ上に十分なパーツがあると判断するため、PF_Controlコールバックがホッパーをオンにしない可能性があります。

以下は、トレイの角の影がパーツとして誤認される可能性がある例です。

ImageOpビジョンオブジェクトをPartBlobシーケンスに追加すると、この問題の解決に役立つ場合があります。ImageOpのSubtractAbs処理を使用します。SubtractAbsは、2つのイメージバッファー間の差分を出力します。この例では、ImageBuffer1プロパティーは空のフィーダーの画像ファイルになり、ImageBuffer2プロパティーはカメラによって取得された画像になります(値「0」はカメラのイメージバッファーを示します)。イメージバッファーが差し引かれると、フィーダーの画像は効果的に削除されます。

手順を次に示します。

  1. 新しいビジョンシーケンス「PartBlob」を作成します。

  2. フィーダーのバックライトをオンにして、フィーダートレイのパーツをすべて取り除きます。

  3. PartBlobのSaveImageプロパティーの[Click to save]ボタンをクリックします。この例では、画像ファイルに「EmptyIF-240」という名前を付けます。ファイルの画像を以下に示します。

  4. ビジョンガイドのツールバーからImageOpオブジェクトをドラッグアンドドロップします。

  5. ImageOpのサイズを変更して、カメラの視野全体にします。

  6. ImageOpのOperationプロパティーを、「SubtractAbs」に変更します。

  7. ImageOpのImageBuffer1プロパティーを、「File」に変更します。

  8. ImageBufferFileボタンをクリックして、以前に「EmptyIF-240」として保存したファイルを選択します。

  9. ビジョンガイドのツールバーから、Blobオブジェクトを追加します。Blobのサーチウィンドウのサイズを変更し、フィーダーのトレイより大きく設定します。

  10. BlobのThresholdColorプロパティーを、“White”に変更します。

  11. パーツを1個トレイに置き、Vision Guideツールバーの[ヒストグラム]を押します。

    パーツが適切に2値化されるまで、ヒストグラムの赤いThresholdHighバーをドラッグします。必要に応じて[更新]をクリックし、終了したらヒストグラムウィンドウの[OK]ボタンをクリックします。
    以上により、PartBlobシーケンスが実行されると、フィーダーの画像が完全に削除されます。パーツは完全に白い背景に黒く表示されます。フィーダーは、PartBlobシーケンスから効果的にマスクされます。

  12. Epson RC+ 8.0メニュー - [ツール] - [パーツフィーディング]ビジョンページで、目的のパーツのパーツブローブビジョンシーケンスとして「PartBlob」を設定します。

特別なコードは必要ありません。

サンプルコード
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