Mensagem de navegação LEO
O tipo de cenário leo-navmsg constrói a mensagem transmitida de efemérides e relógio de um satélite de posicionamento, navegação e temporização (PNT) em órbita baixa da Terra (LEO) e responde às perguntas que um projetista de mensagens faz: por quanto tempo uma mensagem pode cobrir, o que cada parâmetro extra traz, o que um usuário vê quando a mensagem muda no meio de uma passagem e quantos bits são necessários para transportá-la com precisão de centímetro.
É independente de sistema. Qualquer órbita, qualquer portadora e qualquer um dos quatro modelos de efemérides funcionam sem nenhuma predefinição; as predefinições nomeadas são dados opcionais (ver Predefinições).
Imprima um exemplo incluído com kshana example <name> (um nome por chamada) e execute-o com kshana scenarios/<name>.toml: leo-navmsg-fit-interval-trade, leo-navmsg-model-comparison, leo-navmsg-midpass-update e leo-navmsg-encode-decode. O tipo é também a etapa de mensagem do tipo leo-pnt-chain (LEO-PNT.md) e o membro da campanha leo-focus-data-services, que compõe quatro configurações de mensagem e informa o comprimento do quadro de cada uma (146, 154, 159 e 171 bytes).
Código: src/leo_navmsg/ — elements.rs (registros e algoritmo do usuário), truth.rs (órbita e relógio verdadeiros), fit.rs (ajustador), sisre.rs (erro de distância do sinal no espaço), services.rs (ionosfera e Tempo Universal Coordenado (UTC)), codec.rs (formato binário), text.rs (exportações no estilo Receiver Independent Exchange Format (RINEX) e em valores separados por vírgula (CSV)), presets/ (um arquivo por predefinição), mod.rs (o tipo).
O que uma mensagem carrega#
| Parte | Conteúdo |
|---|---|
| Auxiliares | identificador de veículo espacial (SVID), edição dos dados (IOD), identificador de banda, estado de saúde do sinal (convenção Galileo: 0 OK, 1 fora de serviço, 2 operações estendidas, 3 em teste) |
| Sincronização | número da semana, tempo da semana (TOW) de transmissão e um polinômio de relógio de segunda ordem af0 + af1·(t − toc) + af2·(t − toc)² |
| Efemérides | um dos quatro modelos abaixo |
| Outros serviços | um conjunto ionosférico transmitido de Klobuchar, coeficientes NeQuick-G do Galileo ai0, ai1, ai2 com cinco indicadores de tempestade, e parâmetros de tempo do sistema para UTC A0, A1, ΔtLS, t0t, WNot, WNLSF, DN, ΔtLSF |
Modelos de efemérides#
| Código | Modelo | Parâmetros |
|---|---|---|
kepler16 |
o conjunto kepleriano do Documento de Controle de Interface do Sinal no Espaço do Serviço Aberto do Galileo (OS SIS ICD): √A, e, i0, Ω0, ω, M0, Δn, Ω̇, i̇, Cuc, Cus, Crc, Crs, Cic, Cis, toe |
16 |
kepler-rac |
o mesmo, mais polinômios de correção ao longo da trilha, transversal e radial (RAC) a0…, c0…, r0… em τ = tk / tau_s, coeficientes em metros, tau_s a potência de dois igual ou acima da metade do intervalo de ajuste (transmitida), graus definidos por rac_degrees (padrão 7, 5, 6) |
16 + 21 por padrão, mais a escala de tempo |
liu22 |
o modelo de 22 parâmetros de Liu, Su, Xie, Zhou e Qu (2025, Remote Sensing 17(16):2894, doi 10.3390/rs17162894): os 16 mais ȧ, ṅ, Crs3, Crc3, Crs1, Crc1 |
22 |
ecef-poly |
o modelo de "relógio zero" do ATOMIC (Autonomous Time and Orbit Determination for Microsatellite Constellations): um polinômio centrado na Terra e fixo à Terra (ECEF) por eixo em τ = (t − t_ref) / 64 s (grau padrão 6), sem termos de relógio porque o relógio do satélite é conduzido ao tempo do sistema (InsideGNSS) |
22 por padrão |
O algoritmo do usuário (elements::sat_state) é a sequência do ICD do Galileo (equação de Kepler, correções de segundo harmônico, nó fixo à Terra) seguida, para kepler-rac, pelos três polinômios ao longo do referencial próprio da órbita kepleriana: radial ao longo da posição avaliada, transversal ao longo da normal da órbita a partir da inclinação e do nó corrigidos, ao longo da trilha completando a tríade. O relógio acrescenta o termo relativístico do ICD F·e·√A·sin E; para ecef-poly é a forma geral −2 r·v / c² a partir do polinômio e de sua derivada.
Os termos de Liu et al. seguem o algoritmo do usuário do artigo (Seção 2,2, Eq. 1-7): A = A0 + ȧ·tk, n = √(μ/A0³) + Δn + ṅ·tk (versões anteriores a 0,30 usavam a convenção de navegação civil do Global Positioning System (GPS) ½·ṅ·tk, de modo que um ṅ que elas escreviam é o dobro do do artigo), e Crs1·sin Φ + Crc1·cos Φ + Crs3·sin 3Φ + Crc3·cos 3Φ somado ao raio, Φ o argumento de latitude não corrigido. A convenção de escala de ṅ é transcrita da Eq. 1 do artigo; a comparação com o artigo em órbitas reais não depende dela (um fator ½ em ṅ deixa todo valor ajustado inalterado), de modo que o significado de um valor nDot transmitido não é validado ali.
Duas leituras são do próprio Kshana e são declaradas como tal:
- O referencial RAC e a normalização de
τ = tk / tau_s. Nenhum documento público define um referencial de correção LEO para uma mensagem transmitida. - O relógio de uma mensagem de relógio zero é zero no total: considera-se que a malha de condução mantém o relógio aparente, incluído o termo relativístico, no tempo do sistema.
O ajustador#
truth.rs integra a órbita com um Runge–Kutta de quarta ordem de passo fixo em um referencial que se converte em eixos fixos à Terra por uma rotação, θ(t) = θ0 + Ω̇e·t, a mesma rotação única que um algoritmo de usuário de transmissão aplica. A gravidade é de dois corpos (gravity_degree = 0), os harmônicos zonais J2 a J6 (2 a 6), ou o campo do Earth Gravitational Model 2008 (EGM2008) até grau e ordem 7 a 70, cujos termos tesserais carregam a assinatura de curto período que torna difícil um ajuste LEO. O arrasto é opcional (densidade exponencial estática). O relógio é de operação livre (viés, deriva, taxa de deriva e ruído de frequência branco com um desvio de Allan declarado de um segundo, mais o termo relativístico periódico) ou conduzido (um resíduo de Gauss–Markov de primeira ordem).
fit.rs ajusta o conjunto kepleriano com Levenberg–Marquardt sobre elementos não singulares (e·cos ω, e·sin ω, λ0 = M0 + ω): uma órbita LEO é quase circular, de modo que ω e M0 isolados são quase indistinguíveis. Parte do estado osculador em toe com a taxa do nó por J2. Priors fracos centrados em zero limitam as taxas e os harmônicos que um arco curto não consegue resolver; com um peso de observação de 1 cm, eles atuam apenas nessas direções nulas. O ajuste liu22 adota, em vez disso, o início e o estimador da Seção 2,3 do artigo: parte com todo termo de correção igual a zero, não tem priors (mínimos quadrados simples) e mantém o limite de 100 iterações do artigo. Ele para pela regra própria do Kshana de convergência de parâmetros, quando todo passo de parâmetro é inferior a 1e-3 de seu desvio padrão formal; o artigo para, em vez disso, quando o RMS varia menos de 0,1 mm. Os polinômios RAC são então ajustados aos resíduos ao longo/transversal/radial por mínimos quadrados lineares, e o polinômio de relógio ao relógio verdadeiro menos o termo relativístico que o usuário somará de volta.
Uma constatação que os padrões codificam: depois de um ajuste kepleriano por mínimos quadrados, o resíduo é, por construção, o que os 16 parâmetros não conseguem abranger, de modo que oscila ao longo da janela (vários cruzamentos por zero em cada componente) em vez de derivar. Um polinômio de correção só o remove quando o seu grau excede o que o conjunto kepleriano já abrange: ao longo da trilha 7, transversal 5 e radial 6 reduzem um resíduo de 15 minutos de centímetros a cerca de um milímetro, enquanto graus transversais menores quase nada removem (o resíduo transversal é ímpar em torno do centro da janela). Um sistema que obtém a sua parte kepleriana de outra maneira deixa um resíduo de formato diferente, e os graus de que precisa decorrem disso. Os graus de correção próprios da predefinição Celeste (menores do que estes; existem apenas no arquivo da predefinição, src/celeste_iod.rs) são executados aqui sobre a base de mínimos quadrados do Kshana, razão pela qual os seus termos transversais contribuem pouco neste mecanismo: uma afirmação sobre o ajustador do Kshana, não sobre qualquer sistema real. toe e toc são segundos inteiros, como o formato binário os carrega.
Cada mensagem é usada durante um período centrado em sua janela de ajuste (a primeira tabela de compromissos usa a janela inteira). O que os valores do erro de distância do sinal no espaço (SISRE) medem é o erro de representação da mensagem em relação à verdade a que foi ajustada, como raiz do valor quadrático médio (RMS) e máximo ao longo do intervalo. O erro de determinação e de predição de órbita, que um segmento real em solo ou a bordo acrescenta por cima, não é modelado.
Erro de distância do sinal no espaço#
sisre.rs usa o SISRE de média global de Montenbruck, Steigenberger e Hauschild (2018, Advances in Space Research 61(12):3020–3038, doi 10.1016/j.asr.2018.03.041):
SISRE_orb = sqrt( w_R² R² + w_AC² (A² + C²) )
SISRE = sqrt( (w_R R − c·dT)² + w_AC² (A² + C²) )
Os pesos são as médias sobre usuários distribuídos uniformemente sobre a calota visível da Terra de cos² η e ½ sin² η, com η o ângulo de nadir da linha de visada no satélite, calculado para o raio e a máscara de elevação da própria órbita. Com uma máscara de 0°, o cálculo reproduz a tabela do artigo para órbita média da Terra (GPS 0,98 e 1/49, GLONASS 1/45, Galileo 1/61, BeiDou 1/54) e órbita geoestacionária (0,99 e 1/126): essa é a verificação VALIDATED. Em LEO, a mesma média dá
| Altitude | w_R |
1 / w_AC² |
ângulo de nadir no horizonte |
|---|---|---|---|
| 320 km | 0.384 | 2.35 | 72.2° |
| 510 km | 0.459 | 2.53 | 67.8° |
| 550 km | 0.472 | 2.57 | 67.0° |
| 786 km | 0.536 | 2.81 | 62.9° |
| 1080 km | 0.597 | 3.11 | 58.8° |
| 1336 km | 0.638 | 3.37 | 55.8° |
de modo que um usuário LEO, que vê o satélite longe do nadir, sente os erros ao longo da trilha e transversais muito mais do que um usuário de órbita média.
Análises#
analysis = [...] escolhe qualquer uma das quatro (padrão: todas).
Compromisso do intervalo de ajuste#
[trade] define o intervalo, os intervalos de ajuste, os períodos de atualização e os modelos. scenarios/leo-navmsg-fit-interval-trade.toml (550 km, 97,6°, EGM2008 até grau 20 e arrasto, 30 minutos de mensagens) dá, com o período de uso igual ao intervalo de ajuste:
| Modelo | Intervalo de ajuste | RMS de órbita do SISRE | Máximo de órbita do SISRE | RMS do SISRE com relógio | RMS radial / ao longo da trilha / transversal |
|---|---|---|---|---|---|
kepler16 |
60 s | 0,041 cm | 0,179 cm | 0,069 cm | 0,09 / 0,01 / 0,00 cm |
kepler16 |
120 s | 0,032 cm | 0,160 cm | 0,079 cm | 0,06 / 0,01 / 0,01 cm |
kepler16 |
180 s | 0,093 cm | 0,540 cm | 0,134 cm | 0,18 / 0,06 / 0,00 cm |
kepler16 |
300 s | 0,310 cm | 1,033 cm | 0,329 cm | 0,09 / 0,49 / 0,02 cm |
kepler16 |
450 s | 1,690 cm | 7,542 cm | 1,696 cm | 0,72 / 2,65 / 0,04 cm |
kepler16 |
600 s | 2,875 cm | 10,219 cm | 2,866 cm | 1,72 / 4,42 / 0,26 cm |
kepler16 |
900 s | 9,345 cm | 34,032 cm | 9,349 cm | 6,46 / 14,14 / 0,91 cm |
kepler-rac |
60 s | 0,000 cm | 0,000 cm | 0,057 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
120 s | 0,000 cm | 0,000 cm | 0,074 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
180 s | 0,000 cm | 0,001 cm | 0,090 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
300 s | 0,004 cm | 0,014 cm | 0,106 cm | 0,00 / 0,00 / 0,01 cm |
kepler-rac |
450 s | 0,037 cm | 0,176 cm | 0,127 cm | 0,05 / 0,01 / 0,04 cm |
kepler-rac |
600 s | 0,214 cm | 0,643 cm | 0,229 cm | 0,28 / 0,09 / 0,26 cm |
kepler-rac |
900 s | 1,015 cm | 3,695 cm | 1,062 cm | 1,52 / 0,70 / 0,91 cm |
E com um ajuste de 300 s, variando a frequência com que uma nova mensagem assume:
| Modelo | Período de atualização | RMS de órbita do SISRE | Máximo de órbita do SISRE |
|---|---|---|---|
kepler16 |
30 s | 0,314 cm | 0,850 cm |
kepler16 |
60 s | 0,288 cm | 0,859 cm |
kepler16 |
150 s | 0,219 cm | 0,830 cm |
kepler16 |
300 s | 0,310 cm | 1,033 cm |
kepler-rac |
30 s | 0,004 cm | 0,009 cm |
kepler-rac |
60 s | 0,004 cm | 0,009 cm |
kepler-rac |
150 s | 0,004 cm | 0,010 cm |
kepler-rac |
300 s | 0,004 cm | 0,014 cm |
O conjunto kepleriano de 16 parâmetros se degrada de 0,04 cm a 60 s para 9,35 cm a 900 s: um conjunto kepleriano com harmônicos de duas vezes por revolução não consegue acompanhar os termos de gravidade de frequência mais alta e o arrasto de um arco LEO por mais do que alguns minutos, e o seu resíduo de mínimos quadrados oscila ao longo da janela. Os polinômios ao longo/transversal/radial (graus 7, 5, 6) absorvem o que resta: 1,01 cm a 900 s, 0,21 cm a 600 s. Nos intervalos mais curtos os valores keplerianos são submilimétricos e já não estão estritamente ordenados (o ajuste é então limitado pelo condicionamento, não pelo modelo).
Comparação de modelos#
scenarios/leo-navmsg-model-comparison.toml executa os quatro modelos a 1, 5 e 10 minutos sobre a mesma órbita, com o número de parâmetros e os bits de efemérides e relógio na codificação do Kshana:
| Modelo | Intervalo de ajuste | Parâmetros | Bits de efemérides + relógio | RMS de órbita do SISRE | RMS do SISRE com relógio |
|---|---|---|---|---|---|
kepler16 |
60 s | 16 | 570 | 0,022 cm | 0,049 cm |
kepler16 |
300 s | 16 | 570 | 0,230 cm | 0,260 cm |
kepler16 |
600 s | 16 | 570 | 3,061 cm | 3,071 cm |
kepler-rac |
60 s | 37 | 1045 | 0,000 cm | 0,044 cm |
kepler-rac |
300 s | 37 | 1045 | 0,005 cm | 0,120 cm |
kepler-rac |
600 s | 37 | 1045 | 0,160 cm | 0,208 cm |
liu22 |
60 s | 22 | 730 | 0,014 cm | 0,046 cm |
liu22 |
300 s | 22 | 730 | 0,074 cm | 0,142 cm |
liu22 |
600 s | 22 | 730 | 0,258 cm | 0,290 cm |
ecef-poly (relógio zero) |
60 s | 22 | 750 | 0,000 cm | 28,784 cm |
ecef-poly (relógio zero) |
300 s | 22 | 750 | 0,005 cm | 28,784 cm |
ecef-poly (relógio zero) |
600 s | 22 | 750 | 0,561 cm | 28,774 cm |
A linha de relógio zero é avaliada contra um relógio conduzido com um resíduo de 0,24 m (o valor do ATOMIC), as demais contra o relógio de operação livre a que se ajustam.
Liu et al. 2025, SISRE em função da altitude (MODELLED). O mesmo cenário ajusta o modelo de 22 parâmetros do Kshana em arcos de 20 minutos nas cinco altitudes do artigo, na inclinação de cada satélite:
| Satélite | Altitude | Inclinação | Liu et al. 2025 | Kshana (RMS apenas de órbita) | razão |
|---|---|---|---|---|---|
| GRACE-A | 320 km | 89.00° | 8,88 cm | 4,25 cm | 0.48 |
| GRACE-C | 475 km | 89.00° | 6,21 cm | 2,87 cm | 0.46 |
| Sentinel-2A | 786 km | 98.57° | 2,87 cm | 2,20 cm | 0.77 |
| HY-2A | 966 km | 99.34° | 2,11 cm | 1,25 cm | 0.59 |
| Sentinel-6A | 1336 km | 66.04° | 0,75 cm | 0,51 cm | 0.67 |
Isto não é uma validação. O artigo ajustou órbitas científicas precisas reais dos satélites citados (com todo o seu histórico de gravidade, arrasto e forças não gravitacionais); o Kshana ajusta a sua própria órbita integrada, avalia os seis parâmetros acrescentados como descrito acima e usa os seus próprios pesos de SISRE. A comparação mostra a tendência e a ordem de grandeza. A comparação nas mesmas órbitas reais que o artigo ajustou é tests/leo_navmsg_fit_real_orbit_oracle.rs (desde 0,30 o ajuste de 22 parâmetros concorda ali dentro do fator pré-registrado 1,5, nos dias do artigo e em oito dias reservados).
Atualização no meio da passagem#
[midpass] posiciona um usuário (padrão 45° N, 10° E), encontra a passagem mais alta acima da máscara dentro de search_s e programa mensagens a cada update_period_s. Em cada troca dentro da passagem informa o salto de posição, o salto de relógio, o salto de pseudodistância do usuário (nova mensagem menos a antiga), o maior salto que qualquer usuário visível poderia ver (forma fechada sobre o cone de nadir), o erro de distância antes e depois, e PASS ou FAIL contra threshold_m. scenarios/leo-navmsg-midpass-update.toml (ajustes de 300 s atualizados a cada 150 s):
A passagem mais alta em um dia chega a 43,7° e dura 455 s. Suas trocas:
| Troca | Elevação | Salto de posição | Salto de relógio | Salto de distância do usuário | Salto na pior geometria |
|---|---|---|---|---|---|
| IOD 270 → 271 | 12.7° | 0,07 mm | 0,19 mm | -0.17 mm | 0,27 mm |
| IOD 271 → 272 | 37.4° | 0,14 mm | 0,14 mm | -0.24 mm | 0,27 mm |
| IOD 272 → 273 | 28.2° | 0,27 mm | -0.22 mm | 0,35 mm | 0,48 mm |
Maior salto de distância do usuário de 0,35 mm contra um limiar de 5 cm: PASS.
Codificação e decodificação#
scenarios/leo-navmsg-encode-decode.toml codifica a primeira de três mensagens, decodifica-a, verifica o CRC e rejeita uma cópia corrompida, imprime o orçamento de quantização e grava e relê o bloco em estilo RINEX e a tabela CSV:
- quadro: 171 bytes (1310 bits de carga útil, dos quais 1045 são efemérides e relógio), verificação de redundância cíclica de 24 bits (CRC-24Q)
0x19105F; - maior efeito de meio passo de qualquer campo isolado:
af0, 0,545 mm; - mensagem inteira após a quantização: posição a até 1,126 mm e relógio a até 0,185 mm da mensagem exata; SISRE de 0,113 cm exato, 0,129 cm decodificado;
- um quadro com um bit invertido é rejeitado: verdadeiro;
- ida e volta em estilo RINEX dentro de 5.0e-06 m, ida e volta em CSV dentro de 0.0e+00 m.
Independência de plataforma#
Um quadro é transmitido como inteiros, de modo que precisa ser formado pelos mesmos inteiros onde e como quer que o cenário seja executado: o binário nativo em qualquer sistema operacional, uma compilação de depuração ou de release e a compilação WebAssembly (WASM) em um navegador. Três coisas atrapalhavam. O seno, o cosseno, o arco tangente e a exponencial da biblioteca matemática de um hospedeiro não precisam ser arredondados corretamente e diferem entre hospedeiros na última casa. Uma compilação otimizada no macOS obtém o seno e o cosseno de um mesmo argumento da rotina combinada do sistema, que nem sempre devolve o valor do seno isolado, de modo que uma compilação de depuração e uma de release também diferiam. E o amostrador normal usual chama a exponencial e o logaritmo do hospedeiro em seus ramos raros. O ajuste transforma uma diferença tão pequena em campos quantizados diferentes. O tipo de cenário inteiro (órbita e relógio verdadeiros, ajuste, algoritmo do usuário, erro de distância no sinal no espaço (SISRE), codec) calcula, portanto, toda função desse tipo com a crate libm em Rust puro por meio de src/portable_math.rs, potências inteiras como produtos explícitos e desvios normais pelo método polar sobre a saída bruta do gerador. leo_navmsg::tests::the_encoded_frame_is_the_same_bytes_on_every_platform fixa o quadro de 171 bytes do cenário de codificação e decodificação abaixo e um valor de verificação por modelo de efemérides; uma compilação de depuração, uma de release e a compilação WASM produzem documentos de resultado idênticos byte a byte para os cinco cenários leo-navmsg incluídos.
Formato binário#
Esta é a codificação documentada do próprio Kshana. Ela transporta os componentes que as descrições publicadas de mensagens de navegação LEO citam, modelada sobre o conjunto de campos do ICD do Galileo. Não é o layout de bits do Celeste nem de qualquer outro sistema: nenhum é público.
Quadro: preâmbulo 0xA7 (8 bits), versão 1 (4), modelo (4: 1 kepler16, 2 kepler-rac, 3 liu22, 4 ecef-poly), comprimento da carga útil em bytes (12), carga útil preenchida com zeros até um byte, CRC-24Q (uma verificação de redundância cíclica de 24 bits, 24 bits) sobre todos os bytes anteriores. O CRC-24Q é a verificação do padrão RTCM 10403 da Radio Technical Commission for Maritime Services e do ICD do Galileo (polinômio 0x1864CFB, valor inicial 0); o código reproduz o valor de verificação de catálogo 0xCDE703 para 123456789 e os bytes de verificação do quadro de exemplo da mensagem do tipo 1005 do RTCM 10403 (VALIDATED).
Os passos do ICD do Galileo foram escolhidos para órbita terrestre média e são grosseiros demais para uma mensagem LEO de nível centimétrico: Crs em passos de 2⁻⁵ m (3,1 cm), Cuc 2⁻²⁹ rad (1,3 cm no raio LEO), os ângulos 2⁻³¹ semicírculos (1,0 cm) e af0 2⁻³⁴ s (1,7 cm). O Kshana mantém as unidades do ICD e a convenção de semicírculos, refina os passos de modo que o erro de meio passo de cada campo fique abaixo de 1 mm de posição ou de distância em uma janela de 15 minutos, e amplia os campos para manter as faixas de que um ajuste LEO precisa:
| Bloco | Campo | Bits | Passo | Unidade |
|---|---|---|---|---|
| auxiliar e de sincronização | SVID |
8 | 1 | - |
| auxiliar e de sincronização | IOD |
10 | 1 | - |
| auxiliar e de sincronização | Band |
4 | 1 | - |
| auxiliar e de sincronização | Health |
2 | 1 | - |
| auxiliar e de sincronização | WeekNumber |
13 | 1 | semana |
| auxiliar e de sincronização | ToW |
20 | 1 | s |
| auxiliar e de sincronização | Flags |
4 | 1 | - |
| relógio (bit indicador 0) | toc |
20 | 1 | s |
| relógio (bit indicador 0) | af0 |
34 | 2^-38 | s |
| relógio (bit indicador 0) | af1 |
28 | 2^-50 | s/s |
| relógio (bit indicador 0) | af2 |
20 | 2^-62 | s/s^2 |
| Kepleriano (modelos 1-3) | toe |
20 | 1 | s |
| Kepleriano (modelos 1-3) | M0 |
36 | 2^-35 | semicírculo |
| Kepleriano (modelos 1-3) | e |
32 | 2^-33 | - |
| Kepleriano (modelos 1-3) | sqrtA |
36 | 2^-23 | m^0,5 |
| Kepleriano (modelos 1-3) | Omega0 |
36 | 2^-35 | semicírculo |
| Kepleriano (modelos 1-3) | i0 |
36 | 2^-35 | semicírculo |
| Kepleriano (modelos 1-3) | omega |
36 | 2^-35 | semicírculo |
| Kepleriano (modelos 1-3) | deltaN |
29 | 2^-43 | semicircle/s |
| Kepleriano (modelos 1-3) | OmegaDot |
29 | 2^-43 | semicircle/s |
| Kepleriano (modelos 1-3) | iDot |
22 | 2^-43 | semicircle/s |
| Kepleriano (modelos 1-3) | Cuc |
26 | 2^-34 | rad |
| Kepleriano (modelos 1-3) | Cus |
26 | 2^-34 | rad |
| Kepleriano (modelos 1-3) | Crc |
26 | 2^-10 | m |
| Kepleriano (modelos 1-3) | Crs |
26 | 2^-10 | m |
| Kepleriano (modelos 1-3) | Cic |
26 | 2^-34 | rad |
| Kepleriano (modelos 1-3) | Cis |
26 | 2^-34 | rad |
| correções ao longo da trajetória/transversais/radiais (modelo 2) | degA |
3 | 1 | - |
| correções ao longo da trajetória/transversais/radiais (modelo 2) | degC |
3 | 1 | - |
| correções ao longo da trajetória/transversais/radiais (modelo 2) | degR |
3 | 1 | - |
| correções ao longo da trajetória/transversais/radiais (modelo 2) | racTauExp |
4 | 1 | log2(s) |
| correções ao longo da trajetória/transversais/radiais (modelo 2) | a_k, c_k, r_k |
22 | 2^-14 | m |
| extras de Liu et al. 2025 (modelo 3) | aDot |
26 | 2^-20 | m/s |
| extras de Liu et al. 2025 (modelo 3) | nDot |
30 | 2^-58 | semicírculo/s^2 |
| extras de Liu et al. 2025 (modelo 3) | Crs3 |
26 | 2^-10 | m |
| extras de Liu et al. 2025 (modelo 3) | Crc3 |
26 | 2^-10 | m |
| extras de Liu et al. 2025 (modelo 3) | Crs1 |
26 | 2^-10 | m |
| extras de Liu et al. 2025 (modelo 3) | Crc1 |
26 | 2^-10 | m |
| polinômio ECEF (modelo 4) | tref |
20 | 1 | s |
| polinômio ECEF (modelo 4) | degP |
4 | 1 | - |
| polinômio ECEF (modelo 4) | x0, y0, z0 |
38 | 2^-11 | m |
| polinômio ECEF (modelo 4) | x_k, y_k, z_k (k >= 1) |
34 | 2^-12 | m |
| Klobuchar (bit indicador 1) | alpha0 |
8 | 2^-30 | s |
| Klobuchar (bit indicador 1) | alpha1 |
8 | 2^-27 | s/semicircle |
| Klobuchar (bit indicador 1) | alpha2 |
8 | 2^-24 | s/semicírculo^2 |
| Klobuchar (bit indicador 1) | alpha3 |
8 | 2^-24 | s/semicírculo^3 |
| Klobuchar (bit indicador 1) | beta0 |
8 | 2^11 | s |
| Klobuchar (bit indicador 1) | beta1 |
8 | 2^14 | s/semicircle |
| Klobuchar (bit indicador 1) | beta2 |
8 | 2^16 | s/semicírculo^2 |
| Klobuchar (bit indicador 1) | beta3 |
8 | 2^16 | s/semicírculo^3 |
| NeQuick-G (bit indicador 2) | ai0 |
11 | 2^-2 | sfu |
| NeQuick-G (bit indicador 2) | ai1 |
11 | 2^-8 | sfu/deg |
| NeQuick-G (bit indicador 2) | ai2 |
14 | 2^-15 | sfu/grau^2 |
| NeQuick-G (bit indicador 2) | SF1-5 |
5 | 1 | - |
| UTC (bit indicador 3) | A0 |
32 | 2^-30 | s |
| UTC (bit indicador 3) | A1 |
24 | 2^-50 | s/s |
| UTC (bit indicador 3) | dtLS |
8 | 1 | s |
| UTC (bit indicador 3) | t0t |
8 | 3600 | s |
| UTC (bit indicador 3) | WNot |
8 | 1 | semana |
| UTC (bit indicador 3) | WNLSF |
8 | 1 | semana |
| UTC (bit indicador 3) | DN |
3 | 1 | dia |
| UTC (bit indicador 3) | dtLSF |
8 | 1 | s |
Um valor fora da faixa de seu campo é recusado, não envolvido por ciclo. As faixas foram verificadas codificando ajustes a 300 a 2000 km, inclinações de 0° a 140° e intervalos de ajuste de até 20 minutos: deltaN e OmegaDot são largos porque, em uma órbita quase equatorial, o nodo é mal definido e o ajuste reparte entre eles a deriva J2 do argumento de latitude, e aDot e nDot porque o ajuste de 22 parâmetros ao longo de 20 minutos absorve parte da oscilação de curto período do semieixo maior. Desde 0,30, o ajuste de 22 parâmetros é o de mínimos quadrados simples do artigo, sem priores, e um ajuste equatorial a 800 km passa a precisar de nDot de cerca de 6.3e-10 semicírculo/s^2, de modo que sua escala passou de 2^-60 para 2^-58. As correções ao longo da trajetória de grau 7 de kepler-rac cabem na faixa de coeficientes de 22 bits até 15 minutos; um ajuste mais longo pode excedê-la e é então recusado. quantisation_budget informa, para cada campo de efemérides e de relógio, a maior variação de posição e de distância que uma mudança de meio passo provoca ao longo do período de uso, e a variação da mensagem inteira após a quantização.
Exportações de texto#
O RINEX 4,02 não define registros de navegação LEO (suas letras de sistema são G, R, E, J, C, I e S; RINEX 4,02 do International Global Navigation Satellite System (GNSS) Service (IGS)). O bloco que text.rs grava toma emprestado o formato do RINEX 4 — um cabeçalho de registro > EPH, uma linha de satélite e época com três termos de relógio, linhas de órbita de transmissão de quatro campos D19.12 — e é uma extensão documentada do Kshana: letra de sistema L, tipos de registro KP16, KRAC, LU22, APOL e três comentários de cabeçalho que o declaram. Trabalho anterior sobre órbitas LEO em registros de navegação em estilo RINEX-4: arXiv 2401,17767.
> EPH L04 KRAC
L04 yyyy mm dd hh mm ss af0 af1 af2
IOD Crs deltaN M0
Cuc e Cus sqrtA
toe Cic Omega0 Cis
i0 Crc omega OmegaDot
IDOT Band Week Health
txTOW clock degA degC
degR tau_s a0 a1 then the rest of a_k, c_k and r_k, four per line
A tabela CSV transporta mensagens kepler16 e kepler-rac, uma por linha. As colunas padrão usam os nomes do ICD do Galileo (SVID, IOD, Band, WeekNumber, ToW, Health, toc, af0, af1, af2, toe, M0, sqrtA, e, deltaN, Omega0, OmegaDot, iDot, i0, omega, Crc, Crs, Cic, Cis, Cuc, Cus, a0…, c0…, r0…, racTau); csv_schema seleciona, em vez disso, a grafia de uma predefinição. Os dois formatos podem ser relidos.
Ionosfera e UTC#
- Klobuchar: o modelo L1 do mecanismo (
gnss_sim::klobuchar_delay_m, verificado contra o RTKLIB) escalado para a portadora pela lei de primeira ordem(f_L1 / f)². - NeQuick-G: os coeficientes viajam na mensagem e
effective_ionisation_leveldevolveAz = ai0 + ai1·μ + ai2·μ²para uma latitude de inclinação modificadaμ, com as regras do algoritmo (coeficientes todos nulos dão 63,7 unidades de fluxo solar, sfu; o resultado é limitado a [0, 400] sfu). O modelo de densidade eletrônica do NeQuick e sua integração oblíqua, que transformamAzem um atraso, não estão implementados. - Um satélite a algumas centenas de quilômetros voa dentro da ionosfera. Nenhum dos modelos de transmissão leva em conta o conteúdo eletrônico acima do satélite, e nenhuma correção para ele é aplicada.
- UTC:
system_to_utcaplica os três casos do ICD do Galileo §5.1.7 (antes de, em até seis horas de e depois de um evento de segundo intercalar); um segundo inserido lê 86400.
Predefinições#
As predefinições são dados, um arquivo cada em src/leo_navmsg/presets/, com suas fontes. O mecanismo e todo cenário incluído, exceto o do Celeste, funcionam sem elas.
| Chave | Fonte | Órbita | Portadora | Modelo de mensagem |
|---|---|---|---|---|
xona-pulsar |
PUBLIC, arXiv 2509,19551 | 1080 km, 53° | X1 1593,3225 MHz | não publicado |
xona-pulsar-0 |
PUBLIC, arXiv 2509,19551 | 520 km, 97° | X1 | não publicado |
iridium |
PUBLIC, relatório da RNTF, descrição da constelação | 781 km, 86,4° | 1621 MHz (banda de 1616–1626 MHz) | nenhuma transmitida |
starlink |
PUBLIC, NAVIGATION 72(1), descrição da constelação | 550 km, 53° | banda Ku, valor do meio da banda (representativo) | nenhuma (sinais de oportunidade) |
centispace |
PUBLIC, Sensors 2023, Satellite Navigation 2026 | 700 km, 55° | próximo de B1 (mascarado na fonte; L1 como substituto) | não publicado |
cband-generic |
REPRESENTATIVE | 600 km, 97,8° | 5020 MHz (centro da banda C do RNSS) | não publicado |
atomic |
PUBLIC, InsideGNSS | 500 km (representativo) | L1 (representativo) | ecef-poly, grau 6, 60 s, renovado a cada 30 s, relógio nulo, resíduo de direcionamento de 0,24 m |
celeste-iod |
WORKSHOP e PUBLIC | 510 km, 97,4° | 1191,795 MHz | kepler-rac, graus e espaçamento de registros no arquivo da predefinição |
RNSS é o serviço de satélites de radionavegação; RNTF, a Resilient Navigation and Timing Foundation.
Celeste IOD. A predefinição da demonstração em órbita (IOD) Celeste da Agência Espacial Europeia (ESA) é a única que usa material apresentado no workshop LEO-PNT do Programa de Inovação e Apoio à Navegação (NAVISP) da ESA, 2026: a estrutura da mensagem (conjunto kepleriano do Galileo mais polinômios de correção ao longo da trajetória/transversais/radiais, polinômio de relógio, SVID, integridade do satélite, IOD, parâmetros ionosféricos e de UTC), o espaçamento de registros e os nomes das colunas CSV. A órbita (510 km, quase polar heliossíncrona) e a portadora vêm de fontes públicas citadas no arquivo. O layout de bits do Celeste não é público e não é reproduzido; fases posteriores do Celeste e o sistema LEO-PNT da União Europeia (UE) podem diferir. Todo valor derivado do workshop fica no módulo navmsg de src/celeste_iod.rs, usado por scenarios/leo-navmsg-celeste-iod.toml. Como a predefinição é retida: todo número derivado do workshop no mecanismo fica em um único arquivo, src/celeste_iod.rs, que build.rs compila somente quando ele existe, e nos cenários exclusivos do repositório scenarios/*celeste-iod*.toml. Excluir esse arquivo e esses cenários retém a predefinição sem edição de código-fonte; todos os outros testes, referências independentes e cenários funcionam sem ela, e a contagem de arquivos de cenário do README ainda conta os arquivos retidos.
Verificação#
| Linha | Rótulo | Referência independente |
|---|---|---|
| Pesos do SISRE | VALIDATED | tabela de Montenbruck et al. 2018 (GPS, GLONASS, Galileo, BeiDou, geoestacionários) |
| Algoritmo do usuário do ICD do Galileo | VALIDATED | eph2pos do RTKLIB em quatro efemérides de transmissão reais do Galileo, 1 mm por eixo (tests/leo_navmsg_reference.rs) |
| CRC-24Q | VALIDATED | valor de verificação de catálogo 0xCDE703; quadro de exemplo 1005 do RTCM 10403 |
| Ajustador e compromisso do SISRE | MODELLED | verdade de dois corpos recuperada a 1 mm; ajuste J2–J6 corrigido a 1 mm; crescimento monotônico com o intervalo |
| Continuidade no meio da passagem | MODELLED | identidade do salto; limite de cone em forma fechada contra amostragem |
| Formato binário e orçamento | MODELLED | idas e voltas; meio passo de cada campo abaixo de 1 mm |
| Estilo RINEX e CSV | MODELLED | idas e voltas |
| Modelo de 22 parâmetros e ajuste de Liu et al. 2025 | VALIDATED | órbitas precisas ITSG da TU Graz de quatro satélites contra as Tabelas 4, 5, 6 e 8 do artigo: razões ao longo da trajetória, transversal, radial e do SISRE de 0,755 a 1,138 nos dias do artigo e de 0,683 a 1,186 em oito dias reservados, dentro de 1,5x (tests/leo_navmsg_fit_real_orbit_oracle.rs) |
| Polinômio de relógio nulo do ATOMIC e a tabela de cinco altitudes | MODELLED | fatos do ATOMIC extraídos da InsideGNSS; a tabela de Liu publicada impressa ao lado do ajuste de órbita integrada do Kshana, não fixada |
| Ionosfera e UTC | MODELLED | formas fechadas do ICD; o modelo de Klobuchar verificado contra o RTKLIB |
Limitações#
- O SISRE é apenas erro de representação: sem erro de determinação de órbita nem de predição.
- A verdade é uma integração do Kshana (sem terceiro corpo, pressão de radiação solar nem marés), não a órbita precisa de um satélite real.
- O formato binário e o bloco em estilo RINEX são do próprio Kshana.
- O NeQuick-G é transportado, não integrado em um atraso; sem correção para um satélite dentro da ionosfera.
- A comparação com Liu et al. difere em órbitas, leitura de parâmetros e pesos.