Le fil de mission
Logiciel à titre consultatif, et non un équipement de navigation certifié. Sources publiques seulement ; sans affiliation ni aval d'aucune agence, et rien ici ne revendique de conformité aux exigences d'un programme quelconque.
kind = "mission-thread" enchaîne des phases d'une mission, chacune d'un des huit types enregistrés avec ses propres capteurs et son propre filtre, et rapporte le budget d'erreur de navigation et de synchronisation de toute la chaîne : pour chaque phase, le 1-sigma de position, de vitesse et de biais d'horloge à l'entrée, au pic et à la sortie ; chaque contribution à celui-ci, avec son unité ; la marge par rapport à une exigence que vous déclarez ; le maillon le plus faible ; les événements datés ; et une figure chronologique. Chaque nombre est MODELLED : une entrée déclarée ou un modèle d'une entrée. Les seules lignes de références indépendantes externes se trouvent dans xval/mission-thread/ et disent ce qu'elles testent.
Exécutez l'exemple depuis une copie du dépôt (il lit une découpe versionnée du noyau de la Lune) :
kshana scenarios/mission-thread-artemis-class.toml
Le document#
kind = "mission-thread"
title = "..." # optional
seed = 20261024 # each phase's seed comes from it and the phase id
epoch_utc = "2028-01-01T00:00:00Z" # mission elapsed time counts from here
moon_kernel_path = "..." # optional JPL SPK cut with the Moon and the Earth (a file: refused by the MCP server)
[entry] # the first phase's entry state
frame = "gcrf"; x = [...] # six numbers, metres and metres per second
sigma_pos_m = 10.0; sigma_vel_mps = 0.01
timescale = "utc"; sigma_time_s = 1e-7; sigma_drift_s_per_s = 1e-12
[[phase]]
id = "ascent" # unique; names the phase in the report and seeds its noise
kind = "launch-ascent"
duration_s = 540.0
nav = ["gnss", "inertial"] # gnss | gnss-ssv | ground-tracking | lunanet | trn | inertial | relative-optical
time = "gnss" # gnss | ground-clock | lunar-time | onboard-holdover
frame = "mci" # optional: the frame this phase needs its entry in
timescale = "ltc" # optional: the clock timescale it needs
[phase.handover] # how this phase hands over to the next (default carry)
rule = "inflate"; q_acc = 1e-9; gap_s = 172800.0
[phase.requirement] # optional limits; the margin is the smallest limit over peak
max_pos_m = 50.0
[phase.model] # the kind's own parameters
Un document est refusé, et non deviné, lorsqu'un identifiant de phase se répète, qu'une liste nav est vide, qu'un nom est inconnu, qu'une clé de modèle n'est pas connue du type, qu'une clé de durée est en désaccord avec duration_s, ou qu'une phase énumère une source pour laquelle son modèle ne donne pas de nombres.
Ce que fait un transfert#
L'état transmis est la covariance 6x6 complète de [x, y, z, vx, vy, vz] en unités SI, l'horloge (biais, dérive et leur covariance, étiquetés avec une échelle de temps), le référentiel, le temps de mission et une étiquette de preuve. Un transfert ne réinitialise jamais une covariance.
| Règle | Ce qu'il fait |
|---|---|
carry |
transmet l'état sans changement |
inflate |
bruit d'accélération blanc de DSP q_acc sur gap_s avec un modèle en ligne droite ; la ligne énonce les deux |
reacquire |
estime pendant acquire_s, puis un axe est ramené au plancher de la source seulement là où le plancher est plus petit ; jamais en dessous du plancher, jamais une réinitialisation |
Référentiels et échelles de temps#
Le fil convertit au transfert, jamais à l'intérieur d'une phase, et chaque conversion est une ligne de budget à part. Référentiels : GCRF, MCI, MCMF (ITRF et LVLH sont refusés en indiquant la raison). Gcrf <-> Mci décale l'origine par l'état géocentrique de la Lune : l'état de niveau DE440 issu du noyau là où il couvre l'époque (substitut 5 m et 1 mm/s ; pire cas mesuré 2,6 m par rapport à JPL Horizons épinglé), sinon la série analytique avec ses 195,7 km RMS mesurés, que la ligne énonce ; un exemple lunaire doit donc porter un noyau couvrant son époque. Mci <-> Mcmf est la rotation sidérale moyenne avec les axes alignés à l'époque et sans libration. Les échelles de temps passent par TT : Utc <-> Tt exact, Tdb <-> Tt ajoute 14 us, Tt <-> Ltc utilise le taux séculaire de lunar_time avec sa bande de 56 à 59 us/jour comme incertitude de taux.
Les huit types de phase#
| Type | Segment | Ce qu'il fait | Paramètres |
|---|---|---|---|
launch-ascent |
Terre | ascension propulsée jusqu'à une orbite de stationnement : covariance à vitesse constante avec bruit d'accélération blanc, acquisition et évanouissement GNSS, holdover d'horloge | clés [phase.model] dans src/mission_thread/earth/launch.rs |
leo-rendezvous |
Terre | navigation relative sur des segments de capteur : transition de Clohessy-Wiltshire en LVLH, covariance de Kalman 6x6, fenêtre d'amarrage | ci-dessous |
tli-and-cruise |
Terre | poussée TLI et croisière cislunaire : propagation de Cowell, matrice de transition d'état aux différences finies, mises à jour gnss-ssv et de suivi au sol | ci-dessous |
entry |
Terre | croisière retour jusqu'à l'interface d'entrée ; sigma de l'angle de trajectoire, probabilité de corridor, décélération maximale, empreinte | ci-dessous |
lunar-orbit-rendezvous |
lunaire | navigation relative jusqu'à l'amarrage en orbite lunaire | mission-thread/lunar-phases.md |
lunar-descent |
lunaire | budget de dispersion à l'atterrissage sur un site polaire | identique |
lunar-surface |
lunaire | disponibilité du PNT et de la synchronisation temporelle en surface par site et par saison | identique |
lunar-ascent |
lunaire | ascension propulsée jusqu'à une orbite d'insertion | identique |
Les types lunaires sont aussi des types de scénario autonomes ; la conception et les preuves se trouvent dans MISSION-THREAD-LUNAR.md.
leo-rendezvous#
Le budget porte les sigmas relatifs ; la covariance absolue du chasseur est transmise telle quelle et une ligne le dit, parce que cette phase mesure les véhicules l'un par rapport à l'autre, et non par rapport à la Terre. La covariance relative de départ est la covariance absolue du chasseur plus les sigmas déclarés de la cible, additionnés comme s'ils étaient indépendants (prudent). Clés : target_alt_m, target_abs_sigma_pos_m, target_abs_sigma_vel_mps, capture_pos_m, capture_vel_mps, process_q_acc et min_window_s facultatives, et un ou plusieurs [[phase.model.legs]] avec range_m, end_range_m, duration_s, sensor (optical-camera, lidar ou rf-ranging, paramètres ILLUSTRATIVE dans src/mission_thread/sensors.rs) et interval_s ; les durées des segments s'additionnent à celle de la phase. La fenêtre d'amarrage est le temps écoulé depuis l'instant où le sigma relatif reste dans l'enveloppe de capture jusqu'à la fin de la phase. Les répétitions sont des phases séparées avec leurs propres identifiants.
tli-and-cruise#
L'état moyen est celui du propagateur de Cowell du moteur avec la gravité terrestre et J2, et le Soleil et la Lune comme corps tiers. La covariance traverse chaque segment step_s avec une matrice de transition d'état aux différences finies progressives (l'exécution nominale et six exécutions perturbées) et un bruit d'accélération blanc. La poussée est le long de la vitesse d'entrée, avec une fraction de taille et une erreur de pointage déclarées. Limite nommée : les découpes versionnées du noyau de la Lune contiennent la Lune mais non le Soleil, de sorte que le propagateur prend la Lune dans le noyau et le Soleil dans la série analytique (le terme de corps tiers du Soleil est insensible à l'erreur de cette série) ; la phase dit dans un événement laquelle elle a utilisée, et là où aucun noyau ne couvre un segment, elle utilise la série analytique pour les deux. La poussée n'est pas ciblée : l'état nominal est là où va la poussée déclarée, et les phases lunaires ne prennent que la covariance.
Mises à jour, utilisées seulement lorsque le document énumère la source : gnss-ssv (points de position avec disponibilité et PDOP issus du balayage du volume de service spatial du moteur le long d'une orbite terrestre osculatrice tenant lieu d'arc, un balayage par ssv_window_s ; sigma du point = PDOP médian multiplié par ssv_uere_m ; la forme à information attendue garde l'exécution déterministe) et ground-tracking (distance et vitesse radiale selon la direction géocentrique, de sorte que le plan du ciel n'est pas observé ; la variance de la mise à jour est divisée par le cycle de suivi). Clés : tli_dv_mps, tli_dv_sigma_fraction, tli_pointing_sigma_rad, step_s, clock_q_f, clock_q_d, process_q_acc facultative, ssv_uere_m, ssv_window_s, ssv_step_min, ssv_cn0_min_dbhz, ground_range_sigma_m, ground_range_rate_sigma_mps, ground_interval_s, ground_duty.
entry#
Le vol libre est celui de tli-and-cruise sans poussée, et se termine à l'interface d'entrée ; ses clés sont les clés de vol libre ci-dessus. À l'interface, la phase lit l'angle de trajectoire et son sigma à partir de la covariance complète, la probabilité que l'angle soit à l'intérieur d'un corridor déclaré, la décélération maximale à l'angle nominal et aux deux bords du corridor (l'entrée balistique plane du moteur à côté de la forme analytique d'Allen-Eggers) par rapport à une limite facultative, et l'empreinte : en distance à partir d'une sensibilité déclarée, en écart latéral à partir de la covariance à l'interface dans le plan transverse de l'orbite. Clés : interface_alt_m, ballistic_coeff_kg_m2, corridor_min_deg, corridor_max_deg, downrange_sensitivity_km_per_deg, flight_time_s, max_decel_g facultative, scale_height_m et start_state_gcrf (l'état de retour nominal, six nombres, lorsque la chaîne n'a pas de poussée trans-Terre pour en produire un). Rien ici ne modélise la portance, le guidage ou l'échauffement d'une capsule.
La superposition du réseau au sol#
Une table [ground_network] facultative donne des stations et l'élévation de suivi la plus basse ; pour chaque phase qu'elle nomme, le fil calcule la fraction de la phase qu'une station peut suivre et la transmet à la phase comme le cycle qui met à l'échelle sa cadence de mise à jour du suivi au sol. Géométries : entry-orbit (l'état d'entrée volé en deux corps avec J2, pour les phases en orbite basse), moon-direction (le véhicule à la position de la Lune, pour la croisière cislunaire) et stated (un cycle que vous donnez). Un changement de station fait perdre handover_gap_s ; le budget de la phase reçoit le plus long intervalle sans station en vue et un événement donne le cycle. Rien ne modélise les antennes ou les calendriers d'un réseau.
Le rapport#
kshana-mission-thread/1 : phases[] (indice, identifiant, type, temps, étiquette, sources de navigation et de temps, source limitante, sigmas à l'entrée, au pic et à la sortie, exigence, marge, budget_rows[] avec une unité par ligne, events[]), le weakest_link (la plus petite marge par rapport à une exigence déclarée, sinon le plus grand pic de position), le timeline[], l'label du fil (l'étiquette de la phase la plus faible), et un bloc units. La figure est le 1-sigma de position et de biais d'horloge en fonction du temps de mission, une bande par phase.
Ce que sont les preuves#
L'étiquette du fil est l'étiquette de la phase la plus faible, et chaque phase est MODELLED. Le propagateur lunaire est comparé à LRO et CAPSTONE (xval/mission-thread-lunar/) ; l'arc cislunaire est comparé à une trajectoire publique de Horizons (xval/mission-thread/). Une ligne atteint ou manque un seuil fixé dans un fichier versionné avant l'exécution, et un échec est consigné comme un échec. Rien n'est VALIDATED sauf si le registre le dit.