Tradução automática, não revista por um falante nativo. O inglês é a referência.

CenáriosEditar no GitHubFonte: docs/CAMPAIGNS.md

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: jamming dá alarme enquanto menos de quatro satélites estão em seguimento (a sua própria definição de disponibilidade); integrity dá alarme nas épocas que marca como indisponíveis;
  • regras predefinidas sobre os canais da fase, avaliadas depois de carry: clock dá alarme enquanto o erro de tempo absoluto excede guard_ns; gnss-ins enquanto o erro de posição excede position_threshold_m; as regras explícitas vão em [[phases.runs.alarms]];
  • eventos de alarme: spoof gera um no detect_time_s do seu monitor assistido por relógio; spoof-detect gera 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 por duration_s. A missão incluída termina a sua fase de spoofing em classical.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 com steps por 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 aceita max_evals, um step inicial e as tolerâncias de paragem ftol e xtol.

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, integrity e jamming, o documento de resultados do membro é idêntico byte a byte a run_toml sobre 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 em seed + k; o hash da campanha ignora a ordem das chaves.
  • Um caso analítico. scenarios/campaign-monte-carlo-clock-holdover.toml executa 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.