ハンドアイキャリブレーション入門 第4章 前編:カメラの内部パラメータがずれると精度はどうなるか(シミュレーション編)

構成

シリーズ「ハンドアイキャリブレーション入門」の第4章の前編です。第3章では、カメラの計測のばらつき(コーナー位置誤差)・姿勢の数・回転の大きさが精度にどう効くかを調べました。ただし第3章では、カメラのレンズの性質とボードの寸法は正確に分かっているという前提を置いていました。

実際には、レンズの性質には RealSense の中に保存された工場出荷時の値を使うことが多く、ボードは自分で印刷します。どちらも、本当の値から少しずれているかもしれません。この章では、シミュレーションを使って次の問いに答えます。

  • レンズの性質やボードの寸法がずれていると、ハンドアイの推定誤差はどれくらい大きくなるのか
  • そのずれは、第3章のように姿勢を増やせば小さくできるのか
目次

シリーズの構成

第4章は分量が多くなるため、前編(シミュレーション編)と後編(実測編)に分けました。前編で「どれだけずれると、どれだけ悪くなるか」を調べ、後編で RealSense の実際のずれを測って、前編の結果に当てはめます。

章内容ロボットカメラ
第1章ハンドアイキャリブレーションの考え方――
第2章シミュレーションで AX = XB を解き、正しく解けることを確認シミュレーションシミュレーション
第3章精度は何で決まるか:計測誤差・姿勢の数・回転の大きさシミュレーションシミュレーション
第3章 補足OpenCV の5つの解法の注意点:Andreff の偏りと Daniilidis の 180° 問題シミュレーションシミュレーション
第4章 前編(今回)カメラの内部パラメータがずれると精度はどうなるか(シミュレーション編)シミュレーションシミュレーション
第4章 後編RealSense の内部パラメータは信用できるか(実測編)―実測
第5章ボードの位置姿勢の計測はどれくらいばらつくか―実測
第6章実測したばらつきを使って、実機での精度を予測するシミュレーション実測した誤差
番外編(予定)市販の安価なロボットアームで実機検証実機実測

カメラの内部パラメータとは

第3章で「レンズの性質」と呼んでいたものを、正式には内部パラメータと呼びます。カメラの中で、3次元の点が画像のどこに写るかを決める値のことです。カメラの外の世界との位置関係(カメラがどこにあって、どちらを向いているか)を表す外部パラメータと区別するために、こう呼ばれます。

【ここに画像ブロックで図1(04c_intrinsics_ja.png)を挿入し、このブロックは削除】

内部パラメータには、主に次の3種類があります(図1)。

内部パラメータ意味この章の想定(D435 のカラー 1280×720)
焦点距離 fレンズの中心から画像(センサー)までの距離。ピクセル単位で表す。大きいほど、物が大きく写る約 924px
主点 (cx, cy)光軸が画像と交わる点。画像のちょうど中心にあるとは限らない画像の中心 (640, 360)
レンズのゆがみまっすぐな線が、画像の端ほど曲がって写る性質。ゆがみの強さを表す係数(k1 など)で表すゆがみなし

solvePnP は、この内部パラメータを使って「コーナーがこの位置に写ったなら、ボードはここにある」と計算します。そのため、内部パラメータが間違っていると、ボードの位置と向き(B)も間違って計算されます。

内部パラメータを知る方法は2つあります。

  • 工場出荷時の値を使う:RealSense は工場で内部パラメータを測り、カメラの中に保存しています。Intel の公式ライブラリ(pyrealsense2)で読み出せます。
  • 自分で測り直す:第3章で説明したカメラのキャリブレーション(ボードを何十枚も撮影して、レンズの性質を求める作業)を、OpenCV で行います。

手軽なのは工場出荷時の値ですが、その値がどれくらい正確かを実際に測って評価した論文は、調べた範囲では見つかりませんでした。そこで後編で、工場出荷時の値と、自分で測り直した値を比べます。

この章で使うカメラ:カラーカメラ

RealSense D435 には、カラーカメラが1台と、IR カメラ(赤外線カメラ)が2台付いています。IR カメラは、目に見えない赤外線も写せる白黒のカメラで、D435 では左右2台の見え方の違いから奥行きを計算するのに使われています。D435 は IR プロジェクターから赤外線の細かい点模様を当てていて、模様のない壁などでも奥行きを測れるようになっています。

このシリーズでは、カラーカメラを使います。ハンドアイキャリブレーションではカラーカメラを使うのが一般的で、扱いやすいためです。

