Rastreando e visualizando a posição do ISS com 30 linhas de código JavaScript





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:





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!






All Articles