---
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)
