Campanhas
Um único cenário responde a uma pergunta sobre uma situação. Uma missão é uma sequência de situações, e um estudo de projeto é uma família delas. O tipo de cenário campaign compõe os tipos existentes numa só execução sem reimplementar nenhum deles: cada membro é uma tabela de cenário normal que traz o seu próprio kind, despachada através de api::run_toml exatamente como kshana <file>.toml a executaria, e a campanha limita-se a ler números dos documentos de resultados.
Uma campanha é MODELLED. As suas identidades de composição são testadas (abaixo), mas encadear fases é uma escolha de modelação, e cada fase vale apenas o que valer o tipo de cenário que a executou.
Execute-se uma como qualquer outro cenário:
kshana scenarios/campaign-jam-spoof-holdover-integrity.toml
# writes .result.json, .chart.svg, .report.html and .report.json next to the file
Uma campanha pode conter qualquer combinação de quatro secções; uma sem nenhuma executa-se e o seu resumo diz que não compôs nada.
[[phases]]: uma missão encadeada numa só cronologia#
Cada fase executa um ou mais cenários sobre uma janela de uma cronologia de missão partilhada, por exemplo um relógio em holdover e um sistema de navegação inercial (INS) a deslizar ao mesmo tempo. As saídas de cada execução são lidas para canais com nome, colocadas no instante de início da fase e reamostradas para uma grelha comum ([timeline] step_s) por retenção de ordem zero: um instante da grelha toma a amostra mais recente da execução da fase a que pertence, nesse instante ou antes dele, e é nulo quando nenhuma execução dessa fase fornece o canal.
| Canal | Unidade | O que é | Fonte predefinida |
|---|---|---|---|
time_error_ns |
ns | erro de tempo do relógio | clock: <side>.series[].error_ns; spoof: <side>.series[].offset_ns |
guard_ns |
ns | guarda de erro de tempo | o threshold_ns da própria execução |
cn0_dbhz |
dB-Hz | razão média efetiva entre a portadora e a densidade de ruído (C/N0) nos satélites visíveis | jamming: média de epochs[].sats[].cn0_effective_dbhz |
cn0_floor_dbhz |
dB-Hz | piso de perda de seguimento | jamming: o tracking_threshold_dbhz do cenário, quando o indica |
tracking |
contagem | satélites ainda em seguimento | jamming: epochs[].tracking |
protection_level_m |
m | nível de proteção vertical | integrity: epochs[].vpl_m |
alert_limit_m |
m | limite de alerta vertical | integrity: al_v_m |
position_error_m |
m | erro de posição | gnss-ins: <side>.series[].error_m |
position_threshold_m |
m | limiar de erro de posição | gnss-ins: threshold_m |
alarm |
1 | 1 enquanto algum monitor da fase der alarme | ver abaixo |
<side> é classical a menos que a execução defina side = "quantum". Qualquer outra grandeza é lida com uma entrada [[phases.runs.series]] explícita: um caminho temporal com um [] que indica as linhas (epochs[].t), um caminho de valores que partilha essas linhas ou um escalar difundido a todas as linhas (o prefixo input: lê o cenário da execução em vez do seu resultado), uma redução opcional (mean, min, max, count) para vários valores numa só linha, uma escala e uma unidade para um canal que a campanha não conhece.
Os alarmes vêm de três origens, combinadas por OU lógico dentro de uma fase:
- indicadores predefinidos lidos da execução:
jammingdá alarme enquanto menos de quatro satélites estão em seguimento (a sua própria definição de disponibilidade);integritydá alarme nas épocas que marca como indisponíveis; - regras predefinidas sobre os canais da fase, avaliadas depois de
carry:clockdá alarme enquanto o erro de tempo absoluto excedeguard_ns;gnss-insenquanto o erro de posição excedeposition_threshold_m; as regras explícitas vão em[[phases.runs.alarms]]; - eventos de alarme:
spoofgera um nodetect_time_sdo seu monitor assistido por relógio;spoof-detectgera um no início da fase quando a sua decisão fundida alerta.
O estado é transmitido entre fases de três formas explícitas:
carry = ["time_error_ns"]soma o valor do canal no fim da fase anterior aos valores que esta fase tem dele. A fase de relógio que um spoofer deslocou é o ponto de onde parte o holdover. Somar o desvio é exato para a fase do relógio, que integra a frequência; para um erro de posição, pressupõe que os dois erros são colineares, o caso pessimista.[[phases.handoff]]escreve um número da fase anterior (channel:<name>para o valor final de um canal, ou qualquer caminho de resultado de uma execução anterior) numa chave com pontos do cenário desta fase antes de ela ser executada, com uma escala e um desvio opcionais.end_at = "<result path>"termina a fase num instante calculado por uma execução, limitado porduration_s. A missão incluída termina a sua fase de spoofing emclassical.detect_time_s.
skip_s descarta os primeiros segundos da cronologia própria de uma execução (um aquecimento) antes do instante zero da fase.
A missão incluída#
scenarios/campaign-jam-spoof-holdover-integrity.toml executa 18 cenários membros ao longo de seis fases numa grelha de 10 s:
| Fase | Execuções | O que a cronologia mostra |
|---|---|---|
| nominal, 600 s | clock, jamming (sem emissor de jamming), integrity |
erro de tempo 0 ns; C/N0 43,0 dB-Hz face a um piso de 25 dB-Hz; nível de proteção vertical de 9,1 a 21,6 m face a um limite de alerta de 50 m |
| jamming, 600 s | o mesmo, emissor de jamming a -30 dBW, 1 km | C/N0 desce para 27,7 dB-Hz, todos os 8 satélites ainda em seguimento |
spoofing, terminado aos 370 s por end_at |
spoof (rampa de tempo de 0,1 ns/s), spoof-detect, jamming |
o erro de tempo sobe em rampa até 36 ns; o detetor de radiofrequência dá alarme no início da fase, o monitor assistido por relógio aos 370 s |
| holdover, 1800 s | clock (negado, transporta 37,0 ns), gnss-ins (unidade tática a deslizar), jamming a 10 dBW |
todos os satélites perdidos (C/N0 de cerca de -12 dB-Hz); erro de tempo de 36,4 a 62,7 ns face à guarda de 50 ns; erro de posição até 24 km |
| alarme de integridade, 600 s | clock (transporta 59,6 ns), jamming e integrity com uma máscara de 25 graus |
5 satélites em seguimento; nível de proteção de 19 a 135 m, em falta em 18 de 60 instantes da grelha; o erro de tempo transportado, de 52,1 a 61,7 ns, permanece acima da guarda de 50 ns, pelo que o alarme está ativo durante toda a fase |
| recuperação, 600 s | clock, jamming (sem emissor de jamming), integrity |
erro de tempo de volta a 0 ns; alarme em silêncio |
As execuções de integridade usam a trajetória de utilizador própria do exemplo integrity (uma trajetória circular a 0,4 km de altitude), e não o local fixo do recetor de jamming, e a máscara de 25 graus representa o céu parcial de um recetor que está a readquirir. São escolhas de cenário, indicadas no ficheiro.
Uma missão conduzida pelo espetro da banda L#
scenarios/campaign-spectrum-holdover-integrity.toml executa 8 cenários membros ao longo de três fases numa grelha de 1 s, com o C/N0 do GPS L1 C/A e do Galileo E1 lido a partir do tipo de cenário spectrum (ver SPECTRUM.md) e não a partir da tabela por satélite do tipo de cenário jamming. Os emissores de jamming são os de scenarios/l-band-waterfall-jamming.toml.
| Fase | Execuções | O que a cronologia mostra |
|---|---|---|
início, terminado aos 10 s por end_at |
clock, spectrum (chirp a partir dos 10 s), integrity |
L1 C/A 43,48 e E1 44,73 dB-Hz; a fase termina na primeira perda de L1 C/A da própria execução de espetro (timeline.bands[0].first_loss_t_s); nível de proteção de 21,6 m face a 50 m |
| holdover, 600 s | clock (negado, transporta o erro de início, 0 ns aqui), spectrum (chirp ativo) |
L1 C/A 3,38 e E1 4,44 dB-Hz, ambos abaixo do piso de 25 dB-Hz; erro de tempo de -0.07 a 5,06 ns face à guarda de 50 ns; alarme ativo |
| recurso ao Galileo, 300 s | clock (ressincronizado), spectrum (tom CW na portadora L1), integrity numa Walker 24/3/1 semelhante ao Galileo |
L1 C/A mantido em 17,98 dB-Hz, E1 de volta a 44,73 dB-Hz; nível de proteção de 6,1 a 17,7 m; alarme em silêncio |
A recuperação de E1 sob o tom CW assenta no tratamento de espetro contínuo do tipo de cenário de espetro: o tom situa-se no nulo do espetro MBOC e não acopla nada. Um tom real acoplar-se-ia através das riscas espetrais do código; isso está indicado no ficheiro e em SPECTRUM.md.
[sweep]: uma grelha de parâmetros sobre qualquer tipo de cenário#
De uma a três chaves de cenário com pontos, cada uma sobre um intervalo linear ou logarítmico, nos mesmos valores de eixo que o tipo de cenário sweep-nd usa. Cada eixo tem um nome e uma unidade; cada métrica tem um nome e um caminho de resultado, e a sua unidade é lida do bloco de unidades do próprio tipo de cenário varrido, a menos que a campanha declare uma. Com runs > 1, cada nó é um conjunto de Monte Carlo com semente (realização k na semente do nó mais k), apresentado com as estatísticas abaixo. scenarios/campaign-sweep-jammer-power.toml varre um emissor de jamming a 1 km do recetor, de -50 a +10 dBW: a razão média entre o jammer e o sinal varia exatamente 1 dB por dB (12,2 a 72,2 dB), e a disponibilidade desce de 1 para 0 entre -30 e -25 dBW.
Uma chave com pontos pode indexar por posição uma matriz de tabelas: system.2.sisre_m é o sisre_m da terceira tabela [[system]], e case.0.system.0.shell.0.altitude_km desce três níveis.
[monte_carlo]: um conjunto com semente#
A realização k executa o cenário com a sua chave de semente definida como base_seed + k, a convenção que o conjunto de relógios já usa, de modo que o conjunto se reproduz exatamente. Cada métrica indica a média, o desvio-padrão populacional, os percentis 5, 50 e 95 por posto mais próximo, um intervalo de confiança de 95% por bootstrap de percentis com semente fixa para a média (2000 reamostragens) e, por predefinição, todas as amostras por ordem de semente. Os caminhos de resultado podem indexar matrizes: classical.series[-1].error_ns é a última amostra.
[compose]: vários cenários sob condições partilhadas#
Os valores partilhados com nome (um número ou uma matriz de números, com uma unidade) são escritos em cada membro nas chaves a que os associa, de modo que os membros não possam discordar quanto à condição partilhada. Todos os membros são executados e, para cada métrica, o resumo combinado indica o valor mínimo, máximo e médio entre os membros, nomeando o melhor e o pior. scenarios/campaign-shared-jammer-sea-road.toml coloca um emissor de jamming de 8 dBW entre um navio no Golfo da Finlândia (a cerca de 30 km) e um automóvel numa estrada costeira de Helsínquia (a cerca de 50 km): o navio perde todos os satélites (razão média entre o jammer e o sinal de 39,0 dB), enquanto o automóvel mantém pelo menos quatro (34,6 dB).
[optimize]: o melhor valor de uma métrica#
Procura-se o melhor valor de uma métrica (goal = "minimize", "maximize" ou "target", que minimiza a distância a target) em uma a três chaves de cenário com pontos, cada uma limitada a [lo, hi] numa escala lin ou log.
Existem dois métodos:
method = "grid"executa todos os nós de uma grelha comstepspor chave, nos valores de eixo da varredura.method = "nelder-mead"(o predefinido) executa um simplex de Nelder–Mead determinista em coordenadas normalizadas para [0, 1] por chave. Os pontos de ensaio são projetados sobre a caixa. A secção aceitamax_evals, umstepinicial e as tolerâncias de paragemftolextol.
Uma execução cuja métrica está ausente ou não é finita recebe a pior pontuação e fica guardada no rasto. Com runs > 1, a métrica é a média sobre as mesmas sementes em cada avaliação. O resultado indica best_coords, best_metric, best_score, evals, stop_reason e todas as avaliações em trace.
scenarios/campaign-optimize-link-budget.toml procura o alcance e a taxa de dados para uma margem de ligação de 3 dB. O ótimo é local à caixa e ao ponto de partida. É MODELLED, nunca uma afirmação global.
O protocolo e os seus limiares fixados antecipadamente estão em docs/design/evidence/cap32-optimize/. O teste é tests/campaign_optimize_reference.rs. Os resultados:
- uma resolução de alvo 1-D concorda com a forma fechada até 6e-15;
- o método da grelha concorda bit a bit com um ciclo de força bruta independente;
- o simplex faz pelo menos tão bem como a grelha de 41 × 41, em cerca de um décimo das suas execuções.
O limiar 1-D da ronda 1 é registado como NOT MET: a caixa fixada antecipadamente excluía a solução.
Reprodutibilidade#
Todos os resultados de campanha incluem scenario_hash, o SHA-256 (Secure Hash Algorithm 2, resumo de 256 bits) da forma canónica em JavaScript Object Notation (JSON) do documento da campanha (a ordem das chaves e a formatação não o alteram), e um bloco reproducibility com o número de execuções de membros e run_digest, um SHA-256 sobre o resumo de cada resultado de membro pela ordem de despacho. Duas execuções com o mesmo resumo produziram resultados de membros idênticos byte a byte. Cada execução de fase regista ainda o seu tipo de cenário, o seu próprio scenario_hash quando o tipo o tem, e o SHA-256 do seu documento de resultados. Todos os números do documento têm uma entrada de unidades.
O núcleo é sequencial e não lê ficheiros, pelo que uma campanha executa-se sem alterações na compilação WebAssembly. As campanhas não podem conter campanhas.
Exportações#
--export numa campanha escreve cada cenário membro que tenha geometria como o seu próprio conjunto de ficheiros, com a etiqueta do membro inserida antes do sufixo do formato: cada execução de fase (<phase>, ou <phase>-<k> quando a fase tem várias execuções), o cenário de base da varredura (sweep), o cenário de Monte Carlo (monte-carlo) e cada membro composto (com a sua própria etiqueta, e com os valores partilhados a que está associado escritos). Um membro idêntico a um anterior é escrito uma só vez; as transferências entre fases e os valores de varredura ou de semente aplicados em tempo de execução não constam dos cenários exportados.
kshana scenarios/campaign-shared-jammer-sea-road.toml --export kml
# after the usual result, chart and report files:
# wrote scenarios/campaign-shared-jammer-sea-road.ship-strait.kml
# wrote scenarios/campaign-shared-jammer-sea-road.car-coast-road.kml
Um formato que nenhum dos membros consiga descrever é recusado com essa razão. A tabela por cenário está em INTEROP.md.
Campanhas LEO-PNT#
Quinze campanhas incluídas enquadram questões de posicionamento, navegação e temporização (PNT) em órbita terrestre baixa (LEO); LEO-PNT.md descreve o que cada uma mostra. O que cada uma executa, tal como a linha de comandos o resume:
| Cenário | Modo | Questão |
|---|---|---|
leo-focus-data-services.toml |
composição, 4 membros | dados de serviço da mensagem de navegação face ao comprimento da trama |
leo-focus-fused-pnt-sisre.toml |
varredura de leo-pvt, 7 nós |
posicionamento fundido MEO e LEO face ao erro de alcance do sinal no espaço (SISRE) LEO |
leo-focus-indoor-uhf.toml |
composição, 2 membros | LEO-PNT em interiores por banda e classe de edifício |
leo-focus-iot-eirp.toml |
varredura de leo-pass, 9 nós |
energia por posição da Internet das Coisas (IoT) face à potência de transmissão UHF LEO |
leo-focus-ntn-bandwidth.toml |
varredura de ntn-positioning, 9 nós |
posicionamento em redes não terrestres (NTN) face à largura de banda do sinal de referência |
leo-focus-ppp-altitude.toml |
varredura de leo-ppp, 3 nós |
convergência do posicionamento preciso de ponto (PPP) face à altitude de uma camada LEO de 192 satélites |
leo-resilience-gnss-jammed-leo-carries.toml |
cadeia, 3 fases ao longo de 2100 s | Sistema Global de Navegação por Satélite (GNSS) sob jamming, a camada LEO assegura o utilizador, integridade mantida |
leo-resilience-multiband-diversity.toml |
varredura de spectrum, 13 nós |
diversidade de bandas LEO face a um emissor de jamming de barragem na banda L |
leo-resilience-spoof-monitors.toml |
composição, 4 membros | os monitores de spoofing face a quatro emissores de spoofing |
leo-vertical-5g-network-timing.toml |
cadeia, 1 fase ao longo de 86 400 s | temporização de estações de base 5G: holdover e tempo LEO |
leo-vertical-asset-tracking-iot.toml |
cadeia, 3 fases ao longo de 1440 s | seguimento de contentores com UHF LEO: energia por posição ao longo de uma viagem |
leo-vertical-autonomous-vehicle.toml |
cadeia, 2 fases ao longo de 1500 s | um veículo autónomo num desfiladeiro urbano com uma camada LEO |
leo-vertical-autonomous-vehicle-skyline.toml |
cadeia, 2 fases ao longo de 1800 s | o mesmo desfiladeiro urbano como um corte plano de 35 graus e como um horizonte de edifícios city-street |
leo-vertical-critical-infrastructure-timing.toml |
cadeia, 2 fases ao longo de 87 000 s | temporização de infraestruturas críticas: holdover com tempo LEO |
leo-vertical-polar-arctic.toml |
cadeia, 3 fases ao longo de 10 800 s | utilizadores polares e árticos com uma camada LEO polar |
leo-vertical-rail-maritime.toml |
cadeia, 3 fases ao longo de 2520 s | utilizadores ferroviários e marítimos com uma camada LEO |
MEO é órbita terrestre média, UHF frequência ultra-alta e 5G a quinta geração de redes móveis.
O que é verificado#
tests/campaign_composition_reference.rs fixa as identidades de composição:
- Uma campanha de uma só fase reproduz a execução autónoma bit a bit. Para
clock,integrityejamming, o documento de resultados do membro é idêntico byte a byte arun_tomlsobre o ficheiro de cenário, o seu resumo é o que a campanha indica e, com a grelha ao passo da própria execução, cada valor alinhado é igual ao valor da série autónoma (o C/N0 de jamming é igual à média calculada de forma independente a partir do documento autónomo). - Uma varredura de um só nó e uma composição de um só membro leem exatamente o número autónomo.
- Um conjunto de semente fixa é estável byte a byte, e a realização
ké exatamente a execução autónoma emseed + k; o hash da campanha ignora a ordem das chaves. - Um caso analítico.
scenarios/campaign-monte-carlo-clock-holdover.tomlexecuta 200 sementes de um relógio atómico à escala de chip com apenas ruído branco de frequência (q_wf = 9e-20 s^2/s, Microchip SA.45s sigma_y(1 s) = 3e-10), sincronizado até aos 590 s e a deslizar até aos 3600 s. O erro de tempo final é gaussiano com média 0 e desvio-padrão sqrt(q_wf * 3010 s) = 16,459 ns (o passeio aleatório da fase sob ruído branco de frequência, National Institute of Standards and Technology (NIST) Technical Note 1337). O intervalo apresentado, [-2.52, 1,59] ns, contém a verdadeira média 0; o desvio-padrão amostral, 14,93 ns, dá uma estatística de qui-quadrado de 164,5 com 199 graus de liberdade, dentro do intervalo bilateral de 99% [151,37, 254,14]. Com 3000 sementes, o mesmo cenário dá 16,31 ns. - A cadeia conduzida pelo espetro lê os números autónomos: a fase de início dura exatamente o tempo da primeira perda da execução de espetro, e cada valor de L1 C/A e de E1 na cronologia é igual, até 1e-9 dB, à linha do exemplo autónomo de cascata para o mesmo estado do emissor de jamming (nominal, só chirp, só tom CW).
- A cadeia transmite o estado tal como documentado: a fase de spoofing dura exatamente o tempo de deteção da execução de spoofing, o holdover transporta exatamente o desvio da execução de spoofing na deteção, a recuperação não transporta nada, e o alarme está ativo sempre que o nível de proteção está em falta ou excede o limite de alerta.
Estas verificações mostram que compor não altera nada que não devesse. Não validam uma missão encadeada face a uma medida, razão pela qual as três linhas de campanha em VERIFICATION-MATRIX.md são MODELLED.