仮想パーツフィーディング機能

Epson RC+ Standard Edition 以上のエディションでは、シミュレーター上で、パーツフィーディング動作を確認することができます。ここでは、仮想パーツフィーディング機能について、簡単なシステムを構築する手順を説明します。

手順概要

  1. 仮想コントローラーを作成して、ロボットを設定する
  2. プロジェクトを作成する
  3. システム設定で、パーツフィーダーを追加して、設定する
  4. パーツの配置先となるテーブルに相当するオブジェクトを追加・設定する
  5. 仮想カメラを追加・設定する
  6. ビジョンキャリブレーションを実施する
  7. ビジョンシーケンスを作成する
  8. パーツおよびフィーダーを設定する
  9. フィーダーのキャリブレーションを実施する
  10. プログラムを作成・実行する

手順詳細

  1. 準備

    1. 仮想コントローラー接続を新規に作成します。
      システム設定において、ロボット1を "GX8-C652S" (名前はrobot1)に設定します。

    2. プロジェクト "PF_Sample" を作成します。

    3. Epson RC+ 8.0 メニュー - [セットアップ] - [システム設定] の [コントローラー] - [パーツフィーダー] において、フィーダー (IF-A1520)を追加して、次の設定を行います。

      • [ホッパー1実装]を有効にします
      • 位置設定 (Position X, Y, Z) : -100, 450, 0
      • 衝突検出設定 (Collision Check) : false

    4. パーツの配置先となるテーブル (Boxオブジェクト)を追加し、次のように設定します。

      • オブジェクト名 (Name) : Table
      • サイズ設定 (Half size X, Y, Z) : 100, 100, 50
      • 位置設定 (Position X, Y, Z) : 350, 0, 50
    5. カメラ設定を追加します。

      1. Epson RC+ 8.0 メニュー - [セットアップ] - [システム設定] の [ビジョン] において、仮想カメラを追加します。

      2. [仮想]にチェックを入れ、モデルとして "acA640-120gm"を選択し、[適用]ボタンをクリックします。

      3. カメラオブジェクトを次のように設定し、フィーダーオブジェクトの上空に配置します。

        • 位置設定 (Position X, Y, Z) : 65, 440, 770
        • 姿勢設定 (Rotation X, Y, Z) : 180, 0, 90

    6. ビジョンキャリブレーションを実施します。
      ここでは "Calib" という名称で、キャリブレーションを作成・実施します。
      ビジョンキャリブレーションが完了したら、利用したキャリブレーション用CADデータを、作業の妨げにならない位置へ移動します。

      カメラのキャリブレーションについては、以下の動画マニュアルを参照してください。

      Procedure for Using the Vision Simulator (opens new window)

      もしくは以下のマニュアルを参照してください。

      "Vision Guide 8.0 ソフトウェア編 - ビジョンキャリブレーション"

      ビジョンキャリブレーション用のCADデータを、以下のフォルダに、サンプルのCADデータとして用意しています。

      C:\EpsonRC80\Simulator\CAD\CalibBoard

      このCADデータを利用して、キャリブレーションを行います。

    7. ビジョンシーケンスを作成し、次の手順で、パーツが正しく検出されるかどうかを確認します。

      1. フィーダー操作パネルで、パーツとなるオブジェクトを、フィーダーオブジェクト上に、1つ供給します。

        • フィーダー操作パネルの[供給設定]ボタンをクリックします
        • パーツのベースオブジェクトを、現在、3D上に配置されているオブジェクトの中から選択します
        • ここでは、デフォルトの "Default Box" を選択します
      2. このパーツを認識するためのシーケンス "BoxDetection" を作成します。

        • 認識するためのビジョンオブジェクトとしては、Blobオブジェクトを利用します
        • パーツがうまく認識できない場合は、"ThresholdHigh"プロパティーの値を"180"に設定、調整します
        • "NumberToFind"プロパティーを、"1"から"All"に変更して、フィーダー上のパーツを、すべて認識させます
      3. "BoxDetection" シーケンスを実行して、パーツが正しく認識されることを確認します。

      4. "Calibration"プロパティーに、前述の手順で作成したキャリブレーション "Calib" を設定します。

      5. パーツが認識されることを確認できたら、フィーダー上のパーツを、いったんクリアします。

        • フィーダー操作パネルの[クリア]ボタンをクリックします

    8. パーツおよびフィーダーの設定を、以下の手順で実施します。

      1. Epson RC+ 8.0 メニュー - [ツール] - [パーツフィーディング]を開き、パーツを追加します。

      2. 初めてパーツを追加すると、PartFeeding.prg が自動生成されます。

      3. ビジョンシーケンスの設定が必須となり、以下のように設定します。

      4. パーツ供給の設定において、ホッパーとして"1"を選択します。

      5. 他の設定については、必要に応じて設定します。

        設定の詳細については、以下のマニュアルを参照してください。

        "Part Feeding 8.0 導入&ソフトウェア編 - ソフトウェア編 - Part Feeding GUI - パーツフィーディング ダイアログ"

        ここではデフォルトのままとします。

    9. フィーダーのキャリブレーションを、以下の手順で実施します。

      1. パーツ設定画面の[キャリブレーション]から、[キャリブレーション&テスト]をクリックします。

      2. 最初にパーツ領域の測定を行います。

        1. [パーツ供給]ボタンをクリックして、フィーダー操作パネルを開き、パーツを1つだけ供給します。
        2. [実行]ボタンをクリックし、パーツ面積を計算します。
        3. フィーダーのパラメーターの設定・調整を、必要に応じて実施します。

        設定の詳細については、以下を参照してください。

        "Part Feeding 8.0 導入&ソフトウェア編 - ソフトウェア編 - Part Feeding GUI - キャリブレーション&テスト"

  2. プログラム作成

    1つ目のパーツ設定を、新規に追加した際に、自動的に PartFeeding.prg および PartFeeding.inc というプログラムファイルが作成されます。パーツフィーディングの動作プロセスから、所定条件が成立した際に、自動的に呼び出されるコールバック関数のテンプレートが追加されています。

    コールバック関数の詳細については、以下を参照してください。

    "Part Feeding 8.0 導入&ソフトウェア編 - ソフトウェア編 - はじめに - Part Feedingソフトウェア構成 - コールバック関数"

    ここでは、ロボットを動作させるために必要な処理を追加します。
    プログラム動作開始時に、ロボットが Pick & Place するパーツの個数を指定するプログラムです。

    以下のプログラムを、Main.prg として作成します。

    Global Integer gMaxCount  ' Number of parts to pick and place
    Global Integer gCount     ' Current number of picked parts
    
    Function main
       String input$
       InputBox "Please input number of parts to pick and place", "Number of parts", "10", input$
       gMaxCount = Val(input$)
    
       SimSet Feeder_1.ClearSupply
    
       Motor On
       Power High
       Accel 100, 100
       Speed 100
       Jump XY(240, 100, -50, 0)
    
       PF_Start 1
    
       Xqt StartRobot
    Fend
    
    Function StartRobot
       TmReset 0
       Do
          If gCount >= gMaxCount Then
             Exit Do
          EndIf
       Loop
    
       Print "Total: ", Tmr(0), "[s]"
    
       PF_Stop 1
    Fend
    

    PartFeeding.prg の先頭に以下を追記します。

    Global Integer gMaxCount
    Global Integer gCount
    

    さらに、ファンクション "PF_Robot" を、以下のように書き換えます。

    Function PF_Robot(PartID As Integer) As Integer
       'Robot number is set by [Tool] - [PartFeeding] - [General].
       'Set Tool, Arm, ECP if needed.
    
       If gCount >= gMaxCount Then
          PF_Robot = PF_CALLBACK_SUCCESS
          Exit Function
       EndIf
    
       String name$
       Do While PF_QueLen(PartID) > 0
          'Get position of part to be picked in the calibration robot local
          P0 = PF_QueGet(PartID)
    
          'Pick (Jump P0 etc)
          Go Here :Z(-50)
          Jump P0 /R :Z(-160) :U(0) LimZ -50
          SimGet robot1.NearestObjToTool(0), name$
          SimSet robot1.Pick, name$
    
          'Place  (Jump P1 etc)
          Jump XY(300 + (gCount / 6) * 30, -70 + (gCount Mod 6) * 30, -160, 0) LimZ -50
          SimSet robot1.Place, name$
          SimSet name$.SetParent, Table
    
          'Deque
          PF_QueRemove PartID
    
          'Check Cycle stop
          gCount = gCount + 1
          If PF_IsStopRequested(PartID) = True Or gCount >= gMaxCount Then
             Exit Do
          EndIf
       Loop
    
       PF_Robot = PF_CALLBACK_SUCCESS
    
    Fend
    

    また、ファンクション "PF_Control" を以下のように書き換えます。

    Function PF_Control(PartID As Integer, Control As Integer) As Integer
       String msg$
       Select Control
    
          Case PF_CONTROL_SUPPLY_FIRST ' Request for part supply (when empty)
             msg$ = PF_Name$(PartID) + CRLF + CRLF + "Supply " + Str$(PF_Info(PartID, PF_INFO_ID_FEEDER_CALIB_CORRECT_MAXNUM)) + " parts."
    
             'Sample for hopper control
             PF_Hopper 1, PartID, 3000
             Wait 3.0
    
          Case PF_CONTROL_SUPPLY ' Request for part supply (add up to optimum number)
             msg$ = PF_Name$(PartID) + CRLF + CRLF + "Supply additional parts."
    
             'Sample for hopper control
             PF_Hopper 1, PartID, 3000
             '(For parallel supplying, Wait is not needed here.)
    
          Case PF_CONTROL_LIGHT_ON ' Request for Front Light On
             msg$ = PF_Name$(PartID) + CRLF + CRLF + "Turn front light On."
    
          Case PF_CONTROL_LIGHT_OFF ' Request for Front Light Off
             msg$ = PF_Name$(PartID) + CRLF + CRLF + "Turn front light Off."
    
       Send
    
       If False And CtrlDev = 21 Then
          MsgBox msg$, MB_ICONINFORMATION
       Else
          Print msg$
       EndIf
    
       PF_Control = PF_CALLBACK_SUCCESS
    
    Fend
    
  3. プログラム実行

    1. ツールバーの[Runウィンドウ]ボタンをクリックし、Runウィンドウを表示します。

    2. ファンクション"main"を選択して、[開始]ボタンをクリックします。

    3. Pick & Place するパーツの数を入力するダイアログが表示されます。
      任意の数を入れて、[OK]ボタンをクリックします。

    4. パーツがフィーダーに供給された後、ロボットがパーツを拾い上げて、テーブルに移動させる様子を確認してください。