Trago à sua atenção uma tradução deste maravilhoso artigo .
Neste tutorial, iremos criar uma aplicação web que visualiza a posição de qualquer satélite, por exemplo, a Estação Espacial Internacional (doravante - ISS), em tempo real (bem, quase).
Vamos construir um aplicativo do zero e tentar o papel de um verdadeiro cientista de foguetes.
- Descobriremos onde encontrar os dados de um satélite individual, conhecido como conjunto de elementos de duas linhas (TLE ).
- Usamos a biblioteca "satellite-js" para prever a órbita do satélite do DNE (esta parte está diretamente relacionada à ciência de foguetes)
- Usamos a biblioteca "CesiumJS" para renderizar o resultado, entretanto, você pode usar qualquer biblioteca / motor que possa trabalhar com longitude, latitude e altitude.
Visualização do resultado final:
Aqui vemos o movimento da ISS em órbita a uma velocidade aumentada 40 vezes. Para ver a posição atual do ISS, clique no ícone do relógio no canto superior esquerdo do painel de controle.
1. Obtenção do DNE
DNE é um formato de dados que descreve o movimento de um objeto orbitando a Terra. Foi criado pelo Comando de Defesa Aeroespacial da América do Norte (NORAD). Você pode ler mais sobre a história de sua criação aqui .
Tendo uma descrição da órbita, podemos prever a localização em que o satélite estará localizado a qualquer momento (veja abaixo).
Isso significa que a maioria dos dispositivos de rastreamento por satélite não o faz em tempo real. Em vez de receber dados atualizados continuamente, como ao rastrear o movimento de um carro, eles usam os DNEs mais recentes disponíveis para prever a posição de um objeto em um determinado ponto no tempo.
Onde podemos obter o DNE? Não existe um registro global com esses dados. Pela publicação e atualização desses dados para a comunidade espacial, o dono deste ou daquele satélite é o responsável (claro, se não estamos falando de um satélite espião).
Podemos encontrar o DNE no site Space Track , que é o registro do Comando Espacial dos Estados Unidos.
Outro recurso é esta lista no CeleStrak , mantida pelo Dr. TS Kelso.
Usaremos este último, pois não requer registro. Para encontrar o DNE da ISS, clique no link Estações Espaciais .
O primeiro da lista será o ISS:
ISS (ZARYA) 1 25544U 98067A 21122.75616700 .00027980 00000-0 51432-3 0 9994 2 25544 51.6442 207.4449 0002769 310.1189 193.6568 15.48993527281553
Os significados desses números podem ser encontrados nesta tabela . A maioria deles são identificadores de satélite e metadados, por exemplo, quando foi lançado.
No recurso especificado, você pode encontrar DNEs para satélites meteorológicos, satélites GPS e até mesmo para o sistema global de satélites Starlink , que está sendo implantado pela SpaceX.
2. Previsão da órbita do satélite
Nosso próximo passo é transformar o DNE em uma posição específica no tempo.
Usaremos satellite-js para isso .
Conectamos a biblioteca do CDN:
<script src="https://cdnjs.cloudflare.com/ajax/libs/satellite.js/4.0.0/satellite.min.js"></script>
Em seguida, damos a ela o DNE e o tempo:
const ISS_TLE = `1 25544U 98067A 21122.75616700 .00027980 00000-0 51432-3 0 9994 2 25544 51.6442 207.4449 0002769 310.1189 193.6568 15.48993527281553`; // const satrec = satellite.twoline2satrec( ISS_TLE.split('\n')[0].trim(), ISS_TLE.split('\n')[1].trim() ); // const date = new Date(); const positionAndVelocity = satellite.propagate(satrec, date); const gmst = satellite.gstime(date); const position = satellite.eciToGeodetic(positionAndVelocity.position, gmst); console.log(position.longitude); // console.log(position.latitude); // console.log(position.height); //
Agora temos a posição atual do satélite (
new Date()
).
Esta posição é o resultado da construção de um determinado modelo de movimento do satélite. Este modelo é denominado SGP4 / SDP4. Todos os DNEs seguem esse padrão.
Se você está se perguntando o quão preciso é esse modelo, a resposta curta é: isso depende de vários fatores .
. , , , .. , , . , NORAD , .
3.
Agora temos a capacidade de obter a posição do satélite em um determinado momento. Podemos usar isso para animar o caminho do satélite.
Mas primeiro, vamos ver como animar um único ponto no espaço usando CesiumJS .
Conectamos a biblioteca com os estilos:
<script src="https://cesium.com/downloads/cesiumjs/releases/1.81/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.81/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
Criamos um container:
<div id="cesiumContainer"></div>
Em seguida, precisamos inicializar o assim chamado visualizador. Passamos várias configurações adicionais para desativar a funcionalidade que requer um token de acesso:
const viewer = new Cesium.Viewer('cesiumContainer', {
imageryProvider: new Cesium.TileMapServiceImageryProvider({
url: Cesium.buildModuleUrl("Assets/Textures/NaturalEarthII"),
}),
baseLayerPicker: false, geocoder: false, homeButton: false, infoBox: false,
navigationHelpButton: false, sceneModePicker: false
});
viewer.scene.globe.enableLighting = true;
Finalmente, podemos visualizar a posição do satélite como um ponto vermelho no espaço:
const satellitePoint = viewer.entities.add({
position: Cesium.Cartesian3.fromRadians(
position.longitude, position.latitude, position.height * 1000
),
point: { pixelSize: 5, color: Cesium.Color.RED }
});
Aqui está o código completo para esta etapa no Glitch .
4. Animando o caminho
Para animar o caminho, só precisamos obter mais algumas posições de satélite futuras. CesiumJS suporta interpolação (transição) entre posições ao longo do tempo.
A implementação da animação é um tanto prolixa. Aqui está o código Glitch correspondente . Os conceitos mais importantes são descritos a seguir.
Nós criamos
SampledPositionProperty
. Este é um objeto que contém as posições no tempo, entre as quais a transição é feita:
const positionsOverTime = new Cesium.SampledPositionProperty();
Repetimos as posições em qualquer quantidade e, para cada posição, criamos um objeto com o tempo, que é chamado
JulianDate
em CesiumJS, bem como a própria posição e os adicionamos como amostra:
for (let i = 0; i < totalSeconds; i+= timestepInSeconds) {
const time = Cesium.JulianDate.addSeconds(start, i, new Cesium.JulianDate());
// satellite-js
const position = Cesium.Cartesian3.fromRadians(p.longitude, p.latitude, p.height * 1000);
positionsOverTime.addSample(time, position);
}
Finalmente, passamos
positionsOverTime
ao nosso ponto:
const satellitePoint = viewer.entities.add({
position: positionsOverTime,
point: { pixelSize: 5, color: Cesium.Color.RED }
});
O ponto se moverá com a linha do tempo. Para prender a câmera a um ponto móvel, faça o seguinte:
viewer.trackedEntity = satellitePoint;
Conclusão
Espero que você esteja interessado em aprender um pouco sobre como o software de rastreamento de satélite é criado. Claro, muitas questões permaneceram sem resposta, por exemplo, o que significa cada parâmetro DNE? Com que frequência eles são atualizados? Como exatamente eles são atualizados?
Pessoalmente, fiquei muito interessado em aprender sobre a existência desses dados, como obtê-los e usá-los diretamente no navegador usando JavaScript.
Aqui estão algumas ideias sobre o que mais você pode fazer a respeito:
- , , Starlink. Celestrak viewer, . , , Starlink
- .
Aqui está um protótipo para a segunda ideia na Glitch . Demo :.
Também dê uma olhada em "Veja um satélite hoje à noite", de James Darpinian, que usa uma combinação de CesiumJS e Google Streets.
Além disso, quem entende / gosta de modelagem 3D pode imaginar satélites não em forma de pontos, mas em escala real para demonstrar o quão próximos uns dos outros estão no espaço.
Aproximadamente. pista: minha versão do aplicativo é assim:
Obrigado pela atenção e tenha um bom dia!
Os servidores em nuvem da Macleod são rápidos e seguros.
Cadastre-se pelo link acima ou clicando no banner e ganhe 10% de desconto no primeiro mês de aluguel de um servidor de qualquer configuração!