「カメラで見て、つかむ」— 単純に聞こえますが、ロボットビジョンには画像認識だけでは足りない要素があります。「画面のどこにあるか」を「現実の何メートル先か」に変換する必要があるからです。
一般の画像認識との決定的な違い
一般の画像認識
- 「猫が写っている」でOK
- 2Dのピクセル座標
- 認識できれば終わり
ロボットビジョン
- 「30cm先、20度傾いて」まで必要
- 3Dの空間座標
- つかめて初めて成功
「95%の精度で猫と認識」できても、手を伸ばす先がわからなければロボットは何もできません。
処理の流れ
見てからつかむまで
撮る
RGB+深度
見つける
物体検出
位置と向き
6D姿勢推定
つかみ方
把持位置推定
ステップ1: カメラキャリブレーション(最重要)
すべての土台です。カメラのレンズ歪みと、「カメラとロボットの位置関係」を数値化します。
import cv2
# チェスボードを様々な角度で20〜30枚撮影して内部パラメータを求める
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
objpoints, imgpoints, gray.shape[::-1], None, None
)
さらにロボット用にはハンドアイキャリブレーションが必要です。「カメラから見て30cm先」を「ロボットの根元から見てどこか」に翻訳する行列を求めます。
ズレの9割はここ
「AIは正しく認識しているのに、腕が的外れな場所に伸びる」——原因はほぼキャリブレーション不良です。認識モデルを疑う前に、まずここを疑ってください。
ステップ2: 物体検出
定番はYOLO系です。速度と精度のバランスが良く、エッジでも動きます。
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
results = model("scene.jpg")
# → 画像内のバウンディングボックス(2D)が得られる
ここで得られるのは2Dの枠まで。次でこれを3Dに引き上げます。
ステップ3: 深度と組み合わせて3Dへ
深度カメラ(RGB-D)を使うと、各ピクセルまでの距離がわかります。
# 検出した枠の中心の深度を取り、3D座標に変換
u, v = box_center
z = depth_image[v, u] # 距離[m]
x = (u - cx) * z / fx # カメラ座標系のX
y = (v - cy) * z / fy # カメラ座標系のY
# → さらにハンドアイ行列でロボット座標系へ変換
fx, fy, cx, cy はキャリブレーションで求めた内部パラメータです。ここでキャリブレーションが効いてくるわけです。
ステップ4: 6D姿勢推定
位置(XYZ)だけでなく向き(回転3軸) も要ります。マグカップは取っ手の向きによってつかみ方が変わるからです。合計6自由度なので「6D姿勢」と呼びます。
- 既知の物体 → CADモデルとのマッチング(高精度)
- 未知の物体 → 学習ベースの推定モデル、または後述の把持位置推定
ステップ5: 把持位置推定
実務では「物体が何か」を特定せず、いきなり「どこをつかめるか」を推定するアプローチが強力です。
深度画像から「この位置・角度でグリッパーを閉じれば掴める」という候補を出す手法(GraspNet系)が定番で、見たことのない物体でもつかめるのが利点。倉庫の雑多な商品を扱う現場で重宝します。
VLAモデルという別解
2026年のトレンドは、この工程をまるごと1つのAIに任せる方向です。VLAモデルは「映像+指示 → 関節の動き」を直接出力するので、上記のステップ2〜5が不要になります。
| 従来パイプライン | VLA(E2E) | |
|---|---|---|
| 開発 | 工程ごとに調整が必要 | データを集めて学習 |
| デバッグ | どの工程が悪いか特定しやすい | ブラックボックス |
| 精度 | 高い(既知物体) | 汎用性が高い |
| 現場 | 産業用の定番 | 研究・新興企業が採用 |
とはいえキャリブレーションはVLAでも必要なので、この記事の内容は無駄になりません。
まとめ
- ロボットビジョンは「2D認識」ではなく「3D空間の位置と向き」を出す仕事
- キャリブレーションがすべての土台。腕がずれる原因の9割はここ
- 検出→深度で3D化→6D姿勢→把持位置、が古典的パイプライン
- VLAモデルは工程をまるごと置き換えるが、キャリブレーションは依然必要
ゆるふわフィジカルAI
