Validação do SGP4/SDP4 em relação à referência da comunidade
O propagador de órbita do Kshana é validado em relação à referência canônica da comunidade para SGP4/SDP4 (SGP4: Simplified General Perturbations 4; SDP4: Simplified Deep-space Perturbations 4): os vetores de verificação publicados com Vallado et al., "Revisiting Spacetrack Report #3" (AIAA (American Institute of Aeronautics and Astronautics) 2006-6753), distribuídos como SGP4-VER.TLE (os TLEs de teste (conjuntos de elementos de duas linhas)) e tcppver.out (o estado TEME (true equator, mean equinox) esperado em cada instante). Esta é a mesma referência com a qual as implementações públicas em C++/Python/MATLAB se validam; portanto, a concordância aqui é concordância com o padrão de fato.
Resultado#
| Grandeza | Valor |
|---|---|
| Estados de referência comparados | 666 (todas as linhas em tcppver.out, fixadas no teste) |
| Pior erro de posição | 4,12 mm (4.120e-6 km, satélite 23333; < 2e-5 km de tolerância) |
| Pior erro de velocidade | 1.85e-9 km/s (satélite 23333; < 1e-6 km/s de tolerância) |
| Casos cobertos | SGP4 de órbita próxima à Terra, SDP4 de espaço profundo (lunissolar + ressonância de 12 h/24 h) e os casos deliberados de código de erro |
Os casos de espaço profundo e de ressonância importam especificamente para este projeto: os satélites GNSS (global navigation satellite system) ficam em órbitas de ~12 h que são de espaço profundo e ressonantes, o que um modelo de dois corpos + J2 secular não consegue reproduzir — o SGP4/SDP4 consegue.
Método#
- A implementação (
src/sgp4.rs) é uma portagem em Rust, sem dependências, do algoritmo de Vallado, de domínio público; o tratamento de época é em dias desde 1950, usa-se o modoimproved(e nãoafspc), e as constantes gravitacionais do WGS-72 (WGS: World Geodetic System) são aplicadas como a referência especifica. - O teste (
tests/sgp4_verification.rs) analisa as fixturesSGP4-VER.TLEetcppver.outincorporadas ao repositório (tests/fixtures/sgp4/), propaga cada satélite de teste até cada instante de referência e verifica que a posição e a velocidade TEME coincidem dentro das tolerâncias acima. A contagem de linhas comparadas é fixada em exatamente 666, para que uma regressão na fixture ou no comportamento de omissão não possa reduzir a cobertura silenciosamente.
Reproduza#
cargo test --test sgp4_verification -- --nocapture
O teste imprime o número de linhas comparadas e os erros de posição e de velocidade no pior caso. As fixtures estão versionadas, de modo que a verificação é totalmente offline e determinística.
Verificação cruzada independente com o crate sgp4#
Coincidir com a referência publicada demonstra correção em relação a uma tabela. Para demonstrar também a correção em relação a uma implementação independente, tests/sgp4_crate_comparison.rs executa uma biblioteca SGP4 independente em Rust, amplamente usada, o crate sgp4 (neuromorphicsystems/sgp4, versão 2,4), sobre os mesmos 666 vetores da AIAA e compara as duas bases de código diretamente. Ambas são executadas com o modelo gravitacional WGS72 (World Geodetic System 1972) em que os vetores são definidos (o from_elements padrão do crate usa o WGS84 (World Geodetic System 1984), que difere da referência WGS72 em ~km — uma escolha de modelagem, exposta com honestidade, não um erro).
| Regime | kshana ↔ referência | crate ↔ referência | kshana ↔ crate |
|---|---|---|---|
| próximo à Terra (LEO/MEO (LEO: órbita baixa da Terra; MEO: órbita média da Terra)) | 7.3e-9 km | 7.3e-9 km | 4.4e-10 km |
| espaço profundo (não ressonante) | 4.1e-6 km | 2.1e-7 km | 4.1e-6 km |
| ressonância de espaço profundo (½ dia) | 8.1e-9 km | 7.7e-9 km | 2.2e-9 km |
| ressonância de espaço profundo (1 dia) | 8.2e-9 km | 7.8e-9 km | 2.2e-9 km |
Duas implementações independentes concordam em nível submicrométrico em órbitas próximas à Terra e ressonantes e em 4,12 mm no pior caso em todos os regimes — os mesmos 4,12 mm que são o desvio do próprio Kshana em relação à referência, isto é, a discordância é esse único caso de espaço profundo, com o crate situando-se entre o Kshana e a tabela. A tabela completa (com as contagens de linhas por regime e os quatro casos patológicos que o crate rejeita na construção) está versionada em tests/fixtures/sgp4_comparison.md e é regenerada por meio de KSHANA_REGEN_FIXTURES=1 cargo test --test sgp4_crate_comparison.
Situação da "publicação" deste resultado#
A validação cruzada em si está concluída e incorporada ao repositório. Submeter o resultado a veículos externos (um catálogo da comunidade, uma nota breve, um registro arquivado com DOI (DOI: digital object identifier)) é uma ação dos mantenedores, acompanhada separadamente no roteiro; este documento é o registro dentro do repositório para o qual essas submissões apontariam.