ハンドアイ較正と外部パラメータ
カメラで見た座標をそのままロボットに渡すと必ずずれる。カメラと手先の剛体変換をAX=XB問題として解けば、把持もビジュアルサーボも狙った精度で決まる。
- ハンドアイ較正はカメラ座標系とエンドエフェクタ(またはロボット基準)座標系の未知の剛体変換Xを求める問題で、ロボットを複数姿勢に動かして得た相対運動からAX=XBという行列方程式を解く。
- eye-in-hand(カメラを手先に固定)はXがカメラと手先間の変換、eye-to-hand(カメラを外部に固定)はXがカメラとロボット基準間の変換になり、AとBの作り方が入れ替わるが定式化は同じ。
- 回転と並進は結合しているため、Tsai-Lenz法などは先に回転を解いてから並進を解く。姿勢のばらつき不足・回転軸の平行・内部/外部パラメータ誤差が精度を支配する主要因。
なぜカメラ座標をそのままロボットに渡せないのか
ロボットにカメラで対象を見せて掴ませるとき、カメラは「対象はカメラ座標系でここにある」という情報を返します。しかしロボットが動かすのは関節であり、内部で扱うのはあくまでロボット基準(ベース)座標系やエンドエフェクタ(手先)座標系での位置・姿勢です。カメラが見た点をロボットが動く座標系へ変換する剛体変換を知らなければ、視覚情報は制御にまったく使えません。この変換を実測データから求めるのがハンドアイ較正(hand-eye calibration)であり、求める変換そのものを外部パラメータ(extrinsics)と呼びます。
横にスクロール
ここで扱う外部パラメータは、レンズの焦点距離や光学中心といったカメラ固有の内部パラメータとは別物です。内部パラメータは3次元点を画像画素へ落とす透視投影を担い、外部パラメータはカメラ座標系と別の座標系(手先やベース)との間の位置・姿勢の差、すなわち回転行列 R(3x3)と並進ベクトル t(3x1)を4x4にまとめた同次変換で表します。ハンドアイ較正が対象にするのはこの外部側です。
ハンドアイ較正の要点は、カメラと手先(またはベース)の相対位置がロボットが動いても変わらない一定の剛体変換である、という物理的事実にあります。ロボットを姿勢Aから姿勢Bへ動かすと、手先の動きとカメラの動きは同じ剛体系の別部位の動きなので、両者の運動は未知の変換Xを介して必ず整合します。この整合条件を式にしたものが後述のAX=XBです。較正とは、この一定な関係を複数の運動観測から逆算する作業に他なりません。
AX=XB問題としての定式化
ロボットを2つの姿勢1・2へ動かし、それぞれで手先の姿勢(順運動学から計算)と、較正ターゲット(チェッカーボードなど)に対するカメラの姿勢(画像から推定)を記録します。手先の姿勢は順運動学と逆運動学で得た同次変換の連鎖から一意に決まります。姿勢1から2への手先の相対運動を A、同じ移動でのカメラの相対運動を B とし、求める未知の剛体変換を X とすると、次の関係が成り立ちます。
AX = XB
A : 手先座標系での相対運動(姿勢1→2)… 順運動学から既知
B : カメラ座標系での相対運動(姿勢1→2)… ターゲット観測から既知
X : カメラと手先(またはベース)の間の未知の剛体変換 … これを求める
各行列は 4x4 の同次変換:
[ R t ]
[ 0 1 ]
A と B は姿勢間の差(相対運動)であり、絶対姿勢そのものではない点が重要です。絶対姿勢のうちターゲットの置き場所や個々の観測に含まれる未知オフセットは、隣り合う姿勢の差を取ることで打ち消され、残るのが X を介した運動の整合条件だけになります。姿勢ペアを増やせば AX = XB の式が複数得られ、これらを同時に満たす X を最適化で求めます。
同次変換の積を展開すると、AX=XBは回転部分について RA * RX = RX * RB、並進部分について RA * tX + tA = RX * tB + tX の2式に分かれます。回転の式にはXの回転 RX しか現れないため先に回転だけを解け、その結果を並進の式へ代入すると並進 tX が線形方程式で解けます。Tsai-Lenz法など古典的手法はこの2段階分離を採り、回転を軸角(あるいは四元数)で表して線形問題に帰着させます。回転と並進を同時に非線形最適化する手法もありますが、まず分離解を初期値にするのが安定です。
eye-in-hand と eye-to-hand
カメラの取り付け位置によって、求める X の意味と A・B の作り方が変わります。この2構成の区別は較正の設計そのものを左右します。
| 観点 | eye-in-hand(カメラを手先に固定) | eye-to-hand(カメラを外部に固定) |
|---|---|---|
| カメラの取り付け | ロボットの手先・リストに固定し一緒に動く | 架台など環境側に固定しロボットとは別に静止 |
| 求める変換X | 手先座標系 → カメラ座標系の剛体変換 | ロボット基準座標系 → カメラ座標系の剛体変換 |
| ターゲットの置き方 | 環境に固定した静止ターゲットを動きながら観測 | 手先にターゲットを固定しロボットが動かして見せる |
| Aの作り方 | 手先の相対運動(順運動学の差) | 手先の相対運動(順運動学の差) |
| 典型用途 | アーム先端での接近把持・面検査 | 作業台全体を俯瞰するピッキング・組立 |
eye-in-handでは、カメラが手先と一体で動くため、X は手先とカメラの間の固定変換になります。ロボットを動かすとカメラも動き、静止ターゲットが画像内で相対的に動くので、その見かけの運動が B を与えます。eye-to-handでは、カメラは動かず、代わりに手先へ取り付けたターゲットをロボットが動かして見せます。このとき X はロボット基準座標系とカメラ座標系の固定変換になります。どちらも数学的には同じ AX = XB(あるいは等価な形式)に帰着しますが、A と B に何を入れるかを取り違えると解が意味をなさないため、構成の明示が最初の一歩です。
eye-in-handのつもりでeye-to-handの式に観測を入れると、求まる X は方向(前進・逆)や適用対象の座標系がずれ、較正誤差ではなく系統的な座標変換ミスになります。単発の残差が小さく見えても、実際に対象を掴ませると一定方向へずれ続ける、という症状で表面化します。まず「カメラは手先に付いているのか、環境に付いているのか」「ターゲットは環境固定か手先固定か」を確定させ、それに合わせて A(手先の運動)と B(カメラの運動)を定義することが、あらゆる較正コードの前提になります。
較正手順と姿勢設計
実際の手順は、姿勢データの収集と方程式の求解に分かれます。精度を左右するのは主にデータ側、とりわけどんな姿勢集合でロボットを動かすかです。
手順(eye-in-hand の例):
1. 環境にチェッカーボード等のターゲットを固定
2. ロボットを N 個の異なる姿勢へ動かす(N >= 3、実務では 10〜20 以上)
各姿勢で:
- 順運動学から手先姿勢 T_base_gripper[i] を記録
- 画像からターゲット姿勢 T_cam_target[i] を推定
3. 隣接姿勢ペアから相対運動を作る:
A[i] = inverse(T_base_gripper[j]) * T_base_gripper[i]
B[i] = T_cam_target[j] * inverse(T_cam_target[i])
4. { A[i], B[i] } の集合から AX = XB を満たす X を求解
- まず回転 RX を線形/最小二乗で解く
- 次に並進 tX を線形方程式で解く
5. 全姿勢での再投影誤差・整合残差で精度を検証
姿勢の選び方には明確な原則があります。X の回転はターゲットに対する回転軸の多様性からしか観測できないため、すべての姿勢が同じ軸まわりの回転だと回転が一意に定まりません。特に、収集した姿勢の回転軸がすべて平行だと方程式が縮退し、その軸方向の成分が不定になります。そのため、複数の異なる回転軸をまたぐようにロボットを動かし、並進方向にも十分なばらつきを持たせる必要があります。姿勢数を増やすのは主に観測ノイズの平均化のためで、姿勢の幾何的多様性が足りなければ、いくら数を増やしても精度は頭打ちになります。
誤差要因と検証
較正結果の精度は、いくつかの独立した誤差源の合成で決まります。どれが支配的かを切り分けられることが実務上の鍵です。
| 誤差要因 | 内容 | 対策の方向 |
|---|---|---|
| 姿勢の多様性不足 | 回転軸が平行・並進が単調で方程式が縮退し回転が不定になる | 異なる回転軸をまたぐ姿勢を意図的に含める |
| カメラ内部パラメータ誤差 | 焦点距離・歪み係数の誤差がターゲット姿勢推定Bを歪める | 内部較正を先に高精度化しBの信頼度を上げる |
| 順運動学の誤差 | リンク寸法・関節オフセットの誤差でAが真値からずれる | 機体側のキネマティクス較正・剛性の高い姿勢を選ぶ |
| ターゲット検出ノイズ | コーナー検出の画素ノイズがBの姿勢推定に伝播 | 姿勢数を増やし平均化・大きく鮮明なターゲットを使う |
| 回転と並進の結合 | 回転解の誤差が並進解へ伝播し増幅される | 回転を高精度に解いてから並進を解く順序を守る |
これらのうち、姿勢設計の不備と内部パラメータ誤差は特に見落とされがちです。カメラ側のターゲット姿勢推定 B は内部パラメータに依存するため、内部較正が甘いと B が系統的に歪み、その歪みがそのまま X へ流れ込みます。したがって内部パラメータの較正を先に済ませてから外部(ハンドアイ)較正に進むのが定石です。この関係は、カメラと別センサ間のLiDAR・カメラのセンサ融合における外部較正が融合精度の下限を決めるのと同じ構図です。
検証は、較正で使わなかった姿勢でターゲット上の既知点を予測し、実測画素との再投影誤差、あるいは手先で既知点に触れさせて生じる位置誤差で行います。較正時の残差だけを見ると過適合を見逃すため、必ず未使用の姿勢や実タスクでの誤差を確認します。求めた X は、視覚で得た対象位置を手先の指令へ変換する際に使われ、対象の速度追従が要るビジュアルサーボではヤコビ行列と操作性を介して手先速度指令へ、把持ではロボットの物体検出と把持計画で得た6D姿勢の座標変換へと接続されます。
- AX=XBの意味:A=手先の相対運動、B=カメラの相対運動、X=求める固定剛体変換。相対運動を使うのはターゲット位置など未知オフセットを差で打ち消すため。
- 回転を先に解く:回転式にはXの回転しか現れないので回転を先に確定し、その解を並進式へ代入して並進を線形に解く(Tsai-Lenzなど)。
- eye-in-hand vs eye-to-hand:前者はXが手先→カメラ、後者はXがベース→カメラ。カメラとターゲットの固定先が入れ替わり、AとBの作り方が変わる。
- 姿勢の多様性が精度を支配:回転軸が平行だと方程式が縮退。異なる回転軸をまたぐ姿勢が必須で、数を増やすだけでは不足を補えない。
- 内部較正が先:外部パラメータのBは内部パラメータに依存するため、内部較正を先に高精度化する。
まとめ
ハンドアイ較正は、カメラ座標系と手先(またはロボット基準)座標系の間の一定な剛体変換 X を、複数姿勢の運動観測から求める問題です。核心は、手先の相対運動 A とカメラの相対運動 B が未知の X を介して整合するという AX = XB の定式化にあり、相対運動を使うことでターゲット位置などの未知オフセットを打ち消せます。求解では回転と並進の結合を解きほぐし、回転を先に確定してから並進を線形に解くのが安定です。構成としてはカメラを手先に付けるeye-in-handと環境に固定するeye-to-handがあり、X の意味と A・B の作り方が入れ替わります。精度を決めるのは姿勢集合の幾何的多様性、カメラ内部パラメータの正確さ、順運動学の正確さであり、回転軸が平行だと方程式が縮退する点が最大の落とし穴です。この外部パラメータが正しく求まって初めて、視覚情報がロボットの制御指令へと意味を持って接続されます。
ロボティクスの記事ガイド
ハンドアイ較正と外部パラメータを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ロボット工学
比較で見る軸
難易度: advanced / カテゴリ: ロボティクス / タグ数: 6
導入後に効く点
eye-in-hand(カメラを手先に固定)はXがカメラと手先間の変換、eye-to-hand(カメラを外部に固定)はXがカメラとロボット基準間の変換になり、AとBの作り方が入れ替わるが定式化は同じ。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ロボティクス
- タグ数
- 6
判断チェックリスト
- 自社の用途が「ロボット工学 / ハンドアイ較正」に近いか確認する。
- 強みである「ハンドアイ較正はカメラ座標系とエンドエフェクタ(またはロボット基準)座標系の未知の剛体変換Xを求める問題で、ロボットを複数姿勢に動かして得た相対運動からAX=XBという行列方程式を解く。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。