HALCON——アイ・ハンドキャリブレーション

本節では、Windows オペレーティングシステムで Mech-Mind が提供するサンプルプログラムを使用してアイ・ハンドキャリブレーションを実行する方法について説明します。Mech-Mind は、以下のサンプルプログラムを提供します:

  • determine_calibration_poses.hdev:アイ・ハンドキャリブレーションを実行する時の キャリブレーション位置姿勢

  • perform_hand_eye_calibration.hdev:アイ・ハンドキャリブレーションを実行するために使用します。

注釈

  • 6 軸ロボットに適用します。

  • UHP カメラを使用してアイハンドキャリブレーションを実行する場合、撮影モード は必ず Camera1 を選択してください。

事前準備

HALCON を使用してアイ・ハンドキャリブレーションを実行する前に、以下のように準備してください:

  1. ロボットの精度をチェックしてください。またロボットが正常に稼働できることを確認してください。

  2. カメラの付属キャリブレーションボードを用意します。 キャリブレーションボードの取り付け を行います。

  3. Mech-Eye SDK をダウンロードしてインストールします。

  4. 2D画像と深度画像をチェック します。

  5. カメラの内部パラメータをチェック します。

  6. HALCON サンプルプログラム をダウンロードします。Code ‣ Download ZIP をクリックすればいいです。

サンプルプログラムを編集する

determine_calibration_poses.hdev を使用してキャリブレーション位置姿勢を取得してから perform_hand_eye_calibration.hdev を使用してアイ・ハンドキャリブレーションを実行します。

2つのサンプルプログラムは、以下の情報が一致するようにしてください。

  • 接続されたカメラ

  • キャリブレーションボードの型番

なお、位置姿勢を取得する前に、robot_pose.json ファイルのオイラー角のタイプを指定する必要があります。

同じカメラを選択する

サンプルプログラムを実行する前に、カメラを変更する必要があります。2つのサンプルプログラムでは同じカメラを使用するように設定します。以下のように設定します:

  1. HALCON でサンプルプログラムを開きます:HALCON を起動し、サンプルプログラムを プログラムウィンドウ にドラッグします。

  2. プログラムウィンドウinfo_framegrabber の行を選択してからツールバーの step_over ボタンをクリックするか、F6 を押してコマンドを実行します。

  3. 制御変数DeviceInfos をダブルクリックして接続可能なカメラを表示します。

    ../../_images/camera_information_1.png
  4. 使用するカメラを選択してダブルクリックし、unique_name: または user_name: の後に付くカメラ名をコピーします。

    ../../_images/camera_information_3.png
  5. 以下の行で MechEyeunique_name あるいは user_name に取り替えます。

    DeviceInfo := 'MechEye'
    
  6. ツールバーの run ボタンをクリックするか、F5 を押して実行してサンプルプログラムを実行します。

キャリブレーションボードの型番を設定する

以下のように設定します:

  1. HALCON でサンプルプログラムを開きます:HALCON を起動し、サンプルプログラムを プログラムウィンドウ にドラッグします。

  2. キャリブレーションボードの型番を設定します。デフォルトでは型番が BDB-5 になっていますが、変更する場合に以下のコマンドで BDB-5 を使用したい キャリブレーションボードの型番 に取り替えます。

    set_framegrabber_param (AcqHandle, 'BoardType', 'BDB-5')
    

オイラー角のタイプと単位を指定する

determine_calibration_poses.hdev を使用して取得したキャリブレーション位置姿勢を robot_pose.json ファイルに入力する必要があります。デフォルトでは、robot_pose.json ファイルのオイラー角のタイプは sxyz で、単位は角度です。以下の手順を実行して指定してください。

  1. robot_pose.json ファイルを開きます。

  2. オイラー角のタイプを指定します。以下の行で sxyz を使用するロボットのオイラー角のタイプに取り替えます。サンプルプログラムが対応できるオイラー角については、ロボットオイラー角のタイプ をお読みください。

    "EulerType":"sxyz"
    
  3. オイラー角の単位を指定します。ラジアンを単位とするオイラー角を入力する場合、以下のコマンドに truefalse に取り替えてください。

    "FromDegree":true
    
  4. robot_pose.json ファイルを保存します。

キャリブレーション位置姿勢を取得する

フローチャート

../../_images/extri_teach_flow.png

手順

アイ・ハンドキャリブレーションを実行するには、少なくとも 15 セットのキャリブレーション位置姿勢を取得する必要があります。以下のように取得します:

  1. ツールバーの run ボタンをクリックするか、F5 を押して実行します。read_char (WindowHandle, Char, ReCode) を実行する時に停止します。手動でコマンドを入力して続けて実行します。

    ヒント

    カメラを接続できない場合に、そのカメラが Mech-Eye Viewer または GenICam 対応のソフトウェアに接続されているかを確認してください。

  2. ティーチングペンダントを使用してロボットを適切な位置に移動します。

  3. P を入力してカメラを撮影させます。

    • キャリブレーションボードが視野内にない、あるいは一部だけが視野内にある場合、ロボットを移動して再度撮影してください。

    • キャリブレーションボードが全部視野内に入れたら次のステップを実行します。

  4. T を入力し、カメラに特徴認識の結果がある画像を撮影させます。

    • キャリブレーションボードのドットを認識できない場合、HALCON は画像を表示しません。ロボットを移動して再度させてください。

    • カメラがキャリブレーションボードのドットを認識できた場合に、HALCON は以下のように特徴認識の結果がある画像を表示します。次のステップを実行します。

      ../../_images/calib_sample.png
  5. ティーチングペンダントに表示されているロボットの位置姿勢を robot_pose.json ファイルに入力します。

    ヒント

    • 位置姿勢をティーチングペンダントに保存します。アイ・ハンドキャリブレーションを実行するとき、ティーチングペンダントに保存された位置姿勢を使用してロボットを移動することができます。

  6. ステップ 2~5 を繰り返して位置姿勢を収集します。

  7. 少なくとも 15 セットの位置姿勢を収集した後、Q を入力して終了します。

  8. robot_pose.json ファイルのキャリブレーション位置姿勢の数を設定します。robot_pose.json ファイルを開き、以下の行で 15 を実際に収集した位置姿勢の数に取り替えます。

    "pose_count":15
    

