HALCON によるハンドアイキャリブレーション

To perform hand-eye calibration with HALCON, collect matching robot pose and calibration-object pose pairs, then compute the transformation with HALCON's hand_eye_calibration operator.

はじめに

このガイドでは、HALCON を使用して Zivid カメラとハンドアイキャリブレーションを統合する方法について説明します。ハンドアイキャリブレーションには、一般的に Hand-Eye GUI を使用することが推奨されますが、このガイドでは HALCON と HDevelop を使用した別のアプローチを紹介します。これらの演算子は、HALCON の C++ および C# インターフェースでも使用できます。HDevelop のサンプルコードは、弊社のサンプルリポジトリにあります。

  • EyeInHandCalibration3DObject.hdev - Zivid カメラと 3D キャリブレーションオブジェクトを使用したハンドアイキャリブレーション

  • EyeInHandCalibrationMVTecPlate.hdev - Zivid カメラと MVTec キャリブレーションプレートを使用したハンドアイキャリブレーション

  • サンプルデータ - HALCON でハンドアイキャリブレーションサンプルを実行するために必要なサンプルデータセット

HDevelop のサンプルを実行するにはサンプルデータが必要ですが、独自のデータに置き換えることも可能です。

MVTec ドキュメント/ハンドアイキャリブレーションの問題と HALCON の原理

MVTec provides documentation which also covers many more details and specifics about hand-eye calibration and machine vision in general. The documentation for hand-eye calibration is outlined in the Solution Guide III-C: 3D Vision and the relevant section is Chapter 8: Robot Vision.

There are many ways in which to achieve successful hand-eye calibration. While none of the methods is perfect, which to choose depends on the specific use case and requirements. In principle, the fundamentals are similar. The goal is to find a homogenous transform between the coordinate system of the camera and the coordinate system of the robot base or robot flange. Since the data collected by the Zivid cameras is in 3D, the transformation can be calculated from the pose of the camera in the robot base coordinate system. For further information see Hand-Eye Calibration Theory.

HALCON/HDevelop の使用方法については、 How to run a HALCON Sample ページも参照してください。

前提条件

  • Zivid カメラ

  • HALCON ソフトウェアがインストール済みであること

  • GitHub の zivid-halcon-samples のサンプルを参照してください。

  • サンプルデータ をダウンロードしてください

  • 3D キャリブレーションオブジェクトまたは HALCON キャリブレーションプレート

  • 姿勢パラメータが既知のロボット(例:オイラー角 XYX など)

  • ハンドアイキャリブレーションの概念 への理解

カメラ設定

In general we recommend using preset settings wherever possible. This also applies for hand-eye calibration. Using the same settings for hand-eye calibration and for the application itself gives the best possible performance. In the sample data the manufacturing presets were used. If you are struggling with your settings, see Camera Settings for Hand-Eye Calibration.

キャリブレーションオブジェクト

2つの座標系間でハンドアイキャリブレーションを行うには、両方の座標系に共通する姿勢または点のセットが必要です。この姿勢・点ペアのセットを生成するには、キャリブレーションオブジェクトが必要です。詳細については キャリブレーションオブジェクト ページを参照してください。HALCON キャリブレーションプレートを使用するか、既知の形状で対称性のない 3D キャリブレーションオブジェクトを使用できます。

../../../../_images/halcon_3d_calibration_object.png ../../../../_images/halcon_calplate_marker_pattern.png

注釈

Zivid カメラで収集されるデータは 3D であるため、2D カメラの内部パラメータに依存するハンドアイキャリブレーション方法を使用する必要は ありません

ロボットの姿勢

Every robot manufacturer, and indeed sometimes even different robot models from the same manufacturer, will have their own way of representing and exporting robot poses. While the position in cartesian coordinates are depicted as X, Y, and Z (in a right-handed coordinate system), the orientation can be represented in many different ways. Especially Euler angles are parameterized in many different ways, and it is important to know which convention the robot uses. Quaternions and Homogeneous transformation matrices are easier to work with, as they are unambiguous, but can be unavailable.

HALCON は姿勢における向きの表現方法を多数サポートしており、それらの間の変換も可能です。これについては演算子 create_pose のドキュメントに記載されています。演算子 pose_to_hom_mat3d を使用すると、ロボットの姿勢を同次変換行列に変換できます。姿勢の数学的記述については Pose Conversions も参照してください。

ロボットの姿勢を記録する方法はいくつかあります。残念ながら、HALCON にはロボットメーカー向けのインターフェースが用意されていないため、ソケット接続などのインターフェースを使用してプログラムを作成する必要があります。今回の例では、ロボットの姿勢を手動で記録し、HALCON に入力しました。

ハンドアイキャリブレーションのプロセス

キャリブレーションプロセスを開始する前に、以下を確認してください。

  • カメラが ウォームアップ されていること

  • Infield Correction が実施されていること

  • すべてのロボット姿勢においてキャリブレーションオブジェクトがカメラの視野内に収まっていること

ハンドアイキャリブレーションの手順

ハンドアイキャリブレーションのプロセスは以下の手順で構成されます。

  1. 複数のロボット構成からキャリブレーションオブジェクトの姿勢をキャプチャする

  2. 各画像においてキャリブレーションオブジェクトの特徴を検出する

  3. 対応するロボットエンドエフェクタの姿勢を登録する

  4. 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_modelfind_surface_model を使用できます。

create_surface_model (ObjectModel3DCalibrationObject, 0.03, [], [], SurfaceModelID)
find_surface_model (SurfaceModelID, ObjectModel3DScene, 0.05, 0.2, 0, 'false', [], [], PoseObject, Score, SurfaceMatchingResultID)

変換計算

Now in HALCON we collect pose pairs of the calibration object and the robot. We add these pairs to a calibration data model with the operators set_calib_data_observ_pose and set_calib_data.

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)

検証

キャリブレーション後、以下の手順で結果を確認してください。

  • 各キャリブレーション姿勢の残差を確認する

  • Performing a touch test with the robot

  • 点群のアライメントを視覚的に検査する

これは HALCON/HDevelop の演算子と 3D 可視化手法を使用して実行できます。取得した同次変換行列を Hand-Eye GUI から取得した行列と比較することもできます。キャリブレーション品質の評価に関する詳細については Hand-Eye Calibration Verification を参照してください。

Next Steps

キャリブレーション結果の適用方法については、 ハンドアイキャリブレーション結果の使い方 に進んでください。