任意のロボット + RoboDK + Python: タッチテストによるハンドアイキャリブレーション結果の検証

注釈

このチュートリアルは UR5e と Yaskawa H10 でのみテストされており、 RoboDK でサポートされているロボットでのみ動作します。

導入

ハンドアイキャリブレーションの正確度を測定するのは難しい場合があります。そのため、正確度を簡単に検証できるタッチテストを作成しました。このテストでは、 RoboDK を使用してロボットを動かします。このサンプルは、アイインハンドとアイツーハンドの両方のタイプのハンドアイキャリブレーション結果に対応しています。タッチテストは、 Zivid キャリブレーションオブジェクト をカメラの FOV 内に配置し、キャプチャしたうえで、ロボットを制御して特定のポイントでタッチすることから構成されます。タッチ後、 Zivid キャリブレーションオブジェクトを移動させて、ロボットに再度タッチするよう指示できます。このプロセスは何度でも繰り返すことができます。唯一の制限は、ロボットのリーチとカメラの FOV の 2 点です。

下の画像では、タッチテストから期待される結果を確認できます。

注釈

タッチの正確度は、ロボットキャリブレーション誤差、ハンドアイキャリブレーション誤差、 TCP キャリブレーション誤差、およびキャリブレーションオブジェクトの姿勢推定誤差に依存します。

要件

  • Linux の場合は Zivid Tools を含む Zivid software がインストールされていること。

  • Zivid-Python がインストールされていること。

  • RoboDK software がインストールされていること。

  • Robodk robot library にデジタルツインが存在するロボット。

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

  • ハンドアイキャリブレーションの結果として得られたハンドアイ変換行列を含む .yaml ファイル。

  • Pointed Hand-Eye Verification Tool を定義する変換行列を含む .yaml ファイル。

Pointed Hand-Eye Verification Tool

このチュートリアルでは、タッチツールとして Pointed Hand-Eye Verification Tool を使用します。このツールは、 UR5e (ISO 9409-1-50-4-M6) および Yaskawa HC10 (ISO 9409-1-63-4-M6) と互換性があります。

Pointed Hand-Eye Verification Tool を次の図に示します。

Pointed Hand-Eye Verification Tool

アームマウント

このチュートリアルでは、ロボットのエンドエフェクターと Pointed Hand-Eye Verification Tool の間に Zivid On-Arm Mount Extender および Zivid On-Arm Mount を取り付けることを前提としています。これらのマウントにより、ロボットのエンドエフェクターと Pointed Hand-Eye Verification Tool 間の距離が延長されます。各マウントに追加された寸法は、以下の画像で確認できます。

Zivid オンアーム マウントおよびオンアーム マウント エクステンダー

on-arm-mounts.yaml ファイルには、ロボットのエンドエフェクターと Pointed Hand-Eye Verification Tool の間に取り付けられた 2 つのマウントの変換行列が含まれています。マウントの詳細については、 on-arm camera mount datasheet および on-arm mount extender datasheet を参照してください。

RoboDK 環境がすでにセットアップされていてロボットに接続済みの場合は、 タッチテスト用のキャプチャポーズを作成する にジャンプできます。

RoboDK 環境のセットアップ

RoboDK の .rdk ファイルには、ロボット、ターゲットポーズ、および環境に関する情報が格納されています。タッチテストを実行するために必要な .rdk ファイル内のコンポーネントは次のとおりです。

  • ロボットモデルファイル (.robot)

  • ターゲットポーズ 1 つ(このチュートリアルの例では "touch_test_pose" という名前)

  • ロボット環境の仮想モデル(オプション)

  • 使用するカメラの CAD モデル(例: Zivid 2 CAD file)(オプション)

  • Pointed Hand-Eye Verification Tool の CAD モデル(オプション)

RoboDK 環境にロボットを追加する

まず RoboDK プログラムを開き、使用するロボットを追加します。ロボットを追加するには、GUI から File -> Open online library に進んでライブラリを開きます。インターフェースでモデルに合うロボットを見つけ、マウスをその上に合わせて Open を選択します。ロボットがステーションに表示されない場合は、代わりに Download を選択し、.rdk 環境にドラッグアンドドロップします。この手順は Select a robot RoboDK tutorial でも説明されています。

RoboDK を介してロボットに接続する

警告

