カメラで見た物体をロボットでつかむには、「カメラとロボットがどういう位置関係にあるか」を正確に知っておく必要があります。これを求める作業がハンドアイキャリブレーションです。
カメラをロボットの手先に載せる構成(eye-in-hand)にも、カメラをロボットの外に固定する構成(eye-to-hand)にも、同じ考え方で使えます。
シリーズ「ハンドアイキャリブレーション入門」の第1章となるこの記事では、ハンドアイキャリブレーションで何を求めるのか、なぜ AX = XB という式で解けるのかを、図を使って整理します。コードは出てきません。実際に解いてみるのは第2章です。
ハンドアイキャリブレーションで求めるもの:カメラとロボットの「位置関係」
ロボットとカメラは、それぞれ自分を基準にした座標系で位置を表しています。
- ロボット:「手先は台座から見て x=300mm, y=0mm, z=200mm にある」
- カメラ:「ボードはカメラから見て正面 400mm にある」
この2つの座標系をつなぐのがハンドアイキャリブレーションです。カメラを手先に取り付けた場合は、手先の座標系に対して、カメラの座標系がどこにあり、どちらを向いているかを求めます。具体的には次の6つの数値です。
- 位置(3つ):カメラの原点が、手先の原点から x・y・z 方向にそれぞれ何 mm 離れているか
- 向き(3つ):カメラの x・y・z 軸が、手先の x・y・z 軸に対してどれだけ回転しているか
たとえば「カメラは手先の中心から横に50mm、上に100mm の位置にあり、光軸は手先の真下方向から10°傾いている」という情報です。
これがなぜ定規で測れないかというと、カメラの座標系の原点はカメラの筐体ではなく、レンズの光学中心(カメラの内部にある、光線が集まる点)にあるからです。外からは見えない点なので、カメラで実際にボードを撮影して逆算する必要があります。
この位置関係がわずかにずれているだけでも、ロボットの動作は大きくずれます。たとえば向きが1°ずれていると、400mm 先の物体の位置は約7mm ずれます(400mm × tan1° ≈ 7mm)。
カメラをロボットに載せる場合も、外に置く場合も使える
| 構成 | カメラの取り付け場所 | 求める位置関係 X | 用途の例 |
|---|---|---|---|
| eye-in-hand | ロボットの手先 | cam2gripper(手先から見たカメラ) | 部品に近づいて見ながらつかむ、いろいろな角度からの外観検査 |
| eye-to-hand | ロボットの外(天井やスタンド) | cam2base(ロボット台座から見たカメラ) | 作業台全体を見渡して位置決めする、コンベア上の部品のピッキング |


どちらの構成でも、登場するのは次の3つの座標変換です。このシリーズでは、変換の名前を OpenCV と同じ「a2b」の形で書きます。a2b は「a の座標系で表した点を、b の座標系での表し方に直す変換」で、言い換えると「b から見た a の位置と向き」です。図の矢印もこの向きで描いています。
- A = gripper2base(手先 → 台座):台座から見た手先の位置と向き。ロボットのコントローラから読み出せる
- B = target2cam(ボード → カメラ):カメラから見たボードの位置と向き。カメラ画像からボードを検出して計算できる
- X:求めたい位置関係。eye-in-hand では cam2gripper(カメラ → 手先)、eye-to-hand では cam2base(カメラ → 台座)
さらに、ボードは動かないように固定しておきます。eye-in-hand では台の上に、eye-to-hand では手先に固定します。この「動かないもの」が、X を求めるための手がかりになります。
以降は eye-in-hand で説明します。eye-to-hand でも同じ形の式になり、OpenCV の同じ関数で解けます。
なぜ AX = XB という式になるのか
図1の eye-in-hand で考えます。ボード上の点を台座の座標に直すには、図の矢印のとおり「ボード → カメラ → 手先 → 台座」と順に変換すれば済みます。
Ttarget2base = Ai X Bi
行列は右から順に点に作用するので、最初に使う B(ボード → カメラ)が右端に、最後に使う A(手先 → 台座)が左端に来ます。i は「i 番目の姿勢」という意味です。ロボットを動かすたびに A と B は変わりますが、ボードは台に固定しているので左辺は変わりません。そこで、2つの姿勢 i と j を比べると
Ai X Bi = Aj X Bj
これを整理すると
(Aj−1 Ai) X = X (Bj Bi−1)
という AX = XB の形の式になります。ロボットをいろいろな姿勢に動かしてボードを撮影し、A と B の組をたくさん集めて、この式をできるだけ満たす X を求めます。これがハンドアイキャリブレーションの中身です。
OpenCV の calibrateHandEye には、この式を解くための5つの解法(Tsai、Park、Horaud、Andreff、Daniilidis)が用意されています。回転と移動を別々に解くか同時に解くかなど、解き方が少しずつ違います。
このシリーズで明らかにしたいこと
ロボットとカメラを組み合わせたシステムの精度は、何で決まっているのでしょうか。カメラの性能でしょうか、ロボットの動きの正確さでしょうか、それとも両者をつなぐキャリブレーションでしょうか。
このシリーズでは、Intel RealSense と市販の安価なロボットを組み合わせることを想定して、ロボットビジョンの精度がどの要素でどう決まるのかを分解し、どこまで精度を追い込めるのかを明らかにしていきます。
まずはロボットの部分をシミュレーションで置き換え、カメラの部分を RealSense の実測で詰めていきます。反響があれば、市販の安価なロボットアームを使った実機での検証にも取り組む予定です。
シリーズの構成
| 章 | 内容 | ロボット | カメラ |
|---|---|---|---|
| 第1章(今回) | ハンドアイキャリブレーションの考え方 | ― | ― |
| 第2章 | シミュレーションで AX = XB を解き、正しく解けることを確認 | シミュレーション | シミュレーション |
| 第3章 | ノイズ・姿勢数・回転範囲で精度がどう変わるか、5つの解法を比較 | シミュレーション | シミュレーション |
| 第4章 | RealSense の内部パラメータは信用できるか | ― | 実測 |
| 第5章 | ボードの位置姿勢の計測はどれくらいばらつくか | ― | 実測 |
| 第6章 | 実測したばらつきを使って、実機での精度を予測する | シミュレーション | 実測ノイズ |
| 番外編(予定) | 市販の安価なロボットアームで実機検証 | 実機 | 実測 |
まとめと次章予告
- ハンドアイキャリブレーションは、カメラとロボットの位置関係(位置3つ・向き3つ)を求める作業
- カメラを手先に載せる場合(eye-in-hand)にも、外に置く場合(eye-to-hand)にも使える
- カメラの座標系の原点はレンズの光学中心にあり外から測れないので、ボードを撮影して逆算する
- ロボット姿勢 A とボード姿勢 B の組を集め、AX = XB を満たす X を求める
次の第2章では、ロボットを使わずにシミュレーションで実際に AX = XB を解き、正しく解けることを確かめます。
参考
- OpenCV ドキュメント:calibrateHandEye
- R. Y. Tsai and R. K. Lenz, “A new technique for fully autonomous and efficient 3D robotics hand/eye calibration,” IEEE Trans. Robotics and Automation, 1989.

コメント