Animaation vienti
--animate muuttaa ajon aikasarjan liikkuvaksi: animoiduksi Scalable Vector Graphics (SVG) -tiedostoksi, yhdeksi itsenäiseksi HyperText Markup Language (HTML) -soittimeksi tai numeroiduksi SVG-kehysten sarjaksi videoenkooderille. Kampanja toistetaan vaiheinaan (häirintä, harhautus, holdover, eheyshälytys) hälytykset merkittyinä; spektriajo toistaa vesiputouksensa rivi riviltä; matalan Maan kiertoradan (LEO) ylilento toistaa kaistakohtaisen linkkinsä ja harhauttajan kanssa monitoritilastot epookki epookilta.
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
Koodi: src/animation.rs. Testit: tests/animation.rs.
Mitä se on ja mitä se ei ole#
Viejä lukee tulosasiakirjan, jonka ajo on jo kirjoittanut. Se ei aja fysiikkaa uudelleen, ei uudelleennäytteistä, tasoita eikä interpoloi näytteiden välillä (lukuun ottamatta yhtä suoraa janaa, joka päättää jäljen kursoriin), eikä se lisää omia lukujaan. Animaatio on siksi täsmälleen yhtä hyvä kuin sen takana oleva ajo. Sen taso on MODELLED, sisäinen johdonmukaisuus: se on renderöinti, ei koskaan todiste, eikä sillä ole omaa varmennusmatriisin riviä.
Tulosteet#
Jokainen formaatti kirjoitetaan skenaarion viereen tavallisten result.json, chart.svg ja report.html rinnalle:
| Formaatti | Kirjoitetaan muodossa | Mitä se sisältää |
|---|---|---|
svg |
<scenario>.animation.svg |
Yksi SVG, joka on animoitu Cascading Style Sheets (CSS) -avainkehyksillä ja ilman skriptiä: jäljet piirtyvät liikkuvan aikakursorin taakse, tapahtumat ilmestyvät hetkellään, vesiputousrivit paljastuvat aikajärjestyksessä. Se toistuu silmukkana, ja valmis kuva pidetään 1,5 s ajan. |
html |
<scenario>.animation.html |
Yksi tiedosto, jossa on rivinsisäinen skripti ja tyyli eikä ulkoisia resursseja: toisto ja tauko, vierityspalkki, nopeus (0,25x–4x), kaikki paneelit yhdellä synkronoidulla kursorilla, jokaisen jäljen elävä arvo, vaihekaista ja tapahtumaluettelo, joka hakee napsautuksesta. Välilyönti toistaa tai pysäyttää, nuolinäppäimet askeltavat, Home ja End hyppäävät. |
frames |
<scenario>.frames/ |
frame_0000.svg, frame_0001.svg, … ja manifest.json. |
--animate voidaan antaa useita kertoja ja se ottaa pilkuilla erotetun luettelon (--animate svg,html) tai arvon all. --animate-fps (1–60, oletus 12) ja --animate-duration (0,5 s–600 s, oletus 8 s) asettavat toiston; kehyssarja on rajattu 7 200 kehykseen.
Kun --export on mukana samassa komennossa, HTML-soitin luettelee viereensä kirjoitetut vientitiedostot (CZML, KML, GeoJSON, STK, SigMF) suhteellisina linkkeinä näihin sisartiedostoihin; linkki kirjoitetaan vain pelkälle tiedostonimelle, joten mikään ei voi poistua kansiosta eikä tavoittaa verkkoa. Laaja raportti (report.html) upottaa animoidun piirroksen aina, kun tuloksessa on aikasarja, riippumatta siitä, ajettiinko --animate.
Kun --animate ajetaan, tiedostoon result.json tulee lohko animation: formaatit, kuvaa sekunnissa (fps), kesto, kehysmäärä, aikaväli, paneelien otsikot, JSON-polut, joista jokainen jälki luettiin (sources), ja kaikki löydetyt mutta piirtämättömät sarjat (omitted). Ilman valitsinta --animate tulos on tavu tavulta identtinen tavallisen ajon kanssa.
Kehyssarja#
Sarjassa on täsmälleen round(duration × fps) kehystä. Kehys i näyttää aikajanan hetkeen t_start + (t_end − t_start) × i / (n − 1) asti, joten ensimmäinen kehys on alku ja viimeinen on valmis kuva. manifest.json tallentaa fps, duration_s, frame_count, frame_pattern (frame_%04d.svg), pikselikoon, t_start, t_end, jokaisen kehyksen tehtäväajan (frame_times), vaiheet, tapahtumat ja lähteet. Uudelleenvienti samaan hakemistoon poistaa ensin jokaisen siellä jo olevan frame_NNNN.svg (eikä mitään muuta), joten lyhyempi sarja ei jätä pidemmän sarjan kehyksiä enkooderin luettavaksi.
Kehykset ovat SVG:tä, eivät Portable Network Graphics (PNG) -kuvia. Kirjastolla librsvg rakennettu ffmpeg lukee ne suoraan sarjan kirjoitusnopeudella (24 yllä olevassa esimerkissä; manifestin fps):
ffmpeg -framerate 24 -i clock-holdover.frames/frame_%04d.svg -pix_fmt yuv420p clock-holdover.mp4
ffmpeg ilman kirjastoa librsvg pysähtyy viestiin ”no decoder found for: svg”. Rasteroi kehykset ensin, esimerkiksi komennolla rsvg-convert, ja enkoodaa PNG-kuvat:
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
Saavutettavuus ja teema#
- Värimaailma. Soitin seuraa asetusta
prefers-color-schemeja piirtää uudelleen sen muuttuessa; animoitu SVG sisältää paletistaan vaalean variantin saman media-kyselyn alla. Kehykset käyttävät staattisten kaavioiden tummaa palettia, koska videolla ei ole värimaailmaa. - Vähennetty liike. Asetuksella
prefers-reduced-motion: reduceanimoitu SVG kytkee jokaisen animaation pois ja näyttää valmiin kuvan (sen perustyylit ovat lopputila, joten mitään ei piiloteta), ja soitin avautuu pysäytettynä valmiilla kuvalla toistamisen sijaan; käyttäjä voi silti vierittää tai painaa Toista. - SVG:ssä on
<title>ja<desc>; soittimen säätimet ovat nimettyjä painikkeita, aluesyöte, jossa on puhuttu aika-arvo, ja valintalista.
Mikä lasketaan aikasarjaksi#
Tulosasiakirjat eroavat tyypeittäin, joten viejä tunnistaa moottorin tuottamat muodot eikä tyyppiluetteloa:
- Taulukko tietueita, joissa on aikakenttä (
t,t_s,t_hours,t_min,t_daystaiktaulukossaepochs), joka kasvaa tiukasti taulukon läpi. Jokainen muu numeerinen kenttä muuttuu jäljeksi; sama kenttä kahden juuren alla (quantum.series[].error_nsjaclassical.series[].error_ns) jakaa paneelin. - Objekti, jossa on tiukasti kasvava aikataulukko (
t_s,t,times_s, …) ja samanpituisia taulukoita sen rinnalla: sisaruksina numeerisia taulukoita, karttachannels, jossa on tietueita{unit, values}(aikajanacampaign), tietuetaulukko, jonka tietueet sisältävät tällaisia taulukoita (kaistatspectrum, tähdistön satelliittien radat), ja kaksiulotteinen taulukko, jonka rivit vastaavat aika-akselia ja jonka sisarena on taajuusakseli*_hz(vesiputousspectrum). - Tämän aikataulukon rinnalla
phases(name,t0_s,t1_s) muuttuvat vaihekaistaksi jaevents(t_s,label,alarm) merkeiksi. Myös kaistan skalaarit*_t_s(sen ensimmäinen lukituksen menetys, sen pienin kantoaalto–kohinatiheyssuhde) merkitään.
Jäljet, joilla on yksikkö, jakavat paneelin, kun niiden suuruusluokat ovat kertoimen 100 sisällä, joten 50 ns:n suoja ei litistä 2 ns:n virhettä. Enintään 6 paneelia, joissa on 6 jälkeä, piirretään; loput luetellaan kohdassa omitted. Jäljet, joissa on yli 2 400 näytettä, harvennetaan tasaisella askeleella, joka säilyttää viimeisen näytteen, ja vesiputous, jossa on yli 96 × 120 solua, keskiarvoistetaan alas (tehossa desibelisoluille, jotta kapeaa häirintälähdettä ei laimenneta).
Tyyppi, jonka tulos ei sisällä yhtäkään näistä muodoista (linkkibudjetti, yhden epookin geometria, pelkkä tilastollinen Monte Carlo -yhteenveto tai telealan holdover, jonka tulos julkaisee tallenteen hashin mutta ei tallennetta), hylätään viestillä no time series to animate, eikä mitään kirjoiteta. Versiolla kshana 0.40.0 animoituu 94 niistä 193 ajettavasta skenaariotiedostosta (kaikki tiedostot paitsi tutkimussarja), ja 99 hylätään. cargo test --test animation -- --nocapture tulostaa laskennan.
LEO-tyypeistä jokainen mukana toimitettu skenaario tyypeille leo-pass, leo-pnt-chain ja leo-ppp animoituu. leo-pvt animoituu Doppler-, yhteispaikannus- ja ajoitustiloissaan (ajoitusajo tarvitsee trace = true, mikä saa jokaisen rivin raportoimaan aikavirheensä ja ennustetun sigmansa jokaisella epookilla) ja hylätään napa-alueen kattavuustilassaan. leo-navmsg animoituu ylilennon keskivaiheen päivityksensä osalta ja hylätään koodaus-, sovitusvälin- ja mallivertailuanalyyseille. Tuloksissa leo-signal ja ntn-positioning ei ole aika-akselia, ja ne hylätään.
Determinismi#
Tuloste on tulosasiakirjan ja asetusten puhdas funktio: ei kelloa, ei satunnaislukua, ei hash-map-iterointia, ei tiedosto- tai verkkokäyttöä kirjastossa eikä aikaleimaa missään, joten sama skenaario, siemenluku ja asetukset antavat tavu tavulta identtiset tiedostot. Moduuli rakentuu WebAssemblylle sellaisenaan; vain komentorivikäyttöliittymä kirjoittaa tiedostoja.
Kirjastokäyttö#
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 animoi jo olemassa olevan tulosasiakirjan, ja extract_timeline palauttaa sen, mitä piirrettäisiin, piirtämättä sitä.
Rajoitukset#
- Python-wheel ja WebAssembly-moduuli eivät vielä tarjoa viejää; se on käytettävissä komentoriviltä, Rust-kirjastosta ja Model Context Protocol (MCP) -palvelimen työkalusta
animate_scenario(joka palauttaa enintään 120 kehystä yhdessä vastauksessa). - Akselit ovat lineaarisia. Sarja, joka kattaa monta dekadia (kellon virheen kasvu arvosta 0,1 ns mikrosekuntiin), näyttää tasaiselta ajon loppupuolelle asti.
- Animoitu SVG perustuu leikkaussuorakulmion CSS-animaatioon; nykyiset Chromium-, Firefox- ja Safari-moottorit toistavat sen, kun taas katselin ilman CSS-animaatiota näyttää valmiin kuvan.
- Pyyhkäisy-, Monte Carlo- ja compose-kampanjoilla ei ole aika-akselia ja ne hylätään; pyyhkäisyn tai otoksen yhteenvetotilastot eivät ole aikasarja. Ketjutettu kampanja animoituu.