アイ・ハンドキャリブレーションを実行する

ロボットキャリブレーション位置姿勢を取得したあと、perform_hand_eye_calibration.hdev サンプルプログラムを実行してアイ・ハンドキャリブレーションを開始します。

カメラの取り付け方法を確認する

キャリブレーションを開始する前に、カメラの取り付け方法を確認してください。

デフォルトでは Eye in Hand となっています。Eye to Hand の場合に、以下の行で EyeInHandEyeToHand に取り替えます。

set_framegrabber_param (AcqHandle, 'CalibrationType', 'EyeInHand')

座標系を切り替える

サンプルプログラムには、カメラから出力される点群の座標系を切り替えるコマンドがあります。このコマンドを実行することでロボット座標系における点群を出力することが可能です。

デフォルトでは座標系を切り替えません。ロボット座標系に切り替えたい場合、captureTranformedPointCloud 関数で以下のコマンドの falsetrue に取り替えてください。

set_framegrabber_param (AcqHandle, 'Scan3dCoordinateTransformEnable',false)

手順

以下のステップを実行します:

  1. ツールバーの run ボタンをクリックするか、F5 を押してサンプルプログラムを実行します。stop の行では停止します。

  2. ロボットを robot_pose.json ファイルにあるキャリブレーション位置姿勢に移動します。

    ヒント

    robot_pose ファイルの順序に沿ってロボットを移動します。そうしないと外部パラメータを計算できないことがあります。

  3. ツールバーの run ボタンをクリックするか、F5 を押して実行し、カメラで画像を撮影します。

  4. 画像を収集したあと、制御変数CollectResult の値を確認します。

    • SUCCESS の場合、次のステップを実行します。

    • エラーメッセージが表示される場合、エラーコード に基づいてトラブルシューティングを行って再度キャリブレーション位置姿勢を取得します。

  5. 「Move the robot to the next calibration pose」というメッセージが表示されると、ステップ 2~3 を繰り返します。

    ヒント

    robot_pose.json ファイルにある位置姿勢に全部到達したあとサンプルプログラムを実行した場合、外部パラメータを自動的に計算します。

  6. 制御変数CalibResult の値を確認します。

    • SUCCESS と表示された場合、アイ・ハンドキャリブレーションが正常に実行されました。サンプルプログラムがあるフォルダで外部パラメータファイル Extrinsics.txt と座標系変換済みの点群を確認してください。

    • エラーメッセージが表示される場合、エラーコード に基づいてトラブルシューティングを行って再度キャリブレーション位置姿勢を取得します。

ロボットオイラー角のタイプ

キャリブレーションサンプルプログラムは、以下のオイラー角タイプと四元数の転換をサポートします。

入力順序

オイラー角のタイプ

ロボットブランド

Z-Y'-Z''

rzyz

Kawasaki

Z-Y'-X''

rzyx

ABB

KUKA

X-Y-Z

sxyz

FANUC

YASKAWA

Rokae

UR

X-Y'-Z''

rxyz

/

Z-X'-Z''

rzxz

/

注釈

  • オイラー角タイプ一致してもロボットオイラー角の表示順所が異なることがあります。以上の順序に従ってオイラー角を入力してください。

  • ほかのオイラー角タイプのロボットを使用する場合、手動で転換を追加してください。perform_hand_eye_calibration.hdev サンプルプログラムの euler_to_quad 関数に転換を追加してください。

キャリブレーションパラメータについて

ここではアイ・ハンドキャリブレーションのために使用するパラメータについて説明します。

BoardType

使用するキャリブレーションボードの型番を設定します。

値の説明:

説明

BDB-5

キャリブレーションボードとカメラとの推奨距離:< 0.6m

BDB-6

キャリブレーションボードとカメラとの推奨距離:0.6~1.5m

BDB-7

キャリブレーションボードとカメラとの推奨距離:> 1.5m

OCB-005

高い精度が求められ、Eye to Hand 取り付け方法の現場にのみ使用する

OCB-010

OCB-015

OCB-020

CGB-020

キャリブレーションボードとカメラとの推奨距離:< 0.6m

CGB-035

キャリブレーションボードとカメラとの推奨距離:0.6~1.5m

CGB-050

キャリブレーションボードとカメラとの推奨距離:> 1.5m

ExtrinErrCode

設定できないパラメータ。アイ・ハンドキャリブレーション実行時のステータスコードとエラーメッセージを確認できます。

ステータスコード

説明

SUCCESS

実行に成功

POSE_INVALID

間違っている位置姿勢の形式。四元数を入力してください

IMAGE2D_EMPTY

無効な 2D 画像

FIND_CORNERS_FAIL

2D 画像の特徴認識に失敗。2D 画像関連パラメータ調整 を調整して 2D 画像を再度取得してください

DEPTH_EMPTY

無効な深度画像

CORNERS_3D_INVALID

深度画像の特徴の認識に失敗。3D パラメータ を調整して深度画像を再度取得してください

POSES_INSUFFICIENT

位置姿勢の数は足りない。少なくとも 15 セットの位置姿勢を入力してください