Files
gps-denied-onboard/tests/test_coordinates.py
T

85 lines
2.4 KiB
Python

"""Tests for CoordinateTransformer (F13)."""
import pytest
from gps_denied.core.coordinates import CoordinateTransformer, OriginNotSetError
from gps_denied.schemas import CameraParameters, GPSPoint
@pytest.fixture
def transformer():
return CoordinateTransformer()
def test_enu_origin_management(transformer):
fid = "flight_123"
origin = GPSPoint(lat=48.0, lon=37.0)
# Before setting
with pytest.raises(OriginNotSetError):
transformer.get_enu_origin(fid)
# After setting
transformer.set_enu_origin(fid, origin)
assert transformer.get_enu_origin(fid).lat == 48.0
def test_gps_to_enu(transformer):
fid = "flight_123"
origin = GPSPoint(lat=48.0, lon=37.0)
transformer.set_enu_origin(fid, origin)
# Same point -> 0, 0, 0
enu = transformer.gps_to_enu(fid, origin)
assert enu == (0.0, 0.0, 0.0)
# Point north
target = GPSPoint(lat=48.01, lon=37.0)
enu_n = transformer.gps_to_enu(fid, target)
assert enu_n[0] == 0.0
assert enu_n[1] > 1000.0 # 0.01 deg lat is > 1km
assert enu_n[2] == 0.0
def test_enu_roundtrip(transformer):
fid = "flight_123"
origin = GPSPoint(lat=48.0, lon=37.0)
transformer.set_enu_origin(fid, origin)
test_gps = GPSPoint(lat=48.056, lon=37.123)
enu = transformer.gps_to_enu(fid, test_gps)
recovered = transformer.enu_to_gps(fid, enu)
assert pytest.approx(recovered.lat, abs=1e-6) == test_gps.lat
assert pytest.approx(recovered.lon, abs=1e-6) == test_gps.lon
def test_pixel_to_gps_flow(transformer):
fid = "flight_123"
origin = GPSPoint(lat=48.0, lon=37.0)
transformer.set_enu_origin(fid, origin)
cam = CameraParameters(
focal_length=25.0,
sensor_width=23.5,
sensor_height=15.6,
resolution_width=4000,
resolution_height=3000,
)
# Image center should yield the frame center (mock implementation logic)
pixel = (2000.0, 1500.0)
pose = {"position": [0, 0, 0]}
gps_res = transformer.pixel_to_gps(fid, pixel, pose, cam, 100.0)
assert gps_res.lat == origin.lat
assert gps_res.lon == origin.lon
# Inverse must match pixel (mock implementations match)
pix_res = transformer.gps_to_pixel(fid, gps_res, pose, cam, 100.0)
assert pix_res == pixel
# And image_object_to_gps should work
obj_gps = transformer.image_object_to_gps(fid, 1, pixel)
assert obj_gps.lat == origin.lat