任意のロボット + RoboDK + Python: データセットを生成し、ハンドアイキャリブレーションを実行する

注釈

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

はじめに

正確なハンドアイキャリブレーションには優れたデータセットが必要ですが、このデータセットの生成は困難な作業となる場合があります。このタスクを簡素化する方法の一つは、ロボットのポーズを事前に保存し、その後の取得プロセスを自動化することです。このチュートリアルでは、 RoboDK を使用してハンドアイデータセットの取得を自動化します。これにより、 Zivid ハンドアイキャリブレーションからハンドアイ変換行列を取得するために必要な 3D 画像とロボットのポーズが得られます。このサンプルは eye-in-hand と eye-to-hand の両方に対応しています。

ハンドアイキャリブレーションに慣れていない場合は、まず ハンドアイキャリブレーション の記事をお読みください。

要件

RoboDK 環境のセットアップ

RoboDK の .rdk ファイルには、ロボット、ターゲットのポーズ、および環境に関する情報が保存されます。ハンドアイキャリブレーションデータセットの生成に必要かつ有用な .rdk ファイル内のコンポーネントは次のとおりです。

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

  • ターゲットポーズのリスト(例: Target 0、 Target 1、 Target 2 など)

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

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

RoboDK でこの .rdk ファイルのサンプルを開いて確認してください。 サンプルファイル

RoboDK 環境へのロボットの追加

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

RoboDK を介したロボットへの接続

警告

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

Hand-Eye スクリプトを実行する前に、まず 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 のトラブルシューティング」の章を確認してください。

ハンドアイキャリブレーション用ポーズの作成

警告

ロボットがキャリブレーション済みの場合、ハンドアイデータセットを作成する前に、ロボットコントローラーから DH パラメーターを RoboDK に読み込む必要があります。ロボットのキャリブレーションが正しくないと、ハンドアイキャリブレーションの結果が悪化する可能性があります。トラブルシューティング記事 ロボットのキャリブレーション不良(DH パラメーター) では、 UR ロボットの DH パラメーターを取得して読み込む方法を説明しています。ロボットがキャリブレーション済みの場合は、ロボットのドキュメントを参照して DH パラメーターを取得してください。

ポーズを保存するには、 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 Studio を使用してロボットを所定の位置に移動させながらライブモードでキャプチャしてください。これにより、最適なカバレッジが得られる向きを選択できます。正確なハンドアイ変換を得るには、10〜20 個のポーズを用意することをお勧めします。 RoboDK での表示例を以下に示します。

RoboDK でハンドアイキャリブレーションのポーズをとります。

Tip

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

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

Python スクリプトの実行

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

ソースに移動

source

type_group.add_argument("--eih", "--eye-in-hand", action="store_true", help="eye-in-hand calibration")
type_group.add_argument("--eth", "--eye-to-hand", action="store_true", help="eye-to-hand calibration")
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='This is the keyword shared for naming all poses used for hand-eye dataset, i.e. if we have: "Target 1", "Target 2", ... , "Target N". Then we should use "Target"',
)
subparsers = parser.add_subparsers(dest="calibration_object", required=True, help="Calibration object type")
subparsers.add_parser("checkerboard", help="Use checkerboard for calibration")
marker_parser = subparsers.add_parser("marker", help="Use marker for calibration")
marker_parser.add_argument(
    "--dictionary",
    required=True,
    choices=list(zivid.calibration.MarkerDictionary.valid_values()),
    help="Dictionary used for marker calibration",
)
marker_parser.add_argument("--ids", nargs="+", required=True, type=int, help="IDs used for marker calibration")

スクリプトが初期化されると、データセットと結果を保存するための別のパスを選択するオプションが表示されます。パスが指定されない場合、データセットと結果は hand-eye/datasets/<取得日> に保存されます。スクリプトは指定されたポーズを順に実行し、以下のようにハンドアイキャリブレーションを実施します。

スクリプトのウォークスルー

RoboDK のハンドアイキャリブレーションスクリプトを機能させるには、さらに 2 つの Python ファイルが必要です。

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

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

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

ロボットへの接続

