シリーズ「ハンドアイキャリブレーション入門」の第3章です。第2章では、正解の分かっているシミュレーションで AX = XB を解き、5つの解法すべてで正しく解けることを確かめました。
この章では、そのシミュレーションを道具として使い、次の問いに答えます。
- ハンドアイキャリブレーションの精度は何で決まるのか(カメラの計測の誤差、撮影する姿勢の数、ロボットを回す大きさ)
- 実際にやるときは、姿勢をいくつ、どれくらい大きく回して撮ればよいのか
シリーズの構成
この章の実験で、OpenCV の5つの解法のうち2つに知っておくべき注意点が見つかったため、「第3章 補足」を追加しました。
| 章 | 内容 | ロボット | カメラ |
|---|---|---|---|
| 第1章 | ハンドアイキャリブレーションの考え方 | ― | ― |
| 第2章 | シミュレーションで AX = XB を解き、正しく解けることを確認 | シミュレーション | シミュレーション |
| 第3章(今回) | 精度は何で決まるか:計測誤差・姿勢の数・回転の大きさ | シミュレーション | シミュレーション |
| 第3章 補足(追加) | OpenCV の5つの解法の注意点:Andreff の偏りと Daniilidis の 180° 問題 | シミュレーション | シミュレーション |
| 第4章 | RealSense の内部パラメータは信用できるか | ― | 実測 |
| 第5章 | ボードの位置姿勢の計測はどれくらいばらつくか | ― | 実測 |
| 第6章 | 実測したばらつきを使って、実機での精度を予測する | シミュレーション | 実測した誤差 |
| 番外編(予定) | 市販の安価なロボットアームで実機検証 | 実機 | 実測 |
カメラの計測誤差の大きさをどう決めるか
この章で扱うカメラの計測誤差は、カメラが測った B(カメラから見たボードの位置と向き)に含まれる誤差のことです。ボードを置いた場所の精度のことではありません(ボードの置き場所との関係は、この節の最後で説明します)。
第2章では、この B に「回転 0.1°・移動 0.5mm」の誤差を加えました。ただ、この値は仮に置いたもので、根拠がありませんでした。根拠のない値で出した結果は、考察のしようがありません。そこでこの章では、結果を見る前に、どれくらいの誤差を入れるのが妥当かを説明します。
カメラがボードの位置と向きを測る仕組み
カメラは、ボードの市松模様のマス目の角(以下コーナー)を画像から検出し、その写り方からボードの位置と向きを計算します。この計算には、OpenCV の solvePnP という関数を使います。solvePnP は、形と寸法が分かっている物体について、その上の点が画像のどこに写っているかから、カメラに対する物体の位置と向きを求める関数です。

図1のように、3次元のコーナーが画像に写る関係(①投影)を逆にたどり、写った位置からボードの位置と向きを求める(②solvePnP)、という流れです。
誤差の大もとは、コーナーを検出する位置のずれ
コーナーを検出した位置は、本当の位置から少しずれます。このずれをコーナー位置誤差と呼び、その標準偏差 σ をピクセル単位で表します。
用語の注:コーナー位置誤差は、英語の論文では corner localization error(コーナーの位置推定誤差)と呼ばれ、サブピクセル精度(subpixel accuracy)や、写真測量の分野では画像座標の観測誤差とも呼ばれます。また、カメラキャリブレーションの論文では、点の画像座標に加えるこの誤差を「ノイズ(noise)」と呼ぶこともあります。このシリーズでは混乱を避けるため、「ノイズ」という言葉は、センサーが出す画像ノイズ(明るさのランダムなばらつき)だけに使います。ずれが生じる原因には、次のようなものがあります。
- 画像の解像度(1ピクセルの大きさ)
- ピントのぼけ、手ぶれ
- 照明の明るさ・露出
- 画像ノイズ(センサーが出す明るさのランダムなばらつき。暗い場所で撮った写真に出る細かいつぶつぶ)
- ボードの印刷の品質

図2は、コーナー付近の画像を、1マスが1ピクセルになるまで拡大したものです。同じコーナーを何度も検出すると、検出した位置は本当の位置のまわりに少しずつばらつきます。このばらつきの大きさ(標準偏差)が σ です。
誤差が伝わる流れと、この章で使う言葉

