Verfolgen und Visualisieren der Position der ISS mit 30 Zeilen JavaScript-Code





Ich mache Sie auf eine Übersetzung dieses wunderbaren Artikels aufmerksam .



In diesem Tutorial erstellen wir eine Webanwendung, die die Position eines Satelliten, beispielsweise der Internationalen Raumstation (im Folgenden: ISS), in Echtzeit (fast) visualisiert.



Wir werden eine Anwendung von Grund auf neu erstellen und die Rolle eines echten Raketenwissenschaftlers ausprobieren.



  • Wir werden herausfinden, wo sich die Daten für einen einzelnen Satelliten befinden, der als Two-Line-Element-Set (TLE ) bezeichnet wird.
  • Wir verwenden die Bibliothek "Satellit-js" , um die Satellitenumlaufbahn vom DNE aus vorherzusagen (dieser Teil steht in direktem Zusammenhang mit der Raketenwissenschaft).
  • Wir verwenden die "CäsiumJS" -Bibliothek , um das Ergebnis zu rendern. Sie können jedoch jede Bibliothek / Engine verwenden, die mit Längen-, Breiten- und Höhenangaben arbeiten kann.


Vorschau des Endergebnisses:





Hier sehen wir die Bewegung der ISS im Orbit mit einer 40-fach erhöhten Geschwindigkeit. Um die aktuelle Position der ISS anzuzeigen, klicken Sie auf das Uhrensymbol in der oberen linken Ecke des Bedienfelds.



1. Erhalt der DNE



DNE ist ein Datenformat, das die Bewegung eines Objekts beschreibt, das die Erde umkreist. Es wurde vom North American Aerospace Defense Command (NORAD) erstellt. Sie können mehr über die Geschichte ihrer Entstehung lesen hier .



Mit einer Beschreibung der Umlaufbahn können wir jederzeit vorhersagen, an welchem ​​Ort sich der Satellit befinden wird (siehe unten).



Dies bedeutet, dass die meisten Satellitenortungsgeräte dies nicht in Echtzeit tun. Anstatt ständig aktualisierte Daten zu erhalten, beispielsweise beim Verfolgen der Bewegung eines Autos, verwenden sie die neuesten verfügbaren DNEs, um die Position eines Objekts zu einem bestimmten Zeitpunkt vorherzusagen.



Wo können wir die DNE bekommen? Es gibt keine globale Registrierung mit solchen Daten. Für die Veröffentlichung und Aktualisierung dieser Daten für die Weltraumgemeinschaft ist die Person verantwortlich, die diesen oder jenen Satelliten besitzt (natürlich, wenn es sich nicht um einen Spionagesatelliten handelt).



Wir finden die DNE auf der Space Track- Website , der Registrierung des United States Space Command.



Eine weitere Ressource ist diese Liste auf CeleStrak , die von Dr. TS Kelso geführt wird.



Letzteres verwenden wir, da keine Registrierung erforderlich ist. Um die DNE für die ISS zu finden, klicken Sie auf den Link Raumstationen .



Der erste auf der Liste wird die ISS sein:



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

      
      





Die Bedeutung dieser Zahlen finden Sie in dieser Tabelle . Bei den meisten handelt es sich beispielsweise um Satelliten-IDs und Metadaten, als diese gestartet wurden.



Auf der angegebenen Ressource finden Sie DNEs für meteorologische Satelliten, GPS-Satelliten und sogar für das globale Satellitensystem Starlink , das von SpaceX bereitgestellt wird.



2. Vorhersage der Umlaufbahn des Satelliten



Unser nächster Schritt besteht darin, das DNE rechtzeitig in eine bestimmte Position umzuwandeln.



Wir werden dafür Satellit-Js verwenden .



Wir verbinden die Bibliothek von CDN:



<script src="https://cdnjs.cloudflare.com/ajax/libs/satellite.js/4.0.0/satellite.min.js"></script>

      
      





Dann geben wir ihr die DNE und die Zeit:



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); //  

      
      





Wir haben jetzt die aktuelle Satellitenposition ( new Date()



).



Diese Position ist das Ergebnis der Erstellung eines bestimmten Modells der Satellitenbewegung. Dieses Modell heißt SGP4 / SDP4. Alle DNEs folgen diesem Muster.



