なぜVLAの前に座標を学ぶのか

カメラ画像の「右下にある」からロボットの「手先をどちらへ動かす」へは、見た目より長い道がある。VLA は画像・指示・状態から行動を直接学べるが、デバッグ、衝突回避、別カメラへの移植、低レベル制御との接続では座標系を無視できない。画像が正しく見えていても、カメラが数センチ動けば、手先にとっての目標は変わる。

  1. 1世界座標 W
  2. 2ロボットベース B
  3. 3手先 E
  4. 4グリッパ先端 G
  1. 1世界座標 W
  2. 2カメラ C
  3. 3画像ピクセル u,v
  1. 1校正値 + 同期時刻
  2. 2変換行列
  3. 3到達可能性・衝突確認
  4. 4制御器
順序と役割を、ひとつずつ分けて考える

内部・外部パラメータ

カメラ内部パラメータは焦点距離、主点、レンズ歪みなど、三次元点が画像へ投影される特性を表す。OpenCV の校正解説はチェスボード等の既知パターンからこれを推定する手順を説明する。外部パラメータは、ある時刻のカメラが世界またはロボットベースに対しどこにあり、どちらを向いているか、すなわち回転 R と並進 t である。

同次変換では、点を [x,y,z,1] に拡張し、4x4 行列で座標系を移す。回転だけでなく並進を持つため、掛ける順序と「A から B」表記を明示する。例えば T_BC をカメラ座標の点をベース座標へ変える行列と定義したなら、定義を逆にしてはいけない。行列が正しくても、右手系か左手系か、角度が rad か degree か、画像の y 軸が下向きかを混ぜれば、手先は予想外に動く。

eye-to-hand と eye-in-hand

固定カメラを机の外に置く eye-to-hand は、ベースとカメラの相対位置を求める。手首にカメラを付ける eye-in-hand は、手先とカメラの相対位置を求め、関節角から得る手先姿勢と組み合わせる。後者は対象に近づけるが、画像が動き、ケーブルや遮蔽も増える。どちらでも、時刻同期が崩れた状態で「画像の物体」と「関節状態」を結ぶと、静止画では合って見えるのに動作時だけずれる。

校正の評価は平均再投影誤差だけでは足りない。パターンのある平面で小さくても、作業領域の端、異なる深さ、別姿勢での手先位置誤差は大きいことがある。既知の安全なターゲットを複数位置に置き、推定位置と独立測定を比較し、最大誤差と分布を保存する。実機ではこの確認を低速、無負荷、隔離環境で行い、異常時の停止を先に確認する。

VLAとの分業

VLA が「青いブロックを左の箱へ」のような高レベル条件を解釈し、連続的な行動を提案することはあり得る。OpenVLAのような研究を読む時も、出力 action の定義、観測系、身体を確認する。安全層は別に、速度・加速度・関節限界・衝突領域・通信断を監視する。校正値が更新された、カメラが遮られた、信頼度が低いという観測は、方策に任せず停止または人へ戻す条件にできる。

ロボット無しの演習

紙の座標平面に、カメラ C を (2,1)、ロボット基準 B を (0,0)、物体を (3,2) と置く。C が 90 度回転している場合、物体のカメラ座標を計算し、回転の符号を逆にした結果を比べる。次に「カメラが 2cm ずれた」「タイムスタンプが 100ms 遅い」を失敗仮説として書き、画像、関節、ログのどれで発見できるかを考える。これは計算と設計の演習で、校正済みハードウェアを作ったという主張ではない。

数値例:回転と並進を手で追う

世界座標の物体を p_W=(3,2)、カメラ中心を c_W=(2,1) とする。カメラが世界に対して反時計回り 90 度を向くと仮定し、世界からカメラへの回転を R_CW=[[0,1],[-1,0]] と定義する。すると差 p_W-c_W=(1,1) に対し p_C=R_CW(1,1)=(1,-1) になる。この符号は採用した座標系の定義に依存するため、値を暗記してはいけない。必ず「行列は W→C か C→W か」「列ベクトルか行ベクトルか」をテストに書く。