ただし、文献では IR カメラのほうが精度が良いことが分かっています。第3章で紹介した Schöps ほか [1] によると、D435 の再投影誤差(キャリブレーションの良し悪しの指標)の中央値は、カラーカメラで 0.092px、IR カメラで 0.042px でした。IR カメラを使う場合は、プロジェクターの点模様がボードに写らないよう、プロジェクターを切る必要があります。

将来、ご要望があれば、IR カメラでも同じ検証を行う予定です。

ずれの大きさをどう決めるか

第3章では、シミュレーションに入れる誤差の大きさを、結果を見る前に文献で根拠づけました。内部パラメータのずれも同じようにしたいところですが、上で書いたとおり、工場出荷時の値のずれを評価した文献は見つかりませんでした。

そこでこの章では、ずれの大きさを1つに決めず、広めの範囲で変えて、「どれだけずれると、どれだけ悪くなるか」を調べます。実際のずれがどれくらいかは、後編で RealSense を測って決めます。前編のグラフは、後編で測ったずれを当てはめて、精度を読み取るための「ものさし」になります。

調べるずれは、次の4種類です。

ずれの種類変える範囲範囲の考え方
焦点距離0〜2%2% は約 18px。結果が大きく変わる範囲まで含める
主点(横方向)0〜10px10px は画像の幅の約 1%
レンズのゆがみの無視k1 = 0〜0.15本当はゆがみがあるのに、ゆがみなしとして計算した場合。k1 = 0.05 で、画像の隅のコーナーが約 17px ずれる
ボードのマスの大きさ0〜2%家庭用プリンターの印刷の縮尺のずれ。印刷時に「用紙に合わせる」を選ぶと、数% 縮小されることがある

ボードの寸法は内部パラメータではありませんが、後で説明するように、焦点距離とまったく同じ仕組みで効くので、一緒に調べます。

シミュレーションの変更点

第3章のシミュレーションでは、コーナーを画像に写すときと、solvePnP でボードの位置と向きを計算するときに、同じ内部パラメータとボードの寸法を使っていました。この章では、この2つを分けます。

  1. コーナーを画像に写すときは、本当の内部パラメータとボードの寸法を使う
  2. 写った位置にコーナー位置誤差(0.1px)を加える
  3. solvePnP では、こうだと思っている(ずれた)内部パラメータとボードの寸法を使って計算する

これで、「本当の値とずれた値を使って計算してしまった」状況を再現できます。

条件は第3章の基準(コーナー位置誤差 0.1px、15姿勢、傾き最大 35°、ロール ±90°)に、ずれを1種類だけ加えます。条件ごとに 200 回試し、誤差の中央値と、25〜75% の範囲を比べます。ずれがないときの誤差は、回転約 0.044°、並進約 0.37mm です(第3章と同じ)。

解法は、5つの解法(Andreff は第3章 補足で説明した、並進を解き直した版)で結果がほとんど同じだったため、グラフには Park だけを載せています。

実験1:焦点距離のずれ

【ここに画像ブロックで図2(04_focal_ja.png)を挿入し、このブロックは削除】

焦点距離のずれ回転誤差並進誤差
0%(ずれなし)0.044°0.37 mm
0.25%0.043°1.32 mm
0.5%0.043°2.60 mm
1%0.047°5.21 mm
2%0.056°10.43 mm

(Park、200 回の中央値。ほかの解法もほぼ同じ)

  • 並進誤差は、焦点距離のずれに比例して大きくなります。 1% ずれると約 5.2mm で、ずれがないとき(0.37mm)の 14 倍です。わずか 0.25% のずれでも、第3章のランダムな誤差の3倍を超えます。
  • 回転誤差は、ほとんど変わりません。

なぜ焦点距離のずれが、カメラの位置のずれになるのか

【ここに画像ブロックで図3(04c_focal_depth_ja.png)を挿入し、このブロックは削除】

カメラは、ボードの「見かけの大きさ」から距離を計算しています。ボードの本当の大きさが分かっていれば、画像に小さく写っているほど遠くにある、と分かります。式で書くと、次の関係です。

距離 = 焦点距離 × ボードの大きさ ÷ 画像に写った大きさ

焦点距離を 1% 長く思っていると、計算した距離も 1% 長くなります(図3(a))。カメラからボードまでの距離は平均約 475mm なので、1% は約 4.8mm です。ボードの向きは、写ったコーナーの並び方(形のゆがみ方)から計算するので、焦点距離のずれの影響をあまり受けません。これが、回転誤差がほとんど変わらない理由です。

【ここに画像ブロックで図4(04c_axis_shift_ja.png)を挿入し、このブロックは削除】