カメラの計測の誤差は、図3のように原因から結果へ伝わっていきます。この章では、それぞれの段階を次の言葉で呼び分けます。
| 言葉 | 意味 | 単位 |
|---|---|---|
| 画像ノイズ | センサーが出す明るさのランダムなばらつき。コーナー位置誤差の原因の1つ | ― |
| コーナー位置誤差 | 検出したコーナーの位置と、本当の位置とのずれ(標準偏差 σ)。シミュレーションに入れる値 | px |
| ボード姿勢の計測誤差 | コーナー位置誤差から solvePnP を通して生じる、B の誤差。第2章で「計測ノイズ」と呼んだもの | 度・mm |
| ハンドアイの推定誤差 | 求めた X と正解の差(回転誤差・並進誤差)。実験の結果 | 度・mm |
| 再投影誤差 | キャリブレーションの結果の良し悪しを表す指標。コーナー位置誤差に加え、レンズの性質の求め方の誤差も含む。文献の値を読むときに使う | px |
使う値と、その根拠となる文献
この章では、コーナー位置誤差を σ = 0.1px(標準的な条件)〜 0.3px(画像ノイズが大きい条件) の範囲で調べます。根拠は次の2つの論文です。
[1] Schöps ほか(CVPR 2020):RealSense D435 を実際にキャリブレーションした結果が載っています。ここでいうカメラのキャリブレーションは、ハンドアイキャリブレーションの前に行う作業で、レンズの焦点距離やゆがみを、ボードを何十枚も撮影して求めるものです。その精度の目安が再投影誤差です。キャリブレーションで求めたレンズの性質を使って「コーナーが画像のどこに写るはずか」を計算し、実際に検出した位置との差をピクセル単位で表したものです。[1] では、D435 の再投影誤差の中央値が、カラー画像で 0.092px、赤外画像で 0.042px でした。

図4は、再投影誤差のイメージです(ずれは 400 倍に拡大して表示しています)。
[2] Duda・Frese(BMVC 2018):コンピューターで作った画像(合成画像)のコーナーに、ぼけや画像ノイズを加えて、OpenCV で位置を検出したときの誤差を調べています。合成画像は本当のコーナーの位置が分かっているので、検出の誤差を直接測れます。画像ノイズが明るさの幅の 1% のときは約 0.06px、約 8% で約 0.1px、20% で約 0.3px と、画像ノイズが大きいほど誤差が増えていました(論文の図5から読み取り)。
文献の値はコーナー位置誤差の σ そのものではないので、次のように換算しています。
- 再投影誤差は2次元のずれの大きさです。縦と横がそれぞれ標準偏差 σ でずれるとき、ずれの大きさの中央値は約 1.18σ になります。
- [1] の中央値 0.04〜0.09px を換算すると、σ は約 0.03〜0.08px です。しかも再投影誤差にはレンズの性質の求め方の誤差も含まれるので、検出のずれだけならさらに小さくなります。
- よって、σ = 0.1px は「実機の良い条件より少し悲観的な、標準的な値」として妥当です。σ = 0.3px は、[2] で画像ノイズが 20% 程度ある、かなり悪い条件にあたります。
注意点が2つあります。[1] は著者独自のコーナーの位置の求め方を使っていて、OpenCV の標準的な方法より精度が良い可能性があります。また、[2] の「画像ノイズ ○%」が、実際の RealSense の画像で何%にあたるかは分かりません。どちらも、第5章で実際に測って確かめます。
想定するカメラとボード
| 項目 | 設定 |
|---|---|
| カメラ | RealSense D435 のカラー画像相当:1280×720、水平画角 69.4°(焦点距離は 924 ピクセル相当) |
| ボード | A4 に収まる市松模様:7×5 マス、1マス 30mm(内側のコーナー 24 点) |
| カメラとボードの距離 | 350〜600mm(第2章と同じ) |
ピクセルのずれが、ボードの位置と向きのどれだけの誤差になるか
コーナーにコーナー位置誤差を加えて solvePnP でボードの位置と向きを計算し直し、正解との差を 600 回分集計しました(標準偏差)。x・y はボードの面内の軸、z はボードの面に垂直な軸(ほぼカメラの奥行き方向)です。
| コーナー位置誤差 σ | 回転 x | 回転 y | 回転 z | 位置 x | 位置 y | 位置 z |
|---|---|---|---|---|---|---|
| 第2章の仮置き | 0.100° | 0.100° | 0.100° | 0.500 mm | 0.500 mm | 0.500 mm |
| 0.05px | 0.041° | 0.035° | 0.007° | 0.016 mm | 0.014 mm | 0.054 mm |
| 0.1px | 0.083° | 0.069° | 0.013° | 0.032 mm | 0.027 mm | 0.108 mm |
| 0.2px | 0.165° | 0.139° | 0.026° | 0.065 mm | 0.055 mm | 0.215 mm |
| 0.3px | 0.247° | 0.208° | 0.039° | 0.097 mm | 0.082 mm | 0.323 mm |
分かることは3つです。
- 誤差は方向によって大きく違います。 ボードを傾ける向きの回転(x・y)は、ボードの面内での回転(z)の5〜6倍あります。位置は、奥行き方向(z)が面内の3〜4倍です。カメラは奥行きを「ボードの見かけの大きさ」から推定するので、奥行き方向の精度が低くなります。
- 誤差はコーナー位置誤差にほぼ比例します。
- 第2章の仮置きと比べると、回転(x・y)は 0.1px のときとほぼ同じ大きさでしたが、位置の 0.5mm は大きすぎました。