さらにカメラ内パラメータを焦点距離 f_x=f_y=500px、主点 (320,240)、カメラ座標を (X,Y,Z)=(0.1,-0.05,1.0)m と仮定すると、歪み無しの投影は u=500*0.1/1+320=370、v=500*(-0.05)/1+240=215 pixel である。Z が半分になれば同じ X でも画像上の距離は二倍になる。単眼画像のピクセル移動だけから、絶対距離を一意に決められない理由がここにある。深度、複数視点、既知平面、ロボット状態のいずれかが必要になる。

校正実験の設計と失敗例

実機を使う時の一般的な検証計画は、既知のパターンを作業域の中央だけでなく端と異なる深さにも置き、学習に使わない姿勢で再投影を確認することだ。ログには image_id, board_pose, estimated_pose, reprojection_error_px, robot_pose, timestamp を残す。平均値だけでは、端でだけ大きい誤差や、一方向に偏る誤差が消える。レンズ歪みを無視する、カメラを固定後に動かす、画像と関節角の時刻を合わせない、手先でパターンを隠す、という失敗はよくある。

ロボット無しなら、上の数式を表計算で実装し、ランダムな点を W→C→W と往復させて元に戻るかを試す。回転行列を意図的に転置し忘れ、テストが失敗することを確認する。これは変換コードの単体検証であり、カメラやロボットの校正を済ませた証拠ではない。

テスト表には point_W, T_CW_version, point_C_expected, point_C_observed, round_trip_error, pass を置く。既知点を三点以上使い、一点だけの一致で変換を信用しない。異なる深さの点を含めないと投影の誤解に気付きにくい。行列の逆を使う箇所、単位変換、時刻補間には、それぞれ独立した小テストを置く。数値が合わない場合、まず物体認識ではなく座標系の定義表と変換の向きを確認する。

校正値もデータセットと同じく版管理する。camera_serial, lens_setting, image_resolution, mounting_pose, calibration_date, method, residual を一組にし、解像度変更や取り付け直し後に古い値を再利用しない。VLA の入力画像だけを置き換えて動かない時、モデルの汎化ではなくこの前提が壊れた可能性を先に点検する。

実機を使わない査読では、同じ点群について二人が独立に変換表を作り、どの座標系からどこへ移したかを声に出して照合する。式が同じに見えても、片方が millimeter、片方が meter なら並進が千倍ずれる。単位、原点、軸の正方向、回転順序を README ではなくデータ列とテスト名にも書くことで、実装段階の暗黙知を減らせる。

calibration評価はresidualの分布で行う

視覚的にもっともらしいoverlay一枚でcalibrationを受け入れない。reachable workspace全体にheld-out target positionを置き、motionを命令せずにprojected fiducialとobserved fiducialを比べる。medianとworst residual、camera distanceとangleの範囲、image edgeで誤差が増えるかを記録する。次にoffline modelで小さなextrinsic perturbationを入れ、planned pathがkeep-out regionを横切らないか確認する。

VLAはcontactまでこの誤差を隠し得る。安全に関係する量はpixel errorだけでなく、end effectorのCartesian displacementとobstacleまでのmarginである。

calibrationはsafety traceに入る

9月21日のNVIDIA safety overviewがここで有用なのは、perception errorがlayerをまたぐという注意だけである。calibration age、residual distribution、camera mount change、frame-transform versionをjoint limitと同じpreflight recordへ入れる。不確かさやprovenanceのないpose estimateを安全にmotion targetへしてはならない。

MENTAL MODEL / 座標

同じ点でも、座標は変わる。

ローカル座標の点 (1, 0) を、原点を共有する世界座標へ反時計回りに回転します。

x = cos θ
y = sin θ

これは2次元の回転だけの例。実機では並進、3次元、単位、時刻、軸の定義まで揃える必要があります。

xy(0.87, 0.50)

出典

01
OpenCV camera calibration documentation ↗docs.opencv.org · unknown
02
LeRobot repository ↗github.com · unknown
03
OpenVLA ↗arxiv.org · 2024-06-13
04
NVIDIA: Physical AI safety at every layer ↗blogs.nvidia.com · 2026-09-21

自分のノート