距離のずれは、ハンドアイの結果にそのまま入り込みます。どの姿勢でも、カメラはボードを「本当より遠い」と計算するので、ボードから見ると、カメラが自分の光軸の向きに後ろへずれた位置にあるように見えます(図4(a))。手先から見ると、このずれはどの姿勢でもほぼ同じです(図4(b))。すると、「カメラが手先に、本当より少し後ろに付いている」と考えれば、すべての姿勢のデータが矛盾なく説明できてしまいます。実際、シミュレーションで求めた X のずれの向きを調べると、ほぼカメラの光軸の方向(焦点距離 +1% で約 5.3mm)でした。

実験2:主点のずれ

【ここに画像ブロックで図5(04_center_ja.png)を挿入し、このブロックは削除】

主点のずれ(横方向)回転誤差並進誤差
0px(ずれなし)0.044°0.37 mm
1px0.059°0.40 mm
2px0.094°0.52 mm
5px0.211°1.10 mm
10px0.408°2.11 mm
  • 主点のずれは、主に回転誤差を大きくします。 5px のずれで回転誤差は約 0.21° になり、ずれがないとき(0.044°)の約5倍です。
  • 並進誤差も大きくなります(5px で約 1.1mm)。ずれの向きは、主にカメラの光軸に垂直な方向でした。

主点は「光軸がどこを通っているか」を表すので、主点がずれていると、カメラの向きを少し違って思っていることになります。焦点距離 924px のカメラで主点が 5px ずれると、向きの見積もりは約 0.3°(5 ÷ 924 ラジアン)ずれます。これもどの姿勢でも同じように効くので、X の回転がずれた答えになります。

実験3:レンズのゆがみの無視

【ここに画像ブロックで図6(04_distort_ja.png)を挿入し、このブロックは削除】

無視したゆがみ k1回転誤差並進誤差
0(ゆがみなし)0.044°0.37 mm
0.020.054°0.43 mm
0.050.083°0.70 mm
0.10.149°1.23 mm
0.150.216°1.73 mm
  • 本当はレンズにゆがみがあるのに、ゆがみなしとして計算すると、回転誤差・並進誤差の両方が大きくなります。k1 = 0.05 で、並進誤差は約2倍(0.70mm)です。
  • ただし、焦点距離や主点のずれと比べると、悪化の仕方はゆるやかです。

【ここに画像ブロックで図7(04c_distortion_ja.png)を挿入し、このブロックは削除】

ゆがみによるコーナーのずれは、画像のどこに写るかで大きさも向きも違います(図7)。画像の中心ではほぼずれず、隅に行くほど外向きに大きくずれます。姿勢ごとにボードが写る場所は違うので、ずれ方も姿勢ごとに違います。この性質が、次の実験5で大事になります。

実験4:ボードの寸法のずれ

【ここに画像ブロックで図8(04_scale_ja.png)を挿入し、このブロックは削除】

マスの大きさのずれ回転誤差並進誤差
0%(ずれなし)0.044°0.37 mm
0.2%0.044°0.99 mm
0.5%0.044°2.36 mm
1%0.044°4.70 mm
2%0.043°9.17 mm

(印刷したボードが、思っているより大きい場合)

  • 焦点距離のずれ(実験1)とほぼ同じ結果です。 並進誤差はずれに比例し、1% で約 4.7mm。回転誤差はまったく変わりません。
  • 0.2% のずれでも並進誤差は約 1mm になり、ずれがないときの約 2.7 倍です。30mm のマスで 0.2% は 0.06mm、ボード全体(210mm)でも 0.4mm です。定規で測って気付ける大きさではありません。

仕組みも実験1と同じです。距離の式の「ボードの大きさ」がずれているので、距離が同じ割合でずれます。印刷したボードが思っているより大きいと、ボードは本当より近くにあると計算され、カメラが光軸の向きに前へずれた答えになります。図3(b) はその逆で、印刷が小さい(ボードを大きく思っている)ために、ボードを遠くに計算する場合です。ずれの向きが逆になるだけで、誤差の大きさは同じです。

実験5:姿勢を増やすと誤差は減るか

第3章では、姿勢を増やすと誤差が減りました。内部パラメータのずれによる誤差も、姿勢を増やせば減るのでしょうか。

【ここに画像ブロックで図9(04_poses_ja.png)を挿入し、このブロックは削除】

