Navigator / tests / triangulate / test_gps_iterative_traingulation.py
test_gps_iterative_traingulation.py
Raw
import pandas as pd
import pytest
from navigator.epoch.loaders import from_rinex_files
from navigator.epoch import Epoch
from tests.common_fixtures import nav_data, obs_data, navfilepath, obsfilepath
from navigator.core.triangulate import Triangulate, IterativeTriangulationInterface
import numpy as np
from pathlib import Path


@pytest.fixture
def epoch(navfilepath, obsfilepath) -> list[Epoch]:
    return from_rinex_files(
        observation_file=Path(obsfilepath),
        navigation_file=Path(navfilepath),
        station_name="AMC400USA",
        column_mapper={k: k for k in Epoch.OBSERVABLES},
    )


def test_traingulation_gps(epoch):
    epoches = list(epoch)

    # Triangulate the epoch``
    triangulator = Triangulate(
        interface=IterativeTriangulationInterface(),
    )

    # coords list
    coords = []
    # Trianguate all the epochs
    df = triangulator.triangulate_time_series(epoches)

    coords = df[["x", "y", "z"]].values

    # Take the average of the coords
    coords = np.array(coords)

    # Average the coords
    avg_coords = np.mean(coords, axis=0) / 1000

    assert avg_coords.shape == (3,)

    # Between 10 km +- of the earth radius
    assert np.linalg.norm(avg_coords) > 6371 - 10
    assert np.linalg.norm(avg_coords) < 6371 + 10

    # Real coords of AMC400USA_R_20230391700_01H_30S_MO.crx
    real_coords = np.array([-1248596.405, -4819428.21, 3976505.93])

    # Rescale the coords
    avg_coords = avg_coords * 1000
    # Assert the coords are close to the real coords
    assert np.linalg.norm(avg_coords - real_coords) < 50