Maskinoversættelse, ikke gennemgået af en modersmålstalende. Engelsk er referencen.

Output og eksportRedigér på GitHubKilde: docs/ANIMATION.md

Animationseksport

--animate omsætter en kørsels tidsserie til noget, der bevæger sig: en animeret Scalable Vector Graphics-fil (SVG), én selvstændig HyperText Markup Language-afspiller (HTML) eller en nummereret række SVG-frames til en videoindkoder. En kampagne afspilles som sine faser (jamming, spoofing, holdover, integritetsalarm) med sine alarmer markeret; en spektrumkørsel afspiller sit vandfald række for række; en passage i lav jordbane (LEO) afspiller sit link pr. bånd og, med en spoofer, monitorstatistikkerne epoke for epoke.

kshana scenarios/campaign-jam-spoof-holdover-integrity.toml --animate all
kshana scenarios/l-band-waterfall-jamming.toml --animate html
kshana scenarios/clock-holdover.toml --animate frames --animate-fps 24 --animate-duration 10

Kode: src/animation.rs. Tests: tests/animation.rs.

Hvad den er, og hvad den ikke er#

Eksportøren læser det resultatdokument, kørslen allerede har skrevet. Den kører ikke fysikken igen, den resampler, udjævner eller interpolerer ikke mellem sampel (bortset fra det ene lige linjestykke, der afslutter et spor ved markøren), og den tilføjer intet tal af sig selv. En animation er derfor præcis lige så god som den kørsel, der ligger bag. Dens niveau er MODELLED, intern konsistens: den er en gengivelse, aldrig evidens, og den bærer ingen egen række i verifikationsmatrixen.

Output#

Hvert format skrives ved siden af scenariet, ved siden af de sædvanlige result.json, chart.svg og report.html:

Format Skrevet som Hvad det indeholder
svg <scenario>.animation.svg Én SVG animeret med Cascading Style Sheets-keyframes (CSS) og uden script: sporene tegnes bag en bevægelig tidsmarkør, hændelser vises på deres tidspunkt, vandfaldsrækker afsløres i tidsrækkefølge. Den går i løkke med en pause på 1,5 s på det færdige billede.
html <scenario>.animation.html Én fil med inline script og style og uden eksterne aktiver: afspil og pause, en scrubber, hastighed (0.25x til 4x), hvert panel på én synkroniseret markør, en live værdi pr. spor, fasestrimlen og en hændelsesliste, der søger ved klik. Mellemrum afspiller eller pauser, piletasterne trin for trin, Home og End hopper.
frames <scenario>.frames/ frame_0000.svg, frame_0001.svg, … og manifest.json.

--animate kan gentages og tager en kommasepareret liste (--animate svg,html) eller all. --animate-fps (1 til 60, standard 12) og --animate-duration (0,5 s til 600 s, standard 8 s) fastsætter afspilningen; frame-rækken er begrænset til 7.200 frames.

Når --export kører i den samme kommando, viser HTML-afspilleren de eksportfiler, der er skrevet ved siden af den (CZML, KML, GeoJSON, STK, SigMF), som relative links til de søskendefiler; et link skrives kun for et rent filnavn, så ingen kan forlade mappen eller nå netværket. Den avancerede rapport (report.html) indlejrer den animerede tegning, når resultatet har en tidsserie, uanset om --animate kørte.

Når --animate kører, får result.json en blok animation: formaterne, frames pr. sekund (fps), varighed, antal frames, tidsspændet, panelernes titler, de JSON-stier, hvert spor blev læst fra (sources), og enhver serie, der blev fundet, men ikke tegnet (omitted). Uden --animate er resultatet bytemæssigt identisk med en almindelig kørsel.

Frame-rækken#

Rækken har præcis round(duration × fps) frames. Frame i viser tidslinjen op til t_start + (t_end − t_start) × i / (n − 1), så den første frame er starten, og den sidste er det færdige billede. manifest.json registrerer fps, duration_s, frame_count, frame_pattern (frame_%04d.svg), pixelstørrelsen, t_start, t_end, missionstiden for hver frame (frame_times), faserne, hændelserne og kilderne. En ny eksport til den samme mappe fjerner først hver frame_NNNN.svg, der allerede ligger der (og intet andet), så en kortere række aldrig efterlader frames fra en længere, som indkoderen kan læse.

Frames er SVG, ikke Portable Network Graphics (PNG). En ffmpeg bygget med biblioteket librsvg læser dem direkte, med den rate, rækken blev skrevet med (24 i eksemplet ovenfor; manifestets fps):

ffmpeg -framerate 24 -i clock-holdover.frames/frame_%04d.svg -pix_fmt yuv420p clock-holdover.mp4

En ffmpeg uden librsvg stopper med "no decoder found for: svg". Rasteriser først frames, for eksempel med rsvg-convert, og indkod PNG-filerne:

for f in clock-holdover.frames/frame_*.svg; do rsvg-convert "$f" -o "${f%.svg}.png"; done
ffmpeg -framerate 24 -i clock-holdover.frames/frame_%04d.png -pix_fmt yuv420p clock-holdover.mp4

