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を改修した。
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として使用する構造に修正した。
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まで変化する。