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

CenáriosEditar no GitHubFonte: docs/REAL_TLE_GUIDE.md

Utilizar TLE reais de constelações

O ficheiro scenarios/orbit-sgp4-gps.toml fornecido já contém TLE reais (conjuntos de elementos de duas linhas): o instantâneo gps-ops do Celestrak da constelação GPS (Global Positioning System) operacional catalogada em 2021-07-28, 30 satélites, com strict_checksum = true. Cada satélite é propagado com SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4), que está validado face aos vetores oficiais AIAA (American Institute of Aeronautics and Astronautics) 2006-6753. O mesmo instantâneo está incluído como tests/fixtures/celestrak/gps-ops_2021-07-28.txt, e scripts/fetch_tles.sh obtém um novo. Leia a secção 3 antes de citar um valor de geometria a partir dele: esse cenário propaga cada satélite a partir da sua própria época.

Para um exemplo sintético e autónomo, scenarios/orbit-real-tle.toml fornece seis satélites do tipo GPS como registos simples de linha 2, propagados como elementos keplerianos analíticos, e todos os cenários orbit sem um bloco tle constroem uma constelação Walker.

Para estudar a constelação GPS atual (ou qualquer outra), introduza um instantâneo recente.

1. Descarregar um instantâneo atual#

O Celestrak redistribui os conjuntos de elementos do catálogo NORAD (North American Aerospace Defense Command), atualizados pelo menos diariamente. Para o GPS:

curl -o gps-ops.txt "https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle"

Outros grupos úteis: galileo, glo-ops (GLONASS, o Sistema Global de Navegação por Satélite da Rússia), beidou, stations (a ISS, Estação Espacial Internacional, e outras estações tripuladas).

O ficheiro é uma sequência de registos de três linhas (nome, linha 1, linha 2). O analisador do Kshana ignora as linhas de nome, pelo que pode colar o ficheiro tal como está.

2. Introduza-o num cenário#

Em qualquer cenário de órbita, defina o bloco tle da constelação com o conteúdo do instantâneo:

[constellation]
# Paste the Celestrak gps-ops block here (name/line1/line2 triples). Two real records
# from tests/fixtures/celestrak/gps-ops_2026-06-07.txt are shown; a real block has ~30.
strict_checksum = true   # real Celestrak TLEs carry valid checksums; enforce them
tle = """
GPS BIIR-5  (PRN 22)
1 26407U 00040A   26158.26673196  .00000043  00000+0  00000+0 0  9990
2 26407  54.8526 215.5566 0121168 302.4173  18.5084  2.00557626189748
GPS BIIR-8  (PRN 16)
1 27663U 03005A   26157.61055816  .00000039  00000+0  00000+0 0  9995
2 27663  54.8837 215.3893 0147927  53.0597 289.9583  2.00561160171094
"""

(PRN é o número do código de ruído pseudoaleatório que um satélite GPS transmite.)

Um par linha 1 + linha 2 é propagado com SGP4/SDP4 (termos de arrasto e de espaço profundo); uma linha 2 isolada é tratada como elementos médios keplerianos analíticos. Os dois podem ser misturados.

strict_checksum = true rejeita qualquer linha cuja soma de verificação módulo 10 da coluna 69 esteja errada — uma boa verificação de integridade num ficheiro acabado de descarregar. Tem por predefinição false porque os cenários didáticos sintéticos usam somas de verificação de substituição.

3. Notas sobre épocas — leia isto antes de citar um valor de geometria#

O SGP4 propaga cada satélite a partir da sua própria época de TLE, e parse_propagators (em src/tle.rs) devolve apenas propagadores, pelo que o tempo de cenário t é aplicado como tsince = t a cada satélite de forma independente. Essa é a convenção correta apenas se todos os conjuntos de elementos do ficheiro partilharem uma época.

Um ficheiro de grupo do Celestrak não lhe dá isso. O ficheiro é descarregado num único instante, mas o conjunto de elementos de cada satélite é atualizado com a sua própria cadência, pelo que as épocas no seu interior estão distribuídas por dias. Medido nos conjuntos incluídos neste repositório (linha 1, colunas 19–32):

ficheiro de teste conjuntos dispersão das épocas
tests/fixtures/celestrak/gps-ops_2026-06-07.txt 32 70,6 h
tests/fixtures/celestrak/gps-ops_2021-07-28.txt 30 76,4 h
tests/fixtures/celestrak/galileo_2026-06-07.txt 33 335,7 h

70,6 h correspondem a 5,9 revoluções GPS. Propagado tal como está, o faseamento no plano fica baralhado: os satélites estão nas altitudes e inclinações certas, mas não onde estavam em nenhum dia concreto, pelo que o conjunto visível, o DOP (diluição da precisão) e qualquer disponibilidade calculada a partir deles descrevem uma constelação que nunca existiu. Nada no analisador mede esta dispersão por si, e os tipos de cenário orbit e integrity não alinham épocas: um bloco TLE num cenário é sempre propagado com a época de cada satélite.

Faça antes isto. Guarde a época junto do propagador, escolha um instante de referência e desloque o tsince de cada satélite para esse instante. Tle::epoch_days_1950 é público, pelo que o ciclo de análise é curto; tests/igs_real_data.rs (real_gps_tle_snapshot) é o exemplo trabalhado nesta árvore:

use kshana::orbit::Propagator;
use kshana::sgp4::wgs72;
use kshana::tle::parse_tle;

/// TEME position (m) of one satellite at `t` seconds after the common reference
/// instant `t_ref_jd` (a Julian date), not after its own TLE epoch.
fn aligned_teme_m(line1: &str, line2: &str, t_ref_jd: f64, t: f64) -> Result<[f64; 3], String> {
    let tle = parse_tle(line1, line2)?;
    let jd_epoch = 2_433_281.5 + tle.epoch_days_1950;
    let prop = Propagator::Sgp4(Box::new(tle.to_sgp4(wgs72(), false)));
    let tsince_s = (t_ref_jd - jd_epoch) * 86_400.0 + t;
    Ok(prop.position_eci(tsince_s))
}

TEME é o referencial de equador verdadeiro e equinócio médio em que o SGP4 trabalha; tests/igs_real_data.rs roda-o para coordenadas fixas à Terra com teme_to_ecef.

Se não alinhar, diga-o ao comunicar o valor: é uma afirmação sobre camadas orbitais, não sobre um céu real.

A importância disto é medida em tests/araim_dual_real_data.rs, que aplica os mesmos desfasamentos (instante de referência: a época mais recente nos ficheiros de teste GPS + Galileo combinados, 2026-06-07T07:21:04 UTC (Tempo Universal Coordenado)) numa execução de disponibilidade ARAIM (monitorização autónoma avançada da integridade pelo recetor) de dupla constelação durante 24 h. Com um VAL (limite de alerta vertical) de 12 m, o céu alinhado dá 0,993 só com GPS, 1,000 com GPS+Galileo combinados e 0,990 com a dupla robusta a falhas de constelação; a convenção não alinhada com a época de cada satélite dá 0,208, 0,671 e 0,031 para as mesmas entradas — uma conclusão diferente, não um pequeno erro.

Ver também#

  • README.md — os cenários de órbita.
  • SCENARIOS.md — os campos do tipo de cenário orbit; os tipos de cenário integrity, gnss-sim, jamming e constellation-design usam a mesma tabela constellation, e ephemeris usa um único tle.
  • INTEGRITY.md — o motor ARAIM que o teste com céu real executa.
  • src/tle.rs — o analisador (parse_propagators, ParseOpts { strict_checksum }).