ビジョンがキノコを1つ見つけて「カメラ基準で (12, −40, 380) mm にある」と伝えます。ロボットがそこへ向かうには、この値をロボットベース基準の座標に変換しなければなりません。この変換を求める作業がハンドアイキャリブレーションです。この値が1 mmずれれば、すべての把持が1 mmずつずれます。
4つの座標系と変換
変換は、位置(3つ)と回転(3つ)をまとめて持つ4×4行列で表現します。3つの変換のうち、2つはすでにわかっています。
- ベース → 手先: ロボットコントローラーが関節角度から計算し、リアルタイムで通知します。
- カメラ → 物体: ビジョンが計測します。
- 手先 → カメラ (X): カメラの取り付け方で決まる値なので、誰にもわかりません。これを求めるのがキャリブレーションです。
eye-in-hand と eye-to-hand
- eye-in-hand — カメラがロボット手先に取り付けられ、一緒に動きます。複数の位置から近づいて撮影できるため、広い領域や精密な検査に有利です。求める値は手先 → カメラ。
- eye-to-hand — カメラが作業台の上などに固定されています。ロボットが動いている間も撮影し続けられます。求める値はベース → カメラ。
RoboVision は両方の構成に対応しています。
AX = XB — なぜ複数の姿勢が必要か
キャリブレーションボード(チェスボードなど)を固定し、ロボットを複数の姿勢に動かしながらボードを撮影します。2つの姿勢の間でロボット手先が動いた量を A、その間にカメラが見たボードの動きを B とすると、両者は同じ剛体運動を異なる座標から見たものなので、AX = XB が成り立ちます。未知数 X は6自由度のため、姿勢のペアひとつでは解けず、回転軸が互いに異なる姿勢が複数必要です。
この式を解く方法はいくつかあります。RoboVision は OpenCV の5つの解法(Tsai、Park、Horaud、Andreff、Daniilidis)をすべて提供しており、同じデータで結果を比較できます。回転と並進を別々に解く方法(Tsai、Park)と、一度に解く方法(Daniilidis の双対クォータニオンなど)では、ノイズに対する性質が少しずつ異なります。
ボードを使わない補正
現場では、ボードを置くのが難しい場合があります。fineAi は別の方法も使います。
- グリッパーを用いた補正 — ボードの代わりにグリッパー自体をカメラで撮影して補正します。RoboVision で RMS 0.50 mm を得ました。
- TCP の点合わせ — eye-to-hand で、ロボット手先を複数の位置に動かしながら3Dカメラでその位置を撮影し、2つの点群を最もよく重ね合わせる回転・並進を Kabsch アルゴリズムで求めます。先端に球を取り付けて球の中心を合わせると、さらに精密になります。Digital Twin Pick&Place はこの方式を使っています。
精度を高めるコツ
- 回転を大きく、多様に — 姿勢間の回転軸が互いに大きく異なる必要があります。平行移動だけでは、X の回転成分が定まりにくくなります。
- 姿勢を十分に — 最低限の数よりも多め(10〜20個)に撮影して、ノイズを平均化します。
- 視野全体を使う — ボードが画面の中央にしか映らないと、レンズ歪みが大きい周辺部の誤差が隠れてしまいます。
- カメラの内部パラメータ補正を先に — レンズ歪みや焦点距離(内部パラメータ)が誤っていれば、ハンドアイも誤ります。
- 残差で検証 — 得られた X で各姿勢のボード位置を再計算し、残差(RMS)を確認します。特定の姿勢だけ大きく外れる場合は、その姿勢を除いて解き直します。
- 機構が変わったらやり直す — カメラブラケットに触れた、または衝突があった場合は、再度補正します。運用中は、予測位置と実測位置の差を蓄積して小さな補正値を更新する自己補正も使います。