Files
gps-denied-onboard/tests/e2e/conftest.py
T
Yuzviak c9b74f45b8 test(e2e): parametrised ESKF drift tests across all 5 EuRoC MH sequences
conftest.py: add euroc_mh02..05_root fixtures (session-scoped, skip when absent)
test_euroc_mh_all.py: 10 parametrised tests — pipeline_completes + eskf_drift
  for MH_01..05 with per-difficulty ESKF ATE ceilings (easy: 0.5 m, med/hard: 1.5 m)

Results on first 100 frames (vo_scale=5 mm/frame):
  MH_01 easy     ESKF ATE 0.205 m  (< 0.5 m ceiling)
  MH_02 easy     ESKF ATE 0.131 m  (< 0.5 m ceiling)
  MH_03 medium   ESKF ATE 0.008 m  (< 1.5 m ceiling)
  MH_04 difficult ESKF ATE 0.009 m  (< 1.5 m ceiling)
  MH_05 difficult ESKF ATE 0.007 m  (< 1.5 m ceiling)
All 10 tests PASS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 15:19:09 +03:00

68 lines
1.8 KiB
Python

"""Shared fixtures for e2e tests — dataset discovery + skip markers."""
from pathlib import Path
import pytest
REPO_ROOT = Path(__file__).resolve().parents[2]
DATASETS_ROOT = REPO_ROOT / "datasets"
def _euroc_mh_root(seq: str) -> Path:
"""Return path for a MH sequence, skipping if absent."""
root = DATASETS_ROOT / "euroc" / seq
if not (root / "mav0").is_dir():
pytest.skip(
f"EuRoC {seq} not present at {root}. "
"Fetch the Machine Hall bundle from ETH Research Collection "
f"(DOI 10.3929/ethz-b-000690084), unpack the inner {seq}_*.zip "
f"into {root}/ so that {root}/mav0/ exists."
)
return root
@pytest.fixture(scope="session")
def euroc_mh01_root() -> Path:
return _euroc_mh_root("MH_01")
@pytest.fixture(scope="session")
def euroc_mh02_root() -> Path:
return _euroc_mh_root("MH_02")
@pytest.fixture(scope="session")
def euroc_mh03_root() -> Path:
return _euroc_mh_root("MH_03")
@pytest.fixture(scope="session")
def euroc_mh04_root() -> Path:
return _euroc_mh_root("MH_04")
@pytest.fixture(scope="session")
def euroc_mh05_root() -> Path:
return _euroc_mh_root("MH_05")
@pytest.fixture(scope="session")
def vpair_sample_root() -> Path:
root = DATASETS_ROOT / "vpair" / "sample"
if not (root / "poses_query.txt").is_file():
pytest.skip(
f"VPAIR sample not present at {root}. "
"Download the sample zip from the Zenodo link on "
"https://github.com/AerVisLoc/vpair, then unpack so that "
f"{root}/poses_query.txt exists."
)
return root
@pytest.fixture(scope="session")
def mars_lvig_root() -> Path:
root = DATASETS_ROOT / "mars_lvig"
if not root.is_dir():
pytest.skip(f"MARS-LVIG not present at {root}.")
return root