État de la validation
À propos des tolérances. « Vérifié » ci-dessous signifie qu'un test d'étalonnage affirme que la statistique simulée correspond à la relation de référence à l'intérieur d'un seuil appliqué, actuellement 20–25 % d'erreur relative (moyennée sur les graines) pour les relations d'Allan et de budget de bruit. L'accord médian observé est souvent bien plus serré (quelques pour cent), mais la borne garantie est le seuil, et non la médiane. Lorsqu'un nombre comme « ~2 % » apparaît, il s'agit d'une observation typique, et non de la tolérance appliquée. Voir Affirmations et réalité.
La règle de promotion#
Une ligne de la matrice de vérification contrôlée par machine (src/verification.rs) est VALIDATED seulement lorsqu'une référence indépendante indépendante de Kshana concorde avec l'implémentation dans une tolérance énoncée avant l'exécution de la comparaison, dans un test exécuté dans la barrière de contrôle. Cette section est le seul endroit où la règle est écrite ; la matrice, le texte de chaque ligne et les notes de version s'y réfèrent.
Les types de référence indépendante acceptés#
| Type | Ce qui compte | Exemples déjà présents dans la matrice |
|---|---|---|
| Mesuré | Des données réelles mesurées de la grandeur que la ligne revendique : une observation du monde physique, et non une sortie de modèle. | Les deux tiers réservés d'un enregistrement réel d'horloge au césium ; les points normaux archivés de télémétrie laser lunaire ; la série UTC(k) de la Circular T du BIPM (Bureau international des poids et mesures) ; la tuile de terrain SRTM (Shuttle Radar Topography Mission). |
| Bibliothèque | Une bibliothèque ou un outil tiers indépendant qui calcule une grandeur définie de façon unique sur les mêmes entrées, la bibliothèque implémentant elle-même le calcul du domaine. La concordance entre bibliothèques n'est un contrôle authentique que parce que la grandeur n'a qu'une seule bonne réponse. | allantools, Orekit, ANISE, RTKLIB, gnss_lib_py, lamberthub, pymcdm, scikit-learn, les distributions statistiques de SciPy. |
| Référence | Vecteurs de référence, tables ou exemples de vérification publiés : des nombres qu'une norme, une agence ou un texte de référence imprime afin que les implémentations puissent être vérifiées par rapport à eux. | Vecteurs SOFA/ERFA (Standards of Fundamental Astronomy), vecteurs de vérification SGP4 de l'AIAA (American Institute of Aeronautics and Astronautics), exemples de validation de l'UIT-R (Union internationale des télécommunications, Secteur des radiocommunications), exemple détaillé ARAIM du Working Group C, JPL (Jet Propulsion Laboratory) Horizons. |
Deux autres critères tranchent les cas limites. Les deux sont adoptés pour la version 0,30.
- P1, une valeur détaillée publiée. Une valeur détaillée publiée, calculée à partir de la même forme fermée que celle qu'implémente la ligne, compte comme un vecteur de référence publié, lorsque la publication est indépendante de Kshana et que la comparaison fixe une tolérance énoncée. La valeur doit être imprimée sous forme de nombre dans la publication (une valeur lue sur un graphique ne compte que si l'incertitude de lecture est inférieure à la tolérance énoncée), et le test doit faire calculer cette valeur par Kshana à partir des entrées de la publication ; comparer une constante au document dont elle a été copiée est un contrôle de transcription, pas P1.
- P2, une bibliothèque numérique indépendante. Une bibliothèque numérique indépendante telle que numpy ou LAPACK (Linear Algebra PACKage) qui recalcule une grandeur d'algèbre linéaire définie de façon unique sur des entrées indiquées compte comme une bibliothèque indépendante. La bibliothèque doit effectuer l'étape de décomposition, d'inversion, de résolution ou de moindres carrés par son propre algorithme, sur des entrées validées avec le jeu de test ; l'affirmation validée porte alors sur l'algèbre linéaire sur ces entrées, et non sur les grandeurs physiques d'un scénario représentatif. Un script qui réévalue une forme fermée scalaire avec l'arithmétique de numpy est une seconde implémentation de notre cru, pas P2.
Conditions valables pour tous les types : la référence indépendante n'est ni écrite, ni exécutée, ni publiée par ce projet (la série d'articles propre à ce dépôt n'est donc pas indépendante de lui) ; la tolérance figure dans le test et a été fixée avant la première comparaison ; un test conditionné par des données, qui est ignoré lorsque ses données publiques sont absentes, le signale lorsqu'il est ignoré.
Ce qui ne compte pas#
- Notre propre seconde implémentation : un second chemin de code dans ce crate (
ReferenceImpl), ou un script de ce dépôt qui réévalue la même forme fermée. - La concordance avec nos propres sorties antérieures : références figées (goldens), points de non-régression, instantanés, ou un tableau issu des propres articles de ce projet.
- Une transcription des constantes d'une citation : vérifier un coefficient, un préréglage, une valeur de fiche technique ou une fiche de paramètres par rapport au document dont ils ont été copiés.
- Un choix de conception : une allocation, une pondération, un seuil, une limite d'alerte ou un scénario représentatif. Il n'y a pas de vérité externe pour un choix.
- Une identité interne : une intégrale numérique comparée à sa propre forme analytique, un aller-retour, une inversion, un test de propriété ou de monotonie.
- Une exécution d'intégration contre un hôte réel (
IntegrationRun) : charger un module dans un vrai serveur Signal K ou OpenCPN, ou alimenter un consommateur TCP avec la sortie d'une vraie passerelle, et vérifier que l'hôte accepte l'entrée et affiche l'état attendu. Cela montre que la tuyauterie fonctionne. L'hôte n'est pas une référence indépendante pour une valeur que porte l'intégration ; il n'y a donc rien d'externe à comparer, et une telle ligne (la ligne des intégrations maritimes) est MODELLED, et non VALIDATED.IntegrationRunest son propre type de référence indépendante, autorisé seulement sur les lignes MODELLED :integration_run_only_on_modelled_rowsdanssrc/verification.rséchoue si une ligne VALIDATED le porte, etvalidated_rows_require_an_external_oracleexige déjà que chaque ligne VALIDATED soitExternalDataset. - La vraisemblance sur des entrées réelles : des données réelles utilisées uniquement comme entrée, avec des assertions d'ordre de grandeur plutôt qu'une comparaison à une valeur externe.
- Une tolérance choisie après avoir vu la comparaison.
Comment la règle est appliquée#
Chaque ligne VALIDATED déclare, dans validated_oracle_basis() de src/verification.rs, sur quel type elle repose (Measured, Library, Reference, P1 ou P2), la source indépendante (citée à partir du texte de référence indépendante de la ligne elle-même) et l'unique test qui porte la comparaison. Les tests unitaires placés à côté du tableau échouent lorsqu'une ligne VALIDATED n'est pas déclarée ou l'est deux fois, lorsqu'une déclaration nomme une ligne qui n'est pas VALIDATED, lorsque la source déclarée n'est pas celle que nomme le texte de référence indépendante de la ligne ou est Kshana lui-même, lorsque le test déclaré n'est pas un test que cite la ligne, ou lorsqu'une ligne P2 ne nomme aucune bibliothèque numérique indépendante. tests/verification_rows_declare_an_oracle_basis.rs exige ensuite que le test déclaré existe sur le disque comme un véritable #[test] qui n'est pas ignoré. Ce que la machine ne peut pas vérifier, c'est si le test nommé compare bien à la source déclarée ; cela reste une lecture humaine. Les décomptes par type ne sont pas saisis ici : le tableau fait foi.
Lignes VALIDATED existantes réexaminées selon la règle#
La règle a été appliquée aux lignes existantes comme aux promotions futures.
- Lignes P1 nommées par l'étude de validation 0,30, chacune étayée : bilan de liaison unidirectionnel (le tableau de contrôle de conception X-band Galileo du JPL Pub 82-76, reconstitué à partir de ses lignes de détail à 4.6e-3 dB de perte en espace libre) ; formes fermées en bande limitée pour tout signal de télémétrie (90,3 pour cent de la puissance du lobe principal et la gigue cohérente early-late publiée) ; Doppler maximal d'un satellite de navigation en orbite terrestre basse (les chiffres publiés de Xona Pulsar X1 et d'Iridium) ; Doppler maximal vu par un utilisateur statique depuis une orbite LEO ou MEO (tableau 1 de l'article Pulsar, 20 valeurs) ; Doppler qu'un récepteur au sol doit gérer depuis un satellite de navigation LEO (les mêmes chiffres publiés à partir d'une orbite effectivement parcourue). Chaque publication est indépendante de Kshana, imprime ses nombres, et le test énonce sa tolérance.
- Autres lignes reposant sur P1, trouvées lors du réexamen, chacune étayée : compromis de conception du code de télémétrie (la corrélation croisée de Gold publiée à −23,9 dB) ; temps-coordonnée lunaire (Ashby et Patla 2024, dont le contrôle croisé de la vitesse de la Lune par rapport à DE440 est un contrôle Library) ; densités spectrales de puissance de signaux en bande L en forme fermée (valeurs Q de Kaplan et Hegarty) ; retard ionosphérique au premier ordre par bande (le rapport de retard de groupe de l'IS-GPS-200) ; pondérations de l'erreur de distance du signal dans l'espace en moyenne globale (le tableau de Montenbruck, Steigenberger et Hauschild 2018).
- Lignes P2 nommées par l'étude, chacune étayée : information de Fisher et observabilité de Cramér–Rao (numpy
eigh/inv) ; identifiabilité du datum lunaire ; jauge couplée du référentiel et de l'échelle de temps lunaires ; chaîne autonome d'observabilité de défaut en réseau libre (SVD numpy/SciPy, décomposition en valeurs singulières). Chacune recalcule une grandeur d'algèbre linéaire définie de façon unique sur des entrées validées, par un algorithme différent du solveur propre de Jacobi de Kshana. - Autres lignes reposant sur P2, trouvées lors du réexamen, chacune étayée : dérivation de priorité MCDA (analyse de décision multicritère) (le vecteur propre AHP, processus de hiérarchie analytique, par SciPy/LAPACK ; la table d'indice aléatoire qu'elle reproduit aussi est une transcription et n'est pas comptée) ; variance de dérive en holdover d'horloge (
expmde SciPy sur la matrice augmentée de Van Loan) ; réalisation du référentiel lunaire (une résolution d'Umeyama par SVD numpy) ; formation de faisceau CRPA (antenne à diagramme de réception contrôlé) (résolution complexe LAPACK) ; noyau de niveau de protection ARAIM lunaire (l'inverse LU de RTKLIB avec les quantiles de SciPy) ; cohérence référentiel/dynamique lunaire entre fournisseurs (un ajustement par moindres carrés SVD numpy de trois éphémérides publiées). - Signalées lors du premier passage, rétablies sur une base solide à la ronde 2 de l'exécution 0,30. Trois lignes avaient été signalées comme non étayées par la règle écrite. Chacune repose désormais sur une comparaison préenregistrée avant la récupération de son jeu de test ; aucune ligne n'est donc signalée ; un test unitaire placé à côté de
validated_oracle_basis()fige la liste (désormais vide).- Intégrité (RAIM/ARAIM/SBAS). Les tests cités n'affirmaient auparavant que la vraisemblance sur la géométrie réelle de l'IGS (International GNSS Service). La ligne repose maintenant sur trois références indépendantes de type bibliothèque : la séparation des solutions à hypothèses multiples de l'ARAIM du Airborne Design Document v4.2 par rapport à Stanford MAAST pour ARAIM 2 (270 cas réels, pire écart de VPL 2.2e-3 m contre 0,05 m) ; la détection et l'exclusion RAIM par instantané par rapport à RTKLIB
raim_fde(2016 décisions identiques sur 2016) avec le niveau de protection de pente ; et les niveaux de protection SBAS DO-229E L1 par rapport à Stanford MAAST sur de vraies diffusions WAAS (2868 paires à 1.6e-5 m près). La ligne dit clairement que les fonctions à sigma uniformeraim::araim_raimetraim::araim_dual_raimne respectent pas l'ADD et que la comparaison SBAS L5 bifréquence est un constat. - Positions des planètes dans tout le système solaire à partir des éléments képlériens de Standish du JPL. Le seuil a posteriori de deux fois l'erreur nominale est remplacé par un seuil préenregistré : RMS au plus égal à la valeur du tableau 8.10.1 de l'Explanatory Supplement par planète et par composante, par rapport à JPL Horizons DE441, avec la scission de la Terre et la rotation ICRF couvertes.
- Temps de lumière entre corps du système solaire. Le solveur de temps de lumière est désormais comparé aux temps de lumière d'Horizons à 1e-6 s près sur les positions DE441, un seuil préenregistré qui n'hérite pas du seuil de position.
- Intégrité (RAIM/ARAIM/SBAS). Les tests cités n'affirmaient auparavant que la vraisemblance sur la géométrie réelle de l'IGS (International GNSS Service). La ligne repose maintenant sur trois références indépendantes de type bibliothèque : la séparation des solutions à hypothèses multiples de l'ARAIM du Airborne Design Document v4.2 par rapport à Stanford MAAST pour ARAIM 2 (270 cas réels, pire écart de VPL 2.2e-3 m contre 0,05 m) ; la détection et l'exclusion RAIM par instantané par rapport à RTKLIB
- Lignes MODELLED que les deux politiques rendent promouvables (seulement par l'exécution 0,30 ligne par ligne, jamais par ce texte) : sous P1, la borne de géolocalisation d'émetteur TDOA/FDOA (différence de temps et de fréquence d'arrivée), le couplage entre taux d'horloge relativiste et référentiel, les gabarits de synchronisation de l'UIT-T (Secteur de la normalisation des télécommunications) (seulement pour les valeurs de gabarit que les Recommandations impriment sous forme de nombres ; les points de rupture transcrits contrôlés par rapport à eux-mêmes ne comptent pas) et la borne de positionnement 5G par réseau non terrestre (seulement si une valeur détaillée publiée est trouvée) ; sous P2, la cécité d'intégrité en mode commun, le niveau de protection temporel scalaire MHSS (séparation des solutions à hypothèses multiples) et le blanchiment GLS (moindres carrés généralisés). Les deux lignes de benchmark d'intégrité temporelle (le classifieur du diagramme d'intégrité de Stanford et le calculateur de couverture d'intégrité) relèvent d'une classification à base de règles, et non de l'algèbre linéaire ; P2 ne les atteint donc pas ; elles ont besoin d'un outil indépendant, et le seul trouvé (gLAB) porte une licence non commerciale.
- Cohérence avec des refus antérieurs. Le contrôle de Vallado de la ligne de fenêtre de lancement serait maintenant admissible sous P1 si son test calcule l'exemple détaillé imprimé ; le plan 0,30 la promeut plutôt par Orekit. Le tableau de croisement du temps lunaire par classe d'horloge reste MODELLED : le tableau qu'il reproduit provient de l'article propre à ce projet, qui n'est pas indépendant.
| Terme de bruit | État | Preuves |
|---|---|---|
| Parité des estimateurs d'Allan (ADEV/MDEV/TDEV/OHDEV (ADEV : écart-type d'Allan ; MDEV : écart-type d'Allan modifié ; OHDEV : écart-type d'Hadamard avec recouvrement)) | validated |
Deux contrôles à partir de sources primaires par rapport à NIST (National Institute of Standards and Technology) SP (Special Publication) 1065 (Riley, Handbook of Frequency Stability Analysis, 2008), tous deux à une tolérance relative de 1e-4. (1) tests/allan_reference.rs : les estimateurs ADEV avec recouvrement, ADEV modifié, écart de temps et Hadamard avec recouvrement reproduisent les écarts-types du jeu de données canonique à 10 points NBS14 (SP 1065 Tableau 29/30, p. 107) pour tau = 1, 2 — l'accord est en réalité d'environ 1e-6 (p. ex. ADEV avec recouvrement (OADEV) à τ = 2 : 85,952868 contre 85,95287). (2) tests/allan_nist_sp1065_1000point.rs : les quatre mêmes estimateurs reproduisent le jeu de données à 1000 points de la SP 1065 §12,4 (Tableau 31, p. 108) pour des facteurs de moyennage 1 / 10 / 100, le jeu de données étant régénéré dans le code à partir du LCG de la SP 1065 (éq. 73) — hermétique, sans fichier de test. Les mêmes données et les nombres du tableau 31 sont la cible de non-régression dans aewallin/allantools (tests/nbs14), reproduits ici sans code tiers. Cela fixe les mathématiques de l'estimateur par rapport à la référence, distinctement des lignes d'étalonnage du bruit ci-dessous. |
| Parité des estimateurs d'Allan sur du matériel réel mesuré | validated |
tests/cs5071a_reference.rs : les estimateurs d'Allan avec recouvrement et d'Hadamard avec recouvrement reproduisent les écarts-types de référence de Stable32 pour un véritable étalon primaire au césium 5071A mesuré par rapport à un maser à hydrogène (556 990 échantillons de phase à τ₀ = 1 s ; 1 PPS (impulsion par seconde) vers un compteur 53230A, févr. 2014 ; collectés par A. Wallin, distribués avec allantools). Contrôlé sur toute l'échelle décadique de τ (16 facteurs de moyennage, τ = 1 s … 4×10⁴ s) : facteurs bien échantillonnés avec un seuil relatif de 1e-3 (l'accord observé est en réalité ≤ 3e-5, p. ex. OADEV(1 s) 3.317111e-10 contre Stable32 3.3171e-10), facteurs épars à long τ tenus de tomber dans la bande de confiance à 1‑σ imprimée par Stable32. Cela complète la parité synthétique NBS14 ci-dessus par un contrôle sur horloge mesurée. Le fichier de phase brut est une donnée tierce sans licence de redistribution ; il est donc ignoré par git ; scripts/fetch_cs5071a.sh le reproduit et le test imprime un avis d'omission (la CI (intégration continue) reste au vert) lorsqu'il est absent. Seuls les nombres de référence publics de Stable32 sont versés (tests/fixtures/cs5071a/) ; aucun code tiers n'est utilisé. |
| Parité des estimateurs d'Allan sur le PHASE.DAT canonique de Stable32 | validated |
tests/phasedat_reference.rs : les estimateurs d'Allan avec recouvrement, d'Allan modifié et d'écart de temps reproduisent les écarts-types de référence de Stable32 pour PHASE.DAT — la série de 1001 points distribuée avec Stable32 que des outils indépendants (p. ex. allantools) utilisent comme cible de non-régression standard — sur toute l'échelle des facteurs de moyennage (139 facteurs) avec un seuil relatif de 1e-3 (observé ≤ 5e-5). Une seconde série de référence réelle et indépendante, en plus du contrôle sur césium mesuré ci-dessus. PHASE.DAT est livré avec l'outil commercial Stable32 ; la série brute est donc ignorée par git ; scripts/fetch_phasedat.sh la reproduit et le test est omis au vert (la CI reste au vert) lorsqu'elle est absente. Seuls les nombres de référence publics de Stable32 sont versés (tests/fixtures/phasedat/) ; aucun code tiers n'est utilisé. |
| Stabilité d'horloge optique sur une courbe réelle mesurée | validated |
tests/optical_clock_adev_reference.rs : l'inversion des paramètres de bruit d'horloge (quantum_trade::qparams_from_adev_curve) reproduit le σ_y(τ) publié de l'horloge optique à réseau ⁸⁸Sr de Norcia et al., Science 366 : 93 (2019) (Zenodo 10.5281/zenodo.3382347, CC-BY-4.0 (Creative Commons Attribution 4,0), courbe incluse dans tests/fixtures/optical_clock_adev/) : le coefficient de bruit blanc de fréquence retrouvé √q_wf ≈ 4.33e-16 correspond à la stabilité à court terme de ≈4.7e-16/√τ de l'article (~10 % RMS (valeur efficace) sur la courbe) et l'ajustement détecte un plancher mesuré non nul (q_rw > 0). Cela fixe l'inversion de l'ADEV mesuré vers les paramètres de bruit par rapport à une horloge optique réelle ; le bénéfice de holdover jusqu'au seuil qui en découle reste MODELLED. |
| ROC (caractéristique de fonctionnement du récepteur) AUC (aire sous la courbe) de détection d'anomalies sur de la télémétrie réelle OPS-SAT de l'ESA (Agence spatiale européenne) | validated (reproduit les étiquettes) |
tests/opssat_ad_reference.rs : sur le jeu de données OPSSAT-AD (Ruszczak et al. 2025, Zenodo 10.5281/zenodo.12588359, CC BY 4,0) — de véritables segments de télémétrie de service d'OPS-SAT avec des étiquettes d'anomalie de vérité terrain — l'AUC ROC de Mann–Whitney de Kshana (impairment_eval::auc) reproduit roc_auc_score de scikit-learn à < 1e-9 sur la partition de test réservée (529 segments, 113 anomalies), pour deux scores déterministes : un détecteur transparent à une seule caractéristique (nombre de pics du segment, AUC ≈ 0,851) et un score de Mahalanobis diagonal à 8 caractéristiques ajusté sur les segments d'entraînement normaux (AUC ≈ 0,556) ; eval_stats::bootstrap_auc_ci encadre l'estimation ponctuelle avec une borne inférieure qui dépasse le hasard. Cela valide le calcul de l'AUC sur des données réelles de l'ESA et la séparation étiquetée d'un détecteur transparent — cela ne reproduit pas la meilleure métrique publiée de l'article OPSSAT-AD (un FCNN supervisé (réseau de neurones entièrement connecté), F1 ≈ 0,95), qui requiert leur modèle entraîné. Données CC-BY incluses (tests/fixtures/opssat/, hermétique) ; la référence indépendante est régénérée par generate_opssat_oracle.py. |
| Synthèse de fonctionnelles du champ de gravité (carte de navigation assistée par la gravité / sans GNSS (GNSS : système mondial de navigation par satellite)) | validated |
tests/icgem_gravity_reference.rs : le noyau de fonctionnelles de gravité en harmoniques sphériques (gravity_sh::gravity_magnitude / gravity_disturbance_mgal) — le « lecteur de carte » auquel un navigateur assisté par la gravité se compare — est validé par rapport à la norme de gravité normale GRS80 (Geodetic Reference System 1980) (Moritz 1980, adoptée par l'AIG (Association internationale de géodésie)). Construire le champ normal GRS80 à partir de ses harmoniques zonales paires publiées J₂…J₈ et synthétiser la gravité (gravitation + force centrifuge) sur l'ellipsoïde reproduit la gravité normale en forme fermée de Somigliana, ainsi que les valeurs équatoriale et polaire publiées γ_e = 9,7803267715 / γ_p = 9,8321863685 m/s², à 3.5e-12 en valeur relative sur toutes les latitudes (seuil 1e-9). Le même noyau charge le véritable modèle terrestre ICGEM (International Centre for Global Earth Models) EGM2008 (Earth Gravitational Model 2008), modèle phare, (domaine public de la NGA (National Geospatial-Intelligence Agency) via l'ICGEM ; le lecteur from_gfc est aussi exercé sur le champ lunaire GRAIL (Gravity Recovery and Interior Laboratory) dans tests/agency_lro.rs) et produit une carte de perturbation de gravité physiquement bornée (RMS ≈ 26 mGal, max ≈ 89 mGal à d/o 70). Valide la justesse du code de synthèse ; la précision de position de la navigation assistée par la gravité reste MODELLED (aucune trajectoire publique de gravimètre embarqué sur une plateforme avec vérité terrain). |
| ddl équivalents (edf) spécifiques au type de bruit (intervalles de confiance) | validated |
src/allan.rs : la bande de confiance χ² de chaque point d'ADEV avec recouvrement utilise les degrés de liberté effectifs spécifiques au type de bruit (formes fermées du tableau 5 de NIST SP 1065 pour la modulation de phase blanche et de scintillement, la modulation de fréquence blanche et de scintillement et la modulation de fréquence de marche aléatoire (WPM/FPM/WFM/FFM/RWFM) — l'ensemble simple de Stable32), le type de loi de puissance de l'enregistrement étant identifié à partir de la pente log-log de son MDEV. Trois contrôles indépendants : (a) les cinq formules reproduisent des valeurs évaluées à la main à N=64,m=4 à 1e-12 ; (b) un ensemble Monte-Carlo de FM blanche (FM : modulation de fréquence) (4 000 enregistrements) mesure le ddl effectif réel du chi carré de l'estimateur = 2·moyenne²/Var(σ²) et correspond à la formule à 20 % près (et bat nettement le décompte prudent sans recouvrement) ; (c) tests/allan_nist_sp1065_1000point.rs reproduit le ddl imprimé du tableau 32 de la SP 1065 (p. 109) = 146,177 pour le jeu de données à 1000 points à m=10 (FM blanche) à 5e-3 près, et les bornes de confiance à 95 % du tableau (8.223942e-2 / 1.035201e-1) à <0,2 % près (le petit résidu est l'approximation de Wilson-Hilferty du χ² par rapport au χ² exact de NIST). La courbe d'ADEV exportée porte le type de bruit identifié, le ddl effectif et la bande à 95 % pour chaque τ. |
| FM blanche (court terme) | validated |
tests/calibration.rs : l'ADEV avec recouvrement simulé reproduit sigma_y(1 s) publié — typiquement à quelques pour cent près, seuil appliqué de 20 % (CSAC et objectif du réseau optique) — et la courbe de FM blanche sigma_y(tau)=sigma_y(1s)/sqrt(tau) pour tau = 1, 10, 100 s dans un seuil de 25 % (correspond à la fiche technique CSAC (horloge atomique à l'échelle d'une puce) 3e-10 / 1e-10 / 3e-11). |
| FM de marche aléatoire (long terme) | validated |
tests/calibration.rs : l'ADEV simulé correspond à sigma_y^2(tau)=q_rw*tau/3 (Riley NIST SP 1065) à ~20 % près (moyenné sur les graines). |
| Vieillissement / dérive linéaire | modeled + corrigé |
Déterministe ; l'estimateur de holdover supprime le décalage et le vieillissement par un prédicteur quadratique, de sorte que le résidu est la limite stochastique. Testé dans src/estimator.rs / src/models.rs. |
| Estimateur de Kalman + borne d'intégrité | validated |
src/kalman.rs : un filtre à deux états (phase, fréquence) dont le bruit de processus exact de van Loan correspond au modèle de vérité ; la marche libre reproduit la variance analytique de holdover q_wf*T + q_rw*T^3/3 à 1e-9. La mise à jour de covariance est sous forme stabilisée de Joseph P⁺ = (I−KH)P(I−KH)ᵀ + KRKᵀ, qui reste semi-définie positive (vérifiée par Cholesky) sur 500 pas de prédiction/mise à jour avec un rapport extrême R=1e-26 / Q≈1e-30, et concorde avec la forme naïve à 1e-9 là où celle-ci est bien conditionnée. La couche d'exécution rapporte l'intégrité comme la fraction des échantillons de l'interruption situés à l'intérieur de la borne de protection à 3 sigma (src/run.rs). |
| Auto-cohérence du filtre (NIS (innovation normalisée au carré) / NEES (erreur d'estimation normalisée au carré)) | validated (modèle) |
src/filter_health.rs : une évaluation de cohérence par Monte-Carlo (Bar-Shalom §5,4). Le NIS → 1 et le NEES → 2 regroupés du filtre adapté tombent à l'intérieur de leurs bandes χ² à 95 % (la bande du NIS utilise le décompte regroupé d'innovations blanches ; la bande du NEES utilise le décompte d'exécutions indépendantes, car les erreurs d'estimation sont corrélées dans le temps). Un test de balayage de désaccord Q/R vérifie que le moniteur rapporte consistent=true seulement au réglage unitaire et consistent=false pour des déréglages ×0.1/×0.5/×2/×10, le NIS variant en ≈1/q_factor comme le prévoit la dérivation. Exposé sous filter_health dans le JSON (JavaScript Object Notation) du résultat d'horloge et dans une carte du playground. Les bandes χ² utilisent le quantile de Wilson–Hilferty (detection::chi2_inv_cdf, contrôlé par table). |
| Modèle de transfert de temps bidirectionnel | validated (modèle) |
src/timetransfer.rs : le retard réciproque de mode commun s'annule exactement dans l'estimation (m_AB - m_BA)/2 (dérivé à la main, exact) et deux mesures unidirectionnelles se moyennent en 1/sqrt(2) (moyenné sur les graines) ; le retard différentiel non réciproque est un processus coloré de FM blanche + FM de marche aléatoire dont l'écart-type d'Allan suit sigma_y^2(tau) = q_rw*tau/3 (moyenné sur les graines, ~20 %, via le propre step() de la liaison). Les paramètres (sigma_j, q_rw par liaison) sont des valeurs représentatives de TWSTFT/optique (TWSTFT : transfert bidirectionnel de temps et de fréquence par satellite), non ajustées à un terminal précis. |
| Sécurité (score de détection de leurrage) | validated (modèle) |
src/security.rs : le plancher à 1 sigma du moniteur sqrt(r/m + q_wf*tau + q_rw*tau^3/3), le décalage minimal détectable à k sigma qui en résulte et le score [0,1] sont dérivés à la main et testés unitairement. Le modèle (détection assistée par l'horloge de type innovation / RAIM (RAIM : surveillance autonome de l'intégrité par le récepteur)) est solide ; les paramètres (fenêtre de surveillance tau, multiplicateur de détection k, bruit de mesure r) sont représentatifs, non ajustés à un récepteur précis. |
| Détection d'attaque par leurrage | validated (modèle) |
src/spoof.rs : un leurrage temporel progressif est signalé lorsque son décalage dépasse la borne de détection de l'horloge ; l'instant de détection correspond à start + bound/rate dérivé à la main à un pas de grille près, et une horloge dont la borne dépasse la spécification laisse le leurrage atteindre le seuil sans être détecté. Même réserve representative-parameters que pour le score de sécurité. |
| FM de scintillement (plancher) | modeled (désactivé par défaut) |
Synthétisé comme une somme de processus d'Ornstein-Uhlenbeck (OU) espacés logarithmiquement et calibrés sur un plancher d'ADEV plat configurable ; src/models.rs valide que le plancher est plat selon le temps de moyennage et se situe au niveau configuré (moyenné sur les graines). Activé par horloge via flicker_floor. Les scénarios de référence cités le laissent désactivé : le CSAC est dominé par la FM blanche sur toute la plage de sa fiche technique (1-1000 s) et le plancher systématique de l'horloge optique (~5e-17) est représenté par sa valeur d'exactitude. |
| Statistiques d'ensemble Monte Carlo | validated (agrégation) |
src/ensemble.rs : percentiles au rang le plus proche et moyenne sur runs réalisations reproductibles ; une exécution unique écrase la dispersion, la bande par pas de temps est ordonnée p05 <= p50 <= p95, et les réexécutions sont identiques au bit près. Il s'agit d'une agrégation statistique sur l'exécution unique déjà validée, et non d'un nouveau modèle physique. |
| Horloge | sigma_y(1 s) | Source |
|---|---|---|
| csac-sa45s (CSAC) | 3.0e-10 | Fiche technique Microchip SA65 / SA.45s |
| optical-sr-lattice (réseau Sr) | 1.0e-15 | horloge optique à réseau de strontium, objectif orienté spatial, arXiv:1503,08457 |
Statut : FM blanche et FM de marche aléatoire validées ; vieillissement modélisé et corrigé ; FM de scintillement modélisée et validée (désactivée par défaut dans les scénarios cités).
Maturité : les chiffres de l'horloge optique sont l'objectif orienté spatial sur du matériel au sol -- aucune horloge optique à strontium n'a volé. Les horloges Sr de laboratoire atteignent 4.8e-17 (Oelker et al. 2019, Nature Photonics). Les chiffres du CSAC proviennent d'un composant commercial déployé.
Relations : Riley, NIST SP 1065, éq. 67 -- FM blanche sigma_y^2(tau)=h0/(2 tau) ; FM de marche aléatoire sigma_y^2(tau)=(2 pi^2/3) h_-2 tau, soit de façon équivalente q_rw*tau/3 pour un processus de Wiener de fréquence de diffusion q_rw.
Paquet 2 — navigation à l'estime inertielle (centrale inertielle quantique)#
| Terme | État | Preuves |
|---|---|---|
| Biais constant/résiduel -> position | validated |
erreur de position = famille 0,5bT^2 (tutoriel Groves AESS (Aerospace and Electronic Systems Society)) ; test discret dérivé à la main dans src/inertial/mod.rs. |
| Marche aléatoire de vitesse (accélération blanche) | validated |
src/inertial/mod.rs : l'écart-type (ET) de l'erreur de position simulée correspond à sigma_x(T)=sqrt(S_a*T^3/3) (Groves éq. 54) à ~12 % observé (moyenné sur les graines ; seuil appliqué de 20 %). |
| Physique de l'accéléromètre à interféromètre à atomes froids (CAI) (à partir des premiers principes) | validated (modèle) |
src/inertial/quantum_imu.rs : un interféromètre de Mach-Zehnder à atomes froids à trois impulsions. Vérifié à la main par rapport à la géométrie des manuels — Rb-87 k_eff = 4pi/lambda ~ 1.611e7 rad/m ; Phi = k_eff*a*T^2 ~ 1.580e4 rad à 1 g, T = 10 ms ; bruit de projection sigma_Phi = 1/(C*sqrt(N)) = 2e-3 rad à C = 0.5, N = 1e6 ; sigma_a ~ 1.24e-6 m/s^2 par tir ; les lois d'échelle 1/T^2 et 1/sqrt(N) ; décroissance exponentielle du contraste. q_va() dérive la DSP (densité spectrale de puissance) d'accélération blanche que consomme le AccelModel classique. Portée honnête : seulement le plancher de bruit de projection quantique (~0,09 ug/sqrtHz ici) — très inférieur aux dispositifs réels limités par les vibrations (1-50 ug/sqrtHz) ; le tenseur de vibration, les systématiques de Coriolis et de déplacement lumineux ne sont pas encore modélisés (voir QUANTUM.md). |
| Biais du gyroscope + marche aléatoire angulaire (ARW) -> inclinaison -> couplage de la gravité | modeled (désactivé par défaut) |
Un biais résiduel du gyroscope et l'ARW produisent une erreur d'attitude ; l'inclinaison couple la gravité (g*theta) à l'erreur horizontale de force spécifique. src/inertial/mod.rs valide exactement la croissance cubique de position due au biais pur et la croissance de l'attitude due à l'ARW comme un processus de Wiener (moyenné sur les graines). Activé par capteur via gyro_bias et q_arw ; désactivé dans les scénarios cités à accéléromètre seul. |
| Instabilité de biais (plancher de scintillement en 1/f) | modeled (désactivé par défaut) |
src/inertial/mod.rs : un processus de scintillement en 1/f (la même synthèse OU validée pour l'horloge) dont le plancher plat d'écart-type d'Allan se situe au coefficient d'instabilité de biais ; zéro est sans effet, un plancher non nul modifie la trajectoire, les deux sont reproductibles. Activé par capteur via bias_instability. |
| Marche aléatoire d'accélération (marche aléatoire de taux) | validated |
src/inertial/mod.rs : le biais est un processus de Wiener avec Var(bias_rw(T)) = q_aa*T, contrôlé en moyenne sur les graines à ~20 % près. Activé par capteur via q_aa. |
| Validation croisée NaveGo (coefficients de bruit de l'IMU (centrale inertielle)) | validated |
tests/navego_imu_crossval.rs : un contrôle croisé externe par rapport à NaveGo (R. Gonzalez, boîte à outils INS/GNSS open source (INS : système de navigation inertielle), github.com/rodralez/NaveGo). Reproduit l'aller-retour synthétique du navego_example_allan.m de NaveGo sur son profil de référence publié du Microstrain 3DM-GX3-35 : en pilotant notre estimateur d'ADEV avec recouvrement (validé par NBS14/Stable32) avec un bruit blanc de capteur aux niveaux à 1 σ de NaveGo, on retrouve les coefficients de marche aléatoire de vitesse et d'angle (VRW, ARW) (ADEV(1 s) = σ·√dt) à < 5% (réel ~0,4 %), la branche de bruit blanc étant à la pente −1/2. Confirme que notre chaîne d'Allan et les définitions VRW/ARW de NaveGo concordent. Le journal .mat STIM300 enregistré de 40 Mo n'est pas ingéré (conditionné par le format binaire). |
| Facteur d'échelle, termes d'axes croisés plus fins | not modeled dans ce paquet à 1 DDL (un degré de liberté) |
Le paquet hérité à axe unique n'a ni facteur d'échelle ni erreur de couplage croisé. La bibliothèque strapdown à trois axes et le paquet gnss-ins modélisent le facteur d'échelle, le désalignement, la sensibilité à g, la quantification et la rampe de vitesse (src/inertial/imu_errors.rs ; voir le tableau des affirmations ci-dessous). |
| Capteur | stabilité de biais | racine de DSP du bruit | Source |
|---|---|---|---|
| cold-atom-quat (quantique) | 5.88e-7 m/s^2 (60 ng, 24 h) | 22 ug/sqrtHz = 2.16e-4 (m/s^2)/sqrtHz | Templier et al. 2022, Science Advances (arXiv:2209,13209) |
| nav-grade-quartz (classique) | 1.57e-3 m/s^2 (~160 ug) | ~20 ug/sqrtHz = 1.96e-4 (m/s^2)/sqrtHz | Honeywell QA-2000 / tutoriel Groves AESS |
Mise en perspective honnête : l'avantage de l'atome froid est la stabilité de biais à long terme (~2600 fois plus faible), qui domine lors d'une longue interruption du GNSS via 0,5bT^2. Le bruit à court terme est comparable (quantique ~22 contre classique ~20 ug/sqrtHz) — le capteur quantique gagne le marathon, pas le sprint. Maturité : les accéléromètres à atomes froids en sont au stade du laboratoire/des débuts (JRC122785), le quartz de qualité navigation est déployé.
Paquet 3 — transfert de temps (optique contre radiofréquence (RF), liaison optique inter-satellites)#
| Terme | État | Preuves |
|---|---|---|
| Gigue de temps blanche -> précision de synchronisation | validated |
src/timetransfer.rs : la RMS de synchronisation simulée reproduit la gigue de liaison sigma_j ; la moyenne d'échantillon se moyenne en sigma/sqrt(N) à <20 % près (moyenné sur les graines). |
| Synchronisation temporelle -> télémétrie unidirectionnelle | validated |
distance = c * dt, c=299792458 m/s ; 1 ps = 0,299792458 mm (exact, test dérivé à la main). |
| Plancher de scintillement/TDEV, résidu de réciprocité bidirectionnelle | modelled |
src/twstft_budget.rs (type time-transfer-budget) : bruit de phase de scintillement (Kasdin–Walter, TDEV plat), non-réciprocité diurne et résidu de réciprocité constant sur la série bidirectionnelle ; le paquet timetransfer à gigue blanche est inchangé. |
| Liaison | gigue d'un échantillon | type | source |
|---|---|---|---|
| optical-isl | 1 ps (1e-12 s) | cible crédible en orbite | liaison optique inter-satellites, cible de synchronisation à la picoseconde ; O-TWTFT de laboratoire (TWTFT : transfert bidirectionnel de temps et de fréquence) ~1 fs (Giorgetta 2013 / Deschenes 2016) |
| twstft-rf | 0,5 ns (5e-10 s) | mesuré, session unique | TWSTFT BIPM/PTB/NIST (BIPM : Bureau international des poids et mesures ; PTB : Physikalisch-Technische Bundesanstalt, l'institut national allemand de métrologie) |
Mise en perspective honnête : le chiffre optique est une cible de synchronisation en orbite au niveau de la picoseconde (non volée). Le plancher des laboratoires optiques terrestres est d'environ 1 fs (bien meilleur) ; une liaison micro-onde bien conçue (la liaison micro-onde (MWL) d'ACES (Atomic Clock Ensemble in Space), ~0,3 ps) peut rivaliser avec l'optique, de sorte que la référence de base « RF = 0,5 ns » désigne précisément un TWSTFT ordinaire. La conversion en distance est unidirectionnelle (distance = cdt) ; le bidirectionnel/aller-retour la divise par deux (distance = cdt/2).
Paquet 4 — fusion hybride (synthèse)#
Compose le paquet 1 (horloge), le paquet 2 (inertiel) et le paquet 3 (transfert de temps) en une seule suite PNT (positionnement, navigation et synchronisation temporelle). La suite doit maintenir À LA FOIS la synchronisation temporelle (< spécification de temps) et la position (< spécification de position) dans les limites ; pnt_holdover_s est la durée jusqu'à ce que l'une des deux soit dépassée. Un transfert de temps optique inter-satellites (ISL) facultatif resynchronise l'horloge pendant l'interruption (aide au temps seulement — la position n'est pas resynchronisée, puisque le transfert de temps donne le temps, pas la position).
| Aspect | État | Preuves |
|---|---|---|
| Notation PNT combinée (temps ET position) | validated |
src/hybrid.rs test score_hybrid dérivé à la main (pnt_holdover = premier dépassement entre temps et position). |
| Intégrité + sécurité pour le paquet hybride | validated |
src/hybrid.rs : un estimateur de temps de Kalman asservi à la vérité (nominal) et réancré à chaque resynchronisation optique ; l'intégrité est le confinement par la borne de protection (la borne inclut le plancher de gigue de la liaison), la sécurité est le score de détection de leurrage. Testé pour les deux suites, y compris le cas assisté par la liaison. |
| Estimateur de fusion conjoint | validated (modèle) |
src/fusion/mod.rs : un unique filtre de Kalman conjoint ([phase, fréq] ⊕ [pos, vit]) est le navigateur, asservi par le GNSS (apprenant les décalages à partir d'une covariance initiale non nulle) et assisté par le transfert de temps ; la covariance conjointe donne une intégrité conjointe testée fiable (≥0,9) pour les deux suites avec des capteurs cohérents en bruit. Le paquet observe la position et le temps séparément, pour quoi le filtre optimal est bloc-diagonal ; l'estimation de biais constant à état augmenté et l'aide croisée dynamique relèvent de travaux futurs. |
| Filtre couplé horloge+position (covariance inter-blocs) | validated (modèle) |
src/fusion/coupled.rs CoupledPntFilter : un unique filtre de Kalman [pos, vel, phase, freq] empilé (mises à jour sous forme de Joseph) dont la mesure de pseudodistance ρ = g·pos + c·phase + noise couple les blocs de position et d'horloge. Tests : une pseudodistance partagée rend P[pos,phase] non nul (des filtres découplés le maintiennent exactement à 0) ; deux géométries distinctes résolvent conjointement des décalages injectés de position et d'horloge qu'une seule distance ne peut séparer ; un correctif d'horloge seule affine la position grâce à la covariance croisée (le gain que procure le couplage et que ne procurent pas les filtres découplés) ; et un NEES Monte-Carlo est cohérent avec χ²(4) (Bar-Shalom §5,4, bande fondée sur les exécutions). 1 DDL (la dimensionnalité du paquet) ; pas encore raccordé au paquet exécutable, et l'extension 3D à 8 états relève de travaux futurs. |
| Composition de sous-modèles validés | hérite | les termes d'horloge/inertiel/transfert de temps sont validés dans leurs propres paquets. |
GNSS/INS à couplage lâche (paquet gnss-ins) |
validated (modèle) |
src/fusion/{gnss_ins_ekf,closed_loop,pack}.rs : un EKF à état d'erreur à 15 états (δp, δv, ψ, biais d'accéléromètre/gyroscope ; Groves §14) pilote le navigateur strapdown à trois axes avec rétroaction. Tests : une erreur de position injectée s'annule sous une aide à vérité parfaite ; la solution aidée reste bornée au mètre alors qu'un INS en marche libre diverge au-delà de 100 m ; et la RMS de position fusionnée sur une interruption de 60 s bat la navigation à l'estime sans aide selon la borne du test d'ensemble (~4× lorsque mesuré avant 0.27.3 ; la marge est plus grande après la correction ci-dessous). Le couplage du biais de gyroscope est contrôlé par rapport au strapdown lui-même : un biais résiduel connu du gyroscope doit produire l'erreur d'attitude que prédit le filtre (closed_loop::tests::gyro_bias_coupling_predicts_the_strapdown_attitude_error), et un a priori large doit apprendre un biais de gyroscope de classe contrôleur de vol tout en restant borné ; les deux échouent avec le signe d'avant la version 0.27.3. Révisé dans 0.27.3 : ce couplage avait le mauvais signe, de sorte que les estimations du biais de gyroscope allaient dans le mauvais sens et que seul un a priori serré maintenait le paquet stable ; les chiffres d'interruption publiés ont changé (CHANGELOG, Fixed). Limite honnête : le biais d'accéléromètre et l'inclinaison à couplage lâche sont faiblement séparables ; un étalonnage par biais n'est donc pas revendiqué. |
| GNSS/INS à couplage serré (pseudodistance) | validated (modèle) |
src/fusion/gnss_ins_ekf.rs update_tightly_coupled + closed_loop.rs fuse_tightly_coupled : l'innovation est formée dans le domaine des distances (jacobienne de la ligne de visée sur δp). Tests : quatre satellites annulent une erreur horizontale injectée de 8 m/−5 m à < 0,1 m ; deux satellites (aucun point position, vitesse et temps (PVT) possible) réduisent encore l'erreur horizontale de > 5× ; un seul satellite au zénith n'observe que la composante le long de la ligne de visée (verticale) et laisse l'horizontale intacte ; les entrées malformées sont rejetées. Pseudodistance seule — la phase de la porteuse et un état explicite d'horloge du récepteur figurent dans la feuille de route. |
| Fidélité de l'aide croisée entre capteurs (fusion complète par Kalman/graphe de facteurs) | not modeled dans le paquet hybrid |
Le paquet hybride est une composition au niveau du système + une aide au temps, et non un estimateur optimal. Des filtres existent ailleurs : l'EKF (filtre de Kalman étendu) à couplage lâche et serré du paquet gnss-ins (lignes ci-dessus) et l'UKF (filtre de Kalman sans parfum) à 17 états du type hybrid-ukf. Aucun lisseur à graphe de facteurs n'est modélisé. |
Résultat : la suite tout-quantique tient un PNT complet pendant une interruption de 1,8 h ; la suite tout-classique est limitée par la position (l'IMU de qualité navigation dépasse sa limite en premier). Le transfert de temps optique ISL maintient verrouillée même l'HORLOGE classique, ce qui isole le capteur inertiel comme maillon faible de la suite classique — l'argument central en faveur de l'inertiel quantique et de la synchronisation optique ensemble.
Géométrie — disponibilité du GNSS à partir des orbites#
| Aspect | État | Preuves |
|---|---|---|
| Propagation circulaire à deux corps | validated |
src/orbit.rs : période T=2 pi sqrt(r^3/mu) (mu = 3.986004418e14), la position revient après une période, planéité équatoriale/polaire — tests dérivés à la main. |
| Propagation excentrique (képlérienne) | validated |
src/orbit.rs : l'équation de Kepler M = E - e sin E résolue par Newton (résidu < 1e-12) ; rayons au périgée/apogée a(1∓e) ; le cas circulaire concorde avec le chemin en forme fermée à 1e-9. |
| Dérive séculaire nodale/apsidale due à J2 | validated |
src/orbit.rs : Omega_dot = -1.5 n J2 (Re/p)^2 cos i, argp_dot = 0.75 n J2 (Re/p)^2 (5cos^2 i - 1) (Vallado) ; le nœud régresse (prograde) / avance (rétrograde) / est stationnaire (polaire), et les apsides se figent à l'inclinaison critique 63,4 deg — tests de signe/de zéro dérivés à la main. Deux corps + séculaire seulement, non osculateur. |
| Visibilité en ligne de visée (occultation terrestre + masque d'élévation) | validated |
Satellite antipodal occulté, satellite radialement vers l'extérieur à 90 deg d'élévation, satellite tangentiel à l'horizon — tests exacts dérivés à la main. |
| Visibilité -> état du GNSS -> ligne de temps | validated |
>=4 visibles = nominal, 1-3 dégradé, 0 refusé ; générateur Walker-delta ; un test d'intégration pilote une exécution de holdover d'horloge à partir de la ligne de temps dérivée. |
| Optimiseur de conception de constellation + géométrie en rues de couverture | validated (modèle) |
src/walker.rs : optimize_walker_design parcourt la grille {planes × sats × inclination} et renvoie la cellule qui satisfait le mieux un DesignObjective (nombre minimal de satellites pour une cible de couverture / couverture maximale / PDOP (dilution de précision de position) du pire cas minimal) — un test affirme que le choix est égal à un balayage exhaustif indépendant du même balayage, et un exemple détaillé confirme qu'une conception Walker 24/6/1 du GPS (Global Positioning System) couvre au moins aussi bien qu'une version clairsemée à 18 satellites. Les formes fermées analytiques des rues de couverture (coverage_half_angle_rad λ = arccos(Re/r·cos ε) − ε ; street_half_width_rad cos c = cos λ / cos(π/s), Rider/Beste) sont vérifiées à la main par rapport à la géométrie des manuels (GPS avec un masque de 5° : λ ≈ 71,16°, demi-largeur de rue à 4 satellites ≈ 62,83°) et détectent l'écart de sous-peuplement (λ < π/s ⇒ None). Le solveur complet de Rider du nombre minimal de satellites pour une couverture globale (le nombre de plans sensible aux jointures) n'est pas encore implémenté. |
| Dilution de précision (GDOP/PDOP/HDOP/VDOP/TDOP (GDOP : dilution de précision géométrique ; HDOP : dilution de précision horizontale ; VDOP : dilution de précision verticale ; TDOP : dilution de précision temporelle)) -> précision de position | validated |
src/orbit.rs : Q=(HᵀH)⁻¹ à partir de la matrice de conception des lignes de visée. Référence indépendante externe (tests/dop_reference.rs) : les cinq facteurs DOP reproduisent ceux calculés par gnss_lib_py 1.0.4 (Stanford NAV Lab — une bibliothèque GNSS indépendante et évaluée par des pairs, utilisée ici comme ERFA (Essential Routines for Fundamental Astronomy) l'est pour les référentiels) sur 8 géométries allant de bien conditionnées à quasi singulières (DOP de l'ordre de plusieurs centaines), à 1e-6 en valeur relative ; provenance + régénération dans tests/fixtures/dop/. Comme contrôle supplémentaire en forme fermée, une géométrie en tétraèdre régulier reproduit les DOP analytiques (PDOP 1,5, TDOP 0,5, GDOP √2,5, HDOP √1,5, VDOP √0,75) à 1e-9. Sigma de position = PDOP × erreur de distance équivalente utilisateur. |
| Erreur de position = σ_UERE × DOP pour le point par moindres carrés propre au moteur | modelled |
src/dop_error_mc.rs, tests/uere_dop_monte_carlo.rs : un Monte Carlo à graine fixe (N = 20 000 époques par géométrie, σ = 1,5 m, graine ChaCha8 36 + i) de pvt::solve_spp avec des poids unitaires, résolu à partir de la position vraie, sur les 8 géométries de tests/fixtures/dop/dop_reference.csv (celles dont le DOP concorde avec gnss_lib_py), par rapport à σ²·Q où Q est le facteur de covariance du noyau orbit::dop lui-même (orbit::dop_cofactor, la même arithmétique). Tolérances préenregistrées (commit e50c88d2, avant la première exécution, selon la note de conception de géométrie 0,36, section 5,2), chacune exprimée en nombre d'erreurs standard : variances est, nord, haut et horloge à 5 % près ; RMS H/V/P à 2,5 % près ; corrélation est-nord à 0,035 près ; moyennes à 5 erreurs standard près ; fraction de l'ellipse horizontale à 95 % dans 0,95 ± 0,0077. Première exécution : les 104 contrôles passent tous (pire variance 3,2 %, RMS 1,6 %, corrélation 0,012, moyenne 2,2 erreurs standard, ellipse 0,0039). Les contrôles négatifs échouent comme requis : un PDOP doublé échoue sur chaque géométrie ; des erreurs croissant en 1/sin(élévation) face au Q non pondéré échouent à un contrôle de variance sur chaque géométrie dont le satellite le plus bas est sous 20°. Comment cela se compose avec la ligne ci-dessus : cette ligne valide le DOP de ces géométries par rapport à gnss_lib_py ; celle-ci ajoute le passage de ces facteurs aux mètres par le solveur du moteur. Un premier contrôle distinct est conservé à côté (src/dop_error_ci.rs, tests/position_error_dop_ci.rs, exécuté avant le préenregistrement et rapporté comme tel) : quatre ciels choisis à la main (dégagé, groupé, canyon, demi-ciel ; σ 1 m) avec des intervalles de confiance du chi carré à 1e-6 au total sur 20 contrôles ; rapports de 0,987 à 1,009, et ses propres contrôles négatifs (une erreur de DOP de 10 %, des erreurs en 1/sin(élévation)) échouent comme requis. Pourquoi MODELLED : aucun jeu de données externe ; cela ne montre pas que l'erreur d'un récepteur réel suit le modèle, et σ_UERE est une entrée. |
| Disponibilité multi-constellation | validated |
src/orbit.rs : des [[constellations]] supplémentaires sont fusionnées en un seul ensemble de satellites pour la visibilité/DOP ; un test de décompte combiné confirme l'union. |
| Ionosphère diffusée (Klobuchar, IS-GPS-200 (IS : Interface Specification)) → retard oblique L1 | validated |
src/gnss_sim.rs : klobuchar_delay_m, le modèle monofréquence diffusé à huit coefficients. Référence indépendante externe (tests/klobuchar_reference.rs) : le retard oblique L1 reproduit le ionmodel de RTKLIB (une bibliothèque libre de positionnement cinématique en temps réel) (tomojitakasu/RTKLIB, src/rtkcmn.c — la référence GNSS de fait, ouverte, compilée à partir des sources et exécutée indépendamment) sur 10 cas couvrant élévation, azimut, heure locale et deux jeux de coefficients (celui par défaut de kshana + celui de RTKLIB), à < 1e-4 m. Le lecteur de cartes TEC (TEC : contenu électronique total) IONEX (format d'échange de cartes de l'IONosphère) pour les fichiers GIM (carte ionosphérique globale) existe maintenant (src/ionex.rs, parse_ionex avec interpolation spatiale et temporelle bilinéaire et une projection oblique, testé unitairement dans le crate) ; un contrôle croisé de cette interpolation par rapport à un véritable produit GIM du CODE (Center for Orbit Determination in Europe) reste à faire. Le modèle diffusé lui-même est validé en externe. |
| Noyau de détection RAIM/ARAIM (ARAIM : surveillance autonome avancée de l'intégrité par le récepteur) (χ² / χ² non central / normale) → seuils et multiplicateurs | validated |
src/raim.rs : le seuil de détection instantané / séparation des solutions / ARAIM (chi2_quantile), la non-centralité de non-détection pbias=√λ (noncentral_chi2_cdf) et les multiplicateurs K_fa/K_md/K_V (normal_quantile) sont tous évalués à partir d'une fonction gamma incomplète régularisée sans dépendance. Référence indépendante externe (tests/raim_reference.rs) : 171 cas reproduisent SciPy 1.17.0 (scipy.stats.chi2/.ncx2/.norm + optimize.brentq — une implémentation Cephes/Boost indépendante, un algorithme différent) sur les plages de fonctionnement P_fa / P_md / redondance, à ≤ 1e-6 en valeur relative. La géométrie qui enveloppe le noyau (la pente/covariance issue de (GᵀG)⁻¹) est le noyau DOP validé par gnss_lib_py. Portée : cette ligne fixe le noyau statistique. La valeur du niveau de protection de l'allocation MHSS (séparation des solutions à hypothèses multiples) d'ARAIM est fixée séparément par rapport à l'exemple détaillé publié du sous-groupe technique ARAIM du WG-C (Working Group C) (tests/araim_reference_vectors.rs, VPL (niveau de protection vertical) 18,2926 m contre 18,3 m, HPL (niveau de protection horizontal) 13,4063 m contre 13,45 m, dans la propre tolérance de 0,05 m de la référence ; voir la note sur les normes ci-dessous et ARAIM_REFERENCE.md). |
| Niveau de protection SBAS (système d'augmentation par satellite) (DO-229E Annexe J) → niveau de protection horizontal / vertical (HPL / VPL) | validated |
src/sbas.rs : sbas_protection_level, le D=(GᵀWG)⁻¹ des moindres carrés (LS) pondérés → grand axe de l'ellipse d'erreur horizontale + σ vertical, mis à l'échelle par les facteurs K de DO-229E. Référence indépendante externe (tests/sbas_reference.rs) : le HPL de kshana reproduit la variante RTKLIB SBAS-PL (zsiki/rtklib_ws waasprotlevels(), l'implémentation « DO-229D Appendix J » de Siki & Takács 2017), exécutée par rnx2rtkp -ws sur de vraies données EGNOS (European Geostationary Navigation Overlay Service) (messages diffusés par le GEO (orbite géostationnaire) PRN120 + vrai RINEX (Receiver Independent Exchange Format) BUTE/Budapest, 2017-02-19), sur 6 époques à < 2e-3 m. Le σ par satellite est le propre budget SBAS complet de la référence indépendante (UDRE (erreur différentielle de distance utilisateur) + GIVE (erreur verticale ionosphérique de grille) iono + tropo + aéroporté). ESA gLAB v6.0.0 (core/filter.c) a été compilé et confirmé comme utilisant la même convention. Note sur K_V : les deux références indépendantes arrondissent le K_V de la MOPS (normes minimales de performance opérationnelle) à 5,33 ; kshana utilise la valeur exacte Φ⁻¹(1−5e-8)=5.3267 (VPL ~0,06 % plus petit), de sorte que la verticale est validée sous la forme d_U sans facteur K (= VPL de la référence indépendante / 5,33). Le HPL est mis en correspondance directement (K_H = 6,0 des deux côtés). |
| Géométrie réelle de constellation à partir de TLE (ligne 2 / képlérien) | validated (analyse syntaxique) |
src/tle.rs : analyse les éléments képlériens moyens de la ligne 2 (demi-grand axe à partir du mouvement moyen) ; un jeu d'éléments connu de l'ISS (Station spatiale internationale) fait l'aller-retour vers les bons éléments et la bonne période. Pour un bloc à ligne 2 seule, la propagation est celle à deux corps du moteur (+ J2 facultatif) des éléments moyens — correcte pour un instantané à une époque commune, dérivant par rapport à SGP4 (Simplified General Perturbations 4) avec le temps. |
| Propagation SGP4 / SDP4 (Simplified Deep-space Perturbations 4) (TLE complets) | validated |
src/sgp4.rs : SGP4 complet pour l'orbite proche de la Terre + SDP4 pour l'espace lointain (séculaire/périodique luni-solaire + résonance géopotentielle de 12 h / 24 h). Validé dans tests/sgp4_verification.rs par rapport aux vecteurs officiels AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 (« Revisiting Spacetrack Report #3 ») — les 666 états de référence (orbite proche de la Terre, espace lointain, résonants, cas de code d'erreur) concordent avec une erreur de position au pire cas d'environ 4,1 mm. Un jeu complet à deux lignes (ligne 1 + ligne 2) est propagé avec SGP4 ; la ligne 2 seule reste képlérienne ; les deux peuvent être mélangés. Le référentiel est TEME (true equator, mean equinox), utilisé de façon cohérente pour l'utilisateur et les satellites (aucune réduction TEME→ECEF (ECEF : géocentrique, lié à la Terre) — suffisant pour la géométrie de disponibilité/DOP). |
| Nutation IAU (Union astronomique internationale) 2000A / 2000B + réduction TEME→GCRS (GCRS : Geocentric Celestial Reference System) | validated |
src/nutation.rs : la série IAU 2000A complète (678 termes luni-solaires + 687 termes planétaires, nutation_iau2000a) et la troncature à 77 termes 2000B (nutation_iau2000b) sont chacune validées au bit près par rapport aux vecteurs de référence publiés SOFA/ERFA (SOFA : Standards of Fundamental Astronomy) à JD_TT 2453736,5 — eraNut00a donne Δψ = −0.9630909107115518e-5, Δε = 0.4063239174001679e-4 ; eraNut00b donne Δψ = −0.9632552291148363e-5, Δε = 0.4063197106621160e-4 — tous deux à 1e-13 rad. La table 2000A est générée par machine à partir de la source ERFA nut00a par tools/gen_nut00a.py (reproduit nutation_iau2000a_data.rs validé au bit près). La matrice de nutation (iauNumat), l'équation des équinoxes et la chaîne complète TEME→TOD→MOD→GCRS (TOD : vrai de la date ; MOD : moyen de la date) (teme_to_gcrs, Vallado AIAA-2006-6980) sont testées pour les propriétés de rotation propre / d'aller-retour / de précession plus nutation, la matrice de nutation par rapport à ERFA numat élément par élément à 1e-14, et toute la chaîne TEME→GCRS par rapport à l'exemple publié TEME→GCRF de Vallado (AIAA 2006-6753, 2004-04-06) à 0,11 m (tests/frame_reference_vectors.rs) ; jusqu'à l'ajout de ce contrôle de bout en bout, la matrice de nutation portait Δψ avec le mauvais signe, une rotation de 2·Δψ (environ 25″) que les tests de propriétés ne pouvaient pas voir (voir CHANGELOG, Unreleased, Fixed) ; 2000A et 2000B concordent à < 1 mas comme requis. La chaîne est fondée sur l'équinoxe/GMST (GMST : temps sidéral moyen de Greenwich) ; la réduction CIO (X,Y,s) sans équinoxe et son contrôle croisé numérique indépendant ANISE/SPICE (ANISE : Attitude, Navigation, Instrument, Spacecraft, Ephemeris — une boîte à outils de géométrie planétaire en Rust pur ; SPICE : Spacecraft, Planet, Instrument, C-matrix, Events) (≤ 3,6 m en orbite GNSS, bien à l'intérieur de la cible < 10 m) figurent dans la ligne CIO ci-dessous. |
| Modèle du champ principal géomagnétique IGRF-14 (IGRF : International Geomagnetic Reference Field) | validated |
src/igrf.rs : le champ en harmoniques sphériques normalisées de Schmidt de l'IAGA (Association internationale de géomagnétisme et d'aéronomie) (degré/ordre 13, 2025,0 + variation séculaire ; coefficients générés par machine à partir du fichier officiel igrf14coeffs.txt par tools/gen_igrf.py, reproduisant igrf_data.rs au bit près). Validé sur cinq fronts indépendants : (1) contrôles ponctuels exacts des coefficients par rapport au fichier de l'IAGA (g₁⁰=−29350,0, g₁¹=−1410,3, h₁¹=4545,5 nT) ; (2) la synthèse de degré 1 reproduit le champ exact du dipôle incliné en forme fermée (B_r,B_θ,B_φ) à 1e-6 ; (3) le champ analytique complet de degré 13 est égal à −∇V du potentiel scalaire (différences finies, à 1e-4) — exerçant de bout en bout les dérivées de Legendre et le terme en 1/sinθ ; (4) l'axe du dipôle reproduit le pôle nord géomagnétique connu (~80,7°N, −72,7°E) et l'intensité du dipôle (~29,7 µT), et le champ global se situe dans la bande physique de 22–67 µT avec le bon signe d'inclinaison par hémisphère ; et (5) référence indépendante externe — la synthèse complète reproduit les valeurs du service web IGRF-14 du British Geological Survey à 2025,0 (altitude géodésique, WGS-84 (WGS : World Geodetic System)) à < 2 nT sur X/Y/Z/F et < 0.02° sur D/I en quatre points dont une altitude de 400 km (synthesis_matches_the_official_bgs_igrf14_values_at_2025). |
| Réduction GCRS↔ITRS (ITRS : International Terrestrial Reference System) IAU 2006/2000A fondée sur le CIO | validated |
src/cio.rs : la chaîne céleste-terrestre sans équinoxe. Les coordonnées (X, Y) du CIP (Celestial Intermediate Pole) et la série à 66 termes du localisateur CIO s sont validées au bit près par rapport au vecteur publié SOFA/ERFA eraXys06a à JD_TT 2453736,5 — X=0.5791308482835292617e-3 (1e-14), Y=0.4020580099454020310e-4 (1e-15), s=-0.1220032294164579896e-7 (1e-18) ; la matrice GCRS→CIRS (CIRS : Celestial Intermediate Reference System) par rapport à eraC2ixys (les neuf éléments à 1e-12) ; l'angle de rotation de la Terre (ERA) par rapport à eraEra00(2400000.5, 54388.0) = 0,4022837240028158102 (1e-12). La table s est générée par machine à partir de la référence ERFA s06.c par tools/gen_s06.py (reproduit cio_s06_data.rs au bit près). La gcrs_to_itrs_matrix complète (CIO eraC2tcio = mouvement du pôle · ERA · GCRS→CIRS) est testée pour la rotation propre + l'aller-retour, et se révèle cohérente avec l'ancienne réduction TEME équinoxe/GMST-1982 à 1 m près à un rayon de 7 000 km (les conventions diffèrent d'environ 5 cm à cet endroit). Contrôle croisé tiers indépendant (xval/anise-frames/) : la même gcrs_to_itrs_matrix est comparée à ANISE (la réimplémentation en Rust pur de NAIF/SPICE (NAIF : Navigation and Ancillary Information Facility)) effectuant la rotation GCRF→ITRF93 (GCRF : Geocentric Celestial Reference Frame ; ITRF93 : International Terrestrial Reference Frame 1993) à partir du earth_latest_high_prec.bpc du JPL (Jet Propulsion Laboratory), avec des paramètres d'orientation de la Terre finals2000A de l'IERS (International Earth Rotation and Reference Systems Service) identiques fournis aux deux côtés, sur huit époques trimestrielles 2020–2023. Les deux réalisations indépendantes du référentiel concordent à une rotation relative maximale de 0,028″ — ≤ 0,86 m au sol, ≤ 0,93 m en LEO (orbite terrestre basse), ≤ 3,6 m en orbite GNSS (angle moyen 0,023″). C'est le contrôle croisé de référentiel « < 10 m » de la feuille de route, réalisé ; le résidu est la différence attendue de modèle/datum entre ITRF93 et CIO IERS-2010, et non un défaut (l'ancrage au bit près reste les vecteurs SOFA/ERFA ci-dessus). ANISE est un crate sous MPL-2.0 (MPL : Mozilla Public License) / édition 2024 ; le contrôle réside donc dans un sous-crate autonome exclu de l'espace de travail, qui ne touche jamais le graphe de dépendances publié de kshana ni aucune barrière de CI par défaut. |
| Aller-retour d'export SP3 (Standard Product 3, le format d'orbite précise) (constellation → SP3-c → ré-analyse) | validated |
tests/sp3_export_roundtrip.rs : l'instantané réel gps-ops de Celestrak (30 satellites GPS) est propagé avec SGP4, exporté en SP3-c (Sp3File::from_propagators → to_sp3_string), ré-analysé (parse_sp3), et les positions ECEF récupérées sont comparées à la vérité SGP4 à chaque époque sur 24 h — pire résidu < 0,5 m (la sérialisation millimétrique de l'écrivain ; la tolérance de 10 m de niveau TLE (TLE : jeu d'éléments à deux lignes) du jalon est respectée avec une grande marge). Le chemin --export-sp3 de la CLI (interface en ligne de commande) est aussi couvert : le scénario d'orbite fourni exporte un SP3 à 30 satellites ré-analysable, et un scénario sans orbite est rejeté. |
| Géométrie réelle de la constellation GPS à partir de TLE (SGP4 → ECEF) | validated |
tests/igs_real_data.rs : un véritable instantané gps-ops de Celestrak (2021-07-28, 30 satellites GPS opérationnels ; provenance dans tests/fixtures/celestrak/NOTICE) est analysé et chaque satellite est propagé par le noyau SGP4 validé jusqu'à un instant commun, puis pivoté de TEME vers ECEF. Affirme que toute la constellation se place sur la couche MEO (orbite terrestre moyenne) du GPS à 1 % près, et que depuis un site de latitude moyenne à ciel dégagé, la vue complète réelle (neuf satellites) donne un PDOP de 1,64 avec une dilution verticale supérieure à l'horizontale (comme il se doit pour un utilisateur au sol). Cela exerce SGP4 sur une constellation réelle, parallèlement aux chemins de données réelles SP3 (précis) et RINEX (diffusé). |
| Générateur Walker à éléments moyens SGP4 | validated |
src/walker.rs : un motif Walker-delta conçu est émis sous forme d'éléments moyens SGP4 (mouvement moyen de Kozai choisi pour que le demi-grand axe SGP4 tombe sur la couche cible) et propagé par le noyau validé. Tests : un Walker de 24 satellites de type GPS se place sur la couche MEO à 1 % près, les plans sont espacés exactement de 90° en RAAN (ascension droite du nœud ascendant) retrouvée à partir des normales d'orbite, et le mouvement moyen reproduit la période d'environ 718 min de la couche GPS. |
| Balayage de PDOP de constellation + FoM (figures de mérite) de couverture/revisite | validated (monotonie) |
src/walker.rs : pdop_sweep tabule la couverture et le PDOP médian/pire sur une grille {planes × sats × inclination} ; coverage_revisit rapporte la fraction de couverture et les écarts de revisite en un point du sol. Validé par les monotonies physiques qu'un compromis de conception doit respecter : ajouter des satellites n'abaisse jamais la couverture et abaisse strictement le PDOP médian (une conception complète de 24 satellites couvre en continu à un PDOP d'environ 1,7), et densifier une constellation clairsemée réduit strictement le pire écart de revisite. L'écart moyen de revisite ne dépasse jamais le maximum. Ce sont des tableaux de compromis géométriques, et non un bilan de liaison/couverture certifié. |
Mise en perspective honnête : il s'agit d'une couche géométrique déterministe (orbites circulaires, Terre sphérique de rayon moyen 6371 km, ligne de visée pure). Elle établit la disponibilité et la précision de position géométrique (dilution de précision × un budget représentatif d'erreur de distance) à partir de la géométrie réelle, et non une solution de navigation à éphémérides précises. La référence orbit-gnss-challenged.toml place un engin spatial à l'intérieur de la couche GNSS : il ne maintient un point que ~59 % de la journée, l'horloge quantique maintient une solution de synchronisation temporelle de 5 ns à travers chaque interruption (disponibilité 1,0) tandis que l'horloge à l'échelle d'une puce tient ~0,73.
Propagateur numérique (Cowell) et modèle de forces#
Le propagateur numérique (src/propagator.rs) intègre un modèle de forces hiérarchique (src/forces.rs) avec les intégrateurs adaptatifs (src/integrator.rs). Chaque terme ci-dessous est validé par rapport à une vérité analytique ou à une forme fermée dérivée à la main ; les perturbations sont désactivées par défaut, de sorte que les références figées publiées sont intactes. Le modèle composé est aussi contrôlé de façon croisée par rapport à un autre outil : tests/numerical_cowell_propagator_reference.rs exécute 11 cas LEO et GTO (orbite de transfert géostationnaire), 275 époques horaires, par rapport au propagateur DormandPrince853 d'Orekit 12,2, et les niveaux conservatifs (deux corps → J2–J6 → Soleil/Lune → PRS boulet de canon) concordent à un pire cas de 0,08 m sur 24 h (VALIDATED dans la matrice) ; le niveau de traînée est seulement caractérisé (333 m) et reste MODELLED.
| Terme | État | Preuves |
|---|---|---|
| Propagateur de Cowell par rapport à la vérité képlérienne analytique | validated |
src/propagator.rs : l'orbite non perturbée (deux corps) reproduit la solution képlérienne exacte à variables universelles au niveau sub-métrique sur une orbite LEO de 24 h (un seuil plus serré que « par rapport à une référence numérique < 10 m ») ; l'énergie spécifique et le moment cinétique se conservent à ~1e-9 en valeur relative ; la régression nodale due à J2 reproduit la forme fermée j2_secular_rates à la théorie du premier ordre (à 2 % près, le résidu en O(J2²)). solve_kepler_checked renvoie Err plutôt qu'une réponse silencieusement fausse lorsque Newton ne converge pas (près du périgée e = 0,999). Le solve_kepler_robust robuste (amorce de Markley 1995, src/kepler.rs) y converge et sur 0 ≤ e ≤ 0,999999, à 0,9 ε·|E| des racines mpmath à 50 chiffres (tests/kepler_mpmath_oracle.rs). |
| Intégrateurs adaptatifs (RK4 (Runge–Kutta d'ordre quatre) par doublement de pas + la paire imbriquée de Dormand–Prince RK5(4), DP5(4) ci-dessous) | validated |
src/integrator.rs : RK4 intègre y' = y → e à < 1e-9, montre la baisse d'erreur d'environ 16× par pas divisé par deux (convergence d'ordre 4), et conserve l'oscillateur harmonique sur une période. L'estimation d'erreur imbriquée de DP5(4) est en O(h⁵) (diviser le pas par deux la réduit d'environ 32×), intègre l'oscillateur sur 50 périodes en conservant l'énergie à < 1e-6, et atteint le même point final à la même tolérance avec moins d'évaluations de fonction que le doublement de pas ; propagate_dopri franchit le même seuil képlérien sub-métrique et concorde avec le chemin RK4 à < 1 m sur une orbite J2..J6. DOP853 (integrate_dop853) : la paire 8(5 3) de Hairer avec sortie dense reproduit le DOP853 de SciPy 1.18.1 pas à pas (un pas unique à 5.6e-15 près ; nombres de pas identiques sur les exécutions e = 0,7 et Arenstorf, une bascule d'acceptation/rejet sur 501 pas dans l'exécution LEO ; états finaux à 1.6e-12 près) et concorde avec la solution képlérienne exacte aussi bien que SciPy (tests/dop853_scipy_oracle.rs). |
| Champ d'harmoniques zonales J2–J6 | validated |
src/forces.rs : zonal_accel est contrôlé de trois façons — il se réduit à j2_accel, validé par 666 vecteurs, à la précision machine lorsqu'il est restreint à [J2] ; il concorde avec le gradient numérique de son propre potentiel zonal sur tout le champ J2..J6 (l'étalon-or des champs conservatifs) ; et les termes impairs J3 par rapport aux termes pairs J2/J4..J6 montrent la (anti)symétrie nord–sud caractéristique sous z → −z. Une orbite J2..J6 propagée conserve l'énergie totale à ~1e-8 sur une journée. |
| Gravité d'un troisième corps (Soleil et Lune) | validated |
src/forces.rs + src/ephem.rs : third_body_accel concorde avec le gradient exact de son potentiel perturbateur, s'annule au géocentre, et atteint les ordres de grandeur LEO des manuels (~5e-7 m/s² pour le Soleil, ~1.1e-6 m/s² pour la Lune). L'éphéméride solaire de Montenbruck–Gill à basse précision atteint des repères J2000 dérivés à la main (distance au périhélie ≈ 1.471e11 m, déclinaison au solstice ~−23°, mouvement de ~1°/jour) ; l'éphéméride lunaire reste à l'intérieur de son enveloppe périgée/apogée, retrouve la distance moyenne de ~384 400 km, ne dépasse jamais l'inclinaison de 5,3°, et revient à 1° près après un mois sidéral. Le câblage du second membre (RHS) piloté par l'époque est exact au bit près (le terme du RHS égale third_body_accel à la position échantillonnée à t = 0 et t = 1 jour), et un décalage d'époque d'un quart d'année produit une trajectoire différente. |
| Pression de radiation solaire (SRP) + ombre conique | validated |
src/forces.rs : srp_accel (boulet de canon ν·P☉·cᵣ·(A/m)·(AU/d)²·d̂) est identique au bit près à la forme fermée en plein soleil, fixe la pression de radiation à 1 UA (UA : unité astronomique) à ≈ 4.5398e-6 N/m², se situe dans la bande LEO de ~1.36e-7 m/s² en poussant à l'opposé du Soleil, est divisée par quatre lorsque la distance au Soleil double (carré inverse), et est exactement nulle au fond de l'ombre. conical_shadow donne ν = 1 en plein soleil et ν = 0 en ombre totale (exact), une pénombre monotone et lisse montant de 0 → 1 sur la bande [b−a, b+a] qui s'étend au-delà du cylindre d'ombre. |
| Traînée atmosphérique (premier terme dépendant de la vitesse) | validated |
src/forces.rs : atmospheric_density (exponentielle par morceaux du tableau 8-4 de Vallado) s'ancre à 1,225 kg/m³ au niveau de la mer, est plafonné sous la surface, décroît de façon monotone à travers le LEO, se situe dans la bande de ~1e-12 kg/m³ à 400 km avec une hauteur d'échelle physique retrouvée de ~58 km ; drag_accel s'oppose à la vitesse relative de co-rotation à l'ordre de grandeur LEO de ~2e-6 m/s². Le contrôle signature : une orbite de 300 km perd de l'énergie spécifique de façon monotone et son demi-grand axe décroît d'une quantité bornée de ~km/jour, alors que la référence de base dans le vide conserve l'énergie à < 1e-9. |
| Correction relativiste post-newtonienne (Schwarzschild) | validated |
src/forces.rs : relativistic_accel (forme β = γ = 1 de l'IERS a = (μ/c²r³)·{[4μ/r − v²]·r + 4(r·v)·v}) se réduit sur une orbite circulaire à la forme fermée 3μ²/(c²r³)·r̂ (composantes radiale, vers l'extérieur, hors axe exactement nulles), montre le rapport ≈1.9e-9 au deux-corps en LEO des manuels, concorde avec la forme simplifiée à la main en vitesse radiale μ(4μ + 3v²r)/(c²r³) à < 1e-12, et dans le propagateur perturbe l'orbite tout en maintenant le demi-grand axe à moins d'un mètre/jour — l'opposé conservatif de la décroissance par traînée. |
Portée honnête : les valeurs par défaut publiées de ForceModel intègrent le champ zonal. Le champ tesséral EGM2008 de haut degré (src/gravity_sh.rs, degré/ordre 70), les marées solides/océaniques/atmosphériques (src/tides.rs) et le terme d'entraînement des référentiels de Lense–Thirring sont maintenant implémentés et composés dans le modèle de forces d'ajustement d'éphéméride précis (src/precise_od.rs — voir ci-dessous). Le champ tesséral est aussi un terme facultatif du ForceModel de Cowell (propagator::Geopotential, désactivé par défaut), validé par rapport à HolmesFeatherstoneAttractionModel d'Orekit 12,2 jusqu'au degré/ordre 70 (6 cas sur 24 h, pire |Δr| 0,036 m ; tests/cowell_tesseral_orekit_oracle.rs). Deux évaluateurs de champ existent : l'historique acceleration (dérivées partielles sphériques ; valide jusqu'au degré ~180 loin des pôles ; sorties figées) et acceleration_hf (colonne directe modifiée de Holmes–Featherstone 2002, gradient sans 1/cos φ ; valide jusqu'au degré 2190 à toute latitude). EGM2008 jusqu'à 2190 se charge à l'exécution (from_gfc_file, scripts/fetch_egm2008.sh, non inclus). acceleration_hf concorde avec Orekit 12,2 à 7.3e-17 m/s² en huit points jusqu'au degré 2190 ; il reste MODELLED parce que pyshtools a manqué le seuil préenregistré près des pôles (un contrôle mpmath place l'erreur dans pyshtools ; xval/high-degree-gravity/). Une orbite de 200×200 sur 24 h concorde avec Orekit à 0,13 m, mais son contrôle de sensibilité préenregistré au degré 70 a échoué (0,73 m < 1 m), de sorte que les degrés 71–200 sont caractérisés, et non validés, en orbite (xval/cowell-tesseral-200-orekit/). La densité thermosphérique NRLMSISE-00 (NRLMSISE : Naval Research Laboratory Mass Spectrometer and Incoherent Scatter Radar Extended atmosphere model) est portée (src/nrlmsise00.rs : identique au bit près au portage C du domaine public sur 720 points, à 1.9e-6 en valeur relative de pymsis, les 17 cas de test publiés reproduits ; tests/nrlmsise00_reference.rs) et constitue un niveau facultatif de densité de traînée (forces::DensityModel, ForceModel::drag_density ; la valeur par défaut reste le modèle statique de Vallado). Cela valide le portage, et non la précision du modèle par rapport à la densité mesurée. Le Soleil et la Lune DE440 (DE : Development Ephemeris) forment un niveau d'éphéméride facultatif (ForceModel::with_ephemeris). L'ombre SRP d'une Terre aplatie WGS-84 est facultative (ForceModel::srp_shadow), et concorde avec le rapport d'éclairement d'Orekit 12,2 à 7.4e-9 près sur 2400 géométries (tests/srp_oblate_shadow_orekit_oracle.rs) ; sa variante à assombrissement centre-bord n'a pas de référence indépendante externe (MODELLED). Le niveau de traînée NRLMSISE-00 concorde avec la propre traînée NRLMSISE-00 d'Orekit 12,2 sur 24 h à 0,03 m près pour jusqu'à 142 km de déplacement dû à la traînée (tests/drag_tier_orekit_oracle.rs, VALIDATED sous les conventions partagées). Un contrôle croisé GMAT (General Mission Analysis Tool) reste à faire.
Marées sur le géopotentiel (src/tides.rs)#
Corrections variables dans le temps ΔC̄_nm, ΔS̄_nm aux coefficients de Stokes (IERS Conventions 2010, chapitre 6), validées par rapport aux propres nombres publiés des conventions — et non par rapport à un autre outil.
| Contribution | État | Preuves |
|---|---|---|
| Marée terrestre solide (IERS éq. 6,6 / 6.8b / 6,14) | validated |
tests/tides_iers.rs : la marée permanente (fréquence nulle) ΔC̄₂₀ tombe à 1 % de la valeur publiée par l'IERS de −4,1736×10⁻⁹ (nombres de Love anélastiques) ; l'exemple détaillé K1 de l'étape 2 est reproduit au bit près (amplitudes sin/cos 470,9 / −30,2 ×10⁻¹² à 0,1×10⁻¹² près) ; le chemin de Legendre normalisé est fixé par des valeurs à la main en forme fermée indépendantes de la récurrence. |
| Marée océanique (IERS éq. 6,15, FES2004 (Finite Element Solution 2004, atlas de marées), 8 constituants) | validated |
Le sous-ensemble FES2004 inclus (tools/gen_fes2004.py → src/fes2004_data.rs, analyse de Doodson→multiplicateur) reproduit exactement les coefficients M2 (2 2) de la source ; la phase de Doodson de K1 est égale à θ_g + π ; l'amplitude sectorielle de degré 2 est physique et d'un ordre inférieur à la marée solide. |
| Marée atmosphérique S2 (Ray 2001, NASA (National Aeronautics and Space Administration) GSFC (Goddard Space Flight Center)) | validated |
Les harmoniques de Ray incluses sont converties par la relation de charge de surface (éq. 6,21) en un pic ΔC̄₂₂ ≈ 4×10⁻¹¹ (~10 % du terme océanique M2). Réserve honnête : il n'existe aucune référence indépendante publiée de coefficients de géopotentiel pour la marée atmosphérique ; elle est donc validée par l'intégrité de la source + l'ordre de grandeur, un seuil plus faible que pour les marées solide/océanique. |
Manœuvres et conception de trajectoire (src/maneuver.rs)#
| Aspect | État | Preuves |
|---|---|---|
| ΔV impulsif + propagation de la covariance | validated |
Une discontinuité de vitesse avec une covariance 6×6 reportée (poussée déterministe ⇒ STM (matrice de transition d'état) identité ; la covariance de l'erreur d'exécution pivote depuis le repère de poussée — ECI (inertiel géocentrique) ou LVLH (verticale locale, horizontale locale) — vers le bloc de vitesse). |
| Intégration de poussée finie par rapport à Tsiolkovski | validated |
Intégration à poussée constante sur un arc de poussée (masse comme état) dont le ΔV obtenu concorde avec l'équation de fusée en forme fermée de Tsiolkovski à mieux que 0,01 %. |
| Aller-retour du solveur de Lambert (Izzo 2015) | validated |
La sortie de Lambert à révolution unique (r1, r2, temps de vol ⇒ v1, v2) est soumise à un aller-retour par le propagateur képlérien exact à variables universelles — elle doit retomber sur r2. |
| Balayage porkchop par rapport au plancher de Hohmann | validated |
Le minimum de la grille C3 de lancement × V∞ d'arrivée est comparé au plancher analytique de C3 du transfert de Hohmann pour deux orbites circulaires coplanaires. |
| Solveur de Lambert par rapport à une bibliothèque indépendante | validated |
tests/lambert_reference.rs : 13 transferts à révolution unique du LEO au GEO jusqu'à l'héliocentrique, prograde et rétrograde, par rapport à lamberthub 1.0.0 izzo2015 ; pire différence de vitesse aux bornes 7e-12 m/s. |
Portée honnête : pas d'optimiseur de trajectoire, pas de branches de Lambert à révolutions multiples, et un modèle héliocentrique synthétique circulaire coplanaire (pas d'éphéméride planétaire DE, de sorte qu'un contrôle croisé C3 Terre–Mars par GMAT n'a pas été exécuté).
Détermination d'orbite (OD) (src/orbit_determination.rs, src/batch_ls.rs)#
| Aspect | État | Preuves |
|---|---|---|
| Correcteur par lot de Gauss–Newton | validated |
Le solveur générique gauss_newton atteint la solution exacte des moindres carrés pondérés sur un ajustement linéaire, retrouve les vrais paramètres sur un ajustement non linéaire a·exp(b·t), et résout une multilatération de distances 3D à partir de distances sans bruit. |
| Détermination d'orbite par lot à partir de distances | validated |
determine_orbit_batch retrouve [r, v] à partir d'un suivi de distance par station au sol (propagé sur le modèle de forces à deux corps + J2) à sub-métrique / mm·s⁻¹ à partir de distances sans bruit, et à ~2 m avec un résidu après ajustement au plancher de bruit de 5 m — la signature d'un ajustement par moindres carrés cohérent. |
| OD séquentielle (filtre de Kalman sans parfum) | validated |
determine_orbit_sequential retrouve récursivement l'état à quelques dizaines de mètres près sur la même dynamique et le même modèle de distance. |
| OD par lot et séquentielle par rapport à un estimateur indépendant | validated |
tests/batch_sequential_orbit_determination_reference.rs : 8 scénarios (6 LEO/MEO/excentriques sans bruit avec 3–4 stations, 2 à σ = 5 m) par rapport aux estimateurs par moindres carrés par lot et de Kalman d'Orekit 12,2 sur un modèle de forces apparié ; pire cas par lot 1e-3 m / 1e-6 m/s, séquentiel 0,9 m. |
| OD par lot en vitesse de distance / azimut-élévation avec un masque d'élévation | modelled (comparaison externe, un seuil préenregistré manqué) | tests/od_tracking_measurements_reference.rs : 8 scénarios par rapport aux moindres carrés par lot d'Orekit 12,2 avec des mesures géométriques instantanées personnalisées ; ensembles visibles identiques, valeurs de mesure à 5.8e-8 m / 6.3e-10 m/s / 1.4e-13 rad près, matrice de transition d'état à 1.2e-14 près, états bruités à 1,74 cm près et RMS par type à 2.7e-4 près ; le seuil préenregistré d'état sans bruit ≤ 1 cm est manqué sur 2 scénarios sur 4 (1,46 et 1,74 cm ; l'estimation propre d'Orekit se situe aussi loin de sa vérité simulée, celle de kshana à 1e-8 m près). Voir xval/od-measurements-orekit/RESULTS.md. |
Portée honnête : l'OD pédagogique utilise des stations inertielles fixes, un repère topocentrique à Terre sphérique et des mesures géométriques instantanées (sans temps de lumière, aberration, réfraction ni rotation de la Terre) ; la matrice de transition d'état du chemin vitesse de distance/angles est variationnelle (intégrée par RK4 avec des dérivées partielles analytiques à deux corps + J2), et non en forme fermée ; il n'y a pas de filtre séquentiel pour la vitesse de distance ou les angles. Le chemin à distance seule conserve sa jacobienne par différences finies. (Le moteur d'ajustement d'éphéméride à forces complètes ci-dessous porte sa propre matrice de transition d'état variationnelle.)
Validation du modèle de forces par ajustement d'éphéméride (src/precise_od.rs)#
Un estimateur précis par moindres carrés par lot à observation de position et forces complètes : le géopotentiel tesséral EGM2008 (évalué dans le référentiel lié à la Terre par la réduction CIO) composé avec le troisième corps Soleil/Lune, la SRP, la traînée, la RG (relativité générale) de Schwarzschild/Lense–Thirring et les marées ci-dessus, ajusté à une piste de points de position inertiels avec une jacobienne par matrice de transition d'état variationnelle. Validé sur des données synthétiques, où la vérité est l'intégrateur propre de Kshana, de sorte que chaque résidu est celui de l'estimateur et non celui de la dynamique.
| Aspect | État | Preuves |
|---|---|---|
| Composition précise du modèle de forces | validated |
tests/precise_od_synth.rs : le champ de degré 0 est exactement la masse ponctuelle à chaque époque (le terme central est invariant par rotation) ; le degré 8 ajoute l'aplatissement de la bande J2 ; le troisième corps Soleil et le terme de marée se raccordent fidèlement au bit près ; une accélération empirique radiale constante est purement radiale en RTN (radial, transverse, normal). |
| Matrice de transition d'état variationnelle | validated |
Chaque colonne de Φ sur une demi-orbite LEO (géopotentiel de degré 8 + Soleil + Lune) concorde avec une re-propagation indépendante par différences finies (DF) centrales sur l'arc entier à < 1×10⁻⁶ en valeur relative dans la réponse en position comme en vitesse — le contrôle croisé STM↔DF documenté. Φ(0) = I ; les propagateurs augmenté et simple concordent au niveau sub-millimétrique. |
| Auto-récupération par moindres carrés par lot | validated |
Un arc Kshana d'1 heure (degré 6 + Soleil + Lune) observé sans bruit est récupéré à partir d'un décalage de 150 m / 0,1 m·s⁻¹ jusqu'à l'état d'époque à 1×10⁻² m près avec une RMS après ajustement proche de zéro ; avec un bruit blanc de 5 m, la RMS 3D après ajustement se stabilise au plancher de bruit ~σ, sans biais. Le C_R de la SRP est récupéré de 1,0 à 1 % près de la vérité de 1,4. |
| Édition des valeurs aberrantes et rapport RTN | validated |
Une erreur grossière de 500 m est rejetée par l'édition après ajustement à 5 σ (exactement une observation), laissant un ajustement propre au niveau du millimètre ; les résidus sont rapportés décomposés en radial/transverse/normal comme en 3D. |
| Niveau d'accélération empirique (RTN constant + 1-CPR (CPR : cycle par révolution)) | validated |
Les neuf paramètres empiriques contraints a priori restent sous 1×10⁻⁸ m·s⁻² sur une vérité sans terme empirique sans perturber l'ajustement ; une accélération transversale constante de 3×10⁻⁸ m·s⁻² injectée dans la vérité est récupérée à 20 % près. |
Portée honnête : l'onde synthétique utilise des paramètres d'orientation de la Terre nominaux (EOP : UT1 (Universal Time 1, temps de rotation de la Terre) ≈ TT (Terrestrial Time), sans mouvement du pôle) — exacts pour l'auto-récupération, puisque le même modèle génère et ajuste l'arc. Les validations par jeux de données d'agences superposent des EOP finals2000A réels et une vérité SP3/SPK (SPK : noyau d'éphéméride planétaire) à ce moteur par la chaîne de référentiel CIO (src/eop.rs, tests/agency_galileo.rs, tests/agency_swarm.rs, tests/agency_lro.rs).
Orbites précises réelles d'agences (tests/agency_galileo.rs, tests/agency_swarm.rs, tests/agency_lro.rs)#
| Jeu de données | État | Preuves |
|---|---|---|
| Galileo MEO — < 5 m GREEN | validated |
Le moteur à forces complètes de Kshana ajusté à une tranche verbatim de l'orbite finale propre de l'ESA/ESOC (ESOC : Centre européen d'opérations spatiales) (ESA0MGNFIN, ITRF (International Terrestrial Reference Frame)) pour Galileo E11 sur 8 h, chaque point ITRF pivoté en GCRS avec de vrais EOP finals2000A : RMS 3D après ajustement de 0,133 m en forces pures + C_R (RTN 0.105/0.067/0.047 m, C_R 1,174), 0,070 m avec le niveau empirique, à partir d'un recouvrement brut de 78,7 km. L'arc complet de 24 h donne 0,611 m. Tous très en deçà du seuil de 5 m. Champ de gravité convergé dès d/o-8 (identique à d/o 8/10/12) ; la tâche workflow_dispatch exécute le d/o-70 complet. Provenance + SHA-256 (SHA : Secure Hash Algorithm) dans tests/fixtures/agency/NOTICE.md ; enregistrement complet dans docs/AGENCY-ORBIT-VALIDATION.md. |
| Swarm-A LEO — < 5 m GREEN | validated |
Moteur à forces complètes (+ traînée atmosphérique) ajusté à une tranche verbatim de l'orbite précise à dynamique réduite propre de Swarm-A de l'ESA (SW_OPER_SP3ACOM_2_, L47, ITRF, ~430 km, ~2 cm) sur 3 h à d/o-70, vrais EOP finals2000A par la chaîne CIO : niveau dynamique (état seul, densité statique, C_R=1) RMS 3D après ajustement de 2,687 m (RTN 0.925/2.522/0.045 m — résidu ≈ traînée purement le long de la trace), niveau à dynamique réduite (+ accélérations empiriques CPR) 0,098 m (RTN 0.026/0.092/0.025 m) — ~10 cm contre l'orbite de ~2 cm de l'ESA. Provenance + SHA-256 dans tests/fixtures/agency/NOTICE.md ; enregistrement complet dans docs/AGENCY-ORBIT-VALIDATION.md. |
| LRO (Lunar Reconnaissance Orbiter) lunaire — validé, au-dessus de 5 m (en toute honnêteté) | validated |
Ajustement de modèle de forces centré sur la Lune (src/lunar_od.rs) : le champ de gravité GRAIL GRGM660PRIM (d/o 100) dans le référentiel lunaire lié au corps aux axes principaux (src/lunar_frame.rs, IAU 2015 Terre moyenne + le décalage fixe DE421 (Development Ephemeris 421) Terre moyenne → axes principaux (ME→PA), appliqué comme SPICE le définit depuis 0,36 : jusque-là il était appliqué dans le mauvais sens, avec un écart d'environ 208″) + troisième corps Terre/Soleil, ajusté par le même estimateur générique de Gauss–Newton que les jeux de données terrestres à l'orbite reconstruite réelle de JPL Horizons LRO (NAIF −85), 4 h / 241 époques, ~98 km. Résultat honnête après ajustement (0,36) : dynamique 12,05 m (RTN 2.91/10.11/5.88), à dynamique réduite 6,67 m (RTN 3.41/4.58/3.44, empirique 1+2 par révolution), à partir d'un recouvrement brut de 39,9 m (avant la correction ME→PA : 12,6 m, 6,65 m, 53,8 m) — au-dessus du seuil < 5 m, et non à cause de l'estimateur (identique à d/o 100/150 et atol 1e-6/1e-9). Une validation croisée de niveau DE (xval/anise-lunar-od : orientation PA lunaire DE440 (Development Ephemeris 440) + éphéméride DE440 via ANISE) a corrigé l'affirmation sur le facteur limitant — elle a donné 12,0 m en dynamique et 6,67 m à dynamique réduite, ce que la pile analytique corrigée égale désormais aux deux niveaux (l'écart dynamique antérieur, 12,6 → 12,0 m, était l'erreur de décalage ME→PA), de sorte que le plancher opérationnel n'est pas l'orientation/éphéméride analytique mais un résidu irréductible du niveau empirique (le plus cohérent avec une dynamique non gravitationnelle de LRO non modélisée sur l'arc court) ; la pile analytique légère égale déjà le niveau DE pour l'orbite à dynamique réduite. Provenance + SHA-256 dans tests/fixtures/agency/NOTICE.md ; enregistrement complet dans docs/AGENCY-ORBIT-VALIDATION.md. Validé par rapport à une vraie vérité d'agence : 3 sur 3 ; respectant < 5 m : 2 sur 3. |
Navigation par carte de gravité / PNT alternatif (src/gravimeter.rs, src/mapmatch.rs, src/particle_filter.rs, src/altpnt/terrain.rs)#
| Aspect | État | Preuves |
|---|---|---|
| Champ d'anomalie de gravité en harmoniques sphériques | validated |
src/gravimeter.rs : un champ de bas degré, entièrement normalisé, contrôlé par rapport aux fonctions de Legendre en forme fermée (P̄₁₁ = √3·cosφ, P̄₂₀ = (√5/2)(3sin²φ−1), P̄₂₂ = (√15/2)cos²φ) et à une anomalie à un seul terme dérivée à la main de 1,897 mGal. |
| Modèle de mesure du gravimètre à atomes froids | validated (modèle) |
Le plancher de bruit blanc est dérivé de l'ASD de l'accéléromètre CAI (σ = ASD/√τ), injecté comme une séquence déterministe à graine fixe (l'appariement ne reçoit jamais une vérité sans bruit, et pourtant l'exécution est reproductible au bit près). |
| Filtre à particules à ré-échantillonnage par importance séquentielle | validated |
src/particle_filter.rs : le noyau déterministe est fixé exactement — ESS (taille effective d'échantillon) couvrant 1…N, ré-échantillonnage systématique choisissant des indices proportionnellement au poids, combinaison convexe de la moyenne pondérée, une vraisemblance gaussienne ramenant l'estimation sur la mesure, et déterminisme de la prédiction à graine fixe. |
| Vraisemblance d'appariement de carte + récupération | validated |
src/mapmatch.rs : field_likelihood culmine (= 1) à un appariement parfait et tombe à e^(−½) à un sigma ; un filtre à particules sur une parcelle de terrain synthétique distinctive retrouve la vraie position à 0,1 près. |
| Benchmark de 60 minutes sans GPS | validated |
run_gps_denied_gravity_nav (scenarios/gps-denied-gravity-nav.toml) : une interruption de ~700 km / une heure où la solution inertielle dérive jusqu'à ≈ 70 km est récupérée à ≈ 145 m (< 500 m) par un appariement hiérarchique du grossier au fin — reproductible au bit près, stable sur les réalisations de bruit, et démontrablement limité par le raffinement (une seule grille grossière cale à ~2 km). |
Chargeur DEM (modèle numérique d'élévation) SRTM (Shuttle Radar Topography Mission) .hgt + échantillon bilinéaire (RÉFÉRENCE INDÉPENDANTE A) |
validated |
src/altpnt/terrain.rs / tests/terrain_nav_validation.rs : un tampon .hgt de 2×2 construit à la main avec les coins [100 200;300 400] s'interpole bilinéairement à exactement 250,0 au centre de la cellule (référence indépendante en forme fermée), l'aller-retour en 16 bits gros-boutiste est exact, et l'inversion des lignes place la ligne de fichier la plus au nord à la latitude stockée la plus haute — le tout par rapport à la spécification du pilote GDAL (Geospatial Data Abstraction Library) SRTMHGT (format de fichier d'altitude Shuttle Radar Topography Mission) (16 bits signés gros-boutiste, ligne par ligne, ligne nord d'abord, vide -32768, https://gdal.org/en/stable/drivers/raster/srtmhgt.html). Un jeu de test versé de 11×11 (tools/gen_terrain_fixture.py) exerce l'analyseur en CI ; et une vraie tuile SRTM v3 NASA/USGS (USGS : United States Geological Survey) du domaine public, versée (N36W117, Vallée de la Mort, décimée à 6 secondes d'arc, 722 Ko, tests/fixtures/terrain/N36W117_sub6.hgt) est lue en CI (non ignorée, real_srtm_committed_badwater_tile_reads_real_relief), plaçant Badwater Basin à ≈ −78 m dans la bande documentée [−95,−70] m (levé NGS/NOAA (NGS : National Geodetic Survey ; NOAA : National Oceanic and Atmospheric Administration) ≈ −86 m) avec le maximum de la tuile ≈ 2161 m — la source de vérité est le levé, le DEM est l'objet du test (non circulaire). Des cotes ponctuelles publiées plus grandes (Mount Whitney 4421 m) restent dans des tests de tuile complète conditionnés par #[ignore]. |
| Convergence de la navigation par référence au terrain (TERCOM/SITAN (TERCOM : appariement de contours de terrain ; SITAN : Sandia Inertial Terrain-Aided Navigation)) (RÉFÉRENCE INDÉPENDANTE B) | validated |
run_terrain_nav (scenarios/terrain-nav.toml) : une dérive INS injectée dérivée à la main (0,5°N, −0,4°E ≈ 70 km à ~12° de lat., calculée comme dérive° × M_par_deg × cos lat) est récupérée à < 500 m (dans le plancher de résolution de grille search_step/factor² ≈ 140 m), une réduction de > 100× par rapport à l'inertiel libre — contrôlée par rapport au nombre injecté, jamais au DEM (non circulaire), reproductible au bit près et stable sur les graines de bruit. |
| Gain de fusion combinée gravité + magnétisme + terrain (RÉFÉRENCE INDÉPENDANTE C) | validated |
run_combined_altpnt (scenarios/combined-altpnt.toml) : trois canaux scalaires (Δg · anomalie crustale de |B| · élévation) fusionnés comme une vraisemblance produit donnent un résidu borné à < 500 m sur l'interruption de 60 min qui, moyenné sur les graines, n'est pas pire que le meilleur canal unique (additivité de l'information / borne inférieure de Cramér–Rao (CRLB)). Se situe dans le régime « dizaines de mètres » publié du TERCOM / de la navigation par référence au terrain (TRN), en CEP (erreur circulaire probable) (https://en.wikipedia.org/wiki/TERCOM ; PeerJ 2024 ESKF-TERCOM (ESKF : filtre de Kalman à état d'erreur), https://peerj.com/articles/cs-3118/). |
Portée honnête : le champ de gravité est de bas degré + des mascons synthétiques, et non le jeu complet de coefficients EGM2008/EIGEN (EIGEN : European Improved Gravity model of the Earth by New techniques) ; le canal magnétique s'appuie sur le champ principal lisse de l'IGRF plus des mascons d'anomalie crustale synthétiques (une vraie carte crustale à haute fréquence reste à faire) ; le champ de terrain de CI pour les benchmarks de point de navigation est le DEM synthétique autonome, tandis que le lecteur .hgt lui-même est maintenant validé en CI par rapport à une vraie tuile SRTM v3 versée (ci-dessus) ; les vraies tuiles en pleine résolution restent conditionnées par #[ignore]. Un Monte-Carlo de l'erreur de représentation des cartes reste à faire. Les trois navigateurs sont maintenant câblés dans le moteur de scénarios par kind= (gravity-map, terrain-nav, combined-altpnt).
Modèle d'erreur INS / IMU — validation par rapport aux fiches techniques (src/inertial/)#
Le modèle d'erreur stochastique de l'IMU est validé par rapport à des spécifications publiées de fiches techniques / jeux de données de fabricants — jamais par rapport à une valeur produite par Kshana lui-même. Le passage d'une spécification en unités de terrain au modèle de bruit en SI (Système international d'unités) est l'identification standard par l'écart-type d'Allan (Riley, NIST SP 1065 §5 ; norme IEEE (Institute of Electrical and Electronics Engineers) 952) : le coefficient de marche aléatoire N est l'ADEV avec recouvrement lu à τ = 1 s sur la pente en τ⁻¹ᐟ², et le coefficient d'instabilité de biais est le plateau plat d'Allan (tests/imu_allan_spec.rs, hermétique — aucun téléchargement).
| Aspect | État | Preuve / référence indépendante |
|---|---|---|
| Couche de conversion d'unités (le risque de non-circularité n°1) | validated |
Vérifié à la main : 0,15 deg/√hr = 4.3633e-5 rad/√s ; 3,6 µg = 3.5304e-5 m/s² ; 2,0 deg/hr = 9.6963e-6 rad/s. |
| Marche aléatoire d'angle du gyroscope | validated |
L'ARW de l'ADIS16465 de 0,15 deg/√hr (fiche technique d'Analog Devices) est retrouvé à partir de l'ADEV(1 s) à < 5 %. |
| Marche aléatoire de vitesse de l'accéléromètre | validated |
Le VRW de l'ADIS16465 de 0,1 m/s/√hr est retrouvé à < 5 %. |
| Pente d'Allan du bruit blanc | validated |
Pente log-log de la branche blanche de l'ADIS16460 −0,5 ± 0,05. |
| Plateau d'instabilité de biais en fonctionnement | validated |
L'instabilité de biais (BI) du gyroscope de l'ADIS16465 de 2,0 deg/hr est retrouvée comme le minimum plat d'Allan à < 15 %. |
| Deuxième profil d'IMU | validated |
NaveGo ADIS16488 (ARW 0,3 deg/√hr, VRW 0,029 m/s/√hr) tous deux retrouvés à < 5 %. |
Portée honnête : ceci valide le modèle d'erreur stochastique par rapport aux coefficients d'Allan des fiches techniques. Le jeu de données de véhicule i2Nav-WHU (WHU : université de Wuhan) KF-GINS sert de vérification distincte, conditionnée par la disponibilité des données : l'EKF à boucle fermée sur l'état d'erreur, faiblement couplé, avec le modèle de bras de levier GNSS, est une ligne VALIDATED de la matrice de vérification (EKF GNSS/INS faiblement couplé avec bras de levier sur le jeu de données KF-GINS), comparée à la trajectoire de référence C++ de KF-GINS selon des seuils enregistrés avant l'exécution. Il ne s'exécute que lorsque le jeu de données est fourni (KSHANA_KFGINS_DIR) ; sans lui, ce sont le chargeur synthétique et les tests de bras de levier qui s'exécutent. Les variantes à couplage serré et à phase de la porteuse ne sont pas couvertes par cette ligne (la ligne GNSS/INS à couplage serré avec phase de la porteuse est MODELLED).
PNT pour l'espace lointain et Mars — fondation D0 (src/body.rs, src/mars_frame.rs, src/ephem_provider.rs, src/radiometric.rs, src/timescales.rs)#
Le premier jalon du moteur de navigation pour l'espace lointain : généraliser le noyau, codé en dur pour la Terre, à un corps central arbitraire, ajouter la dynamique martienne, une interface de fournisseur d'éphémérides, un temps de précision inférieure à la microseconde, et les primitives de temps de lumière et de retard relativiste. Chaque scénario terrestre existant est identique à l'octet près — les références d'or de reproductibilité multiplateforme (tests/cross_platform_golden.rs, tests/golden.rs) passent sans modification et sans régénération, ce qui est vérifié à chaque commit.
| Terme | État | Preuves |
|---|---|---|
| Abstraction du corps central (Terre identique à l'octet près) | validated |
src/body.rs : Body{mu,re,zonals,gravity,rotation,IAU-pole} avec earth()/mars()/moon()/sun(). tests/mars_dynamics.rs vérifie que two_body_accel_body(r,&Body::earth()) et zonal_accel_body sont égales aux fonctions terrestres historiques par égalité exacte au bit près (assert_eq!), et qu'un arc terrestre avec ForceModel par défaut est identique à l'octet près — les références d'or de reproductibilité sont inchangées (même SHA, sans régénération). |
| Gravité de Mars (GMM-3 (GMM : Goddard Mars Model) tesséral, lié au corps) | validated (modèle) |
Body::mars_gmm3(nmax) : zonaux C̄20/C̄30/C̄40 issus de J2/J3/J4 de MRO110 (solution de gravité de Mars Reconnaissance Orbiter) (C̄n0=−Jn/√(2n+1), J2 revient à 1.9604e-3 après aller-retour) + sectoriels/tesséraux C̄22/S̄22, C̄32/S̄32 de MRO110B2 (Konopliv et al. 2011 ; tabulés dans Liu, Baoyin & Ma 2012), évalués dans le référentiel IAU lié à Mars. tests/mars_dynamics.rs vérifie l'aller-retour, l'écart d'échelle J2 par rapport à la masse ponctuelle, et que le champ est réellement lié au corps (une réorientation d'un quart de jour martien modifie l'accélération inertielle). Un degré/ordre plus élevé se charge depuis un fichier .gfc intégré au dépôt via gravity_sh::from_gfc. |
| Référentiel lié à Mars (pôle IAU) | validated |
src/mars_frame.rs : la rotation IAU 3-1-3 R3(W)·R1(90°−δ0)·R3(90°+α0) (convention WGCCRE/NAIF (WGCCRE : Working Group on Cartographic Coordinates and Rotational Elements), identique à lunar_frame.rs). Tests : orthonormée à 1e-12 près avec det +1, identité après aller-retour, le méridien origine avance de prime_w_dot par jour. |
| Propagation centrée sur Mars / sur le Soleil | validated (autocohérence) |
tests/mars_propagation.rs : une orbite basse martienne revient à son point de départ après une période képlérienne (fermeture) ; l'énergie spécifique ε=v²/2−μ/r dérive de <1e-9 sur l'arc ; la régression séculaire du nœud due à J2 de Mars concorde avec le taux analytique de Vallado (calculé indépendamment ≈ −5,15 °/jour à 60° d'inclinaison) à 3 % près ; une orbite héliocentrique retrouve l'année martienne d'environ 687 jours (vis-viva + récupération indépendante de la période à partir de l'arc). Aucune donnée externe. |
| Validation croisée avec DE440 (Mars héliocentrique) | kernel-gated |
xval/anise-mars-od/ (EXCLU de l'espace de travail ; ANISE sous MPL-2.0 confiné à son propre Cargo.lock ; calqué sur xval/anise-lunar-od) : compare la propagation de Mars centrée sur le Soleil de Kshana à JPL DE440 (via ANISE), la vérité de Horizons étant citée mot pour mot (provenance + SHA-256). Résultat reproduit (date julienne (JD) initiale 2459580,5 TDB (temps dynamique barycentrique), de440s.bsp SHA-256 c1c7fee…b260a49f2) : résidu de position 137 m pour un arc de 1 jour (5,97×10⁻¹⁰ de la distance héliocentrique de 2,299×10¹¹ m), croissant jusqu'à 3,3 km à 5 j, 87,9 km à 30 j, 1,71 Mm à 90 j — le résidu croît avec la longueur de l'arc parce qu'un modèle à deux corps centré sur le Soleil omet délibérément les perturbations planétaires (celles de Jupiter surtout) et le mouvement interne du système martien que porte l'éphéméride du barycentre DE440 ; cette croissance est donc la signature honnête de la dynamique à n corps non modélisée, et non une erreur de l'intégrateur ; un arc court restant une infime fraction de la distance héliocentrique confirme que la mécanique centrée sur le Soleil est correcte. Ne s'exécute que lorsque le noyau DE440 est présent ($KSHANA_ANISE_DE440S, ou récupéré automatiquement, ~32 Mo) — une vérification manuelle / workflow_dispatch de niveau DE, et non une barrière CI par défaut, de sorte que le crate publié et toutes les barrières par défaut restent inchangés à l'octet près. |
| Temps de lumière + retard de Shapiro | validated |
src/radiometric.rs : la solution itérative du temps de lumière à l'époque retardée (converge à |Δτ|<1e-12 s, plafonnée) et le retard de Shapiro Δt=(2μ/c³)·ln[(r1+r2+r12)/(r1+r2−r12)]. Tests : Terre–Soleil ≈ 499 s et Terre–Lune ≈ 1,28 s via l'éphéméride intégrée ; un émetteur synthétique à vitesse constante retrouve la solution retardée analytique à <1e-9 s près (solveur démontré indépendant de toute éphéméride réelle) ; Shapiro concorde exactement avec une valeur calculée à la main et donne ~100–250 µs pour un rayon rasant de conjonction supérieure Terre–Mars. |
| Interface de fournisseur d'éphémérides | validated |
src/ephem_provider.rs : trait EphemerisProvider + BuiltinEphemeris sans noyau (Soleil/Lune de Montenbruck–Gill, géocentrique) ; renvoie None pour les corps pour lesquels il n'a pas de série (par exemple Mars), pour lesquels le fournisseur ANISE de niveau DE est la voie à suivre — la même séparation intégré/ANISE que LunarEnvironment/AniseLunarEnvironment. |
| Temps en deux parties + TT↔TDB | validated |
src/timescales.rs : un TwoPartJd{day,frac} avec accumulation à deux sommes de Knuth retrouve des intervalles inférieurs à la microseconde que le JD en f64 simple perd près de J2000 (meilleur de plus de 1000×, testé) ; tt_to_tdb/tdb_to_tt utilisent la série périodique dominante de Fairhead–Bretagnon (|TDB−TT|≲1,7 ms, vérifiée à la main à J2000). Additif — le chemin temporel existant en f64 simple est inchangé. |
Observables radiométriques de l'espace lointain et message de données de poursuite CCSDS — D1 (src/radiometric.rs, src/ccsds_tdm.rs)#
Le deuxième jalon du moteur de navigation pour l'espace lointain : le modèle d'observables qui transforme le noyau de temps de lumière et de retard relativiste de D0 en grandeurs effectives que rapporte une passe de poursuite du Deep Space Network (DSN) ou d'ESTRACK (European Space Tracking network) — distance, Doppler à un, deux ou trois trajets, transpondeur cohérent à rapport de transposition, mesure de distance régénérative/PN (PN : pseudo-bruit), Δ-DOR (DOR : differential one-way ranging), et milieux de propagation — ainsi que l'entrée/sortie du message de données de poursuite (TDM) CCSDS (Consultative Committee for Space Data Systems) 503.0-B, qui ingère et émet un fichier de poursuite d'agence standard. Portée honnête : il s'agit de modèles géométriques exacts suivant les conventions de Moyer / CCSDS ; le bruit de mesure est le sigma par observation fourni par l'appelant, et non intégré au modèle. Reproduire une passe de poursuite réelle donnée nécessite de vraies données TDM ainsi que le solveur de détermination d'orbite pour l'espace lointain — c'est D2, et non D1. Tout ce qui suit est additif (les références d'or de reproductibilité sont inchangées ; même SHA, sans régénération).
| Terme | État | Preuves |
|---|---|---|
| Distance et Doppler à 1/2/3 trajets (résolution à deux segments de Moyer) | validated (modèle) |
src/radiometric.rs : one_way_range/two_way_range composent les solutions de temps de lumière retardée (segment descendant) et avancée (segment montant) de D0 ; la convention complète de l'aller-retour est ρ₂ = c·(τ_up + τ_down) (m), documentée et cohérente. one_way_doppler/two_way_doppler/three_way_doppler forment le décalage de porteuse f_D = −(M·f_ul/c)·(ρ̇_up + ρ̇_down) (Hz) à partir de la vitesse de variation de la distance sur la ligne de visée, convention de signe : un engin spatial qui s'approche donne un décalage positif (vers le bleu). Tests : distance à deux trajets = somme des segments à <1 mm près (~2 UA d'aller-retour Terre–Soleil) ; distance à un trajet = c·τ exactement ; le Doppler à un trajet concorde avec l'expression analytique −(f/c)·ρ̇ pour un émetteur radial à vitesse constante, au ppt près ; à trois trajets avec des stations colocalisées, le résultat se réduit à l'identique, à l'octet près, à celui à deux trajets. |
| Transpondeur cohérent à rapport de transposition (rapports DSN exacts) | validated |
src/radiometric.rs turnaround_ratio : les nombres rationnels exacts de transposition DSN/CCSDS M = f_down/f_up (Moyer §13 ; DSN 810-005 module 201/214) — S/S 240/221, S/X 880/221, X/S 240/749, X/X 880/749, X/Ka 3344/749, Ka/Ka 3360/3599. Testés pour l'égalité exacte ; une paire de bandes non définie provoque un panic (échec bruyant, n'invente jamais de rapport). two_way_doppler_coherent applique la porteuse de bande et le rapport de bout en bout et égale le two_way_doppler explicite à la précision machine. |
| Mesure de distance régénérative / PN (CCSDS 414 ; ambiguïté) | validated |
src/radiometric.rs : regenerative_range_ambiguity = c/(2·chip_rate) (la distance non ambiguë à l'échelle de la résolution par élément de code) et pn_range_ambiguity = cette valeur × la longueur du code (la distance non ambiguë du code PN complet c·L/(2·f_chip)), selon CCSDS 414.1-B. Testé : une horloge de mesure de distance de 1 MHz donne ~149,9 m ; le code PN à vote pondéré CCSDS-414.1 (1 009 470 éléments) à 1 Mélément/s donne la distance non ambiguë nominale d'environ 151 000 km ; doubler le rythme des éléments divise par deux l'ambiguïté par élément. |
| Δ-DOR (CCSDS 506 plan du ciel) | validated (modèle) |
src/radiometric.rs delta_dor : le retard différentiel dans le plan du ciel Δτ = −B⃗·(ŝ_sc − ŝ_quasar)/c (s) pour une base d'interféromètre B⃗ (CCSDS 506.1-B). Testé : concorde avec la projection analytique exacte −B·sin(Δθ)/c pour un décalage connu aligné sur la base à 1e-15 s près, avec l'amplitude aux petits angles |Δτ| ≈ B·Δθ/c, et avec le cas nul (un engin spatial coaligné avec le quasar donne exactement un retard différentiel nul). |
| Étalonnage du plasma en 1/f² à deux fréquences | validated (modèle) |
src/radiometric.rs : solar_plasma_delay = K_PLASMA·TEC/(c·f²) (le retard de groupe dispersif des particules chargées en 1/f², K_PLASMA = 40.3 m·Hz²·TECU⁻¹) ; coronal_tec_from_sep la colonne de couronne de type Cassini en TEC ∝ 1/sin(SEP) (substitut analytique, et non une couronne étalonnée) ; dual_freq_plasma_calibration l'inversion de dispersion K_disp = (Δt_X−Δt_Ka)/(1/f_X²−1/f_Ka²) que le DSN utilise pour supprimer le plasma. Testé : la loi en 1/f² d_X/d_Ka = (f_Ka/f_X)² ; la couronne s'intensifie à l'approche de la conjonction ; et un TEC injecté est retrouvé à <1 % près (en fait ≪ 1e-9 sans bruit) — dual_frequency_recovers_injected_plasma. |
| Milieux tropo / iono (réutilisation des modèles GNSS) | validated (modèle) |
src/radiometric.rs tropo_delay/iono_delay : le segment de station sol de l'espace lointain traverse la même atmosphère terrestre que le paquet GNSS modélise déjà ; ces fonctions délèguent donc à gnss_sim::tropo_delay_m (zénith de Saastamoinen + fonction de projection de Niell, non dispersif) et à gnss_sim::klobuchar_delay_m (iono diffusée). Testé : câblage vérifié et signe physique correct : tropo positive et plus grande à basse élévation qu'au zénith ; iono, un retard oblique non négatif (la fidélité numérique relève des propres tests du paquet GNSS, référencés aux fiches techniques). |
| Analyse / émission CCSDS-TDM 503 + passerelle radiométrique | validated |
src/ccsds_tdm.rs : un lecteur et écrivain CCSDS 503.0-B-2 KVN (keyword-value notation) (en-tête + segments META_START…META_STOP / DATA_START…DATA_STOP ; enregistrements RANGE/DOPPLER_*/ANGLE_*/*_FREQ). Tests (#[cfg(test)] + tests/fixtures/deepspace/reference.tdm) : le fichier de référence est analysé en champs nommés attendus ; analyse→émission→analyse donne une structure égale (aller-retour sémantique) ; la passerelle to_radiometric_obs convertit les enregistrements non ambigus RANGE/DOPPLER_* en RadiometricObs (trajets déduits de PATH 1,2/1,2,1/1,2,3, bande déduite de TRANSMIT_BAND, km→m) ; un fichier multisegment réinitialise la machine à états. Omission honnête plutôt que supposition : les angles et fréquences, les bandes inconnues, les époques en jour de l'année et les échelles de temps non reconnues sont omis, jamais mal convertis, et sigma est laissé à 0.0 pour que l'appelant le pondère. |
| Benchmark DSN/ESTRACK (précision du modèle ≫ plancher publié) | validated (model) |
tests/radiometric_benchmark.rs : les observables sont des calculs géométriques exacts ; le benchmark honnête consiste donc à montrer que l'erreur numérique propre du modèle est très inférieure au plancher de mesure DSN/ESTRACK publié — le modèle n'est pas le goulot d'étranglement de la précision, c'est le σ fourni par l'appelant. Chaque test calcule une observable de deux manières indépendantes (ou retrouve une vérité injectée) et vérifie que le résidu est inférieur au plancher : la distance revient à <1 mm près ≪ le plancher d'environ 1 m de la mesure de distance PN (DSN 810-005 mod. 214 / CCSDS 414.1-B) ; le Doppler concorde avec la vitesse de variation de distance retardée en forme close exacte v/(1+v/c) à ~10⁻⁶ m/s près, soit plusieurs × sous le plancher de bande X d'environ 0,05 mm/s (DSN 810-005 mod. 203 / Moyer) — le résidu est le plancher de différenciation de distance en f64 à ~1 UA, une caractéristique numérique et non une erreur de modélisation ; le Δ-DOR reproduit la projection en forme close avec un angle équivalent dans le plan du ciel ≪ 1 nrad ≪ le plancher d'environ 1–10 nrad (DSN 810-005 mod. 210 / CCSDS 506.1-B) ; le plasma à deux fréquences retrouve le retard injecté à ≪ 1 % près ; et le retard de Shapiro se situe dans la bande publiée d'environ 100–250 µs de conjonction Terre–Mars. Les chiffres publiés sont énoncés et présentés comme des spécifications DSN en ordre de grandeur, et non comme des nombres exacts inventés, et la documentation du module précise explicitement que ceci évalue la PRÉCISION DU MODÈLE, et non la reproduction d'une passe réelle (cela relève de D2 + de vrais TDM). |
DO en dynamique réduite pour l'espace lointain — D2 (src/deepspace_od.rs, src/clock_state.rs, src/mars_atmos.rs)#
Le troisième jalon du moteur de navigation pour l'espace lointain : l'estimateur qui transforme les observables radiométriques de D1 en trajectoire retrouvée — un filtre d'information en racine carrée (SRIF) numériquement robuste, avec des accélérations empiriques en dynamique réduite, une horloge embarquée à trois états, un modèle de traînée martienne, et les dérivées partielles de mesure radiométrique qui relient distance et Doppler à l'état du filtre, le tout bouclé de bout en bout par une récupération synthétique de détermination d'orbite en orbite basse martienne (LMO). Portée honnête : la récupération est une boucle fermée synthétique (la vérité et le filtre partagent le même propagateur martien, et les observations sont le même modèle géométrique d'observables que le filtre inverse, plus un bruit gaussien injecté) — elle valide la mécanique de l'estimateur, et non la fidélité absolue du modèle de forces martien ; la vérification croisée externe de niveau DE est le crate xval/anise-mars-od conditionné par le noyau (D0.8b). Tout ce qui suit est additif (les références d'or de reproductibilité sont inchangées ; même SHA, sans régénération).
| Terme | État | Preuves |
|---|---|---|
| Noyau SRIF (filtre d'information en racine carrée) | validated |
src/deepspace_od.rs Srif : un filtre d'information en racine carrée de Bierman écrit à la main — R triangulaire supérieure avec Λ = RᵀR, vecteur d'information b, mises à jour de mesure et de temps par Householder, arithmétique Vec<f64> nue (sans nalgebra). Tests : le SRIF séquentiel concorde avec la solution des moindres carrés pondérés par lot (gauss_newton) en état comme en covariance à 1e-9 près sur un problème linéaire-gaussien conçu à cet effet (srif_matches_batch_on_linear) ; la covariance retrouvée P = R⁻¹R⁻ᵀ est symétrique (1e-12) et définie positive par construction après une longue séquence de mises à jour de mesure et de temps (srif_covariance_is_spd, la factorisation de Cholesky réussit) ; et l'information s'accumule (la trace de P décroît de façon monotone à mesure que des mesures de géométrie identique sont intégrées). |
| Accélérations empiriques en dynamique réduite (réglage croisière↔LMO) | validated |
src/deepspace_od.rs ReducedDynamicOd : le filtre à neuf états [r; v; a_emp] avec des accélérations empiriques RTN comme états de processus de Gauss–Markov du premier ordre, la technique de dynamique réduite de JPL/ESOC exposée sous la forme d'un unique réglage dynamic_tightness (quasi dynamique ⇒ lisse le bruit sur un arc balistique ; quasi cinématique ⇒ l'étage empirique absorbe une manœuvre ou une traînée non modélisée). Tests : un filtre quasi cinématique suit une manœuvre en échelon (propulseur) avec un résidu inférieur à <½ de celui du filtre quasi dynamique, tandis que le filtre quasi dynamique lisse mieux un arc balistique bruité (reduced_dynamic_tracks_maneuver) ; faire varier la rigidité déplace le résidu après ajustement de façon monotone, un continuum et non un commutateur (tuning_is_a_continuum). |
| Horloge embarquée à 3 états (phase/fréq./dérive, Q de van Loan, Allan) | validated |
src/clock_state.rs ClockState3 : état d'erreur de phase + fréquence fractionnaire + dérive de fréquence avec le bruit de processus discret exact de van Loan et une mise à jour stabilisée de Joseph. Tests : le Q discrétisé concorde avec le polynôme de van Loan établi à la main à 1e-12 près et se réduit exactement au Q de la KalmanClock à deux états lorsque la dérive = 0 (un sur-ensemble strict) ; une marche libre en plusieurs pas fait croître la variance de phase jusqu'à la relation analytique de holdover de NIST SP 1065 via le terme de marche aléatoire en T⁵ ; l'état de dérive retrouve une rampe de vieillissement réelle à <5 % près ; un profil d'Allan de classe USO est retrouvé (ADEV recouvrant à τ=1 s dans la barrière d'étalonnage) et l'estimateur reste cohérent au sens du NEES (>95 % dans 3σ) et défini positif tout au long d'une exécution à Q/R sévère. ClockClass porte les valeurs σ_y(1 s) citées de CSAC/USO/DSAC (USO : oscillateur ultrastable ; DSAC : Deep Space Atomic Clock) et le plancher Doppler Δv = c·σ_y. |
| Traînée atmosphérique martienne (Mars-GRAM-lite (GRAM : Global Reference Atmospheric Model)) | validated (model) |
src/mars_atmos.rs : un profil de densité neutre martienne exponentiel par morceaux (surface ~0,020 kg/m³, hauteur d'échelle près de la surface ~11 km, la moyenne à faible teneur en poussière de Mars-GRAM 2010 / MCD (Mars Climate Database)) et l'accélération de traînée quadratique prise relativement à l'atmosphère martienne en corotation, plus une variante ..._scaled que le SRIF peut multiplier. Tests : la densité décroît de façon monotone et continue d'une bande à l'autre, la hauteur d'échelle près de la surface retrouvée est la valeur physique d'environ 11 km, la traînée est strictement antiparallèle à la vitesse relative (le produit vectoriel s'annule à 1e-12 près) avec une grandeur raisonnable d'environ 3e-4 m/s² en LMO, et elle est linéaire en le terme balistique. Portée honnête : une atmosphère d'ingénierie représentative, et non un Mars-GRAM/MCD validé en vol avec dépendance à la poussière, à la saison et à l'heure locale. |
| Dérivées partielles de mesure radiométrique (distance/Doppler) pour le SRIF | validated |
src/deepspace_od.rs range_observable / range_rate_observable : les dérivées partielles de la distance sur la ligne de visée ρ = |r_sc − r_sta| (∂ρ/∂r = û, ∂ρ/∂v = 0) et de la vitesse de variation de distance ρ̇ = û·(v_sc − v_sta) (∂ρ̇/∂v = û, ∂ρ̇/∂r = (v_rel − ρ̇·û)/ρ) qui relient les observables de D1 à l'état du filtre, plus la dérivée partielle de fréquence d'horloge du Doppler à un trajet ∂ρ̇_obs/∂y = c. Tests : les deux dérivées partielles concordent avec une différence finie centrée de l'observable à 1e-6 près (range_partial_matches_finite_difference, range_rate_partials_match_finite_difference) ; une seule mise à jour de distance réduit la covariance dans la direction observée (ligne de visée, LOS) d'un facteur ≫1000 et la maintient définie positive (PD), et une mise à jour Doppler réduit la variance de vitesse sur la LOS (radiometric_update_reduces_covariance_in_observed_direction, range_rate_update_observes_velocity). |
| DO de bout en bout en LMO martienne à partir de données radiométriques | validated (synthetic closed-loop) |
tests/mars_lmo_od.rs : un arc de vérité en orbite basse martienne propagé sous la gravité Body::mars_gmm3(4) génère des mesures bruitées de distance à deux trajets (σ=1 m) + Doppler (σ=0,1 mm/s) vers deux stations de poursuite ; le SRIF en dynamique réduite le retrouve à partir d'un état initial perturbé d'environ 2,7 km. Résultat obtenu : RMS de position convergée ≈ 0,2 m (inférieur au mètre, bien en deçà du critère de réussite de quelques mètres à quelques dizaines de mètres) sur un arc de 3 orbites à cadence de 30 s, avec la covariance factorisée définie positive à chaque époque (la garantie du SRIF, vérifiée tout au long). Le continuum de réglage croisière→LMO est exercé de bout en bout : avec une vérité de traînée non modélisée que le modèle du filtre ne possède pas, le réglage en dynamique réduite (rigidité 1) converge à ~14 m contre ~677 m pour l'exécution quasi dynamique (rigidité 0) — une amélioration de 48× due à l'étage empirique qui absorbe la traînée. Portée honnête : boucle fermée synthétique (vérité = le même propagateur que celui du filtre) ; la vérification croisée externe de niveau DE est xval/anise-mars-od, conditionnée par le noyau (D0.8b), jamais exécutée ici, sans réseau. |
Scénario PNT pour l'espace lointain et fusion à un trajet + deux trajets — D3 (src/mars_pnt.rs, src/deepspace_od.rs)#
Le quatrième jalon du moteur de navigation pour l'espace lointain : un scénario de produit PNT martien exécutable qui relie le corps / référentiel martien de D0, les observables radiométriques de D1 et la DO en dynamique réduite de D2 en un unique type de scénario mars-pnt. Il modélise une petite constellation relais de style MARCONI qui diffuse un signal dans l'espace à un trajet (couplé à l'horloge) et relaie en outre une liaison à deux trajets (cohérente, indépendante de l'horloge) vers une station de l'espace lointain, et il navigue trois utilisateurs de référence (transfert vers Mars, orbiteur en orbite basse martienne, point fixe de surface) à l'aide de l'estimateur de fusion conjoint à un trajet + deux trajets de D3.1 — un SRIF à douze états qui augmente le bloc orbite/empirique en dynamique réduite de D2 d'une horloge embarquée à trois états. Portée honnête : chaque chiffre de mérite est la borne de covariance formelle de l'estimateur (position à 1σ / 3σ par époque) et le RMS atteint par rapport à une vérité en boucle fermée synthétique (la vérité et le filtre partagent la même dynamique martienne et le même modèle géométrique d'observables, plus un bruit gaussien injecté) — un chiffre de mérite de navigation simulé, et NON un niveau de protection certifié pour l'aviation, et NON une affirmation de vol (pas de modèle de pannes certifié, pas de moniteur d'intégrité, pas de données de poursuite réelles). Tout ce qui suit est additif (les références d'or de reproductibilité sont inchangées ; même SHA, sans régénération).
| Terme | État | Preuves |
|---|---|---|
| Fusion radiométrique conjointe à un trajet + deux trajets (la fusion bat chacun seul) | validated |
src/deepspace_od.rs FusionOd : le SRIF en dynamique réduite D2.2 augmenté des trois états d'horloge embarquée (ClockState3), qui ingère une série temporelle mixte de distance/Doppler à deux trajets (indépendants de l'horloge, fixant l'orbite — colonnes d'horloge nulles dans la dérivée partielle) et à un trajet (couplés à l'horloge — la dérivée partielle de fréquence ∂ρ̇_obs/∂y = c) via fused_observable. La structure d'étalonnage puis de marche libre : les passes à deux trajets fixent l'orbite, puis les données à un trajet étalonnent l'horloge et prolongent l'orbite entre les passes avec une erreur bornée par la stabilité d'Allan de l'horloge. Testé dans src/deepspace_od.rs #[cfg(test)] : la solution fusionnée bat chaque type de liaison seul ; l'erreur de marche libre d'une exécution à un trajet seul croît avec l'intervalle entre passes à deux trajets, conformément à la borne d'Allan de la classe d'horloge ; la covariance conjointe reste SPD (symétrique définie positive) tout au long. |
| Constellation MARCONI (rayon aréostationnaire, occultation) | validated (model) |
src/mars_pnt.rs MarconiConstellation : un ensemble de cinq relais — trois relais aréostationnaires à r = (μ/ω²)^{1/3} ≈ 20 428 km (le rayon synchrone de Mars déduit de μ et de la vitesse de rotation publiés ; testé dans la bande 20 400–20 500 km) régulièrement espacés de 120° en longitude avec 5° d'inclinaison, plus deux relais sur une orbite circulaire plus haute (1,4× l'orbite aréostationnaire) inclinée de 60° pour la couverture dans le plan du ciel. Les états des relais à chaque époque sont intégrés vers l'avant sous la gravité mars_gmm3 ; le test de visibilité par occultation par Mars est la géométrie corde-dégage-sphère (chord_clears_sphere, testé : un relais diamétralement opposé est occulté, un relais à la verticale est visible). Portée honnête : une géométrie minimale représentative de diffusion plus relais construite à partir de constantes martiennes publiées — et non la conception d'une constellation de vol précise. |
Scénario mars-pnt accessible via CLI / Python / WASM (WebAssembly) / MCP (Model Context Protocol) |
validated |
src/mars_pnt.rs MarsScenario / run_mars_pnt est câblé comme le scénario kind = "mars-pnt" sur toutes les surfaces (D3.3) : l'exécuteur CLI, la liaison Python, la version WASM/playground et le dispatch du serveur MCP y mènent tous (src/api.rs test d'aller-retour mars_pnt_kind_round_trips_through_the_dispatch). Scénarios de référence fournis : scenarios/mars-pnt-lmo.toml, scenarios/mars-pnt-surface.toml, scenarios/mars-pnt-transfer.toml. Le résultat porte une fom_note explicite qualifiant le chiffre de mérite de borne de covariance (et non de PL certifié), et les sorties summary / to_svg répètent l'étiquette d'honnêteté. |
| Objectifs MARCONI / LightShip reproduits : orbiteur < 100 m, rover < 15 m | validated (synthetic closed-loop, under stated assumptions) |
tests/mars_pnt_targets.rs : les objectifs publiés des programmes MARCONI / LightShip (orbiteur < 100 m, surface/rover < 15 m) reproduits en simulation. Hypothèses communes : la constellation MARCONI par défaut à cinq relais ; chaque relais en vue donne une distance+Doppler unidirectionnels par époque ; un passage de station bidirectionnel cohérent toutes les 30 min ; un bruit de classe DSN (σ de distance = 1 m, σ Doppler = 0,1 mm/s) ; le filtre de fusion conjoint à orbite à dynamique réduite + horloge à 3 états, amorcé à partir d'un état a priori perturbé de ~2,7 km (resserrement 0,1) ; FoM = RMS de position 3D convergée sur la seconde moitié de l'arc par rapport à la vérité synthétique. Orbiteur (LMO ~400 km / inclinaison 60°, horloge USO, cadence de 60 s, ~2 h ≈ un arc d'une orbite) : RMS convergée obtenue ≈ 0,40 m ≪ la cible de 100 m (moyenne de 3,1 relais en vue, covariance SPD tout du long). Rover (point de surface équatorial fixe, horloge USO, cadence de 30 s, arc de ~2 h) : RMS convergée obtenue ≈ 5,1 m < la cible de 15 m (moyenne de 3,0 relais en vue, covariance SPD). Les deux cibles sont atteintes sans relâcher aucune assertion — l'USO est la moins performante des classes réalistes d'horloges embarquées (une DSAC ne ferait qu'aider) et la cadence bidirectionnelle de 30 min est prudente pour un calendrier courant de réseau de relais ; les hypothèses sont donc physiquement équitables pour un système de classe MARCONI, et non réglées pour réussir. Portée honnête : reproduction simulée sous les hypothèses énoncées, PAS une affirmation de vol ni un niveau de protection certifié ; la vérité synthétique en boucle fermée partage la dynamique martienne et le modèle d'observables du filtre. |
Temps-coordonnée lunaire — vitesse relativiste de l'horloge Terre-Lune (src/lunar_time.rs)#
Une échelle de temps-coordonnée lunaire (LTC/TCL (TCL : Temps-Coordonnée Lunaire, nom français du temps-coordonnée lunaire)) exige la vitesse séculaire à laquelle une horloge en surface lunaire marche par rapport à une horloge du géoïde terrestre (TT). src/lunar_time.rs la calcule à partir des premiers principes : une identité post-newtonienne du premier ordre qui somme la différence de potentiel propre (le potentiel conventionnel du géoïde IAU L_G W0 = L_G·c² ≈ 6.26369e7 m²/s² moins le potentiel propre de la surface de la Lune GM_moon/R_moon ≈ 2.822e6 m²/s²) et le terme cinétique (effet Doppler du second ordre) −<v²>/2c² issu de la vitesse géocentrique de la Lune (obtenue par différences finies à partir de la série lunaire de Montenbruck-Gill dans src/ephem.rs). Le terme dominant de potentiel propre donne ≈ 57,5 µs/jour, le terme cinétique ≈ −0,5 µs/jour, pour un total de ≈ 57 µs/jour. Le scénario lunar-time-offset rapporte cette vitesse, le décalage LTC−TT accumulé sur un horizon, et prend en charge un ensemble minimal à variance inverse (une horloge papier lunaire) ; les conversions TT↔LTC reviennent à leur valeur de départ à < 1 ns/jour près.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Vitesse relativiste de l'horloge Terre-Lune (LTC/TCL) | modelled |
src/lunar_time.rs lunar_rate_breakdown, tt_to_ltc/ltc_to_tt, lunar_ensemble, LunarTimeScenario. Référence indépendante : une identité relativiste interne en forme close (géopotentiel IAU L_G / conventions IERS et potentiel propre GM/r (GM : paramètre gravitationnel, G fois la masse)), recoupée avec la bande publiée de vitesse d'horloge lunaire [56, 59] µs/jour. Tests (lunar_time::tests) : le terme de potentiel propre ≈ 57,5 µs/jour, la vitesse de la Lune ≈ 1 km/s, le terme cinétique un petit négatif, le total dans la bande avec les termes nommés qui le somment, le décalage LTC−TT sur 1 jour ≈ 57 µs, et un aller-retour TT↔LTC à < 1 ns/jour près. Portée honnête : la valeur phare en µs/jour dépend de la référence — elle dépend des surfaces de référence choisies (géoïde terrestre W0 ou sélénoïde lunaire), de la fenêtre de moyennage temporel et des corrections centrifuge/J₂ inférieures à la µs/jour négligées — c'est pourquoi la sortie publiée est une bande, et non un nombre unique certifié. Il s'agit d'une vérification d'autocohérence Modelled, et NON d'une validation externe, NON d'une exactitude absolue inférieure à la nanoseconde, et NON certifié pour la tenue du temps opérationnelle. |
VLBI géodésique lunaire — retard en champ proche pour une base terrestre observant une balise lunaire (src/lunar_vlbi.rs)#
Une observable de VLBI (very-long-baseline interferometry) géodésique pour deux stations terrestres au sol (une base) observant un signal à un trajet d'un émetteur de classe NovaMoon en surface lunaire. La Lune est en champ proche, et non une onde plane ; le retard géométrique est donc la différence exacte de deux distances tau_geom = (|r2 − r_B| − |r1 − r_B|)/c plutôt que la projection dans le plan du ciel. L'observable complète ajoute la différence des décalages d'horloge des stations et un terme de Shapiro du potentiel terrestre différencié (réutilisé de src/radiometric.rs). Les stations sont placées en coordonnées inertielles géocentriques (GCRS) via src/frames.rs + src/cio.rs ; la balise via src/ephem.rs (Lune géocentrique) + src/lunar.rs (sélénographique→MCMF (MCMF : Moon-centred, Moon-fixed, centré sur la Lune et lié à la Lune)) + src/lunar_frame.rs (corps lié IAU-2015 ME→inertiel). Le scénario lunar-vlbi échantillonne le retard, sa vitesse de variation par différences finies et la correction de champ proche au cours d'une passe.
La référence indépendante est l'observable Δ-DOR en onde plane de la même base de code delta_dor dans src/radiometric.rs : à la limite du champ lointain (une balise synthétique à 1e15 m), le retard géométrique doit se réduire à −(B·ŝ_B)/c = delta_dor(r_B, [0,0,0], B) à la précision machine ; à la vraie distance lunaire, la correction de champ proche due à la courbure du front d'onde est non nulle (de quelques dizaines à quelques centaines de µs). Les dérivées partielles de la balise dtau/dr_B = ((r_B−r2)/|r_B−r2| − (r_B−r1)/|r_B−r1|)/c (et celles des stations) sont vérifiées par différence finie centrée (erreur relative < 1e-5).
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Retard VLBI géodésique lunaire + dérivées partielles | modelled |
src/lunar_vlbi.rs geometric_delay_s, vlbi_delay_s, delay_partials_beacon/_station1/_station2, near_field_correction_s, LunarVlbiScenario. Référence indépendante : ReferenceImpl — le delta_dor en onde plane de la même base de code (src/radiometric.rs) à la limite du champ lointain, plus des dérivées partielles par différences finies. Tests (lunar_vlbi::tests) : la grandeur de la station ≈ le rayon terrestre, la distance de la balise à la distance lunaire (356–407 Mm), le retard géométrique en champ lointain concorde avec delta_dor à < 1e-9 s près, une correction de champ proche non nulle à la distance lunaire, des dérivées partielles balise/station par différences finies à 1e-5 près en relatif, un terme d'horloge exact, et une exécution de scénario finie dirigée via run_toml. Portée honnête : Modelled, et NON validé par rapport à de vraies données VLBI. Le mouvement du pôle est ignoré (xp = yp = 0), de sorte que les positions inertielles des stations portent une erreur de référentiel de quelques mètres ; la balise mélange une série de la Lune à l'équateur moyen de la date avec un décalage lié au corps en ICRF (International Celestial Reference Frame) (jd_tdb ≈ jd_tt), une discordance de cohérence de référentiel inférieure à la fidélité du modèle mais non rigoureuse ; et il n'y a ni itération du temps de lumière, ni rotation de la Terre pendant le temps de lumière, ni milieux (tropo/iono/plasma), ni terme d'aberration au-delà du Shapiro différencié. Aucun TRL (technology readiness level), aucun héritage de vol ni aucune approbation d'agence n'est revendiqué. 0,30 : par rapport aux temps de lumière ANISE via DE440, aucun retard de ce chemin analytique n'est à 1 ps près (plus grand écart 24 µs) ; le constat est figé. |
| VLBI géodésique lunaire, chemin par noyau | validated (0.30) |
src/lunar_vlbi.rs KernelGeometry (Terre et Lune DE440, axes principaux lunaires DE440, orientation de la Terre ITRF93, chaque temps de lumière convergé dans le référentiel barycentrique), exécuté par le scénario lunar-vlbi lorsque les trois chemins de noyaux sont définis. Référence indépendante : Library — NAIF SPICE Toolkit N0067 (spiceypy 8.2.0) temps de lumière convergés vers DSS-14/43/63, préenregistrés : 75 retards à 1 ps près (pire cas 0,06 ps), dérivées partielles de la balise et des stations à 1e-6 près, à 25 époques proches de J2000 (un amendement après que les époques de 2024 ont échoué sur l'époque d'émission en double précision propre à SPICE, d'environ 6 ps, divulgué et figé). Le terme de Shapiro différencié, la vitesse de variation du retard et la correction de champ proche du scénario ne sont pas comparés. |
DO et horloge lunaires conjointes multitechniques — récupération simulée en boucle fermée (src/lunar_combination.rs)#
Un ajustement par moindres carrés par lot à époque unique (instantané) (crate::batch_ls::gauss_newton_qr, une étape QR de Householder depuis 0,30) qui fusionne les techniques de VLBI géodésique, de radiométrie/télémétrie locale lunaire et de télémétrie inter-satellites sur un réseau lunaire SIMULÉ afin de retrouver, ensemble, la position 3-D d'une station de surface lunaire, les positions par satellite d'une petite constellation et le décalage d'horloge de chaque équipement. Les observables sont : (1) les retards de VLBI géodésique sur base terrestre vers la station lunaire traitée comme balise (réutilisant src/lunar_vlbi.rs, inertiel géocentrique) — la technique phare ; (2) les distances radiométriques géocentriques station terrestre→satellite (qui multilatèrent la constellation à partir des stations terrestres bien réparties) et les distances locales lunaires station↔satellite (distance euclidienne MCI (Moon-centred inertial, inertiel centré sur la Lune) plus le terme d'horloge différencié) ; (3) les distances inter-satellites (même forme) ; plus une unique pseudo-observation de synchronisation d'horloge de station qui ancre le décalage d'horloge commun, sinon inobservable. Le vecteur d'état est [station_pos(3), {sat_pos(3)}×N_sat, station_clk, {sat_clk}×N_sat]. Il n'y a aucune propagation par modèle de forces dans le solveur — les satellites sont des points fixes, distincts et illustratifs sur une orbite lunaire représentative ; il s'agit d'un ajustement instantané volontairement épuré. En interne, les positions sont mises à l'échelle et les horloges sont estimées en mètres équivalents-distance afin que la matrice normale reste bien conditionnée en f64 ; les distances VLBI et lunaires sont centrées (moyenne retirée) autour de la géométrie nominale afin que le jacobien par différences finies ne souffre pas d'une annulation catastrophique. Le scénario lunar-joint-od-clock exécute la résolution avec et sans les liaisons VLBI sur la même graine/vérité et rapporte les deux solutions ainsi que le facteur d'amélioration de l'observabilité de la station.
Le résultat honnête phare : la télémétrie locale lunaire depuis une station polaire vers une poignée de satellites tous situés d'un même côté du ciel laisse la position de la station faiblement observée selon une direction, de sorte que la résolution par distances seules est mal conditionnée et que l'erreur 3-D retrouvée de la station est grande (ou que la résolution ne converge pas). Ajouter les retards VLBI sur base terrestre rend observable la position 3-D complète de la station, et l'erreur retrouvée de la station tombe au niveau du mètre. Le test vlbi_restores_station_observability vérifie que l'erreur de la station avec VLBI est nettement (≥5×) plus petite que l'erreur avec distances seules sur la même vérité injectée — le VLBI qui rétablit la direction de la station, sinon inobservable, est l'objet de cette phase.
La référence indépendante est la cohérence interne : un état de vérité injecté (station ~50 m/axe, satellites ~30 m/axe, horloges ~1e-7 s, avec une gigue par composante issue d'une graine) est converti en observables synthétiques par le même modèle géométrique que le solveur inverse, un bruit gaussien issu d'une graine est ajouté (valeurs illustratives par défaut : σ VLBI ≈ 1e-11 s, σ de distance ≈ 0,1 m, σ ISL ≈ 0,1 m ; poids 1/σ²), et l'estimateur doit retrouver la vérité injectée dans le bruit à partir d'une estimation initiale nulle. Un NEES moyen Monte-Carlo Δxᵀ(HᵀWH)Δx sur les graines (formal_covariance_nees) reste dans une bande large autour de n_params, une vérification du réalisme de la covariance.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| OD multi-technique conjointe lunaire + horloge | validated (0,30, P2 : l'algèbre linéaire de la résolution) |
src/lunar_combination.rs estimate, formal_covariance_nees, LunarCombinationScenario. Référence indépendante 0,30 : P2 — numpy 2.4.6 (LAPACK gelsd et inv) recalcule chaque pas de Gauss-Newton, la solution pondérée convergée, les sigmas formels et l'erreur de la station sur les jacobiens enregistrés de six réseaux (tests/lunar_joint_od_numpy_oracle.rs, pas à 2.4e-11 près, sigmas à 1.3e-11 près) ; les modèles d'observation physiques et leurs grandeurs restent MODELLED. Référence indépendante antérieure : InternalConsistency — récupération d'une vérité simulée injectée + cohérence de covariance NEES. Tests (lunar_combination::tests) : la fusion complète retrouve la vérité (station < 5 m, RMS des satellites < 5 m, horloges < 1e-8 s, convergée) ; le VLBI rétablit l'observabilité 3-D de la station (erreur de la station ≥5× plus petite avec le VLBI qu'avec distances seules sur la même vérité) ; déterministe (même graine → solution identique au bit près, graine différente → solution différente mais retrouvée) ; NEES moyen dans une bande large autour de n_params ; chiffres rapportés finis/protégés même lorsque les distances seules sont mal conditionnées ; scénario dirigé via run_toml. Portée honnête : il s'agit d'une récupération simulée en boucle fermée — la vérité partage le modèle d'observation — et NON d'une validation sur données réelles ; aucune propagation par modèle de forces dans le solveur ; les positions des satellites et la géométrie des stations terrestres/lunaires sont illustratives. Aucun TRL, aucun héritage de vol ni aucune approbation d'agence n'est revendiqué. |
Réalisation du référentiel lunaire — ajustement de datum par transformation de Helmert à 7 paramètres (src/lunar_frame_realise.rs)#
Là où src/lunar_frame.rs applique l'orientation du corps lunaire IAU 2015 WGCCRE (un modèle direct), ce module estime (réalise) un référentiel lunaire à partir d'un réseau de coordonnées de points estimées rattaché à un datum. Le cœur d'estimation est une transformation de similitude (Helmert) classique à 7 paramètres — trois de translation, trois de rotation aux petits angles et un d'échelle — qui transforme les points p_i (référentiel estimé) en q_i (référentiel du datum) sous la forme q_i = t + (1 + s)·R(θ)·p_i, avec R(θ) = rz(θz)·ry(θy)·rx(θx) construit à partir de crate::precession::{rx, ry, rz, matmul, mat_vec}. Les sept paramètres [tx, ty, tz, θx, θy, θz, s] sont estimés à partir d'au moins 3 paires de points non colinéaires par moindres carrés pondérés via crate::batch_ls::gauss_newton : le modèle direct prédit chaque q_i à partir de son p_i et aplatit les trois composantes de tous les points dans le vecteur d'observables, les coordonnées observées du datum forment z, les poids sont 1/σ², et la résolution part de x0 = zeros. Les angles de rotation sont estimés en µrad et l'échelle en ppb afin que le jacobien par différences finies reste bien mis à l'échelle à la grandeur des coordonnées de surface lunaire (~1.7e6 m). Un petit icrf_orientation_tie compose la petite rotation réalisée à travers l'orientation IAU corps→ICRF (transpose(crate::lunar_frame::icrf_to_iau_moon(jd_tdb))) et renvoie le décalage résiduel aux petits angles du référentiel réalisé autour des axes ICRF — un changement d'expression de référentiel volontairement simple, et non une estimation indépendante du pôle lunaire.
La référence indépendante est la cohérence interne : une transformation de Helmert connue (translation de l'ordre de quelques dizaines de m, rotation de l'ordre du µrad, échelle ~1e-7) est injectée dans un réseau de points synthétique bien réparti (latitude/longitude sélénographiques variées → MCMF, certains points en altitude), un bruit gaussien issu d'une graine est ajouté, et l'ajustement doit retrouver les paramètres injectés. Sur des données sans bruit, la récupération se fait à environ la précision machine (translation < 1e-6 m, rotation < 1e-9 rad, échelle < 1e-12) ; avec un bruit métrique, les paramètres retrouvés se situent à quelques × le σ formel et le RMS résiduel après ajustement est proche du niveau de bruit. Le scénario lunar-frame-realisation rapporte le datum retrouvé, l'erreur de récupération par paramètre par rapport à la vérité injectée, le RMS résiduel après ajustement et le rattachement d'orientation ICRF de la rotation réalisée.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Réalisation du référentiel lunaire | modelled |
src/lunar_frame_realise.rs helmert_fit, apply_helmert, realise_frame, icrf_orientation_tie, LunarFrameRealiseScenario. Référence indépendante : InternalConsistency — récupération d'une transformation de similitude à 7 paramètres injectée plus l'identité algébrique d'aller-retour de apply_helmert. Tests (lunar_frame_realise::tests) : récupération sans bruit de la transformation injectée (translation < 1e-6 m, rotation < 1e-9 rad, échelle < 1e-12) ; récupération avec bruit à quelques × σ près et RMS résiduel proche du niveau de bruit ; aller-retour appliquer-puis-inverser ; déterministe (même graine → identique au bit près, graine différente → différent mais retrouvé) ; le rattachement ICRF à rotation nulle est nul et le rattachement préserve la grandeur de la rotation ; scénario dirigé via run_toml. Portée honnête : il s'agit d'une vérification d'autocohérence — elle retrouve une transformation injectée sur un réseau synthétique — et NON d'une réalisation du référentiel lunaire à partir de vraies données de poursuite / VLBI, et elle ne revendique aucune exactitude absolue du référentiel. Le rattachement d'orientation ICRF est un simple changement d'expression, et non une estimation indépendante du pôle. Aucun TRL, aucun héritage de vol ni aucune approbation d'agence n'est revendiqué. |
Volume de service de navigation lunaire — DOP / couverture / disponibilité + PL ARAIM lunaire généralisé (src/lunar_service.rs)#
Ce module compose des éléments déjà construits en une analyse de volume de service de navigation lunaire : il balaie une grille de latitude/longitude sélénographiques sur un horizon temporel face à une constellation en orbite lunaire illustrative, de source publique, de classe Moonlight / LCNS (LCNS : Lunar Communications and Navigation Services) et rapporte le DOP / la couverture / la disponibilité ainsi qu'une enveloppe généralisée de niveau de protection ARAIM lunaire. Les deux réutilisations sont déterminantes et explicites. La géométrie DOP est le noyau VALIDATED (par rapport à gnss_lib_py) crate::orbit::dop — service_dop est un simple filtre de masque d'élévation plus ce noyau, et un test vérifie l'identité (service_dop égale un orbit::dop direct sur les mêmes positions visibles). L'intégrité réutilise la mécanique ARAIM lunaire LunaNet LNIS (LunaNet Interoperability Specification) crate::lunar::lunar_araim (σ_URE ≈ 30 m, P_sat ≈ 1e-4) ; lunar_protection_level généralise le niveau de protection existant du pôle Sud à un point de surface arbitraire, et un test vérifie qu'il se réduit au cas du pôle Sud (au pôle Sud, avec la même géométrie et le même budget, il renvoie exactement le résultat existant de lunar::lunar_araim à < 1e-9 près).
Les paramètres de la constellation sont une approximation illustrative des descriptions publiques de l'ESA pour cette classe de système (≈ 4 satellites sur des orbites lunaires elliptiques gelées favorisant la couverture du pôle Sud — apolune au-dessus de l'hémisphère sud ; 4 est la valeur par défaut de la bibliothèque, et le moonlight-service-volume.toml fourni la fixe à 8 parce que le niveau de protection exige au moins 6 en vue). Ils ne sont pas les véritables éphémérides Moonlight/LCNS et n'impliquent aucune affiliation, approbation, héritage, certification ni TRL. La composition (couverture / disponibilité / intégrité) est MODELLED : un ensemble de relais képlériens circulaires/elliptiques (et non des éphémérides LCNS / NRHO (near-rectilinear halo orbit) 9:2 corrigées différentiellement), une Lune en rotation moyenne (sans libration physique ni précession du pôle) et des paramètres d'intégrité LunaNet LNIS publiés. Elle illustre la méthode de volume de service, et non un chiffre de disponibilité opérationnelle. Déterministe (géométrie pure ; aucun aléa). Le scénario moonlight-service-volume rapporte le pourcentage de couverture, les enveloppes du nombre de satellites visibles et du PDOP, l'enveloppe HPL/VPL sur le volume et la disponibilité du niveau de protection par rapport à la limite d'alerte.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Volume de service de navigation lunaire | modelled |
src/lunar_service.rs LunarConstellation, visible_sats, service_dop, coverage, lunar_protection_level, LunarServiceScenario. Géométrie DOP validée par réutilisation du noyau crate::orbit::dop validé par gnss_lib_py ; l'intégrité réutilise l'ARAIM lunaire publié LunaNet/LNIS (crate::lunar::lunar_araim, σ_URE ≈ 30 m). Tests (lunar_service::tests) : service_dop est une identité sur le noyau validé ; lunar_protection_level au pôle Sud égale le PL existant de lunar::lunar_araim à < 1e-9 près (se réduit au cas du pôle Sud) ; la couverture est non décroissante avec la taille de la constellation ; la visibilité respecte le masque d'élévation ; le scénario est déterministe et est dirigé via run_toml. Portée honnête : la constellation est illustrative, de source publique, NON affiliée à l'ESA — et non les véritables éphémérides Moonlight/LCNS ; la composition couverture/disponibilité/intégrité est MODELLED (relais képlériens circulaires/elliptiques, Lune en rotation moyenne, paramètres LNIS publiés), et NON un chiffre de disponibilité opérationnelle de Moonlight. Aucun TRL, aucun héritage de vol ni aucune approbation d'agence n'est revendiqué. |
PNT différentiel lunaire — annulation du mode commun + résidu croissant avec la base + niveaux de protection DGNSS (src/lunar_dpnt.rs)#
Un analogue lunaire de DGNSS (navigation par satellite différentielle) / SBAS : une station de référence de classe NovaMoon à un emplacement sélénographique connu calcule des corrections différentielles par satellite à partir d'une constellation illustrative, de source publique, de classe Moonlight / LCNS, et un utilisateur mobile décalé de celle-ci d'une base les applique de sorte que les erreurs d'éphémérides diffusées de mode commun s'annulent. Chaque satellite i porte un vecteur d'erreur d'orbite 3-D commun injecté e_i et une erreur d'horloge commune c_i. Le résidu de pseudodistance de la station de référence est la correction −e_i · û_ref,i + c_i ; l'erreur brute de l'utilisateur est −e_i · û_user,i + c_i ; l'erreur corrigée de l'utilisateur est leur différence −e_i · (û_user,i − û_ref,i). Le terme d'horloge c_i s'annule exactement (il est identique dans les deux observations), et le terme d'orbite se réduit à la projection sur la différence des deux vecteurs unitaires de ligne de visée, qui → 0 lorsque la base → 0 (le plancher de décorrélation spatiale) et croît ≈ linéairement avec la base. Les erreurs de distance corrigées par satellite sont projetées à travers la géométrie de l'utilisateur par une petite résolution instantanée aux moindres carrés pondérés à faibles dépendances (état [x, y, z, clock] via crate::orbit::invert4 ; un biais de distance constant est absorbé par l'inconnue d'horloge au lieu de corrompre la solution) pour donner l'erreur de position de l'utilisateur. Le niveau de protection de l'utilisateur réutilise la mécanique de niveau de protection SBAS DO-229E (crate::sbas::sbas_protection_level, facteurs K d'approche de précision) avec le σ résiduel différentiel comme budget d'erreur à 1-σ de chaque satellite.
NovaMoon n'est référencé que comme classe de système (une description publique d'une station de référence lunaire) ; la constellation réutilise la crate::lunar_service::LunarConstellation illustrative de source publique. Ce sont des paramètres illustratifs destinés à exercer la méthode différentielle, et non des éphémérides réelles, et ils n'impliquent aucune affiliation, approbation, héritage, certification ni TRL. Le scénario lunar-differential-pnt rapporte l'erreur de position de l'utilisateur avec et sans corrections, le facteur de réduction, la courbe erreur-en-fonction-de-la-base et le niveau de protection. Dans la configuration par défaut, l'erreur corrigée de l'utilisateur à une base de 50 km est ≈ 0,008 m contre ≈ 24 m sans correction (une réduction d'un facteur ~3000), et ≈ 0 à base nulle.
La référence indépendante est la cohérence interne : l'annulation du mode commun est une identité algébrique exacte (avec noise = 0, erreur corrigée < 1e-6 m à base nulle ; le terme d'horloge s'annule à la précision machine quelle que soit la base), le résidu croît de façon monotone avec la base, et le niveau de protection est le même algorithme DO-229E auquel la pile SBAS est rattachée. Le résidu de décorrélation spatiale est un modèle géométrique du premier ordre, et non un modèle de décorrélation ajusté sur de vraies données de poursuite lunaire.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| PNT différentiel lunaire | modelled |
src/lunar_dpnt.rs differential_corrections, corrected_user_range_errors, user_position_error_m, lunar_dgnss_protection_level, LunarDpntScenario. Référence indépendante : InternalConsistency — l'identité d'annulation d'erreur différentielle plus la réutilisation de la mécanique de niveau de protection SBAS DO-229E (crate::sbas). Tests (lunar_dpnt::tests) : à base nulle, l'erreur corrigée de l'utilisateur et chaque erreur de distance corrigée par satellite sont ~0 (< 1e-6 m) et ≪ l'erreur non corrigée ; le terme d'horloge s'annule exactement quelle que soit la base (cas à erreur d'orbite nulle) ; l'erreur corrigée croît de façon monotone avec la base tout en restant ≪ à l'erreur non corrigée pour des bases modestes ; le différentiel bat l'autonome avec une marge nette (> 2×) ; le niveau de protection égale un appel direct à sbas::sbas_protection_level et évolue avec le σ résiduel ; une géométrie sous-déterminée renvoie None ; le scénario est déterministe (graine) et est dirigé via run_toml. Portée honnête : MODELLED — l'annulation du mode commun est une identité exacte, mais le résidu de décorrélation spatiale est un modèle géométrique du premier ordre, et NON un modèle de décorrélation ajusté sur de vraies données de poursuite lunaire, et ceci n'est PAS validé sur données réelles. NovaMoon n'est référencé que comme classe de système (illustrative, de source publique, non affiliée à l'ESA). Aucun TRL, aucun héritage de vol ni aucune approbation d'agence n'est revendiqué. |
Export d'interopérabilité lunaire — CCSDS OEM + KIF alignés LunaNet/IOAG avec vérification d'aller-retour (src/lunar_interop.rs)#
Le référentiel lunaire, l'échelle de temps lunaire et l'éphéméride lunaire sont exportés sous des formes d'échange alignées sur LunaNet/IOAG (IOAG : Interagency Operations Advisory Group) et fondées sur le CCSDS. Cette phase n'invente pas de format de transmission : elle réutilise l'émetteur et l'analyseur CCSDS OEM (Orbit Ephemeris Message) 2,0 existants du crate (crate::oem::OemFile::to_oem_string / crate::oem::parse_oem) et l'enveloppe du format d'échange Kshana (crate::interchange::Envelope), rééquipés pour le contexte lunaire. export_lunar_oem règle le REF_FRAME de l'OEM sur le référentiel lunaire lié au corps WGCCRE de l'IAU 2015 (MOON_ME Terre moyenne ou MOON_PA axes principaux), TIME_SYSTEM sur l'échelle de temps lunaire (LTC / TCL / UTC) et CENTER_NAME sur MOON, sur un échantillon d'éphéméride illustrative, de source publique, de classe LCNS (positions issues de crate::lunar_service::LunarSat::position_mci, vitesse par différence finie centrale). export_lunar_time_metadata émet un descripteur de temps lunaire aligné sur LunaNet/IOAG (identifiant d'échelle, taux séculaire en µs/jour issu de crate::lunar_time::lunar_rate_breakdown, la bande publiée de 56–59 µs/jour, surface de référence) qui fait l'aller-retour par serde_json. export_kif_lunar enveloppe l'OEM + le descripteur + l'étiquette de référentiel dans l'enveloppe KIF existante avec l'étiquette d'honnêteté MODELLED.
La référence indépendante est l'aller-retour / le respect des champs. Comme oem.rs fournit les deux sens, l'OEM fait l'aller-retour par crate::oem::parse_oem (retour à un segment égal, avec le référentiel/temps lunaire et le nombre d'états préservés) et est vérifié indépendamment par oem_conformance, qui contrôle que chaque mot-clé d'en-tête CCSDS/LunaNet requis est présent, que REF_FRAME porte un jeton MOON_* lunaire et que TIME_SYSTEM n'est pas vide, que l'encadrement META_START … META_STOP tient, et que les lignes de données position+vitesse sont bien formées — en renvoyant un succès structuré plus la liste des champs présents/manquants, de sorte qu'un export cassé (p. ex. un TIME_SYSTEM supprimé) est détecté et nommé. Les métadonnées de temps font l'aller-retour par parse_lunar_time_metadata, et l'enveloppe KIF fait l'aller-retour par Envelope::parse vers des artefacts égaux portant l'étiquette MODELLED.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Export d'interopérabilité lunaire | modelled |
src/lunar_interop.rs export_lunar_oem, export_lunar_time_metadata, parse_lunar_time_metadata, export_kif_lunar, oem_conformance, LunarInteropScenario. Référence indépendante : InternalConsistency — aller-retour déterministe (CCSDS OEM par crate::oem::parse_oem ; KIF par crate::interchange::Envelope::parse ; métadonnées de temps par serde_json) plus respect des noms de champ par rapport à la sémantique de champs publiée du CCSDS OEM + LunaNet/IOAG. Tests (lunar_interop::tests) : l'OEM exporté porte les jetons lunaires REF_FRAME (MOON_ME/MOON_PA) et TIME_SYSTEM (LTC/TCL), CENTER_NAME = MOON, l'objet et des lignes de données bien formées ; les métadonnées de temps lunaire font l'aller-retour (taux/bande/référence) et rejettent le contenu aberrant ; l'enveloppe KIF se sérialise et se désérialise en une valeur égale avec l'étiquette d'honnêteté MODELLED présente ; un OEM volontairement cassé (sans TIME_SYSTEM) échoue à oem_conformance et est signalé comme manquant ; le scénario est aiguillé par run_toml. Portée honnête : les noms/unités de champs sont alignés sur des normes publiques (CCSDS 502.0-B OEM, référentiels lunaires WGCCRE de l'IAU 2015, spécification d'interopérabilité LunaNet / architecture lunaire de l'IOAG) ; l'export est MODELLED — l'aller-retour déterministe + le respect des noms de champ sont la référence indépendante, ce n'est PAS un test certifié de respect de la norme d'interopérabilité, l'éphéméride est illustrative, de source publique, non affiliée à l'ESA, et aucun TRL, héritage de vol ni aval d'agence n'est revendiqué. |
Prédictions préenregistrées#
Une prédiction préenregistrée est un résultat MODELLED figé avant l'existence de toute donnée permettant de l'évaluer, avec le protocole d'évaluation fixé en même temps. Ce n'est pas une validation et elle n'ajoute aucune ligne au registre. Chacune se trouve dans docs/predictions/, avec ses entrées figées, son résultat et leurs empreintes SHA-256, et tests/prediction_frozen.rs échoue si un octet figé bouge ; une hypothèse modifiée appelle une nouvelle prédiction datée à côté de l'ancienne, jamais une modification de celle-ci.
| Prédiction | Figée | Évaluée par rapport à | État |
|---|---|---|---|
| Couverture d'une station de référence lunaire | c05dac1d, 2026-10-12 | précision, disponibilité, couverture et niveaux de protection publiés d'une station différentielle lunaire au pôle Sud, par n'importe quelle partie | pas encore évaluée (aucun résultat publié) |
Registre de représentativité de la démonstration et des écarts avant le vol (src/representativeness.rs)#
Un résultat de simulation n'est utile comme preuve que s'il indique, sur sa face même, à quoi il est ancré, ce qu'il suppose et ce qui le sépare encore d'un système de vol. Le registre de représentativité en fait une sortie de premier rang, contrôlée par machine : un enregistrement Representativeness porte les Anchor externes de la démonstration, ses hypothèses modélisées, ses Gap par rapport au vol (chacun avec la phase/activité qui le comblerait) et la bande TRL pour laquelle il est représentatif. C'est le compagnon, par résultat, de la matrice verification au niveau des capacités.
La référence indépendante est un ensemble d'invariants en forme fermée, appliqués par representativeness::tests : un enregistrement Validated doit lister au moins un ancrage ExternalDataset (une simulation ne peut pas être validée par rapport à elle-même) ; un enregistrement Modelled doit lister au moins un écart avant le vol et ne peut pas revendiquer une bande TRL représentative supérieure à 4 (une maturation au-delà exige une preuve matérielle/de vol, qui est un écart, et non une sortie de simulation) ; la bande TRL doit être bien formée ; et un enregistrement PartnerOwned ne doit rien affirmer. Ces invariants rendent opérationnelle la discipline « représentativité justifiée + écarts restants vers le vol clairement identifiés ».
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Registre de représentativité et des écarts avant le vol | modelled |
src/representativeness.rs Representativeness/Anchor/Gap, check/is_valid/report/to_json. Référence indépendante : InternalConsistency — invariants d'honnêteté en forme fermée liés à la frontière statut/type de référence indépendante de verification. Tests (representativeness::tests) : un enregistrement validé sans ancrage externe échoue ; un ancrage interne (ReferenceImpl) ne suffit pas pour valider ; un enregistrement modélisé sans écart échoue ; un enregistrement modélisé au-dessus de TRL 4 échoue ; les bandes TRL mal formées sont détectées ; l'enregistrement se sérialise en JSON avec les champs attendus et produit un rapport lisible. Portée honnête : le registre contrôle la classification de la preuve d'un résultat — il ne prouve pas que les ancrages nommés mènent à des tests vivants (ils sont constitués à la main, exactement comme la matrice verification) ; l'affirmation « contrôlé par machine » se limite aux invariants de statut/ancrage/écart/TRL. |
Preuve unifiée du compromis quantique contre classique (src/qtrade.rs)#
Chaque domaine d'application du PNT quantique répond à la même question de la même façon : fixer un cadre de comparaison (scénario + graine + version du moteur), faire passer un candidat quantique et une référence de base classique par un seul chemin de code neutre, les noter sur des figures de mérite communes, et rapporter — avec un intervalle de confiance et une étiquette honnête validé/modélisé — où le quantique gagne et où il ne gagne pas. TradeEvidence donne à cette réponse une forme unique, de sorte que les verticaux de synchronisation temporelle, de navigation et de détection d'anomalies émettent tous le même objet reproductible et honnêtement étiqueté. Il ne réimplémente aucun compromis : les nombres par FoM proviennent des moteurs existants (quantum_trade, crossover, et les modules verticaux) ; il s'agit du contrat plus l'enveloppe de reproductibilité/représentativité, bâtie sur le registre de représentativité et les étiquettes de vérification.
La référence indépendante est constituée d'identités de bénéfice/gagnant en forme fermée plus un enrobage fidèle de la sortie de compromis existante. qtrade::tests : le rapport de bénéfice est correct en polarité (orienté de sorte que >1 signifie toujours que le côté quantique est meilleur, tant pour les FoM de holdover où plus est mieux que pour les FoM d'erreur où moins est mieux) ; un objet de preuve construit à partir d'un véritable quantum_trade::TradeResult reproduit ses rapports de bénéfice ; une preuve malhonnête est rejetée (une représentativité modélisée sans écart, ou une FoM Validated dont l'enregistrement de compromis ne porte aucun ancrage externe) ; le JSON est déterministe et porte les champs cadre/graine/moteur/FoM/représentativité.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Preuve du compromis quantique contre classique | modelled |
src/qtrade.rs TradeEvidence/TradeFom/TradeFrame/Winner. Référence indépendante : InternalConsistency — identités de bénéfice/gagnant en forme fermée + enrobage fidèle de quantum_trade::TradeResult ; honnêteté liée au registre de représentativité et à la frontière statut/type de référence indépendante de la vérification. Tests (qtrade::tests) comme ci-dessus. Portée honnête : le harnais normalise la façon dont un compromis est rapporté et reproduit ; la physique sous-jacente par FoM est celle que fournit le moteur contributeur, portée avec sa propre étiquette validé/modélisé — TradeEvidence ne fait pas passer une FoM modélisée au statut de validée. |
Bibliothèque de modèles d'erreur de dispositifs quantiques (src/quantum_devices.rs)#
Un lieu unique qui expose les dispositifs de PNT quantique que le démonstrateur compare — horloges optiques / à ions piégés / à ions de mercure, horloges de référence classiques, interféromètre à atomes froids et liaisons de transfert de temps — chacun sous forme de DeviceCard portant sa spécification principale et un enregistrement de représentativité. La plupart de la physique des dispositifs est réutilisée (stabilités d'horloge issues de holdover::QuantumClockClass et clock_state::ClockClass ; l'interféromètre à atomes froids issu de quantum_trade/crossover ; les liaisons optiques/RF classiques issues de timetransfer_adv). Le seul modèle réellement nouveau est la liaison de transfert de temps par intrication / photon unique, dont la précision de synchronisation est limitée par le bruit de grenaille : σ_t ≈ jitter/√(R·τ) en fonction du taux de coïncidences détectées R et de l'intégration τ, dégradée par une pénalité de comptage d'obscurité √(1 + dark/R) et plafonnée par une systématique irréductible.
La référence indépendante est constituée des coefficients publiés réutilisés d'horloge/CAI plus des identités de bruit de grenaille/perte en forme fermée. quantum_devices::tests : l'ordre de stabilité d'horloge réutilisé est sain (réseau optique < ions de mercure < CSAC en σ_y(1 s)) ; la précision de l'intrication s'améliore comme 1/√τ (une intégration × 4 divise σ par deux) lorsqu'elle est limitée par le bruit de grenaille ; le taux de coïncidences détectées chute d'un facteur 10 par 10 dB de perte de liaison ; les comptages d'obscurité dégradent la précision de façon monotone ; le plancher systématique borne la précision par le bas ; chaque fiche de dispositif est un enregistrement de représentativité valide et modélisé.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Bibliothèque de modèles d'erreur de dispositifs quantiques | modelled |
src/quantum_devices.rs DeviceCard, quantum_clock_card/classical_clock_card, EntanglementTimeLink. Référence indépendante : InternalConsistency — coefficients publiés d'horloge/CAI réutilisés + identités de bruit de grenaille/perte en forme fermée pour la liaison par intrication. Tests (quantum_devices::tests) comme ci-dessus. Portée honnête : les paramètres de dispositifs d'horloge/CAI sont réutilisés des modèles à coefficients publiés existants du moteur ; le modèle de liaison par intrication est MODELLED à partir du comportement publié de synchronisation d'horloges quantiques avec des valeurs illustratives de taux de paires/rendement/perte de source publique — il n'est pas validé par rapport à une liaison mesurée, et le matériel réel de source/canal/détecteur est un écart avant le vol déclaré. |
Synchronisation quantique de confiance — chaîne de bout en bout, diffusion sécurisée, anomalie + compromis (src/timetransfer_chain.rs)#
Le scénario quantum-time-transfer compose la chaîne de synchronisation temporelle dont a besoin un démonstrateur de PNT quantique : un budget de temps utilisateur de bout en bout (erreur de marche libre de l'horloge de référence et précision de synchronisation de la liaison combinées en quadrature) pour une chaîne quantique (horloge à réseau optique + liaison par intrication/photon unique) contre une chaîne classique (CSAC + liaison bidirectionnelle RF) ; un niveau de protection temporel (TPL, réutilisé de tpl) bornant l'erreur de temps non détectée ; une figure de mérite de sécurité contre les attaques par retard/rejeu 1 − P_md à un taux de fausse alarme énoncé (réutilisée de detection) ; une probabilité de détection d'anomalie d'horloge + latence de détection de changement par CUSUM (somme cumulée) ; et la comparaison quantique contre classique sous forme de qtrade::TradeEvidence honnête portant un enregistrement de représentativité + d'écarts avant le vol.
La référence indépendante est un budget en quadrature en forme fermée sur des noyaux réutilisés et validés séparément (ADEV par rapport à Stable32/NIST ; la borne TPL ; detection::analytic_pd/analytic_pmd). timetransfer_chain::tests : la précision quantique s'améliore avec le temps d'intégration ; la chaîne quantique peut gagner et peut perdre sur la FoM de précision (honnête — pas une victoire universelle ; une liaison très perdante inverse le résultat) ; le niveau de protection est fini et positif ; la FoM de sécurité est dans [0 1] et croît avec le retard de l'attaque ; la probabilité de détection d'anomalie est monotone en l'amplitude du défaut ; et la preuve du compromis est internement honnête (is_honest()).
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Synchronisation quantique de confiance (chaîne + diffusion sécurisée + anomalie + compromis) | modelled |
src/timetransfer_chain.rs QuantumTimeTransferScenario/Report, to_svg ; kind="quantum-time-transfer". Référence indépendante : InternalConsistency — budget en quadrature en forme fermée sur des noyaux validés réutilisés (ADEV/Stable32-NIST, borne TPL, Pd/Pmd analytiques de détection) ; honnêteté liée au registre de représentativité. Tests (timetransfer_chain::tests) comme ci-dessus. Portée honnête : les paramètres d'horloge/liaison sont illustratifs, de source publique ; la liaison par intrication est le modèle MODELLED limité par le bruit de grenaille issu de quantum_devices ; cela modélise la classe de systèmes de synchronisation de confiance — il n'est pas validé par rapport à une liaison de bout en bout mesurée, et le matériel réel d'horloge/liaison/canal spatial est un écart avant le vol déclaré ; aucun TRL, héritage de vol ni certification n'est revendiqué. |
Navigation quantique sans GNSS (src/quantum_nav_od.rs)#
Le scénario quantum-gnss-free-nav compare la navigation à l'estime pendant une interruption du GNSS avec un budget inertiel quantique (un accéléromètre à interféromètre à atomes froids, réutilisé de inertial::quantum_imu/quantum_trade, dont le plancher de bruit blanc du CAI est validé à ~2 ordres de grandeur près de Freier et al. 2016) face à un INS classique de qualité navigation. Il rapporte la croissance de l'erreur de position pendant la marche libre, la durée de holdover jusqu'à un seuil de position, et le compromis quantique contre classique sous forme de qtrade::TradeEvidence honnête. L'observabilité est énoncée honnêtement : sans point externe pendant l'interruption, le biais de l'accéléromètre est inobservable, de sorte que l'erreur de position croît sans borne (≈ ½·biais·t² plus un terme de marche aléatoire de vitesse) ; un capteur quantique à biais plus faible ralentit cette croissance mais ne comble pas l'écart — seul un point externe le fait.
La référence indépendante est constituée des budgets inertiels réutilisés (QuantumNavBudget/ClassicalInsBudget, qui implémentent tous deux le trait PositionDrift) plus des identités de dérive en forme fermée. quantum_nav_od::tests : le budget quantique bat le classique sur une longue interruption (erreur plus faible, holdover plus long) ; l'erreur croît avec la durée de l'interruption pour les deux (l'écart d'observabilité) ; l'avantage dépend de l'interruption, ce n'est pas un facteur de gain constant (la courbe quantique est dominée par le bruit en marche libre courte, par le biais en marche libre longue) ; la preuve du compromis est internement honnête.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Navigation quantique sans GNSS | modelled |
src/quantum_nav_od.rs QuantumNavOdScenario/Report, to_svg ; kind="quantum-gnss-free-nav". Référence indépendante : InternalConsistency — budgets inertiels réutilisés (CAI validé par réutilisation à ~2 ordres de grandeur près de Freier 2016 ; dérive classique en forme fermée) ; honnêteté liée au registre de représentativité. Tests (quantum_nav_od::tests) comme ci-dessus. Portée honnête : une comparaison de budgets statiques de navigation à l'estime, et non un filtre dynamique sur des trajectoires réelles ; le biais inobservable sans point est énoncé ; les paramètres de dispositifs sont illustratifs, de source publique ; modélise la classe de la navigation quantique sans GNSS — le matériel réel d'IMU à atomes froids, une plateforme dynamique et l'environnement de vol sont des écarts avant le vol déclarés ; aucun TRL/vol/certification revendiqué. |
Détection de défauts / d'anomalies pour les systèmes PNT quantiques (src/quantum_faults.rs)#
Le scénario quantum-anomaly-detect définit un catalogue étiqueté de défauts du PNT quantique (saut de fréquence d'horloge, dérive, perte d'accrochage ; saut de biais de capteur, perte de signal), note une statistique de détection sur des fenêtres nominales contre défaillantes, et rapporte la discrimination du détecteur sous forme d'AUC ROC et de défaut minimal détectable à un taux de fausse alarme fixé. L'angle quantique contre classique : une référence d'horloge quantique plus stable abaisse le bruit σ du moniteur, de sorte qu'elle détecte des défauts plus petits — émis sous forme de qtrade::TradeEvidence honnête avec un enregistrement de représentativité.
La référence indépendante est une AUC en forme fermée pour la statistique de détection gaussienne (nominale N(0,σ), défaut N(μ,σ) ⇒ AUC = Φ(μ/(σ√2))) contrôlée par rapport à eval_stats::bootstrap_auc_ci, validé en externe (validé par rapport à scikit-learn), et aux seuils analytiques de detection. quantum_faults::tests : l'AUC analytique concorde avec les valeurs connues (0,5 à μ=0, →1 pour de grands μ/σ, monotone) ; l'IC d'AUC par bootstrap empirique encadre la forme fermée ; le moniteur quantique a une AUC plus haute et un défaut minimal détectable plus petit ; l'avantage disparaît pour des défauts énormes (les deux détectent parfaitement — pas une marge universelle) ; le catalogue a cinq classes étiquetées ; le compromis est internement honnête.
| Capacité | État | Référence indépendante / portée honnête |
|---|---|---|
| Détection de défauts/d'anomalies pour le PNT quantique | modelled |
src/quantum_faults.rs FaultKind, QuantumAnomalyScenario/Report, analytic_auc, min_detectable_fault ; kind="quantum-anomaly-detect". Référence indépendante : InternalConsistency — AUC gaussienne en forme fermée contrôlée par rapport à l'AUC par bootstrap de eval_stats, validée en externe (par rapport à scikit-learn), et aux seuils analytiques de detection. Tests (quantum_faults::tests) comme ci-dessus. Portée honnête : la statistique de détection est un modèle gaussien, et non de la télémétrie réelle ; le catalogue de défauts est synthétique étiqueté ; les niveaux de bruit des moniteurs quantique/classique sont illustratifs, de source publique ; modélise la classe de la détection d'anomalies du PNT quantique — la télémétrie matérielle réelle avec étiquettes de vérité terrain est un écart avant le vol déclaré ; aucun TRL/vol/certification revendiqué. |
Respect des normes — formats d'échange, bilan de liaison et intégrité (contrôles par référence indépendante externe)#
Ces normes sont validées en retrouvant les exemples détaillés / valeurs de référence verbatim publiés dans les normes elles-mêmes (ou dans une implémentation de référence indépendante), et non par l'aller-retour propre de Kshana. Retrouver l'exemple d'annexe d'une norme est le contrôle de respect de la norme le plus fort disponible pour un analyseur de format d'échange.
| Norme | État | Référence indépendante externe |
|---|---|---|
| CCSDS OEM (502.0-B Orbit Data Messages) | validated |
tests/ccsds_reference.rs : parse_oem retrouve les époques exactes et les vecteurs d'état X/Y/Z/Ẋ/Ẏ/Ż de l'exemple OEM KVN de la CCSDS 502.0-B-3, annexe G §G6, figure G-11 (« OEM Example with No Acceleration, No Covariance », p. G-10) — les deux segments d'éphéméride, y compris les valeurs sources à zéro initial (-063.042). Le jeu de test tests/fixtures/ccsds/oem_502_b3_figG11.oem est reproduit caractère pour caractère à partir du Blue Book officiel (les marqueurs éditoriaux « < intervening data records omitted here > », qui ne sont pas des enregistrements OEM valides, ne sont pas inclus). |
| CCSDS TDM (503.0-B Tracking Data Message) | validated |
tests/ccsds_reference.rs : TdmFile::parse retrouve les 41 enregistrements RANGE (premier 3198,03679519614 km, dernier 3270,46440460551 km) et les métadonnées de l'exemple TDM KVN de la CCSDS 503.0-B-2, annexe E, figure E-9 (« Range Data with TIMETAG_REF=TRANSMIT », p. E-9). Le jeu de test tests/fixtures/ccsds/tdm_503_b2_figE9.tdm est verbatim du Blue Book. (C'est la référence indépendante du Blue Book publié, à côté de l'aller-retour reference.tdm écrit à la main préexistant dans src/ccsds_tdm.rs.) |
| CCSDS 133,0 (Space Packet Protocol) | validated |
src/space_packet.rs primary_header_matches_published_independent_test_vectors : l'encodeur reproduit les vecteurs de test de l'en-tête primaire au niveau de l'octet de la bibliothèque spacepackets indépendante (us-irs/spacepackets-py, tests/ccsds/test_space_packet.py) — p. ex. 18 02 40 34 00 16 et le cas tout-maximum 1F FF FF FF FF FF — plus le cas canonique de télémesure (TM) tout à un, chacun ayant fait l'aller-retour par le décodage. Largeurs/ordre des champs de bits selon la CCSDS 133.0-B-2 §4.1.3. |
| CCSDS 401 / DSN (bilan de liaison, DSN 810-005) | validated |
src/linkbudget.rs link_equation_reproduces_descanso_galileo_dct : la chaîne FSPL (perte en espace libre) et C/N₀ reproduit le tableau de contrôle de conception de télémesure de l'espace lointain publié par J. H. Yuen (éd.), Deep Space Telecommunications Systems Engineering (DESCANSO/JPL (DESCANSO : Deep Space Communications and Navigation Systems Center of Excellence) Pub. 82-76), tableau 1-1 — la liaison descendante Galileo en bande X (8420,43 MHz) à 6,37 UA : perte en espace libre 290,54 dB (<0,05 dB) et Pr/N₀ = 54,6 dB-Hz reçu (<0,2 dB). Les centres de bande se situent à l'intérieur des allocations de liaison descendante de l'espace lointain DSN/CCSDS-401 (DSN 810-005 module 201). Les paramètres de mission par défaut restent représentatifs (pas un transpondeur étalonné) ; c'est l'équation de liaison que cela fixe. |
Normes GNSS — statut de la référence indépendante externe et écarts restants, en toute honnêteté :
| Norme | Statut et réserve honnête |
|---|---|
| RAIM / ARAIM | Noyau, géométrie et niveau de protection ARAIM validés en externe. Le noyau de détection — le seuil de détection de défaut en χ², la non-centralité de non-détection en χ² non central et les multiplicateurs K de loi normale — reproduit SciPy (tests/raim_reference.rs, 171 cas, ≤ 1e-6 rel), et la géométrie qui l'enveloppe reproduit gnss_lib_py (DOP). La valeur du niveau de protection (PL) ARAIM est maintenant elle aussi fixée : par rapport à l'« exemple numérique LPV-200 (LPV : performance du localisateur avec guidage vertical) » de l'ADD (Algorithm Description Document) de référence ARAIM v3.1 du WG-C (WG : Working Group), src/araim_reference.rs / tests/araim_reference_vectors.rs donnent VPL 18,2926 m contre 18,3 m, HPL 13,4063 m contre 13,45 m et σ_v,acc 1,3694 m contre 1,3694 m, dans la propre TOL_PL = 0,05 m de la référence (le type araim-reference-check). Portée : modes de défaut jusqu'à un satellite ou une constellation (N_fault,max = 1) ; les sous-ensembles de défauts à événements multiples et l'exclusion ne sont pas implémentés, et le RAIM classique n'a toujours aucun vecteur de test publié canonique entrée→HPL. Voir ARAIM_REFERENCE.md. |
| SBAS / DO-229E | Algorithme de niveau de protection maintenant validé en externe. Étant donné (él, az, σ) par satellite, le sbas_protection_level de kshana reproduit la variante RTKLIB SBAS-PL (zsiki/rtklib_ws waasprotlevels(), Siki & Takács 2017, « DO-229D Appendix J ») — alimentée avec le propre σ de cet outil, calculé à partir de messages diffusés EGNOS réels + RINEX BUTE réel — à < 2e-3 m de HPL sur 6 époques (tests/sbas_reference.rs) ; ESA gLAB v6.0.0 (core/filter.c) a confirmé la même convention. Les facteurs K (K_H,PA=6.0, K_V=5.33, K_H,NPA≈6.18) concordent avec DO-229E Appendix J. Ce qui est validé et ce qui ne l'est pas : cela fixe l'algorithme du PL (σ en entrée → HPL/VPL en sortie) ; la modélisation amont du σ à partir des messages bruts UDRE/GIVE est hors de la portée de kshana — c'est là que des outils indépendants de chaîne complète divergent encore de plusieurs mètres sur des données réelles. K_V mis en correspondance à la valeur arrondie de 5,33 de la référence indépendante (la valeur exacte Φ⁻¹(1−5e-8)=5.3267 de kshana → VPL ~0,06 % plus petit ; la verticale est validée sans facteur K sous la forme d_U). |
| IONEX / Klobuchar | Modèle diffusé validé en externe. Le modèle Klobuchar L1 reproduit le ionmodel de RTKLIB (tests/klobuchar_reference.rs, < 1e-4 m) — une parité d'implémentation avec la référence ouverte de fait, puisqu'il n'existe aucun exemple détaillé officiel de vérité mesurée. Le lecteur de cartes TEC IONEX existe maintenant (src/ionex.rs, testé unitairement) ; l'écart restant est un contrôle croisé de celui-ci par rapport à un véritable produit GIM, et non le modèle diffusé. Voir les lignes Klobuchar dans Affirmations et réalité. |
| Code d'étalement GPS L1 C/A (IS-GPS-200) | Génération du code validée en externe. src/sdr.rs (ca_first_ten_chips_match_is_gps_200_octal) : le générateur de code C/A à LFSR (registre à décalage à rétroaction linéaire) G1/G2 reproduit exactement les attributions de phase de code publiées dans IS-GPS-200 tableau 3-Ia — l'octal des dix premiers chips pour les PRN (bruit pseudo-aléatoire) 1–9 ({1440, 1620, 1710, 1744, 1133, 1455, 1131, 1454, 1626}). Cela fixe la séquence de chips du code d'étalement par rapport à la spécification d'interface du GPS ; les éléments environnants de modulation, de séparation spectrale et de poursuite de code par DLL (boucle à verrouillage de délai) (navsignal) restent MODELLED. |
Synchronisation temporelle pour les réseaux, le spectre, le système solaire, les constellations, les campagnes et le LEO-PNT#
Les capacités ajoutées dans la ligne 0,28 sont notées ligne par ligne dans le VERIFICATION-MATRIX.md généré ; cette section résume lesquelles portent une référence indépendante externe. Une ligne n'est VALIDATED qu'avec une référence indépendante externe ; tout le reste est MODELLED.
| Capacité (type) | État | Référence indépendante externe, ou pourquoi elle reste modélisée |
|---|---|---|
MTIE (erreur maximale d'intervalle de temps) et TDEV (écart de temps) télécoms sur une série de holdover (telecom-timing) |
validated |
tests/telecom_timing_reference.rs : 17 facteurs de moyennage MTIE et 12 facteurs TDEV sur une série de holdover d'horloge à l'échelle d'une puce de 2 048 échantillons versée, par rapport à allantools 2024,06, à < 1e-12 / < 1e-9 en valeur relative. Les verdicts de gabarit de l'UIT-T (Union internationale des télécommunications, Secteur de la normalisation des télécommunications) PASS/FAIL et les préréglages d'oscillateurs de fiches techniques restent MODELLED. Voir TELECOM-TIMING.md. |
Prédiction de holdover à partir d'un enregistrement d'horloge mesuré (slot-timing) |
validated |
tests/slot_timing_cs5071a_holdout.rs : ajustement sur le premier tiers de l'enregistrement réel d'horloge au césium 5071A, prédiction de l'instant de dépassement à un sigma pour six seuils, mesure sur les deux tiers réservés ; seuil d'un facteur 1,5 dans un sens comme dans l'autre, rapports observés de 0,84 à 1,03. Le budget de garde de créneau et la cadence de correction construits dessus restent MODELLED. |
Densités spectrales de puissance en bande L en forme fermée et séparation spectrale (spectrum) |
validated |
Formes fermées de navsignal par rapport aux valeurs publiées (ligne de la matrice « Closed-form L-band signal power spectral densities… »). La cascade avec J/S (rapport brouilleur/signal) par bande et C/N0 (densité de rapport porteuse/bruit) effectif, ainsi que l'entrée/sortie SigMF (Signal Metadata Format), restent MODELLED. |
Positions des planètes à partir des éléments de Standish du JPL (Jet Propulsion Laboratory), et temps de lumière entre corps (solar-system) |
validated |
0,30, préenregistré par rapport à JPL Horizons (DE441) : tests/solar_system_standish_preregistered.rs et tests/solar_system_standish_earth_icrf_preregistered.rs, RMS par planète et par composante au plus égale à la valeur du tableau 8.10.1 de l'Explanatory Supplement (pire cas 0,778), scission de la Terre et rotation ICRF incluses ; tests/solar_system_light_time_solver_preregistered.rs, le solveur de temps de lumière sur les positions DE441 à 1e-6 s du temps de lumière d'Horizons (pire cas 6.7e-9 s). La comparaison antérieure à deux fois le nominal (tests/solar_system_horizons_reference.rs), dont le seuil a été fixé après la première comparaison, est conservée comme non-régression sans valeur bloquante. Uranus/Neptune du tableau 1, Pluton, les lunes, les constantes de corps et body-pnt restent MODELLED. |
Géométrie Walker et créneaux publiés du GPS, de Galileo et de GLONASS (GLObal NAvigation Satellite System) ; dilution de précision globale du GPS (constellation-design) |
validated |
constellation::tests : Walker 24/3/1 reproduit le tableau de définition du service ouvert de Galileo à 1e-9°, la formule de créneau du document de contrôle d'interface de GLONASS, les passages équatoriaux du GPS ; la médiane de HDOP de référence du GPS 0,940 par rapport au 0,94 de la norme de performance du service de positionnement standard. Les cartes de couverture multi-constellation arbitraires autour de n'importe quel corps restent MODELLED. |
Campagnes : missions enchaînées, balayages, ensembles Monte Carlo, exécutions à conditions partagées (campaign) |
modelled |
tests/campaign_composition_reference.rs (11 tests) : une campagne à une phase reproduit l'exécution autonome octet pour octet, un balayage à un nœud lit le même nombre, un ensemble à graine fixe est stable à l'octet. Des identités de composition, et non une référence indépendante externe. |
| Physique de liaison LEO (orbite terrestre basse) : coefficients de pluie P.838 de l'UIT-R (Secteur des radiocommunications de l'UIT), affaiblissement par la pluie et scintillation P.618, perte d'entrée dans les bâtiments P.2109, ionosphère au premier ordre, Doppler maximal | validated |
tests/leo_link_reference.rs, tests/leo_doppler_reference.rs : les propres tableaux des Recommandations de l'UIT-R et les exemples de validation de la Commission d'études 3 (versés avec leur source et leur date de récupération), le rapport de retard de groupe de l'IS-GPS-200 pour l'ionosphère, et le tableau publié de Doppler maximal de Leclere, Marathe et Reid (ION GNSS+ 2025, arXiv 2509,19551). |
Message de navigation LEO : l'algorithme utilisateur d'éphéméride diffusée de l'ICD (document de contrôle d'interface) de Galileo, le CRC-24Q (contrôle de redondance cyclique sur 24 bits), les pondérations SISRE (erreur de distance du signal dans l'espace) en moyenne globale (leo-navmsg) |
validated |
tests/leo_navmsg_reference.rs : l'algorithme utilisateur de Galileo reproduit RTKLIB (une bibliothèque libre de positionnement cinématique en temps réel) à 1 mm près sur quatre véritables éphémérides diffusées de Galileo ; le CRC-24Q donne la valeur de contrôle de catalogue 0xCDE703 et les octets de contrôle de la trame d'exemple RTCM (Radio Technical Commission for Maritime Services) 1005 ; les pondérations SISRE reproduisent le tableau publié MEO/GEO. L'ajusteur, la mise à jour en cours de passage, le codage binaire, le texte de type RINEX-4/CSV (valeurs séparées par des virgules) et les modèles d'éphéméride sélectionnables restent MODELLED. |
Conception de signal LEO, passage et bilan de liaison, Doppler et positionnement conjoint GNSS+LEO, convergence PPP (positionnement précis par point), positionnement 5G NTN (réseau non terrestre), transfert de temps LEO (leo-signal, leo-pass, leo-pvt, leo-ppp, ntn-positioning) |
modelled |
tests/leo_signal_reference.rs, tests/leo_fusion_scenarios.rs : formes fermées, cohérence des filtres (par exemple le NEES moyenné sur les exécutions du filtre PPP à l'intérieur de sa bande à 95 %) et comparaisons de tendances publiées ; aucune donnée de terrain. |
Un système LEO-PNT de bout en bout (leo-pnt-chain) |
modelled |
tests/leo_pnt_chain.rs : chaque valeur transmise est égale à la propre sortie de l'étage amont, et modifier une entrée amont déplace chaque chiffre aval qui en dépend. |
| Résilience et verticaux LEO (leurrage par Doppler et par cohérence inter-bandes, sondage de l'ionosphère) | modelled |
tests/leo_resilience_verticals.rs (10 tests). Les scénarios de résilience et de verticaux sont listés dans RESILIENCE-CROSSWALK.md. |
Les sorties qui sont des rendus, et non des preuves, ont des tests mais pas de ligne de matrice : les exports d'échange (CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, éphéméride STK (Systems Tool Kit), SigMF (Signal Metadata Format)), chacun ré-analysé par un validateur écrit à partir de la spécification du format (tests/interop_formats.rs, 13 tests ; voir INTEROP.md) ; les animations (tests/animation.rs : réexécutions identiques à l'octet, nombres d'images exacts, SVG (Scalable Vector Graphics) bien formé, aucune adresse externe dans le lecteur HTML (HyperText Markup Language)) ; et le rapport d'exécution (tests/advanced_report.rs, tests/advanced_report_cli.rs : chaque scénario fourni produit un rapport sans section vide ni valeur de substitution, les étiquettes concordent avec la matrice, et la commande enregistrée reproduit result.json et le rapport octet pour octet).
Domaine de fonctionnement#
Chaque paquet est exercé sur son domaine d'entrée déclaré par tests/scenario_coverage.rs, qui affirme que chaque sortie numérique est finie (ni NaN ni Inf (NaN : not a number)) et bornée. Le tableau liste la plage d'entrée testée par paquet, le comportement de sortie attendu et le test qui la couvre.
| Paquet | Entrée balayée | Plage testée | Sortie attendue | Test de couverture |
|---|---|---|---|---|
| clock | threshold_ns (spécification de temps) |
1 – 500 ns | FoM de holdover/synchronisation/sécurité finies | clock_pack_covers_the_spec_threshold_envelope |
| inertial | accel.bias |
1e-7 – 1e-2 m/s² (atomes froids → MEMS (systèmes micro-électromécaniques) bruts) | RMS/p95 de position finis et bornés | inertial_pack_covers_the_accel_bias_envelope |
| orbit | mask_deg (masque d'élévation) |
5° – 30° | DOP/disponibilité finis ; borné | orbit_pack_covers_the_elevation_mask_envelope |
| spoof | attack.rate_ns_per_s |
0,1 – 50 ns/s | P_md / sécurité finis, bornés | spoof_pack_covers_the_attack_rate_envelope |
| hybrid | position_spec_m |
10 – 1000 m | holdover de synchronisation/position fini | hybrid_pack_covers_the_position_spec_envelope |
| orbite (réelle) | vrais TLE gps-ops de Celestrak |
instantané de 30 satellites, somme de contrôle stricte | ne se charge qu'avec des sommes de contrôle valides ; géométrie bornée | real_gps_constellation_scenario_loads_with_valid_checksums_and_bounded_output |
| horloge (scintillement) | flicker_floor activé/désactivé |
0 contre 1e-12 | activer le plancher en 1/f aggrave la marche libre du p95 de synchronisation | flicker_fm_floor_degrades_the_clock_holdover_when_enabled |
| fusion (réalisme) | accel.bias 0 contre 5.88e-7 m/s² |
zéro contre non nul réaliste | le filtre converge toujours, à 3× près de l'erreur à biais nul | fusion_filter_converges_with_a_realistic_non_zero_bias |
Les lignes FM de scintillement et biais de fusion comblent deux écarts précis de réalisme : les termes de bruit sont désactivés par défaut mais affectent manifestement la sortie lorsqu'ils sont activés, et le filtre de fusion conjoint ne dépend pas de biais mis à zéro — il converge aussi avec un biais résiduel réaliste de qualité atomes froids.
Limites connues#
- Les exécutions quantiques et classiques utilisent maintenant des graines de RNG (générateur de nombres aléatoires) indépendantes (graine classique = graine + 0x9e3779b97f4a7c15) afin que leurs réalisations de bruit soient décorrélées — corrigé après relecture.
holdover_stient compte des segments : les lignes de temps d'interruption sont découpées en segments contigus aux réacquisitions du GNSS et la valeur rapportée est la marche libre du pire cas (la plus courte) parmi eux. Elle reste bornée par la résolution de la grille de temps (une borne inférieure).- La resynchronisation par transfert de temps ISL modélise l'incertitude résiduelle de la liaison comme une gigue fraîche à moyenne nulle par pas de mesure plus un réancrage à l'intervalle configuré.
Affirmations et réalité — référence rapide#
La liste de contrôle d'un évaluateur hostile. Pour chaque terme qui pourrait être lu comme plus qu'il n'est : ce que Kshana fait aujourd'hui, et où se situe la vraie version dans la feuille de route.
| Terme que vous pouvez rencontrer | Ce que c'est réellement aujourd'hui | Ce que ce n'est pas (encore) |
|---|---|---|
| « simulateur PNT hybride quantique/classique » | un simulateur stochastique classique piloté par des coefficients publiés d'Allan/de bruit de capteurs quantiques | de la physique quantique à partir des premiers principes (phase de Mach–Zehnder, bruit de projection, systématiques) — voir QUANTUM-MODELS.md |
| « fusion de Kalman conjointe » / paquet de fusion | le paquet fusion exécutable observe l'horloge et la position séparément (un point de temps direct et un point de position direct), pour lesquels l'estimateur optimal est véritablement bloc-diagonal — deux filtres à deux états avec une FoM combinée |
un filtre couplé pour le cas de la pseudodistance existe maintenant sous le nom fusion::coupled::CoupledPntFilter ([pos,vel,phase,freq] empilé à 4 états, covariance inter-blocs non nulle, validé par NEES) mais n'est pas encore raccordé au paquet exécutable, et le paquet est à 1 DDL (un degré de liberté) — l'extension 3D à 8 états relève de travaux futurs |
FoM de sécurité (type spoof) |
1 − P_md d'un détecteur stochastique de leurrage temporel : un test bilatéral χ²₁ / Neyman–Pearson sur une statistique de moniteur assistée par l'horloge, seuil fixé à partir d'un P_fa cible, P_md évalué à l'amplitude de la spécification à la fois en forme fermée et par Monte-Carlo (qui concordent à quelques ×1/√N près) |
un détecteur RAIM/ARAIM multisatellite — voir INTEGRITY.md ; la statistique du moniteur est un modèle gaussien avec le σ dérivé de la DSP de l'horloge, et non une corrélation au niveau du signal |
| « détection de leurrage assistée par l'horloge » | un moniteur d'écart de temps à horloge unique (statistique gaussienne, σ issu de la DSP de l'horloge), PAS un RAIM multi-SV (SV : space vehicle, c'est-à-dire un satellite) | RAIM multi-SV dans le domaine des distances avec niveaux de protection |
| P_md du détecteur de leurrage (forme fermée contre Monte-Carlo) | le P_md analytique fondé sur Φ et l'estimation empirique sur mc_runs essais concordent à l'erreur d'échantillonnage près (≈ 1/√N) ; validé dans les tests de src/spoof.rs / src/detection.rs à une déflexion sollicitée (μ/σ = 2) |
une ROC de détecteur mesurée par rapport à des données de leurrage enregistrées |
modèle de pseudodistance gnss-sim |
une simulation directe : ρ = geometric + clocks + Klobuchar iono + Saastamoinen·Niell tropo + noise + multipath. Chaque modèle d'atmosphère est testé unitairement par rapport à des valeurs calculées à la main (ZHD (retard hydrostatique zénithal) ≈ 2,3 m, Niell = 1 au zénith, obliquité de Klobuchar), et le modèle diffusé complet de Klobuchar est contrôlé de façon croisée par rapport à l'implémentation de référence ionmodel() de RTKLIB au niveau sub-millimétrique (klobuchar_agrees_with_rtklib_reference_implementation, 6,1278 m pour le cas à coefficients par défaut de RTKLIB — aucun vecteur de test officiel publié de Klobuchar n'existe ; il s'agit donc d'une parité d'implémentation, et non d'une vérité mesurée) ; une exécution sans bruit reproduit la géométrie + les corrections au niveau sub-millimétrique (résidu RAIM ≈ 0) |
une solution de position à partir de signaux réels (PPP/RTK (PPP : positionnement précis par point)), combinaison bifréquence sans ionosphère, ou résolution d'ambiguïté de la phase de la porteuse — non modélisé |
modèle de brouillage (type jamming) |
une chaîne de bilan de liaison : J/S à partir de la perte en espace libre + du gain d'antenne par direction → C/N₀ effectif par l'équation antibrouillage (gain d'étalement × Q de séparation spectrale) → perte d'accrochage à un seuil (Kaplan & Hegarty §9,4) |
trajets multiples, dynamique de l'AGC (commande automatique de gain) dans le temps, la recherche d'acquisition elle-même (l'hystérésis facultative [acquisition] est une paire de seuils) ; la perte de quantificateur facultative [front_end] est celle d'une entrée gaussienne, non valable pour un brouilleur CW ; le réseau facultatif [crpa] est à bande étroite et idéal (sans couplage ni désadaptation), et l'ombrage facultatif [terrain] est un seul tranchant sur une seule tuile SRTM ; Q est une constante représentative par type, non dérivée de la DSP mesurée du brouilleur |
| FoM d'intégrité (paquets d'horloge/holdover) | auto-cohérence du filtre (fraction des échantillons d'interruption à l'intérieur de sa propre borne k·σ) | HPL/VPL, risque d'intégrité / P_HMI, limites d'alerte, DO-229E/316/ED-259A — ils sont rapportés séparément par le type integrity (RAIM / ARAIM) et les fonctions SBAS, jamais intégrés à cette FoM |
FoM du paquet de scénario inertial hérité |
un budget d'erreur d'accéléromètre/gyroscope à axe unique (1 DDL) (VRW/ARW, instabilité de biais) avec une réinitialisation à la vérité | le paquet hérité est à 1 DDL ; le chemin à 3 axes est livré dans le paquet gnss-ins (ligne suivante) |
bibliothèque strapdown à 3 axes + paquet gnss-ins (src/inertial/, src/fusion/pack.rs) |
un navigateur quaternion/NED (NED : nord-est-bas) vérifié avec un modèle d'erreur d'IMU déterministe — facteur d'échelle, désalignement, sensibilité à g, quantification, rampe de vitesse modélisés (IEEE Std 952-1997 §A.2 ; Groves 2013 §4,3) — maintenant piloté par le paquet de scénario gnss-ins et configurable par capteur depuis le TOML (Tom's Obvious Minimal Language, le format des scénarios) ([imu_*.error_model]) |
non modélisés : erreur de redressement des vibrations, dérive due au gradient de température. L'erreur de marche libre fusionnée est plafonnée par l'erreur d'attitude au passage de relais (inclinaison/biais d'accéléromètre faiblement séparables) ; un étalonnage par biais n'est donc pas revendiqué |
« Intégration PNT hybride » (paquet hybrid) |
navigation à l'estime en boucle ouverte encadrée par des réinitialisations GNSS à la vérité | un mélange de Kalman GNSS–INS couplé (lâche/serré) — c'est le paquet distinct gnss-ins (EKF) et le type hybrid-ukf |
| « Performance de positionnement » (paquets d'horloge) | RMS de synchronisation de phase d'horloge en ns (timing_rms_ns) |
une exactitude dans le domaine de la position en RMS/CEP/SEP/pondérée par le DOP (SEP : erreur sphérique probable) |
FoM de position inertielle (pos_rms_m) |
une RMS/p95 de position à axe unique en mètres, à partir d'une seule graine sauf si runs = N demande un ensemble (alors moyenne, dispersion et intervalle de confiance bootstrap à 95 % par métrique) |
une distribution d'ensemble CEP / 2DRMS (deux fois la RMS de distance) (feuille de route : CEP par Monte-Carlo) |
| « validé à ~2 % » | un accord observé typique ; le seuil appliqué est une erreur relative de 20–25 % | une borne d'exactitude garantie de 2 % |
| « reproductible / identique au bit près » | réexécution identique au bit près sur le même OS (système d'exploitation) + chaîne d'outils figée ; sous Linux, macOS et Windows, la CI contrôle un SHA-256 versé de l'empreinte d'entrée et de la forme de chaque résultat (tests/cross_platform_golden.rs) et les valeurs numériques à 1e-6 (tests/golden.rs) |
un résultat complet identique à l'octet d'un système d'exploitation à l'autre (différences de libm au dernier chiffre) |
Scénario SGP4 GPS (orbit-sgp4-gps.toml) |
un véritable instantané gps-ops de Celestrak (2021-07-28, 30 satellites, sommes de contrôle strictes), chaque satellite propagé à partir de sa propre époque TLE |
une constellation actuelle — actualisez l'instantané avec scripts/fetch_tles.sh (voir REAL_TLE_GUIDE.md) ; les numéros de catalogue NORAD (North American Aerospace Defense Command) sont les vrais |
Contrôles croisés de l'article sur le PNT lunaire (preuves de non-régression, et non lignes de matrice)#
La suite lunaire/cislunaire (les capacités « Lunar & cislunar » et « Lunar PNT suite » du README) voit ses affirmations d'articles publiés contrôlées de façon croisée et indépendante dans tests/validate_p*.rs, chacune par rapport à une référence indépendante issue d'une implémentation différente :
- empreinte orbitale d'émission/de capture par rapport à
scipy.special.j1(Bessel J1 de Cephes) ; - DOP de géométrie de balises de surface par rapport à une résolution
(HᵀH)⁻¹indépendante de NumPy ; - croissance de l'erreur de prédiction de persistance UT1/EOP par rapport à une ré-analyse NumPy des mêmes lignes
finals2000Averbatim de l'IERS ; - famille d'orbites rétrogrades lointaines planes par rapport à la Three-Body Periodic Orbit Database de la NASA/JPL ;
- budget de précision de télémétrie RF par rapport à une référence issue des premiers principes.
Les jeux de test et les scripts de génération de référence indépendante se trouvent sous tests/fixtures/{p1_footprint,lunar_service,eop_prediction,rf_ranging_precision,dro_family_jpl,p2_independent_dop}/. Ils renforcent la preuve derrière des capacités qui restent MODELLED dans la matrice contrôlée par machine (src/verification.rs) ; ce sont des contrôles de non-régression, et non de nouvelles lignes VALIDATED de la matrice, de sorte qu'ils ne modifient pas eux-mêmes le décompte de la matrice contrôlée par machine. Ce décompte n'est pas répété ici, car une copie saisie à la main dérive : la répartition en vigueur est l'en-tête généré de VERIFICATION-MATRIX.md, que gen_validation_artifacts écrit à partir de verification_matrix() et que tests/verification_artifacts_doc_sync.rs fige.