誤差が方向によって違う理由は、ボードを動かしたときの画像の変わり方を比べると分かります(図5)。ボードを横に 1mm 動かすとコーナーは平均 1.85px 動きますが、カメラに近づける方向に 1mm 動かしても 0.21px(横移動の約 1/9)しか動きません。同じように、光軸まわりに 1° 回すと 1.85px 動くのに対し、ボードを 1° 傾けても 0.12px(光軸まわりの回転の約 1/15)しか動きません。図5の右下は、変化が見えるように、左下の 5° の6倍の 30° 傾けています。それでもコーナーの動きは平均 7.9px で、5° しか回していない左下(9.2px)より小さくなっています。画像がほとんど変わらない動きほどコーナー位置誤差に埋もれて正確に測れないので、奥行きと傾きの誤差が大きくなります。
誤差の種類と、この章で扱う範囲
ハンドアイキャリブレーションの誤差の原因は、カメラの計測のばらつきだけではありません。この章で扱うものと扱わないものを整理しておきます。
| 誤差の原因 | 例 | 性質 | この章での扱い |
|---|---|---|---|
| カメラの計測のばらつき | コーナー位置誤差(原因は画像ノイズ・ぼけなど) | 毎回ランダムにずれる | 扱う |
| ボードの置き場所 | 台座からボードまでの距離や向き | ― | 影響しない(下で説明) |
| 撮影中にボードが動く | 振動、手で触れる | 姿勢ごとにずれる | 扱わない(しっかり固定する前提) |
| ボードの寸法・平らさ | 印刷の倍率のずれ、たわみ | いつも同じ方向にずれる | 扱わない(第4〜6章) |
| カメラのレンズの性質の誤差 | 焦点距離、レンズのゆがみ | いつも同じ方向にずれる | 扱わない(第4章) |
| ロボットの誤差 | 手先の位置決めの誤差 | ランダム+いつも同じ方向 | 扱わない(第6章・番外編) |
ボードの置き場所が結果に影響しない理由:第1章で、台座からボードまでの変換は「姿勢を変えても変わらない定数」として、2つの姿勢を比べたときに式から消えました。ハンドアイキャリブレーションで使うのは、姿勢と姿勢の間の動きだけです。そのため、ボードを置いた場所を知っている必要はなく、少しずれた場所に置いても結果は変わりません。大事なのは、データを集めている間にボードが動かないことです。
一方、ボードの寸法の誤差は別です。たとえばマス目の大きさが印刷で 0.3% ずれていると、solvePnP はボードを 0.3% 遠く(または近く)にあると計算してしまい、すべての姿勢の B が同じ向きにずれます。これは毎回ランダムにずれるコーナー位置誤差とは性質が違うので、この章では扱わず、第4〜6章で調べます。
シミュレーションの変更点
第2章では、ボードの位置と向き(B)に直接誤差を加えていました。この章では、実際のカメラと同じ流れで計測を再現します。
- ボードのコーナーが画像のどこに写るかを計算する
- その位置にコーナー位置誤差を加える
solvePnPで、ずれたコーナーの位置からボードの位置と向きを計算し直す