姿勢の数ずれなし焦点距離 +1%主点 +5pxゆがみ k1=0.05 を無視
50.72 mm5.28 mm1.42 mm1.45 mm
100.49 mm5.16 mm1.16 mm0.80 mm
150.37 mm5.21 mm1.10 mm0.70 mm
300.26 mm5.20 mm1.01 mm0.49 mm

(並進誤差、Park、200 回の中央値)

  • 焦点距離のずれによる誤差は、姿勢を増やしても減りません。 5姿勢でも30姿勢でも約 5.2mm です。
  • 主点のずれによる誤差も、ほとんど減りません。 回転誤差も 5姿勢で 0.26°、30姿勢で 0.21° と、ほぼ横ばいです。
  • レンズのゆがみを無視したことによる誤差は、姿勢を増やすと減ります。 5姿勢の 1.45mm から 30姿勢の 0.49mm まで、ずれなしの場合と同じように下がっていきます。

【ここに画像ブロックで図10(04c_bias_ja.png)を挿入し、このブロックは削除】

この違いは、誤差の性質の違いで説明できます(図10)。

  • ランダム誤差(第3章のコーナー位置誤差)は、姿勢ごとにばらばらの方向にずれます。たくさんの姿勢を使うと打ち消し合い、答えは正解に近づきます。
  • 系統誤差(いつも同じ方向にずれる誤差)は、どの姿勢でも同じようにずれます。焦点距離・主点・ボードの寸法のずれがこれにあたります。姿勢を増やしても、答えは「ずれた点」に近づくだけです。

レンズのゆがみは、内部パラメータの誤差ではありますが、ずれ方が写る場所によって変わるため、姿勢ごとにずれ方が違います。そのため、ランダム誤差に近い振る舞いをして、姿勢を増やすと平均されて小さくなります。

もう1つ注意したいのは、焦点距離がずれていても、答えのばらつきは小さいことです。焦点距離 +1%・30姿勢では、200 回の答えの 25〜75% の範囲が 5.05〜5.39mm に収まっていました。何度キャリブレーションをやり直しても、毎回ほぼ同じ「ずれた答え」が出ます。答えがそろっているからといって、正しいとは限りません。

実践的な目安

この章の結果から、内部パラメータとボードについての目安をまとめます(コーナー位置誤差 0.1px・15姿勢で、ずれがないときの並進誤差 約 0.37mm を基準とした場合)。

  • 焦点距離とボードの寸法が、最も効きます。 ずれの割合 × カメラとボードの距離が、そのまま X の並進誤差になります。距離 500mm で並進誤差を 0.5mm 程度に収めたいなら、焦点距離もボードの寸法も、0.1% 程度の正確さが必要です。
  • ボードは「実際のサイズ」で印刷し、印刷後に寸法を確かめる。 「用紙に合わせる」で印刷すると数% 縮小されることがあります。実験4の結果から見積もると、3% の縮小で並進誤差は約 14mm になります。
  • 主点は 1〜2px 以内に合っていることが望ましい。 5px ずれると回転誤差が約5倍になります。
  • レンズのゆがみは、無視せずにゆがみの係数を使う。 姿勢を増やせばある程度は減りますが、悪化はします。
  • 系統誤差は、姿勢を増やしても、答えのばらつきを見ても気付けません。 内部パラメータとボードの寸法は、ハンドアイキャリブレーションの前に、別の方法で確かめておく必要があります。

結果の解釈の限界

  • ずれの大きさは、文献の値ではなく、広めに取った範囲です。実際のずれは後編で測ります。
  • ずれは1種類ずつ加えました。実際には複数のずれが同時にあり、打ち消し合ったり、強め合ったりします。
  • レンズのゆがみは、最も効きの大きい k1 だけを調べました。
  • ボードは完全に平らで、ロボットには誤差がないという前提です。

まとめと次回予告

  • 内部パラメータ(焦点距離・主点・レンズのゆがみ)やボードの寸法がずれると、ハンドアイの推定誤差は大きくなる
  • 最も効くのは焦点距離とボードの寸法で、1% のずれで並進誤差が約 5mm(ずれがないときの十数倍)。カメラが光軸の方向にずれた答えになる
  • 主点のずれは主に回転誤差を大きくする(5px で約5倍)
  • 焦点距離・主点・ボードの寸法のずれは系統誤差なので、姿勢を増やしても減らない。レンズのゆがみの無視だけは、姿勢を増やすと減る

後編では、RealSense D435 の工場出荷時の内部パラメータを読み出し、OpenCV で測り直した値と比べます。あわせて、印刷したボードの寸法も確かめ、実際のずれをこの前編のグラフに当てはめて、精度への影響を見積もります。

参考

  • [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.
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次