JaGuard (Jamming Guardian) is a deep temporal graph neural network designed to estimate and correct jamming-induced positional drift in GNSS systems. JaGuard defines this task as a dynamic graph regression problem. It models the satellite-receiver constellation as a sequence of heterogeneous star graphs, capturing the physical deterioration of the signal over time.
- Dynamic Star Graph: Models the receiver as a central node and visible satellites as leaf nodes.
- Spatiotemporal Fusion: Uses a HeteroGCLSTM layer to process 10-second windows of signal history.
- Minimalist Input: Operates exclusively on standard NMEA observables (SNR, Azimuth, Elevation; Latitude and Longitude).
- High Resilience: Maintains centimeter-level accuracy even under severe -45 dBm jamming and data starvation.
├── gnss/ # Core library
│ ├── train/ # Training logic
│ ├── dataset.py # Graph construction & normalization
│ └── model.py # JaGuard architecture
├── params.yaml # Central experiment configuration
├── prepare_data.py # Data preprocessing
├── run_experiment.py # Execution for a single configuration
├── run_all_experiments.py # Master script for automated experimental sweeps
├── dvc.yaml # DVC pipeline orchestration
└── README.md
Make sure you have Conda installed:
conda create --solver classic -n gnss-py310
python=3.10
numpy=1.24.4
scipy=1.15.2
pandas=1.3.5
scikit-learn
-c conda-forge -y
source $(conda info --base)/etc/profile.d/conda.sh conda activate gnss-py310
pip install -r requirements.txt
This project is fully instrumented with Data Version Control (DVC). To simplify the research workflow, we use an automated sweep script that manages parameter updates and triggers the DVC pipeline internally. This script automatically updates params.yaml for each configuration and executes dvc repro for you.
python run_all_experiments.py
python run_all_experiments.py --dry-run
python run_all_experiments.py --receivers Ublox10,GP01 --seeds 42,2024