Tutoriais
Exemplos práticos que o levam de “executar um cenário fornecido” a “quantificar e defender um resultado”. Cada número citado nos três tutoriais é uma saída real do motor, ancorada numa referência independente externa (não circular) de autoridade reconhecida, e fixado por um teste de integração (tests/tutorials.rs), pelo que um tutorial nunca pode afastar-se silenciosamente do que o motor realmente faz. Se um tutorial disser que o relógio ótico aguenta 6600 s, o teste faz falhar a compilação no dia em que isso deixar de ser verdade.
O Kshana é um simulador de posicionamento, navegação e temporização (PNT). Os tutoriais usam mais algumas abreviaturas, cada uma por extenso onde aparece pela primeira vez: GNSS (Global Navigation Satellite System), GPS (Global Positioning System), CLI (command-line interface) e TOML (Tom's Obvious Minimal Language, o formato dos ficheiros de cenário).
É novo no projeto? Leia primeiro o guia de conceitos e o glossário e depois volte aqui.
Os três exemplos práticos#
| # | Tutorial | O que aprende | Tipo de cenário | Dificuldade | ~Tempo |
|---|---|---|---|---|---|
| 1 | A minha primeira órbita: onde estão os satélites GPS | propagar uma constelação GPS real, ler a disponibilidade, a diluição da precisão da posição (PDOP) e a exatidão de posição, e exportar onde os satélites estão realmente (formato de órbita precisa SP3) | orbit |
principiante | 15 min |
| 2 | Holdover do relógio: durante quanto tempo se consegue navegar em inércia | executar um holdover de relógio sem GNSS, ler a figura de mérito de temporização e compreender a lei de crescimento √(q_wf·T) que lhe está por trás | clock |
principiante | 20 min |
| 3 | Resiliência GNSS quântica contra clássica | o tutorial final: um detetor de spoofing (spoof) e um conjunto PNT completo e fundido (hybrid), e como ler em conjunto segurança / integridade / navegação por estima |
spoof + hybrid |
intermédia | 35 min |
Cadernos interativos#
Os notebooks Jupyter executáveis, sobre dados sintéticos e conjuntos de elementos públicos mantidos apenas no repositório, estão em notebooks/:
| Notebook | O que aprende |
|---|---|
| Confiança e formação de embarcações | gerar um fluxo NMEA sintético de ponte com um evento programado e pontuá-lo com os monitores de confiança de embarcação (consultivo, não um equipamento de navegação homologado) |
| Mapa de interferência e exposição de rotas | onde os dados de navegação pareceram degradados e quanto de um percurso afetam |
| Mapeamento de compliance e exportação de test-bench | para que linhas de referenciais públicos um conjunto de execuções fornece elementos de prova em apoio (nunca que um referencial é satisfeito), e o movimento e os eventos de um cenário exportados como texto para um simulador GNSS de laboratório (nenhum sinal é escrito) |
| GDOP quântico contra clássico | a mesma geometria de constelação com um sensor quântico e um clássico, comparados pela diluição da precisão |
| Geometria do céu sob uma linha de horizonte | os satélites que um local vê sob a linha de horizonte de uma rua ou de um cais, o seu DOP e elipse de erro, um céu datado a partir de conjuntos de elementos e um Monte Carlo com seed face à covariância (MODELLED) |
Como executar um tutorial#
Todos os tutoriais executam o mesmo cenário de três formas; escolha a que lhe convier. Todas chamam o mesmo motor, pelo que os números são idênticos (espelha a secção Utilização do README).
Linha de comandos. A CLI despacha com base no campo kind do cenário e escreve <scenario>.result.json, <scenario>.chart.svg, <scenario>.report.html e <scenario>.report.json junto da entrada (JSON é JavaScript Object Notation, SVG Scalable Vector Graphics, HTML HyperText Markup Language). Alguns tipos de cenário publicam também uma tabela de reprodutibilidade como <scenario>.table.csv (valores separados por vírgulas): realtime-frame-eop, lunar-time-budget, lunar-jamming, leo-navmsg, telecom-timing e moonlight-service-volume quando está definido um local de exportação. Nenhum dos três tutoriais é um deles, pelo que não verá esse ficheiro aqui.
cargo run -- scenarios/orbit-sgp4-gps.toml
cargo run -- compila a CLI a partir desta cópia de trabalho. Com um binário instalado (cargo install kshana), o mesmo comando é kshana scenarios/orbit-sgp4-gps.toml. Sem uma cópia de trabalho, a maioria dos cenários fornecidos está incluída no binário: kshana example lista-os (e indica os poucos que não estão incluídos, com o motivo), e kshana example orbit-sgp4-gps > orbit-sgp4-gps.toml escreve um: a cópia de scenarios/orbit-sgp4-gps.toml com que o binário foi compilado.
Python. Compile a extensão a partir desta cópia de trabalho uma vez com o maturin, dentro de um ambiente virtual ativo, e depois chame kshana.run:
pip install maturin
maturin develop --features python
import json, kshana
result = json.loads(kshana.run(open("scenarios/orbit-sgp4-gps.toml").read()))
print(result["geometry"]["best_pdop"])
pip install kshana instala antes o wheel publicado. Pode ficar atrás desta cópia de trabalho: json.loads(kshana.list_kinds()) indica-lhe que tipos de cenário a sua compilação tem.
Playground no navegador. Sem instalação: abra o Studio, escolha um cenário, edite os parâmetros e leia o resultado. Nada é enviado; o motor corre no cliente como WebAssembly.
Os tutoriais citam a CLI, mas cada comando tem o equivalente em Python e no playground acima. Cada resultado é reproduzível a partir de scenario + seed + engine version: execute-o duas vezes e obtém uma saída idêntica bit a bit.
Cenários didáticos anotados#
Para cada domínio de capacidade existe um .toml muito comentado em scenarios/: uma cópia didática de um cenário canónico com cada campo explicado em linha, a referência independente citada indicada e o resumo esperado de uma linha registado como comentário # expected:. Os valores dos campos são idênticos aos do cenário de origem no diretório scenarios/ de topo do repositório (tests/tutorials.rs compara o TOML analisado), pelo que a saída documentada continua verdadeira. Os hashes de referência também ficam intactos: um comentário nunca altera o hash de um cenário.
| Domínio | Ficheiro didático | Tipo | Derivado de |
|---|---|---|---|
| Holdover do relógio | scenarios/clock.toml | clock |
scenarios/clock-holdover.toml |
| Órbita e geometria | scenarios/orbit.toml | orbit |
scenarios/orbit-sgp4-gps.toml |
| Integridade (RAIM, monitorização autónoma da integridade pelo recetor) | scenarios/integrity.toml | integrity |
scenarios/integrity-raim.toml |
| Segurança (spoofing) | scenarios/security.toml | spoof |
scenarios/spoof-attack.toml |
| PNT híbrido | scenarios/hybrid.toml | hybrid |
scenarios/hybrid-pnt.toml |
| Navegação estimada inercial | scenarios/inertial.toml | inertial |
scenarios/imu-deadreckoning.toml |
| Transferência de tempo | scenarios/timetransfer.toml | timetransfer |
scenarios/timetransfer.toml |
| Domínio de medições GNSS | scenarios/gnss-sim.toml | gnss-sim |
scenarios/gnss-sim-raim.toml |
O ficheiro didático de segurança usa
kind = "spoof"no interior: a figura de mérito de Segurança (1 − P_md, um menos a probabilidade de falha de deteção) é produzida pelo pacote spoof. O nome do ficheiro segue a capacidade (segurança), okindsegue o pacote (spoof). O cabeçalho desse ficheiro chama a atenção para isto.
O catálogo completo de tipos de cenário#
O motor despacha com base no kind do cenário. A tabela abaixo lista os tipos de cenário mais usados (os oito domínios dos tutoriais acima mais os vizinhos mais próximos). Não é o conjunto completo: src/api.rs::list_scenario_kinds() devolve todos os 92 tipos de cenário incorporados. Essa função (exposta como list_kinds() nas ligações Python e WebAssembly (WASM), e como kshana kinds --json na linha de comandos) é o catálogo de referência, sempre atual, e SCENARIOS.md é a sua enumeração gerada, com uma secção por tipo de cenário e os campos TOML obrigatórios e opcionais. tests/tutorials.rs::tutorial_scenarios_use_real_kinds garante que todos os tipos de cenário que um tutorial documenta são tipos de despacho reais, pelo que nada nesta tabela pode nomear um tipo de cenário que não existe.
| Tipo | O que faz |
|---|---|
clock |
Holdover do relógio face à especificação; ensemble de Monte Carlo opcional (runs > 1). |
inertial |
Navegação inercial por estima de 1-DOF (um grau de liberdade) durante uma interrupção GNSS. |
orbit |
Disponibilidade GNSS + diluição da precisão (DOP) a partir de uma constelação (Walker / elementos de duas linhas / RINEX, o Receiver Independent Exchange format). |
integrity |
Snapshot / separação de soluções / ARAIM (RAIM avançado) com níveis de proteção horizontal e vertical (HPL/VPL) + diagrama de Stanford. |
lunar-integrity |
Passagem de níveis de proteção ARAIM no polo sul lunar face a um conjunto de relés LunaNet. |
timetransfer |
Transferência bidirecional de tempo/frequência ótica contra de radiofrequência (RF). |
hybrid |
Tutorial final de PNT híbrido: relógio + unidade de medição inercial (IMU) + auxílio de transferência de tempo. |
fusion |
PNT por fusão de sensores com filtro de Kalman conjunto sobre as mesmas entradas híbridas. |
gnss-ins |
Filtro de Kalman estendido de estados de erro GNSS/INS (sistema de navegação inercial), de acoplamento fraco e forte. |
gnss-sim |
Simulação de pseudodistâncias no domínio da medição (ionosfera de Klobuchar, troposfera de Saastamoinen/Niell) + RAIM. |
jamming |
Jamming por balanço de ligação: relação interferência-sinal (J/S) → densidade portadora-ruído efetiva (C/N₀) → perda de bloqueio. |
spoof |
Detetor estocástico de spoofing de tempo (Neyman–Pearson / χ²₁) com probabilidades de falso alarme e de falha de deteção por Monte Carlo (P_fa/P_md). |
sweep |
Varrimento 1-D de estudo de compromissos sobre um parâmetro de um pacote de relógio. |
sweep-nd |
Varrimento N-D genérico sobre qualquer pacote através de chaves TOML com pontos / caminhos de métricas JSON. |
Para além dos tutoriais: capacidades mais recentes#
Os três tutoriais ficam pelos pacotes clássicos de relógio, órbita e segurança. O motor cresceu muito para além deles. Cada linha abaixo é um cenário fornecido que pode executar tal como está (cargo run -- <file> ou kshana <file>); o resumo é a primeira linha que o kshana 0.35.0 imprimiu para ele em 2026-10-10. Ao contrário dos valores dos tutoriais, estas linhas são o registo de uma execução, não fixadas por tests/tutorials.rs: execute novamente o cenário para obter o valor atual. Os resultados indicam o seu próprio âmbito (a maioria traz um label), e a matriz de verificação indica que capacidades são VALIDATED face a uma referência independente externa e quais são MODELLED.
| Capacidade | Cenário | Tipo | Primeira linha do resumo | Ler mais |
|---|---|---|---|---|
| Espetro de banda L e cascata de jamming | scenarios/l-band-waterfall-jamming.toml |
spectrum |
scenario spectrum | 5 bands | 3 jammers | noise floor -202.0 dBW/Hz | worst band gps-l1ca min C/N0 3.2 dB-Hz (J/S 60.2 dB) |
SPECTRUM.md |
| O sistema solar numa época | scenarios/solar-system-tour.toml |
solar-system |
Solar system at 2026-09-28T00:00:00 (JD 2461311.50080 TDB), 18 bodies, observer Earth |
SCENARIOS.md |
| Posicionamento em torno de outro corpo | scenarios/europa-surface-pnt.toml |
body-pnt |
Positioning around Europa — surface user, 12 relays at 4500 km, 171 epochs |
SCENARIOS.md |
| Projeto de constelações em larga escala | scenarios/constellation-multi-gnss-coverage.toml |
constellation-design |
constellation-design: 102 satellites (GPS, Galileo, BeiDou, GLONASS) around the Earth; availability 100.00% (PDOP <= 6 at 10 deg mask), … |
CONSTELLATION-DESIGN.md |
| Campanhas: tipos de cenário encadeados numa única cronologia | scenarios/campaign-jam-spoof-holdover-integrity.toml |
campaign |
campaign f87a4a0e0bab | Jamming, spoofing, holdover and integrity: a chained mission | chain: 6 phases over 4570 s, … |
CAMPAIGNS.md |
| Um sistema LEO-PNT de ponta a ponta | scenarios/leo-pnt-end-to-end.toml |
leo-pnt-chain |
LEO-PNT end to end, generic 1080 km constellation |
LEO-PNT.md |
| Posicionamento fundido MEO + LEO | scenarios/meo-leo-fused-pvt.toml |
leo-pvt |
LEO PVT (joint) at 40.42, -3.70 over 1800 s |
LEO-PNT-FUSION.md |
| Sinais, passagens e mensagens de navegação LEO | scenarios/leo-band-trade.toml, scenarios/leo-pass-iridium.toml, scenarios/leo-navmsg-encode-decode.toml |
leo-signal, leo-pass, leo-navmsg |
LEO pass link budget, air user at 50.00, -30.00; 1 LEO satellite(s), 900 s window (a passagem) |
LEO-SIGNAL.md, LEO-PASS.md, LEO-NAVMSG.md |
| Convergência PPP com uma camada LEO; posicionamento 5G | scenarios/leo-ppp-convergence.toml, scenarios/ntn-5g-positioning.toml |
leo-ppp, ntn-positioning |
PPP convergence to 0.10 m horizontal / 0.10 m vertical, 12 runs per case, 96 GNSS satellites |
SCENARIOS.md |
| Resiliência: GNSS com jamming, o LEO leva o utilizador | scenarios/leo-resilience-gnss-jammed-leo-carries.toml |
campaign |
campaign 248395b851cc | GNSS jammed, LEO-PNT carries the user, integrity maintained | chain: 3 phases over 2100 s, … |
RESILIENCE-CROSSWALK.md |
| Verticais: ferrovia, marítimo, telecomunicações, veículos, Ártico | scenarios/leo-vertical-rail-maritime.toml (e os outros ficheiros leo-vertical-*) |
campaign |
campaign 49575d27b696 | Railway and maritime with a LEO layer | chain: 3 phases over 2520 s, … |
CAMPAIGNS.md |
| Holdover de telecomunicações face aos limites de relógio G.8272 da ITU-T (International Telecommunication Union, Telecommunication Standardization Sector) | scenarios/telecom-prtc-holdover-24h.toml |
telecom-timing |
telecom-timing: max|TE| 603.2 ns over 90000 s; eprtc-a-holdover FAIL, prtc-a FAIL; 100 ns budget exceeded after 8206 s (MODELLED) |
TELECOM-TIMING.md |
LEO é órbita terrestre baixa e MEO órbita terrestre média; PVT é posição, velocidade e tempo; PPP é posicionamento preciso de ponto; 5G é a norma móvel de quinta geração; TDB é o Tempo Dinâmico Baricêntrico; JD é a Data Juliana; TE é o erro de tempo.
A CLI acrescenta três saídas a qualquer execução:
- Relatórios. Cada execução escreve
<scenario>.report.htmle<scenario>.report.json(ver REPORTS.md).kshana --study <suite.toml>executa um conjunto de cenários num único.study.jsone.study.html, por exemplokshana --study scenarios/quantum-pnt-demonstrator.suite.toml. - Animation.
kshana <scenario.toml> --animate <svg|html|frames|all>desenha as séries temporais da execução, por exemplo--animate htmlemscenarios/orbit-sgp4-gps.tomlescreveorbit-sgp4-gps.animation.html. Um tipo de cenário sem eixo temporal amostrado (comosolar-system) é recusado com um erro; ver ANIMATION.md. - Exportações de interoperabilidade.
--export <czml|kml|geojson|stk|sigmf|all|list>escreve o resultado para outras ferramentas: CZML (Cesium Language), KML (Keyhole Markup Language, para o Google Earth), GeoJSON (JSON geográfico), efemérides STK (Systems Tool Kit) ou uma gravação SigMF (Signal Metadata Format).--export listindica que formatos se aplicam a um cenário; o SigMF aplica-se apenas aspectrum. O pacote de órbita também exporta--export-sp3,--export-omme--export-oem(mensagens de órbita CCSDS, do Consultative Committee for Space Data Systems). Ver INTEROP.md.
Exercícios graduados#
Percorra a escada. Cada nível é mais difícil e mais defensável do que o anterior; as soluções de referência encontram-se em exercises/.
| Nível | Objetivo | O que faz | Solução de referência |
|---|---|---|---|
| Nível 1 — executar e ler | executar um cenário fornecido sem alterações e ler uma figura de mérito | Execute scenarios/clock-holdover.toml; imprima o holdover_s quântico contra clássico. CLI, playground ou uma chamada Python de uma linha. |
exercises/tier1_run.py |
| Nível 2 — editar e varrer | alterar um parâmetro e observar um efeito monótono | Aperte a especificação do relógio (threshold_ns) ou alongue a interrupção e veja o holdover descer; ou use kind = "sweep"/"sweep-nd" para o tabelar. |
exercises/tier2_sweep.py |
| Nível 3 — quantificar e defender | Monte Carlo, bandas de confiança, reprodutibilidade e um nível de proteção | Execute um ensemble de relógios (runs = N), leia a banda [p05–p95], confirme que duas execuções dão um scenario_hash idêntico e leia um resultado de integridade / Stanford. |
exercises/tier3_montecarlo.py |
As soluções de referência usam a extensão Python (primeiro maturin develop --features python). Executado a partir da raiz do repositório, tier2_sweep.py imprime o holdover do relógio atómico à escala de chip a descer de 2610 s com uma especificação de 20 ns para 1140 s a 5 ns.
Quer dados novos?#
Os números de destaque destes tutoriais correm inteiramente a partir de cenários que já estão no repositório. Nada é descarregado, o que os mantém reproduzíveis e seguros para executar em integração contínua (CI). Para os exercícios de “alargar” pode obter dados em direto:
- Elementos de duas linhas (TLE) do GPS (atualizar a constelação de órbita): https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle, conjuntos de elementos em texto simples de 3 linhas (nome + linha 1 + linha 2). Auxiliar:
scripts/fetch_tles.sh. Dados abertos (catálogo do 18th Space Defense Squadron da US Space Force, redistribuído pelo Celestrak, Dr. T. S. Kelso). - Referência independente de verificação do SGP4 (Simplified General Perturbations 4) (já incorporada, não descarregar de novo): vetores de teste AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 “Revisiting Spacetrack Report #3”, https://celestrak.org/publications/AIAA/2006-6753/, usados por
tests/sgp4_verification.rs; verdocs/SGP4-VALIDATION.md. - Referência independente das relações de estabilidade de relógio: NIST (National Institute of Standards and Technology) Special Publication 1065 (Riley, Handbook of Frequency Stability Analysis), https://tf.nist.gov/general/pdf/2220.pdf, as relações σ_y(τ)↔fase por trás do Tutorial 2.