EIH_2台カメラ_点群結合
|
Mech-Visionプロジェクトをインポート
Pythonスクリプトをソリューションにコピー
ドリフト自動補正ソリューションのコアアルゴリズム部分はPythonスクリプトで実装されており、主に「ドリフト補正モデルの生成」、「位置姿勢のドリフト補正」、「フォルダ内の位置姿勢データの読み込み」機能が含まれています。
Mech-Visionサンプルプロジェクトに保存されているPythonスクリプトの resource/python_script
フォルダ全体を、現在の生産ソリューションにコピーする必要があります(同じディレクトリ構造で保存することを推奨します)。
Pythonスクリプトとファイルの読み書きを行うため、ファイル名変更を行わないようにご注意ください。 |
キャリブレーションボール関連のプロジェクトをワーク認識ソリューションにコピー
Mech-Visionのサンプルソリューションから「Vis_CaptureCalibrationSphere_CameraA」、「Vis_ComputeDriftCorrectionModel_CameraA」、「Vis_CaptureCalibrationSphere_CameraB」、「Vis_ComputeDriftCorrectionModel_CameraB」の4つのプロジェクトを現在の生産ソリューションにコピーします。
-
Vis_CaptureCalibrationSphere_Camera:キャリブレーションボールの位置姿勢を取得するプロジェクト。
-
Vis_ComputeDriftCorrectionModel_Camera:キャリブレーションボール情報に基づいてドリフト補正モデルを生成するプロジェクト。
プロジェクトのパラメータを調整
プロジェクト1:Vis_CaptureCalibrationSphere_Camera
-
必須の調整項目
-
カメラから画像を取得 ステップで、「カメラを選択」と「コンフィグパラメータグループ」を調整し、現在のカメラに正常に接続します。
-
「ステップの組合せ(Locate Three Calibration Spheres)」をダブルクリックしてその中身に入ります。「3D ROI内の点群を抽出(Spheres1/2/3)」の3つのステップで、各キャリブレーションボールが対応する3D ROI内に収まるように、3D ROIのサイズをキャリブレーションボール直径の 2~3倍 に設定します。これは、カメラのドリフトによってキャリブレーションボールが3D ROI外に出るのを防ぐためです。
-
-
オプションの調整項目
-
キャリブレーションボールのサイズがサンプルプロジェクトと異なる場合
-
「ステップの組合せ(Locate Three Calibration Spheres )」をダブルクリックしてその中身に入ります。
-
3D位置姿勢高精度推定 ステップで「モデル選択」パラメータを調整します。
-
続いて 「3D位置姿勢推定(Locate Calibration Sphere Using 3D Matching)」 をダブルクリックしてその中身に入ります。「3D位置姿勢低精度推定/3D位置姿勢高精度推定」ステップで「モデル選択」パラメータを調整します。サンプルプロジェクトでは「直径100mm」、「直径60mm」、「直径25.4mm」のキャリブレーションボールモデルが提供されています。それ以外のキャリブレーションボールを使用する場合は、Mech-Mindテクニカルサポートにお問い合わせください。
-
-
「ステップの組合せ(Extract Spherical Cap Cloud)」をダブルクリックしてその中身に入り、円柱以内の点群を抽出 ステップで「最大Z値」と「外円半径」の2つのパラメータを調整します。
-
最大Z値:キャリブレーションボールの直径に設定します。
-
外円半径:キャリブレーションボールの直径の5分の4に設定します。
-
-
-
パラメータレシピの調整
-
説明:このプロジェクトには設定済みのパラメータレシピが含まれています。各撮影経路点におけるキャリブレーションボール座標系の位置姿勢を保存する際に、ファイル名の接頭辞を切り替えるために使用されます。ファイル名の接頭辞には、現在取得しているキャリブレーションボールの経路点に対応する層番号と層内番号が含まれています。このソリューションでは、N * 1の経路点を設定し、Nは層数を示し、層内番号は1で固定されています。例えば、「sphereCoordinatePose_3_1」は、3層目の撮影経路点で生成されたキャリブレーションボール座標系の位置姿勢を意味します。
-
このプロジェクトには、3層のキャリブレーションボール経路点のパラメータレシピが事前に設定されています。キャリブレーションボールの経路点が3層以下である場合、レシピの変更は必要ありません。3層以上の場合は、ルールに従ってレシピを追加するだけで対応可能です。
-
-
プロジェクト2:Vis_ComputeDriftCorrectionModel_Camera
-
必須の調整項目:特に調整不要です。
-
オプションの調整項目
-
「Vis_CaptureCalibrationSphere_Camera」プロジェクト名や、その中のキャリブレーションボールの位置姿勢を保存するフォルダ名を変更した場合
-
「Vis_ComputeDriftCorrectionModel_Camera*」プロジェクトの「ラベルリストをクイック作成(Folder Path of Baseline Sphere Coordinate Pose)」および「ラベルリストをクイック作成(Folder Path of Sphere Coordinate Pose After Drift)」の2つのステップで、「文字列のリスト」パラメータを対応して変更します。このステップは、キャリブレーションボールの位置姿勢ファイルパスを設定し、パラメータの初期値は「../../Vis_CaptureCalibrationSphere_Camera*/sphereCoordinatePose_**」です。
-
-
Pythonスクリプトが推奨パス
resource/python_script
に保存されていない場合-
「Pythonを使用して結果を計算(Read the Pose from the Pose Files in the Folder1/2)」の2つのステップで、「スクリプトファイルのパス」パラメータを対応して変更します。
-
「Pythonを使用して結果を計算(Compute Drift Correction Model)」ステップで、「スクリプトファイルのパス」パラメータも対応して変更します。
-
「ステップの組合せ(Monitoring Drift)」をダブルクリックしてその中身に入ります。「Pythonを使用して結果を計算(Calculate XYZ Range)」ステップで、「スクリプトファイルのパス」パラメータを対応して変更します。
-
-
ドリフトのアラートしきい値の調整
-
「ステップの組合せ(Monitoring Drift)」をダブルクリックしてその中身に入ります。「しきい値によって数値を二項分類(Set and Compare the Drift Threshold (mm))」ステップの「各ポートの入力データのしきい値」パラメータの初期値は(2, 2, 5)mmです。現場の精度要件に応じて、この値を調整することができます。
-
-
プロジェクトフォルダ内のキャリブレーションボールの正常/異常のラベル内容の調整
-
必要に応じて、プロジェクトフォルダ内にあるキャリブレーションボールのドリフトに関連する正常または異常のラベルの内容をカスタマイズすることができます。
-
-
2台のカメラに対応するワーク認識プロジェクトに「ドリフト補正」および「点群変換」ステップの組合せを追加
Vis_CorrectWorkpiecePartACloud_CameraA
「Vis_CorrectWorkpiecePartACloud_CameraA」プロジェクトから「ステップの組合せ(Correct Drift)」および「点群変換(Correct Cloud Drift)」をワーク認識プロジェクトにコピーします。「ステップの組合せ(Correct Drift)」は通常、ワークの幾何学的中心の位置姿勢に対して補正を行い、補正後の位置姿勢と補正変換を出力します。これらは、後の点群補正に使用されます。以下の点に注意してください。
-
「ステップの組合せ(Correct Drift)」には、補正する点群の 幾何学的中心点(またはそれに近い点)を入力する必要があります。補正する点群の幾何学的中心点を取得するには、以下のいずれかの方法を使用します。
-
ステップ「平面点群の位置姿勢とサイズを計算」から取得:ノイズのある点群が幾何学的中心点の算出に大きな影響を与える可能性があるため、注意が必要です。
-
3Dマッチング法から取得:マッチングモデルの点群と幾何学的中心点が空間的に大きく離れている場合(特にZ方向で50mm以上のずれがある場合)、3Dマッチングモデルの把持点を幾何学的中心点に調整し、ドリフト補正後に必要な把持点にマッピングする必要があります。
-
-
補正する位置姿勢は カメラ座標系 であり、補正後にロボット座標系へ変換する必要があります。
-
オプションの調整項目
-
「Vis_ComputeDriftCorrectionModel_CameraA」プロジェクトで補正モデルの保存パスを変更した場合:「ステップの組合せ(Correct Drift)」をダブルクリックしてその中身に入り、「ファイルから位置姿勢を読み取る(Read Drift Correction Model)」ステップの「位置姿勢のファイルパス」パラメータを対応して変更します。
-
Pythonスクリプトが推奨パス
resource/python_script
に保存されていない場合:「ステップの組合せ(Correct Drift)」をダブルクリックしてその中身に入り、「Pythonを使用して結果を計算」ステップの「スクリプトファイルのパス」パラメータを対応して変更します。
-
Vis_CorrectWorkpiecePartBCloudAndLocateMergedCloud_CameraB
「Vis_CorrectWorkpiecePartBCloudAndLocateMergedCloud_CameraB」プロジェクトから、「ステップの組合せ(Correct Drift)」、「点群変換(Correct Cloud Drift)」、「点群を読み取る(V2)(Read Cloud of Workpiece PartA After Correction)」、「データをマージ」および「点群をマージ」をワーク認識プロジェクトにコピーします。
-
「ステップの組合せ(Correct Drift)」は通常、3Dマッチング処理後のワークの幾何学的中心の位置姿勢に対して補正を行い、補正後の位置姿勢と補正変換を出力します。
-
注意点は前述の「Vis_CorrectWorkpiecePartACloud_CameraA」プロジェクトと同じです。
ロボットプログラムを作成
ロボットプログラムの処理フロー(カメラAとカメラBの両方)
「キャリブレーションボールの取得」と「ドリフト補正モデルの生成」のためのプログラムを下記のようなフローで作成します。このプログラムを定期的(毎日または毎週、推奨は毎日生産開始前)実行して、ドリフト補正モデルをリアルタイムで更新できるようにします。
-
ロボットがカメラを動かし、事前に計画された経路点に順番に到達します。このソリューションでは、層ごとに1つの経路点があり、層数はNです。そのため、合計ではN * 1個の経路点があります。
-
各経路点に移動させた後、「Vis_CaptureCalibrationSphere_Camera*」プロジェクト内のパラメータレシピを切り替えます。
切り替えられた「パラメータレシピ番号」と、事前に計画された「キャリブレーションボールの移動経路点」が一対一に対応しています。この対応関係は で確認できます。 -
パラメータレシピを切り替えた後、「Vis_CaptureCalibrationSphere_Camera*」プロジェクトを実行し、キャリブレーションボールを認識し、その位置姿勢を保存します。
-
切り替えられた「パラメータレシピ番号」と位置姿勢を保存するための「ファイル名の接頭辞」が一対一に対応しています。この対応関係は
で確認できます。 -
ファイル名の接頭辞の形式は「***_m_n」で、mは層番号、nは層内番号を表します。このソリューションでは、各層に1つの撮影経路点のみがあるため、nは固定値1となります。
-
-
各ャリブレーションボールの撮影経路点に対して、上記の1~3の操作を実行します。すべての経路点への移動が完了すると、「Vis_CaptureCalibrationSphere_Camera*」プロジェクトの「sphereCoordinatePose_drift」フォルダには、各撮影経路点におけるキャリブレーションボール座標系の位置姿勢ファイルが生成されます。
-
例えば、撮影経路点が合計で3つある場合、「sphereCoordinatePose_drift」フォルダには3つのjsonファイルが生成されます(sphereCoordinatePose_1_1.json、sphereCoordinatePose_2_1.json、sphereCoordinatePose_3_1.json)。
-
キャリブレーションボールの位置姿勢取得が完了した後、その移動経路点がもう調整されない場合、キャリブレーションボール取得で生成されたすべてのjsonファイルを「sphereCoordinatePose_drift」フォルダからコピーし、「sphereCoordinatePose_baseline」フォルダに貼り付けます。これにより、後のドリフトが発生した際の「比較」基準情報として使用されます。
-
コピー前に「sphereCoordinatePose_baseline」フォルダを空にしてください。
-
このコピー操作は初回の導入時に一度だけ行えばよく、その後は再操作の必要はありません。導入後は通常、「sphereCoordinatePose_baseline」フォルダ内のファイルを変更しません。
-
-
上記の操作が完了した後、「Vis_ComputeDriftCorrectionModel_Camera*」プロジェクトを実行します。このプロジェクトは、「Vis_CaptureCalibrationSphere_Camera*」プロジェクト内の「sphereCoordinatePose_baseline」と「sphereCoordinatePose_drift」にあるキャリブレーションボール座標系の位置姿勢データをもとに、新しいドリフト補正モデルを求めます。生成されたドリフト補正モデルは、該当プロジェクトディレクトリに「drift_correction_model_00000.json」というファイル名で保存されます。
ロボットサンプルプログラム
以下のコードは参考用であり、使用するロボットに応じてプログラムを作成する必要があります。 |
.PROGRAM calibpoint()
;*****カメラAに対応するキャリブレーションボールの撮影経路点(実データに変更してください)*****
TOTAL_POINT_CAMERA_A = 3 ;
POINT P_CAMERA_A[1] = TRANS(100,200,300,0,90,0)
POINT P_CAMERA_A[2] = TRANS(100,200,300,0,90,0)
POINT P_CAMERA_A[3] = TRANS(100,200,300,0,90,0)
;*****カメラAに対応するロボットを移動*****
ACCURACY 1 ALWAYS
SPEED 100 MM/S ALWAYS
JMOVE STAND_BY ;安全位置に移動、ユーザーによるティーチングが必要
FOR I = 1 TO TOTAL_POINT_CAMERA_A
PRINT "MOVE TO POINT NO. ", I
LMOVE P_CAMERA_A[I] ;キャリブレーションボールの撮影経路点へ移動
BREAK
TWAIT 3
CALL MM_SWITCH_MODEL(1,I) ;カメラAに対応するキャリブレーションボール取得プロジェクトのレシピの切替え(Vis_CaptureCalibrationSphere_CameraAプロジェクト番号が1であると仮定)
TWAIT 1
CALL MM_START_VIS(1,0,1,.#start_vis) ;カメラAに対応するキャリブレーションボール取得プロジェクトの実行をトリガー
TWAIT 3
END
CALL MM_START_VIS(2,0,1,.#start_vis) ;カメラAに対応するドリフト補正モデル生成プロジェクトの実行をトリガー(Vis_ComputeDriftCorrectionModel_CameraAプロジェクト番号が2であると仮定)
JMOVE STAND_BY
;*****カメラBに対応するキャリブレーションボールの撮影経路点(実データに変更してください)*****
TOTAL_POINT_CAMERA_B = 3 ;
POINT P_CAMERA_B[1] = TRANS(100,200,300,0,90,0)
POINT P_CAMERA_B[2] = TRANS(100,200,300,0,90,0)
POINT P_CAMERA_B[3] = TRANS(100,200,300,0,90,0)
;*****カメラBに対応するロボットを移動*****
ACCURACY 1 ALWAYS
SPEED 100 MM/S ALWAYS
FOR I = 1 TO TOTAL_POINT_CAMERA_B
PRINT "MOVE TO POINT NO. ", I
LMOVE P_CAMERA_B[I] ;キャリブレーションボールの撮影経路点へ移動
BREAK
TWAIT 3
CALL MM_SWITCH_MODEL(3,I) ;カメラBに対応するキャリブレーションボール取得プロジェクトのレシピの切替え(Vis_CaptureCalibrationSphere_CameraBプロジェクト番号が3であると仮定)
TWAIT 1
CALL MM_START_VIS(3,0,1,.#start_vis) ;カメラBに対応するキャリブレーションボール取得プロジェクトの実行をトリガー
TWAIT 3
END
CALL MM_START_VIS(4,0,1,.#start_vis) ;カメラBに対応するドリフト補正モデル生成プロジェクトの実行をトリガー(Vis_ComputeDriftCorrectionModel_CameraBプロジェクト番号が4であると仮定)
JMOVE STAND_BY
.END