Tutoriais
Exercícios práticos resolvidos que levam você de “executar um cenário fornecido” a “quantificar e defender um resultado”. Todo número citado nos três tutoriais é uma saída real do mecanismo, ancorada em uma referência independente externa (não circular) de autoridade reconhecida, e fixado por um teste de integração (tests/tutorials.rs), de modo que um tutorial nunca pode se afastar em silêncio do que o mecanismo realmente faz. Se um tutorial diz que o relógio óptico mantém 6600 s, o teste derruba o build no dia em que isso deixar de ser verdade.
O Kshana é um simulador de posicionamento, navegação e temporização (PNT). Os tutoriais usam algumas outras abreviações, cada uma explicada onde aparece pela primeira vez: GNSS (Global Navigation Satellite System), GPS (Global Positioning System), CLI (interface de linha de comando) e TOML (Tom's Obvious Minimal Language, o formato de arquivo de cenário).
Novo no projeto? Leia antes o guia de conceitos e o glossário e depois volte aqui.
Os três exemplos práticos#
| # | Tutorial | O que você aprende | Tipo de cenário | Dificuldade | ~Tempo |
|---|---|---|---|---|---|
| 1 | 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 de posição (PDOP) e a exatidão de posição, e exportar onde os satélites realmente estão (formato de órbita precisa SP3) | orbit |
iniciante | 15 min |
| 2 | Holdover de relógio: por quanto tempo você consegue seguir sozinho | executar um holdover de relógio sem GNSS, ler a figura de mérito de temporização e entender a lei de crescimento √(q_wf·T) por trás dela | clock |
iniciante | 20 min |
| 3 | Resiliência quântica contra clássica do GNSS | o capstone: um detector de spoofing (spoof) e uma suíte PNT fundida completa (hybrid), e como ler segurança / integridade / navegação por estima em conjunto |
spoof + hybrid |
intermediário | 35 min |
Notebooks#
Notebooks Jupyter executáveis, com dados sintéticos e conjuntos de elementos públicos mantidos apenas no repositório, estão em notebooks/:
| Notebook | O que você aprende |
|---|---|
| Confiança em embarcações e treinamento | gerar um fluxo NMEA sintético de ponte com um evento roteirizado e depois 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 rota | onde os dados de navegação pareceram degradados e quanto de uma rota eles afetam |
| Mapeamento de compliance e exportação para test-bench | em quais linhas de referenciais públicos um conjunto de execuções fornece evidências em apoio de (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 é gravado) |
| 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 enxerga sob a linha de horizonte de uma rua ou cais, seu DOP e elipse de erro, um céu datado a partir de conjuntos de elementos e um Monte Carlo com seed contra a covariância (MODELLED) |
Como executar um tutorial#
Todo tutorial executa o mesmo cenário de três maneiras; escolha a que lhe convier. Todas chamam o mesmo mecanismo, portanto os números são idênticos (espelha a seção Uso do README).
Linha de comando. A CLI despacha pelo campo kind do cenário e grava <scenario>.result.json, <scenario>.chart.svg, <scenario>.report.html e <scenario>.report.json ao lado da entrada (JSON é JavaScript Object Notation, SVG Scalable Vector Graphics, HTML HyperText Markup Language). Alguns tipos de cenário também publicam uma tabela de reprodutibilidade como <scenario>.table.csv (valores separados por vírgula): realtime-frame-eop, lunar-time-budget, lunar-jamming, leo-navmsg, telecom-timing e moonlight-service-volume quando um local de exportação é definido. Nenhum dos três tutoriais é um deles, de modo que você não verá esse arquivo aqui.
cargo run -- scenarios/orbit-sgp4-gps.toml
cargo run -- compila a CLI a partir deste checkout. Com um binário instalado (cargo install kshana), o mesmo comando é kshana scenarios/orbit-sgp4-gps.toml. Sem um checkout, a maioria dos cenários fornecidos está embutida no binário: kshana example os lista (e nomeia os poucos que não estão embutidos, com o motivo), e kshana example orbit-sgp4-gps > orbit-sgp4-gps.toml grava um: a cópia de scenarios/orbit-sgp4-gps.toml com que o binário foi compilado.
Python. Compile a extensão a partir deste checkout uma vez com maturin, dentro de um ambiente virtual ativo, e então 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 o wheel publicado. Ele pode estar defasado em relação a este checkout: json.loads(kshana.list_kinds()) informa quais tipos de cenário 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 mecanismo roda no cliente como WebAssembly.
Os tutoriais citam a CLI, mas todo comando tem o equivalente em Python e no playground acima. Cada resultado é reprodutível a partir de scenario + seed + engine version: execute duas vezes e você obtém uma saída idêntica bit a bit.
Cenários didáticos anotados#
Para cada domínio de capacidade há um .toml bastante 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 nomeada e o resumo esperado de uma linha registrado como comentário # expected:. Os valores dos campos são idênticos aos do original no diretório scenarios/ de nível superior do repositório (tests/tutorials.rs compara o TOML interpretado), de modo que a saída documentada continua verdadeira. Os hashes de referência (golden) também ficam intocados: um comentário nunca altera o hash de um cenário.
| Domínio | Arquivo 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, monitoramento autônomo de integridade pelo receptor) | 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 inercial por estima | scenarios/inertial.toml | inertial |
scenarios/imu-deadreckoning.toml |
| Transferência de tempo | scenarios/timetransfer.toml | timetransfer |
scenarios/timetransfer.toml |
| Domínio de medição do GNSS | scenarios/gnss-sim.toml | gnss-sim |
scenarios/gnss-sim-raim.toml |
O arquivo didático de segurança usa
kind = "spoof"internamente: a figura de mérito de Segurança (1 − P_md, um menos a probabilidade de detecção perdida) é produzida pelo pacote spoof. O nome do arquivo segue a capacidade (segurança); okindsegue o pacote (spoof). O cabeçalho desse arquivo destaca isso.
O catálogo completo de tipos de cenário#
O mecanismo despacha pelo kind do cenário. A tabela abaixo lista os tipos de cenário mais usados (os oito domínios de tutorial acima mais seus vizinhos mais próximos). Ela não é o conjunto completo: src/api.rs::list_scenario_kinds() devolve todos os 92 tipos de cenário embutidos. Essa função (exposta como list_kinds() nos bindings Python e WebAssembly (WASM), e como kshana kinds --json na linha de comando) é o catálogo autoritativo e sempre atual, e SCENARIOS.md é sua enumeração gerada, uma seção por tipo de cenário com os campos TOML obrigatórios e opcionais. tests/tutorials.rs::tutorial_scenarios_use_real_kinds garante que todo tipo de cenário que um tutorial documenta é um tipo de despacho real, de modo que nada nesta tabela pode nomear um tipo de cenário que não existe.
| Tipo | O que faz |
|---|---|
clock |
Holdover de relógio contra a especificação; conjunto Monte-Carlo opcional (runs > 1). |
inertial |
Navegação por estima inercial de 1-DOF (um grau de liberdade) durante uma interrupção de GNSS. |
orbit |
Disponibilidade de 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 contra um conjunto de relays LunaNet. |
timetransfer |
Transferência bidirecional de tempo/frequência óptica contra radiofrequência (RF). |
hybrid |
Capstone de PNT híbrido: relógio + unidade de medição inercial (IMU) + auxílio por 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 estado de erro GNSS/INS (sistema de navegação inercial) com acoplamento fraco e forte. |
gnss-sim |
Simulação de pseudodistância no domínio da medição (ionosfera Klobuchar, troposfera Saastamoinen/Niell) + RAIM. |
jamming |
Jamming por orçamento de enlace: razão jammer-sinal (J/S) → densidade efetiva de portadora-ruído (C/N₀) → perda de sincronismo (loss of lock). |
spoof |
Detector estocástico de spoofing de tempo (Neyman–Pearson / χ²₁) com probabilidades de falso alarme e de detecção perdida (P_fa/P_md) por Monte-Carlo. |
sweep |
Varredura 1-D de estudo de compromissos sobre um parâmetro do pacote de relógio. |
sweep-nd |
Varredura genérica N-D sobre qualquer pacote por meio de chaves TOML pontuadas / caminhos de métricas JSON. |
Além dos tutoriais: capacidades mais novas#
Os três tutoriais ficam nos pacotes clássicos de relógio, órbita e segurança. O mecanismo cresceu muito além deles. Cada linha abaixo é um cenário fornecido que você pode executar 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 das figuras dos tutoriais, essas linhas são o registro de uma execução, não fixadas por tests/tutorials.rs: execute o cenário de novo para obter o valor atual. Os resultados declaram seu próprio escopo (a maioria traz um label), e a matriz de verificação declara quais capacidades são VALIDATED contra uma referência independente externa e quais são MODELLED.
| Capacidade | Cenário | Tipo | Primeira linha do resumo | Ler mais |
|---|---|---|---|---|
| Espectro da 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 em uma é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ção em 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 em uma linha do tempo | 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 MEO + LEO fundido | 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 de 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 sob jamming, LEO carrega o usuário | 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, telecom, veículos, Ártico | scenarios/leo-vertical-rail-maritime.toml (e os demais arquivos leo-vertical-*) |
campaign |
campaign 49575d27b696 | Railway and maritime with a LEO layer | chain: 3 phases over 2520 s, … |
CAMPAIGNS.md |
| Holdover de telecom contra os limites de relógio G.8272 da ITU-T (União Internacional de Telecomunicações, Setor de Normalização das Telecomunicações) | 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 é o padrão 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. Toda execução grava
<scenario>.report.htmle<scenario>.report.json(veja REPORTS.md).kshana --study <suite.toml>executa uma suíte de cenários em um.study.jsone.study.html, por exemplokshana --study scenarios/quantum-pnt-demonstrator.suite.toml. - Animation.
kshana <scenario.toml> --animate <svg|html|frames|all>renderiza as séries temporais da execução, por exemplo--animate htmlemscenarios/orbit-sgp4-gps.tomlgravaorbit-sgp4-gps.animation.html. Um tipo de cenário sem eixo de tempo amostrado (comosolar-system) é recusado com um erro; veja ANIMATION.md. - Exportações de interoperabilidade.
--export <czml|kml|geojson|stk|sigmf|all|list>grava 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 listinforma quais formatos se aplicam a um cenário; o SigMF se aplica somente aspectrum. O pacote de órbita também exporta--export-sp3,--export-omme--export-oem(mensagens de órbita do CCSDS, Consultative Committee for Space Data Systems). Veja INTEROP.md.
Exercícios graduados#
Percorra a escada. Cada nível é mais difícil e mais defensável que o anterior; as soluções de referência estão em exercises/.
| Nível | Objetivo | O que você 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 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 cair; ou use kind = "sweep"/"sweep-nd" para tabulá-lo. |
exercises/tier2_sweep.py |
| Nível 3 — quantificar e defender | Monte-Carlo, faixas de confiança, reprodutibilidade e um nível de proteção | Execute um conjunto de relógios (runs = N), leia a faixa [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 (maturin develop --features python primeiro). Executado a partir da raiz do repositório, tier2_sweep.py imprime o holdover do relógio atômico em escala de chip caindo de 2610 s com especificação de 20 ns para 1140 s a 5 ns.
Quer dados novos?#
Os números de destaque nestes tutoriais rodam inteiramente a partir de cenários já presentes no repositório. Nada é baixado, o que os mantém reprodutíveis e seguros para rodar em integração contínua (CI). Para os exercícios de “estenda”, você pode puxar dados ao vivo:
- Elementos de duas linhas (TLEs) do GPS (atualizar a constelação de órbita): https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle, conjuntos de elementos de 3 linhas em texto simples (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á incluída, não baixe 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; vejadocs/SGP4-VALIDATION.md. - Referência independente das relações de estabilidade de relógio: Publicação Especial 1065 do NIST (National Institute of Standards and Technology) (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.