こうすると、方向による誤差の違いも自然に再現されます。ボード全体が画像に写らない姿勢は作り直しています。
実験は、基準の条件(コーナー位置誤差 0.1px、15姿勢、傾き最大 35°、ロール ±90°)から1つだけ条件を変えて行います。条件ごとに乱数を変えて 200 回ずつ試し、誤差の中央値と、200 回のうち真ん中の半分(25〜75% の範囲)を比べます。同じ試行の番号では、すべての解法・すべての条件で同じ乱数を使うので、比較は公平です。
グラフには OpenCV の5つの解法に加えて、「Andreff(並進を解き直し)」も載せています。これは第3章 補足で説明する注意点への対策をした版です。
実験1:コーナー位置誤差の大きさを変える

| コーナー位置誤差 | 回転誤差(5つの解法) | 並進誤差(Andreff 以外) | 並進誤差(Andreff) |
|---|---|---|---|
| 0.05px | 0.022〜0.023° | 0.19〜0.21 mm | 0.27 mm |
| 0.1px | 0.044〜0.047° | 0.37〜0.42 mm | 0.66 mm |
| 0.2px | 0.088〜0.094° | 0.73〜0.84 mm | 2.37 mm |
| 0.3px | 0.132〜0.141° | 1.10〜1.25 mm | 5.04 mm |
(200 回の中央値。グラフの灰色の帯は [1] から分かる D435 実機の良い条件、点線は [2] の画像ノイズが大きい条件の目安)
- 回転誤差は、どの解法もほぼ同じで、コーナー位置誤差に比例します。
- 並進誤差も、Andreff 以外はコーナー位置誤差に比例します。 Park と Horaud がわずかに良く、Tsai は1〜2割ほど悪い結果でした。
- Andreff の並進誤差だけ、コーナー位置誤差が大きくなると急に悪化します。 0.3px では約 5mm で、ほかの解法の4倍以上です。理由と対策は第3章 補足で説明します。
1回の計測の位置の誤差は 0.03〜0.1mm 程度(0.1px のとき)なのに、X の並進誤差は 0.4mm 前後になっています。これは、ボードの回転の誤差が、カメラからボードまでの距離(約 0.5m)を腕の長さとして、X の位置の誤差に化けるためです。精度を決めているのは、位置よりも回転の計測誤差だといえます。

図8のように、向きが 0.08° ずれると、500mm 先では位置が約 0.7mm ずれます。
第2章の結果(並進誤差 約 0.85〜1.26mm)は、仮置きの計測誤差が大きめだったため、0.1px の条件より悲観的な値でした。
実験2:姿勢の数を変える

| 姿勢の数 | 回転誤差 | 並進誤差(Park) | 並進誤差(Andreff) |
|---|---|---|---|
| 5 | 0.089〜0.100° | 0.72 mm | 1.07 mm |
| 10 | 0.054〜0.061° | 0.49 mm | 0.74 mm |
| 15 | 0.044〜0.047° | 0.37 mm | 0.66 mm |
| 20 | 0.036〜0.040° | 0.33 mm | 0.70 mm |
| 30 | 0.028〜0.030° | 0.26 mm | 0.71 mm |
- 姿勢を増やすほど誤差は小さくなります。 姿勢の数を4倍(5→20)にすると、並進誤差はおよそ半分(0.72→0.33mm)になりました。たくさんの計測を平均すると誤差が「数の平方根」に比例して小さくなる、という一般的な性質とおおむね一致します。
- 15姿勢を超えると、減り方はゆるやかになります。
- Andreff の並進誤差だけ、15姿勢を超えても約 0.7mm から下がりません。 これも第3章 補足で説明します。
実験3:回転の大きさ(カメラの傾き)を変える