使用するロボットのメーカーによっては、 RoboDK に接続するためにドライバーのセットアップが必要になる場合があります。セットアップの詳細については、 RoboDK ドキュメントのロボットヒントセクションを参照してください。例えば、 ABB robots 向けのアドバイスが記載されています。

タッチテストスクリプトを実行する前に、まず RoboDK インターフェースを使用してロボットに接続する必要があります。 RoboDK GUI で Connect -> Connect Robot に移動します。これにより、ロボットの IP アドレスとポート番号を入力できるサイドパネルが開きます。

../../../../_images/robodk-connect-to-robot.png

注釈

ほとんどのロボットには、制御ペンダントまたはタブレットにリモートモードが搭載されています。接続を確立するには、ロボットがリモートモードになっていることを確認してください。

ロボットに接続するには、IP アドレスを知っている必要があります。IP アドレスはロボットの制御ペンダントで確認できます。 connecting to the robot for RoboDK の手順に従ってください。確認が必要なもう一つの接続設定はポート番号です。以前に変更が加えられていない限り、ドライバーに付属するデフォルトのポート番号が機能するはずです。

Connect をクリックして、 Connection status ボックスが緑色になっていれば、 RoboDK インターフェースでロボットを制御できます。赤色の場合は、ポート番号と IP アドレスが正しいことを確認してください。それでも赤色の場合は、このチュートリアルの末尾にある「 RoboDK のトラブルシューティング」の章を確認してください。

タッチテスト用のキャプチャポーズを作成する

タッチテストのキャプチャポーズを保存するために how to create a target in RoboDK を参照してください。

RoboDK を使用してポーズを作成する方法は 2 通りあります。

  1. ペンダントを使用してロボットを物理的に目的のポーズに移動させた後、 RoboDK 経由で接続してポーズを記録する

  2. RoboDK を通じてロボットをリモート操作し、ポーズを作成して保存する

Tip

RoboDK を使用してロボットを動かしており、速度が適切でない場合は、 set the robot speed in RoboDK を参照してください。速度を設定した後は、作成したプログラムを右クリックして Run on the robot にチェックを入れ、再度右クリックして Run を選択してください。

タッチテストのキャプチャポーズを作成する前に、 Zivid キャリブレーションオブジェクト をどこに配置するかを検討する必要があります。アイインハンドの場合は、カメラの FOV 内に収まるようにしてください。アイツーハンドの場合は、ロボットが Zivid キャリブレーションオブジェクトの視界を遮らないようにしてください。タッチテストに必要なポーズは 1 つだけです。 RoboDK での表示例を以下に示します。

RoboDK でタッチ テストのポーズをとります。

Tip

使用するロボット構成を制御するには、保存したターゲットがデカルトターゲットではなくジョイントターゲットであることを確認してください。 RoboDK でターゲットを右クリックしてジョイントターゲットを選択すると、ポーズがジョイントターゲットに変換されます。これにより、ターゲットシンボルの色も赤から緑に変わります。

デカルトターゲットとジョイントターゲットの違い。

タッチテストを実行する

Hand-Eye GUI を使用したタッチテスト手順

このガイドでは、 Hand-Eye GUI を使用してタッチテストを実行するために必要な手順を説明します。

タッチテストメニュー

Tip

手順について不明な点がある場合は、 GUI 内の チュートリアル セクションを参照してガイダンスと視覚的な例を確認してください。

タッチマーカー

カメラを接続する

カメラが正しく接続され、システムに認識されていることを確認してください。

カメラを接続する

ロボットに接続する

GUI を介してロボットとの通信を確立してください。

ロボットに接続する

ハンドアイ変換行列を入力する

ハンドアイ変換行列にデータを入力する方法はいくつかあります。

  • ディスクから読み込む: File > Load data from directory を選択し、保存済みのハンドアイキャリブレーションファイルが含まれるフォルダを選択します。

  • GUI キャリブレーションの結果を使用する: GUI を通じてハンドアイキャリブレーションを実行したばかりの場合は、再読み込みすることなく、得られた変換行列をそのまま使用できます。

  • 手動入力: または、対応する入力フィールドに変換行列を直接手動で入力することもできます。

ハンドアイ変換データを読み込む

