Export animace
--animate promění časovou řadu běhu v něco, co se pohybuje: animovaný soubor Scalable Vector Graphics (SVG), jediný samostatný přehrávač HyperText Markup Language (HTML) nebo očíslovanou posloupnost snímků SVG pro kodér videa. Kampaň se přehraje jako své fáze (rušení, spoofing, holdover, poplach integrity) s vyznačenými poplachy; běh spektra přehraje svůj waterfall řádek po řádku; přelet na nízké oběžné dráze Země (LEO) přehraje svůj spoj po pásmech a s spooferem statistiky monitoru epochu po epoše.
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
Kód: src/animation.rs. Testy: tests/animation.rs.
Co to je a co není#
Exportér čte dokument výsledku, který běh už zapsal. Neprovádí znovu fyziku, nepřevzorkovává, nevyhlazuje ani neinterpoluje mezi vzorky (kromě jediného přímkového úseku, který ukončuje stopu u kurzoru) a nepřidává žádné vlastní číslo. Animace je tedy přesně tak dobrá jako běh, na kterém stojí. Její úroveň je MODELLED, vnitřní konzistence: je to vykreslení, nikdy důkaz, a nemá žádný vlastní řádek verifikační matice.
Výstupy#
Každý formát se zapíše vedle scénáře, vedle obvyklých result.json, chart.svg a report.html:
| Formát | Zapsáno jako | Co obsahuje |
|---|---|---|
svg |
<scenario>.animation.svg |
Jedno SVG animované klíčovými snímky Cascading Style Sheets (CSS) a bez skriptu: stopy se vykreslují za pohyblivým časovým kurzorem, události se objevují ve svém okamžiku, řádky waterfallu se odhalují v časovém pořadí. Opakuje se ve smyčce, s prodlevou 1,5 s na dokončeném obrazu. |
html |
<scenario>.animation.html |
Jeden soubor s vloženým skriptem a stylem a bez externích prostředků: přehrát a pozastavit, posuvník, rychlost (0,25x až 4x), každý panel na jednom synchronizovaném kurzoru, živá hodnota u každé stopy, pás fází a seznam událostí, který po kliknutí přeskočí. Mezerník přehrává nebo pozastavuje, šipky krokují, Home a End skáčou. |
frames |
<scenario>.frames/ |
frame_0000.svg, frame_0001.svg, … a manifest.json. |
--animate lze opakovat a přijímá seznam oddělený čárkami (--animate svg,html) nebo all. --animate-fps (1 až 60, výchozí 12) a --animate-duration (0,5 s až 600 s, výchozí 8 s) nastavují přehrávání; posloupnost snímků je omezena na 7 200 snímků.
Když --export běží ve stejném příkazu, přehrávač HTML uvádí soubory exportu zapsané vedle něj (CZML, KML, GeoJSON, STK, SigMF) jako relativní odkazy na tyto sousední soubory; odkaz se zapíše jen pro holý název souboru, takže žádný nemůže opustit složku ani sahat do sítě. Pokročilá zpráva (report.html) vkládá animovaný výkres vždy, když výsledek má časovou řadu, ať --animate běželo, nebo ne.
Když --animate běží, result.json získá blok animation: formáty, snímky za sekundu (fps), trvání, počet snímků, časový rozsah, názvy panelů, cesty JSON, z nichž byla čtena každá stopa (sources), a každou řadu nalezenou, ale nevykreslenou (omitted). Bez --animate je výsledek byte-identický s prostým během.
Posloupnost snímků#
Posloupnost má přesně round(duration × fps) snímků. Snímek i ukazuje časovou osu až do t_start + (t_end − t_start) × i / (n − 1), takže první snímek je začátek a poslední je dokončený obraz. manifest.json zaznamenává fps, duration_s, frame_count, frame_pattern (frame_%04d.svg), velikost v pixelech, t_start, t_end, čas mise každého snímku (frame_times), fáze, události a zdroje. Opětovný export do téže složky nejprve odstraní každý již přítomný frame_NNNN.svg (a nic jiného), takže kratší posloupnost nikdy nenechá snímky delší, aby je kodér četl.
Snímky jsou SVG, nikoli Portable Network Graphics (PNG). ffmpeg sestavený s knihovnou librsvg je čte přímo, rychlostí, s jakou byla posloupnost zapsána (24 v příkladu výše; fps manifestu):
ffmpeg -framerate 24 -i clock-holdover.frames/frame_%04d.svg -pix_fmt yuv420p clock-holdover.mp4
ffmpeg bez librsvg skončí s „no decoder found for: svg“. Snímky nejprve rasterizujte, například pomocí rsvg-convert, a zakódujte PNG:
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
Přístupnost a motiv#
- Barevné schéma. Přehrávač sleduje
prefers-color-schemea při změně se překreslí; animované SVG nese světlou variantu své palety pod stejným media query. Snímky používají tmavou paletu statických grafů, protože video schéma nemá. - Omezený pohyb. Při
prefers-reduced-motion: reduceanimované SVG vypne každou animaci a ukáže dokončený obraz (jeho základní styly jsou konečný stav, takže nic není skryto) a přehrávač se otevře pozastavený na dokončeném obrazu místo přehrávání; uživatel může stále posouvat nebo stisknout Přehrát. - SVG má
<title>a<desc>; ovládací prvky přehrávače jsou popsaná tlačítka, vstup typu rozsah s vyslovenou časovou hodnotou a výběr.
Co se počítá jako časová řada#
Dokumenty výsledků se liší druh od druhu, takže exportér rozpoznává tvary, které engine vydává, místo seznamu druhů:
- Pole záznamů s časovým polem (
t,t_s,t_hours,t_min,t_daysnebokv poliepochs), které podél pole striktně roste. Každé další číselné pole se stane stopou; totéž pole pod dvěma kořeny (quantum.series[].error_nsaclassical.series[].error_ns) sdílí panel. - Objekt se striktně rostoucím časovým polem (
t_s,t,times_s, …) vedle polí téže délky: sousední číselná pole, mapachannelszáznamů{unit, values}(časová osacampaign), pole záznamů obsahujících taková pole (pásmaspectrum, dráhy družic konstelace) a dvourozměrné pole, jehož řádky odpovídají časové ose, se sousední frekvenční osou*_hz(waterfallspectrum). - Vedle tohoto časového pole se
phases(name,t0_s,t1_s) stanou pásem fází aevents(t_s,label,alarm) se stanou značkami. Značeny jsou také skaláry*_t_spásma (jeho první ztráta zachycení, jeho nejnižší poměr nosné k hustotě šumu).
Stopy s jednotkou sdílejí panel, jsou-li jejich velikosti do faktoru 100, takže ochrana 50 ns nezplošťuje chybu 2 ns. Vykresleno je nejvýše 6 panelů po 6 stopách; zbytek je uveden pod omitted. Stopy nad 2 400 vzorků se ztenčí rovnoměrným krokem, který ponechá poslední vzorek, a waterfall nad 96 × 120 buněk se průměruje (ve výkonu, u decibelových buněk, takže úzký rušič není zředěn).
Druh, jehož výsledek nenese žádný z těchto tvarů (rozpočet spoje, geometrie jedné epochy, shrnutí Monte Carlo pouze se statistikami nebo telekomunikační holdover, jehož výsledek zveřejňuje hash záznamu, ale ne záznam), je odmítnut s no time series to animate a nic se nezapíše. S kshana 0.40.0 se 94 z 193 spustitelných souborů scénářů (každý soubor kromě sady studií) animuje a 99 je odmítnuto. cargo test --test animation -- --nocapture vytiskne soupis.
Mezi druhy LEO se animuje každý přibalený scénář leo-pass, leo-pnt-chain a leo-ppp. leo-pvt se animuje ve svých režimech Doppler, společného určování polohy a časování (běh časování potřebuje trace = true, což způsobí, že každý řádek hlásí svou časovou chybu a předpovězené sigma v každé epoše) a v režimu polárního pokrytí je odmítnut. leo-navmsg animuje svou aktualizaci uprostřed přeletu a je odmítnut pro analýzy kódování, intervalu proložení a porovnání modelů. Výsledky leo-signal a ntn-positioning nenesou časovou osu a jsou odmítnuty.
Determinismus#
Výstup je čistou funkcí dokumentu výsledku a voleb: žádné hodiny, žádné náhodné číslo, žádná iterace hash mapy, žádný přístup k souborům ani síti v knihovně a nikde žádné časové razítko, takže tentýž scénář, seed a volby dávají byte-identické soubory. Modul se pro WebAssembly sestaví beze změny; soubory zapisuje jen rozhraní příkazového řádku.
Použití v knihovně#
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 animuje dokument výsledku, který už máte, a extract_timeline vrací, co by se vykreslilo, aniž by to vykreslil.
Omezení#
- Kolo Pythonu a modul WebAssembly zatím exportér nezpřístupňují; je dostupný z příkazového řádku, z knihovny Rustu a z nástroje
animate_scenarioserveru Model Context Protocol (MCP) (který v jedné odpovědi vrací nejvýše 120 snímků). - Osy jsou lineární. Řada zahrnující mnoho dekád (růst chyby hodin od 0,1 ns do mikrosekundy) vypadá až do pozdní fáze běhu plochá.
- Animované SVG spoléhá na animaci CSS ořezového obdélníku; současné enginy Chromium, Firefox a Safari ho přehrají, zatímco prohlížeč bez animace CSS ukáže dokončený obraz.
- Kampaně průchodu, Monte Carlo a skládání nenesou časovou osu a jsou odmítnuty; souhrnné statistiky průchodu nebo souboru nejsou časová řada. Zřetězená kampaň se animuje.