Tilgængelighed og tema#

  • Farveskema. Afspilleren følger prefers-color-scheme og tegner igen, når det ændres; den animerede SVG bærer en lys variant af sin palet under den samme media query. Frames bruger den mørke palet fra de statiske diagrammer, fordi en video ikke har noget skema.
  • Reduceret bevægelse. Under prefers-reduced-motion: reduce slår den animerede SVG hver animation fra og viser det færdige billede (dens basisstile er sluttilstanden, så intet skjules), og afspilleren åbner på pause på det færdige billede i stedet for at afspille; brugeren kan stadig scrubbe eller trykke på Play.
  • SVG'en har en <title> og en <desc>; afspillerens betjeningselementer er mærkede knapper, et områdeinput med en oplæst tidsværdi og en select.

Hvad der tæller som en tidsserie#

Resultatdokumenterne er forskellige fra type til type, så eksportøren genkender de former, motoren udsender, i stedet for en liste af typer:

  1. Et array af poster med et tidsfelt (t, t_s, t_hours, t_min, t_days eller k på et epochs-array), der strengt vokser langs arrayet. Hvert andet numerisk felt bliver et spor; det samme felt under to rødder (quantum.series[].error_ns og classical.series[].error_ns) deler et panel.
  2. Et objekt med et strengt voksende tidsarray (t_s, t, times_s, …) ved siden af arrays af samme længde: søskende-numeriske arrays, et channels-map af {unit, values}-poster (tidslinjen campaign), et array af poster med sådanne arrays (båndene spectrum, en konstellations satellitspor) og et todimensionalt array, hvis rækker svarer til tidsaksen, med en søskende frekvensakse *_hz (vandfaldet spectrum).
  3. Ved siden af det tidsarray bliver phases (name, t0_s, t1_s) til fasestrimlen og events (t_s, label, alarm) til markørerne. Et bånds skalarer *_t_s (dets første tab af lås, dets laveste forhold mellem bærebølge og støjtæthed) markeres også.

Spor med en enhed deler et panel, når deres størrelser ligger inden for en faktor 100, så en vagt på 50 ns ikke fladtrykker en fejl på 2 ns. Højst 6 paneler med 6 spor tegnes; resten opregnes under omitted. Spor over 2.400 sampel tyndes ud med et jævnt stride, der bevarer det sidste sampel, og et vandfald over 96 × 120 celler midles ned (i effekt, for decibelceller, så en smal jammer ikke fortyndes).

En type, hvis resultat ikke bærer nogen af disse former (et linkbudget, en geometri for én epoke, en Monte Carlo-oversigt med kun statistik eller telecom-holdover, hvis resultat udgiver optagelsens hash, men ikke optagelsen), afvises med no time series to animate, og intet skrives. Med kshana 0.40.0 animerer 94 af de 193 kørbare scenariefiler (alle filer undtagen en undersøgelsessuite), og 99 afvises. cargo test --test animation -- --nocapture udskriver optællingen.

Blandt LEO-typerne animerer hvert medfølgende scenarie leo-pass, leo-pnt-chain og leo-ppp. leo-pvt animerer i sine tilstande Doppler, fælles positionering og tidssynkronisering (en tidskørsel kræver trace = true, som får hver række til at rapportere sin tidsfejl og forudsagte sigma ved hver epoke) og afvises i sin tilstand for polardækning. leo-navmsg animerer sin opdatering midt i passagen og afvises for analyserne af kodning, tilpasningsinterval og modelsammenligning. Resultater fra leo-signal og ntn-positioning har ingen tidsakse og afvises.

Determinisme#

Outputtet er en ren funktion af resultatdokumentet og indstillingerne: intet ur, intet tilfældigt tal, ingen iteration over hash-map, ingen fil- eller netværksadgang i biblioteket og intet tidsstempel noget sted, så det samme scenarie, seed og de samme indstillinger giver bytemæssigt identiske filer. Modulet bygges uændret til WebAssembly; kun kommandolinjegrænsefladen skriver filer.

Brug som bibliotek#

use kshana::animation::{AnimationFormat, AnimationOptions};
let anim = kshana::api::animate_toml(src, AnimationFormat::Html, &AnimationOptions::default())?;
std::fs::write("run.html", &anim.files[0].content)?;

kshana::animation::animate_result animerer et resultatdokument, du allerede har, og extract_timeline returnerer det, der ville blive tegnet, uden at gengive det.

Begrænsninger#

  • Python-wheel'en og WebAssembly-modulet udstiller endnu ikke eksportøren; den kan nås fra kommandolinjen, Rust-biblioteket og værktøjet animate_scenario i Model Context Protocol-serveren (MCP) (som højst returnerer 120 frames i ét svar).
  • Akserne er lineære. En serie, der spænder over mange dekader (et urs fejlvækst fra 0,1 ns til et mikrosekund), ser flad ud, indtil sent i kørslen.
  • Den animerede SVG bygger på CSS-animation af et klip-rektangel; nuværende motorer i Chromium, Firefox og Safari afspiller den, mens en fremviser uden CSS-animation viser det færdige billede.
  • Sweep-, Monte Carlo- og compose-kampagner har ingen tidsakse og afvises; oversigtsstatistikkerne for en sweep eller en ensemble er ikke en tidsserie. En kædet kampagne animerer.