タッチする ArUco マーカーを確認し、ツール長を設定する

  1. タッチテスト中に使用するマーカー ID を選択または確認してください。

  2. ロボットのエンドエフェクター基準点と実際のツール先端との距離を指定します。

マーカー ID とツールを確認する

マーカーを検出するためにキャプチャする

シーン内のターゲットマーカーの位置を特定するために、マーカー検出を開始します。

マーカーをキャプチャする

マーカーにタッチする

ロボットを移動させて、検出されたマーカーの中心に物理的にタッチさせます。

タッチマーカー
Hand-Eye スクリプトを使用したタッチテスト手順

スクリプトを実行する前に、.rdk ファイルを開いてロボットに接続しておく必要があります。 The script can be found in the Zivid Python Samples。以下に示すように、コマンドライン引数を受け取ります。

ソースに移動

ソース

type_group.add_argument("--eih", "--eye-in-hand", action="store_true", help="eye-in-hand configuration")
type_group.add_argument("--eth", "--eye-to-hand", action="store_true", help="eye-to-hand configuration")
parser.add_argument(
    "--settings-path",
    required=False,
    type=Path,
    help="Path to the camera settings YML file",
)
parser.add_argument("--ip", required=True, help="IP address of the robot controller")
parser.add_argument(
    "--target-keyword",
    required=True,
    help="RoboDK target name representing a robot pose at which the calibration object is in the field of view of the camera",
)
parser.add_argument(
    "--tool-yaml",
    required=True,
    help="Path to YAML file that represents the Pointed Hand-Eye Verification Tool transformation matrix",
)
parser.add_argument(
    "--mounts-yaml",
    required=False,
    help="Path to YAML file that represents the on-arm mounts transformation matrix",
)
parser.add_argument(
    "--hand-eye-yaml",
    required=True,
    help="Path to the YAML file that contains the Hand-Eye transformation matrix",
)
subparsers = parser.add_subparsers(dest="calibration_object", required=True, help="Calibration object type")
subparsers.add_parser("checkerboard", help="Verify using Zivid calibration board")
marker_parser = subparsers.add_parser("marker", help="Verify using ArUco marker")
marker_parser.add_argument(
    "--dictionary",
    required=True,
    choices=list(zivid.calibration.MarkerDictionary.valid_values()),
    help="Dictionary of the targeted ArUco marker",
)
marker_parser.add_argument(
    "--id", nargs=1, required=True, type=int, help="ID of ArUco marker to be used for verification"
)

スクリプトは以下の手順で実行されます。

  • ロボットは事前に定義されたキャプチャポーズに移動します。

  • ユーザーは、 Zivid キャリブレーションオブジェクトを FOV 内に配置し、 Enter を押すよう求められます。

  • カメラが Zivid キャリブレーションオブジェクトをキャプチャし、タッチポイントの姿勢が計算されてユーザーに表示されます。

  • ユーザーが Enter キーを押すと、ロボットは Zivid キャリブレーションオブジェクトの特定のポイントにタッチします。

  • Enter キーを押すと、ロボットは後退してキャプチャポーズに戻ります。

  • この時点で、 Zivid キャリブレーションオブジェクトを移動させて、別の場所でタッチテストを実行できます。

  • ユーザーは、タッチテストを繰り返すか中止するかを「y」または「n」で入力するよう求められます。

スクリプトの解説

RoboDK ハンドアイキャリブレーション検証スクリプトが機能するには、3 つの追加 Python ファイルが必要です。

  1. robodk_tools.py はロボットの設定に使用されます。

  2. save_load_matrix.py は、 YAML ファイルへの行列の保存および読み込みに使用されます。

スクリプトはそれぞれ次の手順で実行されます。

ロボットに接続する

まず、IP アドレスを使用してロボットに接続します。次に、シミュレータとのリンクを確立するための rdk オブジェクトと、各種ロボット設定パラメータを含む robot オブジェクトを取得します。

ソースに移動

ソース

rdk, robot = connect_to_robot(user_options.ip)

ロボットの速度と加速度を設定する

ロボット設定の最後のステップは、ロボットの速度と加速度を定義することです。

ソースに移動

ソース

set_robot_speed_and_acceleration(robot, speed=100, joint_speed=100, acceleration=50, joint_acceleration=50)

Pointed Hand-Eye Verification Tool の変換行列を読み込む