Wenn Sie sich fragen, wie genau dieses Modell ist, lautet die kurze Antwort: Es hängt von mehreren Faktoren ab .



. , , , .. , , . , NORAD , .



3.



Jetzt haben wir die Möglichkeit, die Position des Satelliten zu einem bestimmten Zeitpunkt zu ermitteln. Wir können dies verwenden, um den Pfad des Satelliten zu animieren.



Aber zuerst wollen wir sehen, wie man einen einzelnen Punkt im Raum mit CäsiumJS animiert .



Wir verbinden die Bibliothek zusammen mit den Stilen:



<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">
      
      





Wir erstellen einen Container:



<div id="cesiumContainer"></div>

      
      





Als nächstes müssen wir den sogenannten Viewer initialisieren. Wir übergeben mehrere zusätzliche Einstellungen, um Funktionen zu deaktivieren, für die ein Zugriffstoken erforderlich ist:



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;
      
      





Schließlich können wir die Position des Satelliten als roten Punkt im Raum visualisieren:



const satellitePoint = viewer.entities.add({
  position: Cesium.Cartesian3.fromRadians(
    position.longitude, position.latitude, position.height * 1000
  ),
  point: { pixelSize: 5, color: Cesium.Color.RED }
});

      
      





Hier ist der vollständige Code für diesen Schritt in Glitch .



4. Den Pfad animieren



Um den Pfad zu animieren, brauchen wir nur noch ein paar zukünftige Satellitenpositionen. CäsiumJS unterstützt die Interpolation (Übergang) zwischen Positionen im Laufe der Zeit.



Die Animationsimplementierung ist etwas ausführlich. Hier ist der entsprechende Glitch-Code . Die wichtigsten Konzepte werden nachfolgend beschrieben.



Wir schaffen SampledPositionProperty



. Dies ist ein Objekt, das die zeitlichen Positionen enthält, zwischen denen der Übergang erfolgt:



const positionsOverTime = new Cesium.SampledPositionProperty();
      
      





Wir iterieren über Positionen in beliebiger Menge und erstellen für jede Position ein Objekt mit der Zeit, das JulianDate



in CäsiumJS genannt wird, sowie die Position selbst und fügen sie als Beispiel hinzu:



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);
}
      
      





Schließlich kommen wir positionsOverTime



zu unserem Punkt:



const satellitePoint = viewer.entities.add({
  position: positionsOverTime,
  point: { pixelSize: 5, color: Cesium.Color.RED }
});
      
      





Der Punkt bewegt sich mit der Zeitachse. Gehen Sie wie folgt vor, um die Kamera an einem sich bewegenden Punkt zu befestigen:



viewer.trackedEntity = satellitePoint;
      
      





Fazit



Ich hoffe, Sie waren daran interessiert, ein wenig darüber zu erfahren, wie Satelliten-Tracking-Software erstellt wird. Natürlich blieben viele Fragen offen, zum Beispiel, was bedeutet jeder DNE-Parameter? Wie oft werden sie aktualisiert? Wie genau werden sie aktualisiert?



Persönlich war ich sehr daran interessiert, etwas über die Existenz solcher Daten zu erfahren und zu erfahren, wie man sie mit JavaScript direkt im Browser abruft und verwendet.



Hier sind einige Ideen, was Sie sonst noch dagegen tun können:





Hier ist ein Prototyp für die zweite Idee bei Glitch . Demo:.



Schauen Sie sich auch "Sehen Sie heute Abend einen Satelliten" von James Darpinian an, der eine Kombination aus CäsiumJS und Google Streets verwendet.



Darüber hinaus können sich diejenigen, die 3D-Modellierung verstehen / mögen, Satelliten nicht in Form von Punkten vorstellen, sondern in realem Maßstab, um zu demonstrieren, wie nahe sie im Weltraum beieinander liegen.



Ca. Lane: Meine Version der Anwendung sieht folgendermaßen aus:





Vielen Dank für Ihre Aufmerksamkeit und einen schönen Tag!






Cloud-Server von Macleod sind schnell und sicher.



Registrieren Sie sich über den obigen Link oder indem Sie auf das Banner klicken und erhalten Sie 10% Rabatt für den ersten Monat der Anmietung eines Servers einer beliebigen Konfiguration!






All Articles