| 傾きの最大値 | 回転誤差 | 並進誤差(Park) |
|---|---|---|
| 5° | 0.29〜0.32° | 2.82 mm |
| 10° | 0.17〜0.19° | 1.55 mm |
| 20° | 0.08° | 0.67 mm |
| 30° | 0.05〜0.06° | 0.44 mm |
| 45° | 0.03〜0.04° | 0.30 mm |
- 傾きが小さいと、誤差は大きく悪化します。 傾きの最大値が 5° のときの並進誤差は約 2.8mm で、45° のとき(約 0.3mm)の約9倍です。
- 20〜30° 以上傾けると、かなり改善します。
傾きが小さいと、姿勢どうしの回転のほとんどが「光軸まわりのロール」になり、回転の軸がほぼ同じ向きにそろってしまいます。ハンドアイキャリブレーションで X を正しく求めるには、向きの異なる2つ以上の軸のまわりに回転させたデータが必要です。軸がそろっていると X の一部の成分が決まりにくくなり、計測誤差の影響を強く受けます。

図11は、15姿勢のすべての組について、姿勢と姿勢の間の回転の「回転軸」の向きを示したものです。中心がカメラの光軸の向きで、外側ほど光軸と違う向きの軸です。傾きの最大値が 5° のときは、光軸から 30° 以上離れた軸は 10% しかなく、ほとんどの軸が光軸の近くに集まっています。35° では 38% に増え、軸の向きがばらけています。
実践的な目安
この章の結果から、ハンドアイキャリブレーションのデータを集めるときの目安をまとめます(コーナー位置誤差 0.1px 程度の、良い撮影条件の場合)。
- 姿勢の数:15 個以上。並進誤差は 15姿勢で約 0.37mm、30姿勢で約 0.26mm です。増やすほど良くなりますが、15 を超えると改善はゆるやかです。
- 回転の大きさ:ボードの正面から 20〜30° 以上傾けた姿勢を含める。光軸まわりに回すだけでは不十分で、向きの違う軸のまわりに回すことが大切です。
- 撮影条件:誤差はコーナー位置誤差に比例するので、ピントを合わせ、明るく撮って画像ノイズを減らすことが、そのまま精度につながります。
- 解法:Park か Horaud が最も安定していました。Tsai は1〜2割ほど悪い程度です。OpenCV の Andreff と Daniilidis には注意点があります(第3章 補足)。
結果の解釈の限界
この章の数値は、次の前提のうえでのものです。
- コーナー位置誤差の大きさは、文献 [1][2] から見積もった想定値です。実際の RealSense での値は第5章で測ります。
- いつも同じ方向にずれる誤差(焦点距離、ボードの寸法、たわみ)と、ロボットの誤差は含んでいません。実際には、これらのほうが大きく効く可能性があります。
- レンズのゆがみがなく、ボードは完全に平らという理想的なカメラとボードを想定しています。
まとめと次章予告
- カメラの計測誤差の大きさは、文献をもとに「コーナー位置誤差 0.1px(標準)〜0.3px(悪い条件)」と根拠をもって決めた
- ハンドアイの推定誤差は、コーナー位置誤差に比例し、姿勢を増やすと減り、回転が小さいと大きく悪化する
- 0.1px・15姿勢・傾き 35° の条件で、誤差は回転約 0.045°、並進約 0.37〜0.42mm
- データ集めの目安は、15姿勢以上、20〜30° 以上の傾きを含めること
次の第3章 補足では、この章の実験で見つかった、OpenCV の Andreff と Daniilidis の注意点について、原因と対策を説明します。
参考
- [1] T. Schöps, V. Larsson, M. Pollefeys, and T. Sattler, “Why Having 10,000 Parameters in Your Camera Model Is Better Than Twelve,” CVPR, 2020.
- [2] A. Duda and U. Frese, “Accurate Detection and Localization of Checkerboard Corners for Calibration,” BMVC, 2018.

コメント