まず、 robodk_tools.pyconnect_to_robot() 関数に IP アドレスを引数として渡してロボットに接続します。この関数は、シミュレーターとのリンクを確立するために使用される rdk オブジェクトと、さまざまなロボット設定パラメーターを含む robot オブジェクトを返します。

ソースに移動

ソース

rdk, robot = connect_to_robot(user_options.ip)

ロボットターゲットの設定

次に robodk_tools.pyget_robot_targets() 関数を使用してターゲットのリストを取得します。このリストは RoboDK の .rdk ファイルから取得され、各ターゲットのロボットのポーズが含まれています。ターゲットのリストを取得するには、前のステップで取得した rdk オブジェクトとユーザーが指定したターゲットキーワードを引数として指定する必要があります。

ソースに移動

source

targets = get_robot_targets(rdk, user_options.target_keyword)

ロボットの速度と加速度の設定

ロボット設定の最後のステップは、ロボットの速度と加速度を定義することです。これらのパラメーターを定義するために、 robot_speed_accel_limits という名前の 4 つの整数からなるリスト(それぞれ線形速度、関節速度、線形加速度、関節加速度)を作成します。次に、 robodk_tools.pyset_robot_speed_and_acceleration() 関数に robot オブジェクトと robot_speed_accel_limits を引数として渡すことで、ロボットの設定が完了します。

ソースに移動

ソース

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

ハンドアイデータセットの生成

次に、ターゲットリスト内の各ポーズにロボットを移動させてハンドアイデータセットを生成します。各ポーズについて、 ZDF ファイルとキャプチャ中のロボットのポーズをキャプチャして保存します。このステップでは、 datasets/hand-eye という名前のフォルダーが作成されてデータセットが保存されるディレクトリへのパスをユーザーに入力してもらいます。パスが指定されない場合は、デフォルトのパス(このスクリプトの場所)が使用されます。このデータセットを生成するには generate_hand_eye_dataset() 関数を使用します。引数として、カメラにアクセスするための Zivid アプリケーション app オブジェクトと、ロボットの移動先ターゲットのリストを取得するための robot オブジェクトを受け取ります。

ソースに移動

source

dataset_dir = generate_hand_eye_dataset(app, robot, targets, user_options)

ハンドアイキャリブレーションの実施

ハンドアイキャリブレーションを実施するには、前のステップで保存したすべてのロボットのポーズと ZDF ファイルを反復処理します。キャリブレーションの種類( eye-in-hand または eye-to-hand )とデータセットディレクトリへのパスを引数として perform_hand_eye_calibration() 関数を使用し、ハンドアイ変換行列と残差を取得します。

ソースに移動

source

if user_options.eih:
    transform, residuals = perform_hand_eye_calibration("eye-in-hand", dataset_dir, user_options)
else:
    transform, residuals = perform_hand_eye_calibration("eye-to-hand", dataset_dir, user_options)

ハンドアイ結果の保存

最後に、変換行列と残差を保存します。これは save_hand_eye_results() 関数に保存先のパス(この場合はデータセットディレクトリ内)を引数として指定することで実行されます。

ソースに移動

source

_save_hand_eye_results(dataset_dir, transform, residuals)

ハンドアイ変換の検証と活用

ハンドアイキャリブレーションが完了したら、得られた変換行列が正しく、精度要件を満たしていることを確認するのが次のステップです。

記事 ハンドアイキャリブレーションの検証方法 では、いくつかの方法について説明しています。しかし、推奨するハンドアイキャリブレーション検証方法は、 Zivid キャリブレーションオブジェクト をシーンに配置し、ロボットでタッチテストを実施することです。

ハンドアイ変換の活用方法を学ぶ準備ができたら、 ハンドアイキャリブレーション結果の使い方 をお読みください。

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

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

ハンドアイキャリブレーションプロセスを再現可能にするには、ロボットが常に同じ構成をとるようにジョイントターゲットを使用してください。デカルトターゲットを使用するとロボットが構成を選択できるため、ハンドアイの精度に影響を与える可能性があります。下の画像では 2 つのターゲットが表示されています。 target 1 は赤色で、 target 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 をクリックすれば完了です。

アクションとプロファイルの設定。