仮想パーツフィーディング機能
Epson RC+ Standard Edition 以上のエディションでは、シミュレーター上で、パーツフィーディング動作を確認することができます。ここでは、仮想パーツフィーディング機能について、簡単なシステムを構築する手順を説明します。
手順概要
- 仮想コントローラーを作成して、ロボットを設定する
- プロジェクトを作成する
- システム設定で、パーツフィーダーを追加して、設定する
- パーツの配置先となるテーブルに相当するオブジェクトを追加・設定する
- 仮想カメラを追加・設定する
- ビジョンキャリブレーションを実施する
- ビジョンシーケンスを作成する
- パーツおよびフィーダーを設定する
- フィーダーのキャリブレーションを実施する
- プログラムを作成・実行する
手順詳細
準備
仮想コントローラー接続を新規に作成します。
システム設定において、ロボット1を "GX8-C652S" (名前はrobot1)に設定します。プロジェクト "PF_Sample" を作成します。
Epson RC+ 8.0 メニュー - [セットアップ] - [システム設定] の [コントローラー] - [パーツフィーダー] において、フィーダー (IF-A1520)を追加して、次の設定を行います。
- [ホッパー1実装]を有効にします
- 位置設定 (Position X, Y, Z) : -100, 450, 0
- 衝突検出設定 (Collision Check) : false
パーツの配置先となるテーブル (Boxオブジェクト)を追加し、次のように設定します。
- オブジェクト名 (Name) : Table
- サイズ設定 (Half size X, Y, Z) : 100, 100, 50
- 位置設定 (Position X, Y, Z) : 350, 0, 50
カメラ設定を追加します。
Epson RC+ 8.0 メニュー - [セットアップ] - [システム設定] の [ビジョン] において、仮想カメラを追加します。
[仮想]にチェックを入れ、モデルとして "acA640-120gm"を選択し、[適用]ボタンをクリックします。
カメラオブジェクトを次のように設定し、フィーダーオブジェクトの上空に配置します。
- 位置設定 (Position X, Y, Z) : 65, 440, 770
- 姿勢設定 (Rotation X, Y, Z) : 180, 0, 90
ビジョンキャリブレーションを実施します。
ここでは "Calib" という名称で、キャリブレーションを作成・実施します。
ビジョンキャリブレーションが完了したら、利用したキャリブレーション用CADデータを、作業の妨げにならない位置へ移動します。カメラのキャリブレーションについては、以下の動画マニュアルを参照してください。
Procedure for Using the Vision Simulator (opens new window)
もしくは以下のマニュアルを参照してください。
"Vision Guide 8.0 ソフトウェア編 - ビジョンキャリブレーション"
ビジョンキャリブレーション用のCADデータを、以下のフォルダに、サンプルのCADデータとして用意しています。
C:\EpsonRC80\Simulator\CAD\CalibBoardこのCADデータを利用して、キャリブレーションを行います。
ビジョンシーケンスを作成し、次の手順で、パーツが正しく検出されるかどうかを確認します。
フィーダー操作パネルで、パーツとなるオブジェクトを、フィーダーオブジェクト上に、1つ供給します。
- フィーダー操作パネルの[供給設定]ボタンをクリックします
- パーツのベースオブジェクトを、現在、3D上に配置されているオブジェクトの中から選択します
- ここでは、デフォルトの "Default Box" を選択します
このパーツを認識するためのシーケンス "BoxDetection" を作成します。
- 認識するためのビジョンオブジェクトとしては、Blobオブジェクトを利用します
- パーツがうまく認識できない場合は、"ThresholdHigh"プロパティーの値を"180"に設定、調整します
- "NumberToFind"プロパティーを、"1"から"All"に変更して、フィーダー上のパーツを、すべて認識させます
"BoxDetection" シーケンスを実行して、パーツが正しく認識されることを確認します。
"Calibration"プロパティーに、前述の手順で作成したキャリブレーション "Calib" を設定します。
パーツが認識されることを確認できたら、フィーダー上のパーツを、いったんクリアします。
フィーダー操作パネルの[クリア]ボタンをクリックします
パーツおよびフィーダーの設定を、以下の手順で実施します。
Epson RC+ 8.0 メニュー - [ツール] - [パーツフィーディング]を開き、パーツを追加します。
初めてパーツを追加すると、PartFeeding.prg が自動生成されます。
ビジョンシーケンスの設定が必須となり、以下のように設定します。
パーツ供給の設定において、ホッパーとして"1"を選択します。
他の設定については、必要に応じて設定します。
設定の詳細については、以下のマニュアルを参照してください。
"Part Feeding 8.0 導入&ソフトウェア編 - ソフトウェア編 - Part Feeding GUI - パーツフィーディング ダイアログ"
ここではデフォルトのままとします。
フィーダーのキャリブレーションを、以下の手順で実施します。
パーツ設定画面の[キャリブレーション]から、[キャリブレーション&テスト]をクリックします。
最初にパーツ領域の測定を行います。
- [パーツ供給]ボタンをクリックして、フィーダー操作パネルを開き、パーツを1つだけ供給します。
- [実行]ボタンをクリックし、パーツ面積を計算します。
- フィーダーのパラメーターの設定・調整を、必要に応じて実施します。
設定の詳細については、以下を参照してください。
"Part Feeding 8.0 導入&ソフトウェア編 - ソフトウェア編 - Part Feeding GUI - キャリブレーション&テスト"
プログラム作成
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 FendPartFeeding.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プログラム実行
ツールバーの[Runウィンドウ]ボタンをクリックし、Runウィンドウを表示します。
ファンクション"main"を選択して、[開始]ボタンをクリックします。
Pick & Place するパーツの数を入力するダイアログが表示されます。
任意の数を入れて、[OK]ボタンをクリックします。パーツがフィーダーに供給された後、ロボットがパーツを拾い上げて、テーブルに移動させる様子を確認してください。