UR5 ロボット + Python: データセットの生成とハンドアイキャリブレーションの実行
注釈
このチュートリアルは、Universal Robots UR5e を使用して構築およびテストされています。
導入
正確なハンドアイキャリブレーションには優れたデータセットが必要ですが、このデータセットの生成は簡単ではありません。このチュートリアルでは、最初に Zivid カメラとユニバーサルロボット (UR) UR5e の間の通信をセットアップします。次に、3D 画像とロボットのポーズで構成されるデータセットを抽出します。最後に、このデータセットを使用してハンドアイキャリブレーションを行います。このサンプルは、eye-in-hand と eye-to-hand の両方で機能します。
ハンドアイキャリブレーションに慣れていない場合は、 ハンドアイキャリブレーション を参照することをお勧めします。
要件
標準の TCP/IP 接続を備えた UR ロボット。
Zivid-Python がインストールされています。
UR5e ロボットの準備
Github から zivid-python-samples をクローンし、 ur_hand_eye_calibration フォルダーに移動して、 runtime requirements をインストールします。
Windows
cd source\applications\advanced\hand_eye_calibration\ur_hand_eye_calibration
pip install -r requirements.txt
Ubuntu
cd source/applications/advanced/hand_eye_calibration/ur_hand_eye_calibration
pip install -r requirements.txt
これにより、UR RTDE (Real-Time Data Exchange) 通信プロトコルを含むすべてのサードパーティライブラリがインストールされます。
このサンプルに必要な 3 つのファイルは次のとおりです。
universal_robots_communication_file.xml - I/O レジスターを含む設定ファイル。
universal_robots_robot_motion_script.urp - UR コントローラーで作成され実行されるロボットモーションスクリプト。
universal_robots_perform_hand_eye_calibration.py - 画像とポーズをキャプチャして保存し、ハンドアイキャリブレーションを実行する Python スクリプト。
ロボットモーションスクリプトでは、キャリブレーションで使用されるすべてのロボットのポーズを設定します。Python スクリプトは画像をキャプチャし、ロボットのポーズを読み取り、ハンドアイキャリブレーションを実行します。ロボットとコンピュータ間の通信は、UR RTDE (Real-Time Data Exchange) プロトコルを通じて行われます。通信の流れの概要を以下に示します。
データセットを生成する前に、UR ロボットモーションスクリプトにいくつかの調整を行う必要があります。
universal_robots_robot_motion_script.urp ロボットモーションスクリプトを変更します
まず、universal_robots_robot_motion_script.urp ファイルを USB ドライブに保存し、UR コントローラーにスクリプトをロードしてください。コントローラーのインターフェースは次のようになります。
ここで、capture_hand_eye は、ロボットの各ポーズごとにカメラをトリガーして画像を 1 枚キャプチャするサブルーチンです。このサブルーチンは、通信インターフェース上の論理チャネルであるレジスタを介して PC と通信します。以下は、Python スクリプトとの通信に使用される I/O 変数です。
image_count
start_capture
camera_ready
finish_capture
- output_int_register_24 = image_count:
取得した画像とポーズの数をカウントします。
- output_bit_register_64 = start_capture:
カメラが画像をキャプチャするトリガーとなるブール値。
- input_bit_register_64 = finish_capture:
UR ロボットを次の位置へ移動させるトリガーとなるブール値。
- input_bit_register_65 = ready_to_capture:
UR ロボットにカメラを使用する準備ができていることを伝えるブール値。
universal_robots_communication_file.xml ファイルには、書き込み先のレジスタが指定されています。Python スクリプトでレジスタを変更した場合は、設定ファイル内の同じレジスタも変更する必要があります。
<?xml version="1.0"?>
<rtde_config>
<recipe key="out">
<field name="actual_TCP_pose" type="VECTOR6D"/>
<field name="output_int_register_24" type="INT32"/>
<field name="output_bit_register_64" type="BOOL"/>
</recipe>
<recipe key="in">
<field name="input_bit_register_64" type="BOOL"/>
<field name="input_bit_register_65" type="BOOL"/>
</recipe>
</rtde_config>
良好なデータセットを生成するには、 ハンドアイキャリブレーションプロセス で説明されている手順に従う必要があります。すべてのウェイポイント robot_pose_X は、セットアップに合わせて変更する必要があります。最も簡単な方法は、ロボットを フリードライブ に設定し、手で目的の姿勢に移動させることです。これらの各姿勢で Zivid キャリブレーションオブジェクト がカメラから見えるようにしてください。ArUco マーカーを使用している場合は、すべてのマーカーが各キャプチャで見える必要はありません。
How to get Good Quality Data on Zivid Calibration Object explains how we can tune our parameters for the optimal 3D image quality.
注意
キャリブレーション対象物の撮影画像が適切に露出されていない場合、ハンドアイキャリブレーションは機能しません。
ウェイポイントを追加または削除する場合は、各ウェイポイントの後に必ず capture_hand_eye を呼び出してください。正確なハンドアイ変換を行うには、10 〜 20 個を使用することをお勧めします。
Python スクリプトを実行する前に、ロボットのすべての位置を手動で確認しておくと便利です。こうすることで、ロボットが 1 つの姿勢から次の姿勢へ移動する際に特異点を回避できることを確認できます。
注意
eye-in-hand キャリブレーションを行う場合は、Zivid カメラがロボットと衝突しないようにしてください。
Python スクリプトを実行する
シーンに合わせてロボットスクリプトを変更したので、データセットを生成してキャリブレーションを実行する準備が整いました。
Tip
ハンドアイキャリブレーションを実行する前に、カメラを ウォームアップ し、 Infield Correction を実行することをお勧めします。ウォームアップ、インフィールド補正、およびハンドアイキャリブレーションでは、アプリケーションと同じキャプチャサイクルを使用してください。温度に依存するパフォーマンス要因の影響をさらに軽減するには、 Thermal Stabilization を有効にしてください。
まず、UR コントローラーから universal_robots_robot_motion_script.urp を実行します。プログラムが起動すると、Python スクリプトが camera_ready 変数を True に設定するまで待機します。次に、コマンドラインから universal_robots_perform_hand_eye_calibration.py スクリプトを実行します。
Zivid checkerboard
eye-in-hand の場合:
python universal_robots_perform_hand_eye_calibration.py --eih --ip 192.168.0.123
eye-to-hand の場合:
python universal_robots_perform_hand_eye_calibration.py --eth --ip 192.168.0.123
ArUco marker
eye-in-hand の場合:
python universal_robots_perform_hand_eye_calibration.py --eih --ip 192.168.0.123 marker --dictionary aruco4x4_50 --ids 1 2 3
eye-to-hand の場合:
python universal_robots_perform_hand_eye_calibration.py --eth --ip 192.168.0.123 marker --dictionary aruco4x4_50 --ids 1 2 3
192.168.0.123 をロボットの実際の IP アドレスに置き換えます。UR ティーチペンダントの右上隅で、 Hamburger menu → System に移動して、ロボットの IP アドレスを確認または設定します。
Python スクリプトに必要な各種入力項目は、コマンドプロンプトに以下のコマンドを入力することで表示されます。
python universal_robots_perform_hand_eye_calibration.py -h
スクリプトが完了すると、次のように出力されます。
データを保存したディレクトリ
ハンドアイ変換 - 4x4 キャリブレーションマトリックス
ロボットの各ポーズの回転と移動の 残差
Zivid が残差を計算する方法についてのより詳細な説明は ハンドアイキャリブレーション残差 にあります。
変換行列があれば、それを使用して 3D ポイントをカメラフレームからロボットのベースフレームに変換できます。これを行う方法の詳細については ハンドアイキャリブレーション結果の使い方 で説明されています。