LOG146 — IKの壁とSimの出番

01. カメラ検出 ✓ 正常動作
iPhone → OpenCV HSV検出
pixel(1347, 639) → 赤ブロック重心
camera_check.py — リアルタイム検出確認
cap = cv2.VideoCapture(1) # iPhone index 1 centroid = detect_red_block(frame) # → pixel_x=1347, pixel_y=639
HSV閾値で赤色マスクを生成し最大輪郭の重心を取得。プレビュー画面に緑の円とPixel座標を重畳表示するようcamera_check.pyを改修した。
02. homography変換 ✓ 二重変換バグ修正済み
pixel → Robot XY(マット四隅実測)
pixel(1461, 849) → robot(129.2, 183.6)
homographyキャリブレーション — マット四隅実測値
左上: pixel(216, 82) → robot(-89.0, -202.6) 右上: pixel(1547, 56) → robot(-112.5, 204.6) 左下: pixel(330, 873) → robot(138.1, -172.9) 右下: pixel(1459, 847) → robot(128.6, 182.9) H, _ = cv2.findHomography(src_points, dst_points) # → 誤差1mm以下で一致確認
修正前はhomographyの出力(Robot座標)にさらにオフセット変換をかける二重変換になっていた。pixel_to_world()の出力をそのままRobot XYとして使用する構造に修正した。
03. send_coords() ⚠ IK不安定
Robot XY + RXYZ → mechArm移動
送った座標 ≠ 実測座標(位置によって大きくズレ)
IK不安定の証拠
# 成功ケース 送った: [70.9, 178.6, 60.6, -81.36, 61.94, 11.17] 実測: [71.5, 175.5, 54.9, -86.32, 63.03, 5.68] XYズレ: 0.6mm, 3.1mm ← 正常 # 失敗ケース 送った: [-0.6, -167.7, 60.6, -92.71, 63.07, -8.75] 実測: [155.3, 0.4, 218.1, -94.04, 59.96, -93.32] XYズレ: 155.9mm ← 破綻
位置によってRXYZが大きく変化するのに固定値を渡しているため、IKが別の解を選ぶ。RZの実測値は位置によって167〜-140まで変化する。
なぜIKが不安定なのか
send_coords()はXYZ+RXYZの6値を同時に満たす関節角度をIKで計算する。RXYZが実際のアーム姿勢と整合していない場合、全く別の解を出す。位置ごとにRXYZが変化するのに固定値を渡し続けることが根本原因だ。
次のアプローチ — Sim-to-Real
Unityシミュレーション上でマット全域にブロックをグリッド配置し、各位置でのPICK動作を実行して関節角度を記録する。pixel座標 → angles の対応テーブルを生成し、実機ではsend_angles()で確実に動作させる。これがSim-to-Realの本来の用途だ。