Je porte à votre attention une traduction de ce merveilleux article .
Dans ce tutoriel, nous allons créer une application Web qui visualise la position de n'importe quel satellite, par exemple, la Station spatiale internationale (ci-après - ISS), en temps réel (enfin, presque).
Nous allons créer une application à partir de zéro et essayer le rôle d'un vrai spécialiste des fusées.
- Nous découvrirons où trouver les données pour un satellite individuel, connu sous le nom de jeu d'éléments à deux lignes (TLE ).
- Nous utilisons la bibliothèque "satellite-js" pour prédire l'orbite du satellite à partir du DNE (cette partie est directement liée à la science des fusées)
- Nous utilisons la bibliothèque "CesiumJS" pour rendre le résultat, cependant, vous pouvez utiliser n'importe quelle bibliothèque / moteur qui peut travailler avec la longitude, la latitude et l'altitude.
Aperçu du résultat final:
On voit ici le mouvement de l'ISS en orbite à une vitesse multipliée par 40. Pour voir la position actuelle de l'ISS, cliquez sur l'icône de l'horloge dans le coin supérieur gauche du panneau de contrôle.
1. Obtention du DNE
DNE est un format de données décrivant le mouvement d'un objet en orbite autour de la Terre. Il a été créé par le Commandement de la défense aérospatiale de l'Amérique du Nord (NORAD). Vous pouvez en savoir plus sur l'histoire de sa création ici .
Ayant une description de l'orbite, nous pouvons prédire l'emplacement dans lequel le satellite sera situé à tout moment (voir ci-dessous).
Cela signifie que la plupart des appareils de suivi par satellite ne le font pas en temps réel. Au lieu de recevoir des données continuellement mises à jour, comme lors du suivi du mouvement d'une voiture, ils utilisent les derniers DNE disponibles pour prédire la position d'un objet à un moment donné.
Où pouvons-nous obtenir le DNE? Il n'y a pas de registre mondial avec de telles données. Pour la publication et la mise à jour de ces données pour la communauté spatiale, la personne qui possède tel ou tel satellite est responsable (bien sûr, si on ne parle pas d'un satellite espion).
Nous pouvons trouver le DNE sur le site Web de Space Track , qui est le registre du United States Space Command.
Une autre ressource est cette liste sur CeleStrak , maintenue par le Dr TS Kelso.
Nous utiliserons ce dernier car il ne nécessite pas d'enregistrement. Pour trouver le DNE de l'ISS, cliquez sur le lien Stations spatiales .
Le premier sur la liste sera l'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
La signification de ces nombres peut être trouvée dans ce tableau . La plupart d'entre eux sont des identifiants et des métadonnées de satellite, par exemple lors de son lancement.
Sur la ressource spécifiée, vous pouvez trouver des DNE pour les satellites météorologiques, les satellites GPS et même pour le système mondial de satellites Starlink , qui est déployé par SpaceX.
2. Prédire l'orbite du satellite
Notre prochaine étape est de transformer le DNE en une position spécifique dans le temps.
Nous utiliserons satellite-js pour cela .
Nous connectons la bibliothèque à partir du CDN:
<script src="https://cdnjs.cloudflare.com/ajax/libs/satellite.js/4.0.0/satellite.min.js"></script>
Ensuite, nous lui donnons le DNE et l'heure:
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); //
Nous avons maintenant la position actuelle du satellite (
new Date()
).
Cette position est le résultat de la construction d'un certain modèle du mouvement du satellite. Ce modèle s'appelle SGP4 / SDP4. Tous les DNE suivent ce modèle.
Si vous vous demandez à quel point ce modèle est précis, la réponse courte est: cela dépend de plusieurs facteurs .
. , , , .. , , . , NORAD , .
3.
Nous avons maintenant la possibilité d'obtenir la position du satellite à un moment donné. Nous pouvons l'utiliser pour animer la trajectoire du satellite.
Mais d'abord, voyons comment animer un seul point dans l'espace à l'aide de CesiumJS .
Nous connectons la bibliothèque avec les styles:
<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">
Nous créons un conteneur:
<div id="cesiumContainer"></div>
Ensuite, nous devons initialiser le soi-disant visualiseur. Nous lui transmettons plusieurs paramètres supplémentaires pour désactiver les fonctionnalités qui nécessitent un jeton d'accès:
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;
Enfin, nous pouvons visualiser la position du satellite sous forme de point rouge dans l'espace:
const satellitePoint = viewer.entities.add({
position: Cesium.Cartesian3.fromRadians(
position.longitude, position.latitude, position.height * 1000
),
point: { pixelSize: 5, color: Cesium.Color.RED }
});
Voici le code complet de cette étape dans Glitch .
4. Animation du chemin
Pour animer la trajectoire, nous avons juste besoin d'obtenir quelques futures positions satellites supplémentaires. CesiumJS prend en charge l'interpolation (transition) entre les positions au fil du temps hors de la boîte.
L'implémentation de l'animation est quelque peu verbeuse. Voici le code Glitch correspondant . Les concepts les plus importants sont décrits ci-dessous.
Nous créons
SampledPositionProperty
. Il s'agit d'un objet contenant les positions dans le temps, entre lesquelles se fait la transition:
const positionsOverTime = new Cesium.SampledPositionProperty();
Nous itérons sur des positions dans n'importe quelle quantité, et pour chaque position, nous créons un objet avec le temps, qui est appelé
JulianDate
dans CesiumJS, ainsi que la position elle-même et les ajoutons en tant qu'échantillon:
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);
}
Enfin, nous passons
positionsOverTime
à notre point:
const satellitePoint = viewer.entities.add({
position: positionsOverTime,
point: { pixelSize: 5, color: Cesium.Color.RED }
});
Le point se déplacera avec la chronologie. Pour attacher la caméra à un point en mouvement, procédez comme suit:
viewer.trackedEntity = satellitePoint;
Conclusion
J'espère que vous vouliez en savoir un peu plus sur la création d'un logiciel de suivi par satellite. Bien sûr, de nombreuses questions sont restées sans réponse, par exemple, que signifie chaque paramètre DNE? À quelle fréquence sont-ils mis à jour? Comment sont-ils mis à jour exactement?
Personnellement, j'étais très intéressé à en savoir plus sur l'existence de telles données, comment les obtenir et les utiliser directement dans le navigateur en utilisant JavaScript.
Voici quelques idées sur ce que vous pouvez faire d'autre à ce sujet:
- , , Starlink. Celestrak viewer, . , , Starlink
- .
Voici un prototype de la deuxième idée chez Glitch . Démo:.
Jetez également un œil à "Voir un satellite ce soir" de James Darpinian, qui utilise une combinaison de CesiumJS et Google Streets.
De plus, ceux qui comprennent / aiment la modélisation 3D peuvent imaginer des satellites non pas sous forme de points, mais à échelle réelle pour démontrer à quel point ils sont proches les uns des autres dans l'espace.
Environ. lane: ma version de l'application ressemble à ceci:
Merci pour votre attention et bonne journée!
Les serveurs cloud de Macleod sont rapides et sécurisés.
Inscrivez-vous en utilisant le lien ci-dessus ou en cliquant sur la bannière et bénéficiez d'une remise de 10% pour le premier mois de location d'un serveur de toute configuration!