任意のロボット + 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 にデジタルツインが存在するロボット。
ハンドアイキャリブレーションの結果として得られたハンドアイ変換行列を含む .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.STL- 3D プリントに使用できる STL 形式の CAD モデル。pointed-hand-eye-verification-tool.STEP- RoboDK に読み込める STEP 形式の CAD モデル。pointed-hand-eye-verification-tool.yaml- YAML 形式の変換行列。このチュートリアルに関連するコードサンプルの入力引数の一つとして必要です。
Pointed Hand-Eye Verification Tool を次の図に示します。
アームマウント
このチュートリアルでは、ロボットのエンドエフェクターと Pointed Hand-Eye Verification Tool の間に Zivid On-Arm Mount Extender および Zivid On-Arm Mount を取り付けることを前提としています。これらのマウントにより、ロボットのエンドエフェクターと Pointed Hand-Eye Verification Tool 間の距離が延長されます。各マウントに追加された寸法は、以下の画像で確認できます。
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 アドレスとポート番号を入力できるサイドパネルが開きます。
注釈
ほとんどのロボットには、制御ペンダントまたはタブレットにリモートモードが搭載されています。接続を確立するには、ロボットがリモートモードになっていることを確認してください。
ロボットに接続するには、IP アドレスを知っている必要があります。IP アドレスはロボットの制御ペンダントで確認できます。 connecting to the robot for RoboDK の手順に従ってください。確認が必要なもう一つの接続設定はポート番号です。以前に変更が加えられていない限り、ドライバーに付属するデフォルトのポート番号が機能するはずです。
Connect をクリックして、 Connection status ボックスが緑色になっていれば、 RoboDK インターフェースでロボットを制御できます。赤色の場合は、ポート番号と IP アドレスが正しいことを確認してください。それでも赤色の場合は、このチュートリアルの末尾にある「 RoboDK のトラブルシューティング」の章を確認してください。
タッチテスト用のキャプチャポーズを作成する
タッチテストのキャプチャポーズを保存するために how to create a target in RoboDK を参照してください。
RoboDK を使用してポーズを作成する方法は 2 通りあります。
ペンダントを使用してロボットを物理的に目的のポーズに移動させた後、 RoboDK 経由で接続してポーズを記録する
RoboDK を通じてロボットをリモート操作し、ポーズを作成して保存する
Tip
RoboDK を使用してロボットを動かしており、速度が適切でない場合は、 set the robot speed in RoboDK を参照してください。速度を設定した後は、作成したプログラムを右クリックして Run on the robot にチェックを入れ、再度右クリックして Run を選択してください。
タッチテストのキャプチャポーズを作成する前に、 Zivid キャリブレーションオブジェクト をどこに配置するかを検討する必要があります。アイインハンドの場合は、カメラの FOV 内に収まるようにしてください。アイツーハンドの場合は、ロボットが Zivid キャリブレーションオブジェクトの視界を遮らないようにしてください。タッチテストに必要なポーズは 1 つだけです。 RoboDK での表示例を以下に示します。
タッチテストを実行する
Hand-Eye GUI を使用したタッチテスト手順
このガイドでは、 Hand-Eye GUI を使用してタッチテストを実行するために必要な手順を説明します。
カメラを接続する
カメラが正しく接続され、システムに認識されていることを確認してください。
ロボットに接続する
GUI を介してロボットとの通信を確立してください。
ハンドアイ変換行列を入力する
ハンドアイ変換行列にデータを入力する方法はいくつかあります。
ディスクから読み込む: File > Load data from directory を選択し、保存済みのハンドアイキャリブレーションファイルが含まれるフォルダを選択します。
GUI キャリブレーションの結果を使用する: GUI を通じてハンドアイキャリブレーションを実行したばかりの場合は、再読み込みすることなく、得られた変換行列をそのまま使用できます。
手動入力: または、対応する入力フィールドに変換行列を直接手動で入力することもできます。
タッチする ArUco マーカーを確認し、ツール長を設定する
タッチテスト中に使用するマーカー 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 ファイルが必要です。
robodk_tools.py はロボットの設定に使用されます。
save_load_matrix.py は、 YAML ファイルへの行列の保存および読み込みに使用されます。
スクリプトはそれぞれ次の手順で実行されます。
ロボットに接続する
まず、IP アドレスを使用してロボットに接続します。次に、シミュレータとのリンクを確立するための rdk オブジェクトと、各種ロボット設定パラメータを含む robot オブジェクトを取得します。
ロボットの速度と加速度を設定する
ロボット設定の最後のステップは、ロボットの速度と加速度を定義することです。
Pointed Hand-Eye Verification Tool の変換行列を読み込む
次に、 Pointed Hand-Eye Verification Tool を定義する変換行列が読み込まれます。
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 内に配置したことを確認することです。
Zivid キャリブレーションオブジェクトの検出と姿勢推定
Enter を押すと、 Zivid キャリブレーションオブジェクトがキャプチャされ、カメラフレーム内での姿勢が推定されます。
Zivid キャリブレーションオブジェクトの姿勢をカメラフレームからロボットベースフレームへ変換する
この変換の背後にある数学的な原理を理解するには、 ハンドアイキャリブレーションソリューション を参照してください。
タッチポーズを取得する
ロボットを移動させるタッチポーズはエンドエフェクター(フランジ)のポーズであるため、 TCP を考慮する必要があります。
アプローチポーズを取得する
アプローチポーズは、タッチポーズから Z 軸方向へのオフセットとして定義し、任意の値 -140 mm に設定します。
Zivid キャリブレーションオブジェクトにタッチする
Zivid キャリブレーションオブジェクトに近づいてタッチする前に、計算されたタッチポーズがユーザーに表示されます。
ユーザーは Enter を押すことで、ロボットにタッチ動作を実行させることができます。
Zivid キャリブレーションオブジェクトにタッチするために、ロボットはまずジョイント動作でアプローチポーズに移動します。次に、直線的に移動してタッチポーズに移ります。この時点で、ユーザーは Zivid キャリブレーションオブジェクトに近づき、タッチの正確度を目視で確認できます。
Zivid キャリブレーションオブジェクトから離れる
プログラムはユーザーが Enter を押すことを待ち、その後ロボットは Zivid キャリブレーションオブジェクトから離れてキャプチャポーズに戻ります。
Zivid キャリブレーションオブジェクトに再度タッチする
この時点で、 Zivid キャリブレーションオブジェクトを移動させて、カメラの FOV 内の別の場所でタッチテストを実行できます。ユーザーはタッチテストを繰り返すか中止するかを「y」または「n」で入力するよう求められます。
ハンドアイ変換の活用方法を学ぶ準備ができている場合は、 ハンドアイキャリブレーション結果の使い方 をお読みいただくことをお勧めします。
RoboDK のトラブルシューティング
ロボットが意図とは異なる構成に移動する
Windows のファイアウォール経由で接続する
注釈
この方法は Windows 10 でテストされました。
ドライバーのブロックを確認する
Windows を実行しているコンピューターに接続する場合は、ファイアウォールによってロボットへの接続が妨げられる可能性があることに注意してください。ファイアウォールを完全に無効にする方法もありますが、システムが脆弱な状態になるため推奨しません。
代わりに、 Windows ファイアウォールに新しいルールを追加して、使用するロボットのドライバーと IP アドレスに対してのみ通信を許可することができます。これら 2 つの属性を確認するには、 more options を選択して connect to robot パネルを展開します。この場合、ドライバーは apiur です。
システムの Windows Defender ファイアウォールを開き、 Advanced settings に進みます。ファイアウォールルールの定義画面が表示されます。ここで受信ルールを変更して、ロボットの制御に必要なドライバーとの通信を許可することができます。
受信ルールでロボットドライバーにブロックマークが付いているか確認してください。ドライバーがブロックされている場合はそのルールを無効にしてください。無効にしない限り、ファイアウォールが通信をブロックします。
このルールを無効にしたら、 RoboDK ソフトウェアがロボットに接続できるか確認します。それでも接続できない場合は、ドライバーがロボットと通信できるよう専用のルールを作成する必要があります。
新しい受信ルールを作成する
New Rule... をクリックすると、コンピューターとロボット間の通信を許可するルールを作成して定義できます。
まず、最初のページで Custom オプションを選択し、2 ページ目で All programs を選択する必要があります。以下に図示しています。
次のページでは、プロトコルとして TCP を選択し、特定のローカルポートを選択して、 RoboDK のポートと一致するポート番号を入力する必要があります。
次のステップは IP アドレスの設定です。 Which remote IP address does this rule apply to? の下で These IP addresses を選択します。次に Add をクリックして、 RoboDK の IP と一致する IP アドレスを設定します。
OK と Next をクリックした後、 Allow all connections を選択し、次のページですべてのチェックボックスにチェックを入れます。
最後に、ルールに適切な名前を付けて Finish をクリックすれば完了です。