HALCON によるハンドアイキャリブレーション
はじめに
このガイドでは、HALCON を使用して Zivid カメラとハンドアイキャリブレーションを統合する方法について説明します。ハンドアイキャリブレーションには、一般的に Hand-Eye GUI を使用することが推奨されますが、このガイドでは HALCON と HDevelop を使用した別のアプローチを紹介します。これらの演算子は、HALCON の C++ および C# インターフェースでも使用できます。HDevelop のサンプルコードは、弊社のサンプルリポジトリにあります。
EyeInHandCalibration3DObject.hdev - Zivid カメラと 3D キャリブレーションオブジェクトを使用したハンドアイキャリブレーション
EyeInHandCalibrationMVTecPlate.hdev - Zivid カメラと MVTec キャリブレーションプレートを使用したハンドアイキャリブレーション
サンプルデータ - HALCON でハンドアイキャリブレーションサンプルを実行するために必要なサンプルデータセット
HDevelop のサンプルを実行するにはサンプルデータが必要ですが、独自のデータに置き換えることも可能です。
MVTec ドキュメント/ハンドアイキャリブレーションの問題と HALCON の原理
MVTec は、ハンドアイキャリブレーションやマシンビジョン全般に関する詳細な情報を含む包括的なドキュメントを提供しています。ハンドアイキャリブレーションに関するドキュメントは Solution Guide III-C: 3D Vision に記載されており、関連するセクションは Chapter 8: Robot Vision です。
ハンドアイキャリブレーションを成功させる方法は数多くあります。どの方法も完璧ではありませんが、どれを選択するかは具体的なユースケースと要件によって異なります。原則として、基本的な考え方は似ています。目標は、カメラの座標系とロボットベースまたはロボットフランジの座標系との間の同次変換を求めることです。Zivid カメラで収集されるデータは 3D であるため、ロボットベース座標系におけるカメラの姿勢から変換を簡単に計算できます。詳細については ハンドアイキャリブレーション理論 を参照してください。
HALCON/HDevelop の使用方法については、 How to run a HALCON Sample ページも参照してください。
前提条件
Zivid カメラ
HALCON ソフトウェアがインストール済みであること
GitHub の zivid-halcon-samples のサンプルを参照してください。
サンプルデータ をダウンロードしてください
3D キャリブレーションオブジェクトまたは HALCON キャリブレーションプレート
姿勢パラメータが既知のロボット(例:オイラー角 XYX など)
ハンドアイキャリブレーションの概念 への理解
カメラ設定
一般的に、可能な限りプリセット設定を使用することをお勧めします。これはハンドアイキャリブレーションにも当てはまります。最高のパフォーマンスを確保するために、ハンドアイキャリブレーションに使用する設定をアプリケーション自体にも使用することが理想的です。サンプルデータでは製造向けプリセットが使用されています。設定に問題がある場合は、 ハンドアイキャリブレーションのカメラ設定 を参照してください。
キャリブレーションオブジェクト
2つの座標系間でハンドアイキャリブレーションを行うには、両方の座標系に共通する姿勢または点のセットが必要です。この姿勢・点ペアのセットを生成するには、キャリブレーションオブジェクトが必要です。詳細については キャリブレーションオブジェクト ページを参照してください。HALCON キャリブレーションプレートを使用するか、既知の形状で対称性のない 3D キャリブレーションオブジェクトを使用できます。
注釈
Zivid カメラで収集されるデータは 3D であるため、2D カメラの内部パラメータに依存するハンドアイキャリブレーション方法を使用する必要は ありません。
ロボットの姿勢
ロボットメーカーごとに、また同じメーカーの異なるロボットモデルであっても、ロボットの姿勢の表現方法やエクスポート方法は異なります。位置はデカルト座標系では X、Y、Z で表されますが(右手系の場合)、向きはさまざまな方法で表現できます。特にオイラー角はさまざまな方法でパラメータ化されるため、ロボットがどの表記法を使用しているかを把握することが重要です。クォータニオンや同次変換行列は曖昧さがないため扱いやすいですが、常に利用できるとは限りません。
HALCON は姿勢における向きの表現方法を多数サポートしており、それらの間の変換も可能です。これについては演算子 create_pose のドキュメントに記載されています。演算子 pose_to_hom_mat3d を使用すると、ロボットの姿勢を同次変換行列に変換できます。姿勢の数学的記述については Pose Conversions も参照してください。
ロボットの姿勢を記録する方法はいくつかあります。残念ながら、HALCON にはロボットメーカー向けのインターフェースが用意されていないため、ソケット接続などのインターフェースを使用してプログラムを作成する必要があります。今回の例では、ロボットの姿勢を手動で記録し、HALCON に入力しました。
ハンドアイキャリブレーションのプロセス
キャリブレーションプロセスを開始する前に、以下を確認してください。
カメラが ウォームアップ されていること
Infield Correction が実施されていること
すべてのロボット姿勢においてキャリブレーションオブジェクトがカメラの視野内に収まっていること
ハンドアイキャリブレーションの手順
ハンドアイキャリブレーションのプロセスは以下の手順で構成されます。
複数のロボット構成からキャリブレーションオブジェクトの姿勢をキャプチャする
各画像においてキャリブレーションオブジェクトの特徴を検出する
対応するロボットエンドエフェクタの姿勢を登録する
3D シーンとロボット姿勢のペアを保存する
アイインハンド方式でもアイツーハンド方式でも、キャリブレーションの手順は似ています。上記の手順で構成されます。違いは、アイインハンド方式ではカメラがロボットのエンドエフェクタに取り付けられているのに対し、アイツーハンド方式ではカメラが環境内に固定されてロボットを観測する点です。つまり、アイインハンド方式ではキャリブレーションオブジェクトは静止していますが、アイツーハンド方式ではロボットと共に移動します。どちらの場合も、ロボットの姿勢が異なるキャリブレーションオブジェクトをキャプチャする必要があり、その結果、カメラの視野内でも姿勢が異なるキャリブレーションオブジェクトが必要になります。
したがって、データ収集においては以下の点が両方のシナリオに当てはまります。
ロボットを 10〜20 種類の異なる姿勢に移動させる
多様な視点角度と全関節の活用を確保する
各姿勢でキャリブレーションオブジェクトをキャプチャする
コントローラーからロボットの姿勢を記録する
ハンドアイキャリブレーションに適したデータセットを取得する方法の詳細とヒントについては、 適切なデータセットの取得 を参照してください。
この例では、ZividStudio で点群を取得し、それを *.zdf ファイルと *.ply ファイル(法線付き)としてエクスポートし、対応するロボットの姿勢をテキストファイルとして保存します。*.zdf ファイルは推定された内部パラメータを抽出するために必要です。*.ply ファイルは各画像におけるキャリブレーションオブジェクトの姿勢をキャプチャするために使用されます。
注釈
HALCON はキャリブレーションオブジェクトの姿勢推定に法線を使用するため、エクスポートされた点群ファイルに法線が含まれていることを確認することが重要です。
検証およびデバッグのために、キャプチャデータと姿勢ペアのデータセットを保存することをお勧めします。
カメラ内部パラメータ
HALCON キャリブレーションプレートを使用する場合は、キャリブレーションプレートのキャプチャの ZDF ファイルから取得した内部パラメータを HALCON にロードすることをお勧めします。詳細については、ナレッジベースの Camera Intrinsics セクションを参照してください。ZDF ファイルと対応する Python スクリプトを使用して内部パラメータを HALCON 形式で保存する場合、以下のように内部パラメータをロードできます。
read_cam_par(ZividDataDir + '/ZividHandEyeHalconData/estimated_intrinsics.dat', InputCameraParameters)
特徴抽出
HALCON キャリブレーションプレートを使用する場合、演算子 find_calib_object を使用して、キャプチャされた各画像からキャリブレーションオブジェクトの姿勢を抽出できます。
create_calib_data ('hand_eye_moving_cam', 1, 1, CalibDataID)
set_calib_data_calib_object (CalibDataID, 0, CalibrationPlateFile)
find_calib_object (GrayImage, CalibDataID, 0, 0, I, ['sigma'], [2])
3D キャリブレーションオブジェクトを使用する場合、各キャプチャシーン内でオブジェクトの姿勢を求める必要があります。各キャプチャ画像内のキャリブレーションオブジェクトから特徴を抽出し、複数の視点間で点の対応関係を確立します。キャリブレーションオブジェクトの姿勢を抽出するには、演算子 create_surface_model と find_surface_model を使用できます。
create_surface_model (ObjectModel3DCalibrationObject, 0.03, [], [], SurfaceModelID)
find_surface_model (SurfaceModelID, ObjectModel3DScene, 0.05, 0.2, 0, 'false', [], [], PoseObject, Score, SurfaceMatchingResultID)
変換計算
HALCON では、キャリブレーションオブジェクトとロボットの姿勢ペアを収集します。
create_calib_data ('hand_eye_moving_cam', 0, 0, CalibDataID)
for j := 1 to NumberOfCaptures by 1
set_calib_data_observ_pose (CalibDataID, 0, 0, j, PoseObjects[j])
set_calib_data (CalibDataID, 'tool', j, 'tool_in_base_pose', RobotPoses[j])
endfor
ロボットの姿勢とキャリブレーションオブジェクトの姿勢のペアが収集されたら、HALCON の hand_eye_calibration を使用して変換を計算できます。
calibrate_hand_eye (CalibDataID, Errors)
検証
キャリブレーション後、以下の手順で結果を確認してください。
各キャリブレーション姿勢の残差を確認する
ロボットでタッチテストを実施する
点群のアライメントを視覚的に検査する
これは HALCON/HDevelop の演算子と 3D 可視化手法を使用して実行できます。取得した同次変換行列を Hand-Eye GUI から取得した行列と比較することもできます。キャリブレーション品質の評価に関する詳細については Hand-Eye Calibration Verification を参照してください。
次のステップ
キャリブレーション結果の適用方法については、 ハンドアイキャリブレーション結果の使い方 に進んでください。