次に、 Pointed Hand-Eye Verification Tool を定義する変換行列が読み込まれます。

ソースに移動

ソース

print("Loading the Pointed Hand-Eye Verification Tool transformation matrix from a YAML file")
tool_base_to_tool_tip_transform = load_and_assert_affine_matrix(Path(user_options.tool_yaml))

TCP 変換行列を定義する

次に、ツールの中心点 ( TCP ) を定義する必要があります。まずプログラムは、ユーザーがアームマウント行列を含む .yaml ファイルを提供したかどうかを確認します。アームマウント行列が提供されない場合、 Pointed Hand-Eye Verification Tool がロボットのエンドエフェクターに直接取り付けられていると見なします。したがって、 TCP 行列は Pointed Hand-Eye Verification Tool 行列と同等になります。

ソースに移動

ソース

if user_options.mounts_yaml:
    print("Loading the on-arm mounts transformation matrix from a YAML file")
    flange_to_tool_base_transform = load_and_assert_affine_matrix(Path(user_options.mounts_yaml))

    flange_to_tcp_transform = flange_to_tool_base_transform @ tool_base_to_tool_tip_transform
else:
    flange_to_tcp_transform = tool_base_to_tool_tip_transform

キャプチャポーズに移動する

ロボットは、このサンプルの実行中に開いている .rdk ファイルから取得した capture_pose に移動します。

ソースに移動

ソース

capture_pose = get_robot_targets(rdk, target_keyword=user_options.target_keyword)
if not capture_pose:
    raise IndexError(
        "The list of poses retrieved from RoboDK is empty...\nMake sure that you have created a Capture Pose and that you introduced the right keyword for it."
    )
robot.MoveJ(capture_pose[0])

Zivid キャリブレーションオブジェクトを配置する

次のステップは、ユーザーが Zivid キャリブレーションオブジェクトをカメラの FOV 内に配置したことを確認することです。

ソースに移動

ソース

print("\nPlace the calibration object in the FOV of the camera.")
input("Press enter to start.")

Zivid キャリブレーションオブジェクトの検出と姿勢推定

Enter を押すと、 Zivid キャリブレーションオブジェクトがキャプチャされ、カメラフレーム内での姿勢が推定されます。

ソースに移動

ソース

frame = camera.capture_2d_3d(settings)
bgra_image = frame.point_cloud().copy_data("bgra_srgb")
camera_to_calibration_object_transform = _estimate_calibration_object_pose(frame, user_options)

Zivid キャリブレーションオブジェクトの姿勢をカメラフレームからロボットベースフレームへ変換する

ソースに移動

ソース

print("Calculating the calibration object pose in robot base frame")
base_to_calibration_object_transform = _get_base_to_calibration_object_transform(
    user_options,
    camera_to_calibration_object_transform,
    robot,
)

この変換の背後にある数学的な原理を理解するには、 ハンドアイキャリブレーションソリューション を参照してください。

タッチポーズを取得する

ロボットを移動させるタッチポーズはエンドエフェクター(フランジ)のポーズであるため、 TCP を考慮する必要があります。

ソースに移動

ソース

print("Calculating pose for robot to touch the calibration object")
touch_pose = base_to_calibration_object_transform @ np.linalg.inv(flange_to_tcp_transform)

アプローチポーズを取得する

アプローチポーズは、タッチポーズから Z 軸方向へのオフセットとして定義し、任意の値 -140 mm に設定します。

ソースに移動

ソース

print("Calculating pose for the robot to approach the calibration object")
touch_pose_offset = np.identity(4)
touch_pose_offset[2, 3] = -140
approach_pose = touch_pose @ touch_pose_offset

Zivid キャリブレーションオブジェクトにタッチする

Zivid キャリブレーションオブジェクトに近づいてタッチする前に、計算されたタッチポーズがユーザーに表示されます。

ユーザーは Enter を押すことで、ロボットにタッチ動作を実行させることができます。

ソースに移動

ソース

_draw_coordinate_system(frame, camera_to_calibration_object_transform, bgra_image)
input("\nClose the window and press enter to the touch the calibration object...")

Zivid キャリブレーションオブジェクトにタッチするために、ロボットはまずジョイント動作でアプローチポーズに移動します。次に、直線的に移動してタッチポーズに移ります。この時点で、ユーザーは Zivid キャリブレーションオブジェクトに近づき、タッチの正確度を目視で確認できます。

