--- plan: 01-02 phase: 01-eskf-core status: complete completed: 2026-04-01T20:50:00Z --- ## Summary Replaced all FAKE Math stubs in CoordinateTransformer with real camera projection mathematics. Implements the complete pixel-to-GPS chain via K^-1 unprojection, camera-to-body rotation, quaternion body-to-ENU transformation, and ray-ground intersection (ESKF-06). ## Key File Modified - `src/gps_denied/core/coordinates.py` (176 lines added) — Real K matrix math, helper functions, pixel_to_gps, gps_to_pixel, cv2.perspectiveTransform ## Commits - `dccadd4` feat(coordinates): implement real pixel-to-GPS projection chain (ESKF-06) ## New Helpers - `_build_intrinsic_matrix()` — K matrix from focal_length, sensor size, resolution - `_cam_to_body_rotation()` — Rx(180deg) for nadir-pointing camera - `_quat_to_rotation_matrix()` — Quaternion to 3x3 rotation matrix ## Deviations None — all acceptance criteria passed. ## Self-Check: PASSED - [x] K^-1 unprojection replaces 0.1m/pixel fake scaling - [x] Ray-ground intersection at altitude - [x] gps_to_pixel is exact inverse - [x] transform_points uses cv2.perspectiveTransform - [x] All FAKE Math stubs removed - [x] Image center pixel projects to UAV nadir - [x] Backward-compatible defaults (ADTI 20L V1)