ソースに移動

ソース

print("Touching calibration object")
robot.MoveJ(Mat(approach_pose.tolist()))
robot.MoveL(Mat(touch_pose.tolist()))

Zivid キャリブレーションオブジェクトから離れる

プログラムはユーザーが Enter を押すことを待ち、その後ロボットは Zivid キャリブレーションオブジェクトから離れてキャプチャポーズに戻ります。

ソースに移動

ソース

input("\nPress enter to pull back and return to the capture pose...")
robot.MoveL(Mat(approach_pose.tolist()))
robot.MoveJ(capture_pose[0])

Zivid キャリブレーションオブジェクトに再度タッチする

この時点で、 Zivid キャリブレーションオブジェクトを移動させて、カメラの FOV 内の別の場所でタッチテストを実行できます。ユーザーはタッチテストを繰り返すか中止するかを「y」または「n」で入力するよう求められます。

ソースに移動

ソース

print("\nThe calibration object can be moved at this time.")
answer = _yes_no_prompt("Perform another touch?")
if answer == "n":
    break

ハンドアイ変換の活用方法を学ぶ準備ができている場合は、 ハンドアイキャリブレーション結果の使い方 をお読みいただくことをお勧めします。

RoboDK のトラブルシューティング

ロボットが意図とは異なる構成に移動する

タッチテストプロセスを再現性のあるものにするには、ジョイントターゲットを使用してください。ジョイントターゲットを使用すると、ロボットは常に同じ構成をとります。デカルトターゲットを使用した場合、ロボットが構成を自由に選択できるため、衝突が発生する可能性があります。下の画像では、 target 1 が赤色、 target 2 が緑色で表示されている 2 つのターゲットを確認できます。赤色はデカルトターゲットを、緑色はジョイントターゲットを意味します。

デカルトターゲットとジョイントターゲットの違い。
Windows のファイアウォール経由で接続する

注釈

この方法は Windows 10 でテストされました。

ドライバーのブロックを確認する

Windows を実行しているコンピューターに接続する場合は、ファイアウォールによってロボットへの接続が妨げられる可能性があることに注意してください。ファイアウォールを完全に無効にする方法もありますが、システムが脆弱な状態になるため推奨しません。

代わりに、 Windows ファイアウォールに新しいルールを追加して、使用するロボットのドライバーと IP アドレスに対してのみ通信を許可することができます。これら 2 つの属性を確認するには、 more options を選択して connect to robot パネルを展開します。この場合、ドライバーは apiur です。

ドライバー名の表示。

システムの Windows Defender ファイアウォールを開き、 Advanced settings に進みます。ファイアウォールルールの定義画面が表示されます。ここで受信ルールを変更して、ロボットの制御に必要なドライバーとの通信を許可することができます。

受信ルールでロボットドライバーにブロックマークが付いているか確認してください。ドライバーがブロックされている場合はそのルールを無効にしてください。無効にしない限り、ファイアウォールが通信をブロックします。

ブロックされたドライバーとルール無効化ボタン。

このルールを無効にしたら、 RoboDK ソフトウェアがロボットに接続できるか確認します。それでも接続できない場合は、ドライバーがロボットと通信できるよう専用のルールを作成する必要があります。

新しい受信ルールを作成する

New Rule... をクリックすると、コンピューターとロボット間の通信を許可するルールを作成して定義できます。

新しい受信ルールを追加する。

まず、最初のページで Custom オプションを選択し、2 ページ目で All programs を選択する必要があります。以下に図示しています。

最初の 2 ステップ。

次のページでは、プロトコルとして TCP を選択し、特定のローカルポートを選択して、 RoboDK のポートと一致するポート番号を入力する必要があります。

プロトコルとポートを選択する。

次のステップは IP アドレスの設定です。 Which remote IP address does this rule apply to? の下で These IP addresses を選択します。次に Add をクリックして、 RoboDK の IP と一致する IP アドレスを設定します。

ルールの適用範囲を選択する。

OKNext をクリックした後、 Allow all connections を選択し、次のページですべてのチェックボックスにチェックを入れます。

アクションとプロファイルを設定する。

最後に、ルールに適切な名前を付けて Finish をクリックすれば完了です。

アクションとプロファイルを設定する。