Berechnen Sie die Position der Sonne in ECEF

Ich mache einen sehr einfachen Orbit-Simulator in C# mit dem Helix Toolkit.

Ich möchte das Helix-Beleuchtungsobjekt auf die Sonne positionieren, aber auch die Sonnenfinsternis von Mond und Erde für einen Satelliten berechnen können (in ECEF definierte Position).

Nach einigen kurzen Recherchen habe ich gelesen, dass es eine Menge Arbeit ist, eine genaue Positionsberechnung für die Sonne in ECEF zu erhalten.

Gibt es einen Algorithmus, der diese Berechnung für mich durchführen kann, den ich in eine UpdateSunPosition() -Methode einbeziehen kann, damit ich eine einigermaßen genaue Positionsberechnung der Sonne in ECEF haben kann?

Vielleicht muss ich vorerst die Ambitionen der Finsternisberechnung streichen, stattdessen die geografische Position der Sonne berechnen, um die Deklination und den Greenwich-Stundenwinkel zu erhalten, diese Breiten- und Längengrade nennen und dann einfach eine zufriedenstellende Höhe angeben.

Mir ist aufgefallen, dass die Leute sich oft auf SOFA beziehen, wenn sie darüber sprechen, aber ich bin mir nicht sicher, was SOFA ist oder ob ich es in C# verwenden kann. Ich bin mir ziemlich sicher, dass es nicht in einer .NET-Umgebung wie Visual Studio funktioniert, aber bitte korrigieren Sie mich, wenn ich falsch liege.

Ich schätze alle Vorschläge oder Erkenntnisse, die jemand hier anbieten kann.

Antworten (3)

SOFA ist der Standard of Fundamental Astronomy, der von der International Astronomical Union (IAU) als kanonischer Standard für die Berechnung von Positionen und Zeiten in der Astronomie anerkannt wurde. Es ist standardmäßig in C- und F77-Versionen verfügbar, und Wrapper wurden in anderen Sprachen geschrieben, insbesondere in Python als Teil von AstroPy. Für Ihren Zweck erwähnt der Drittanbieter-Teil der Website die World Wide Astronomy (WWA)-Bibliothek , die C# ist, so dass es sich lohnt, nach Ihrer Anwendung zu suchen. Ich würde empfehlen, die SOFA Cookbooks zu lesen , insbesondere die über Earth Attitude und Time Scales, um eine bessere Vorstellung davon zu bekommen, wie die (vielen) verschiedenen Zeit- und Koordinatensysteme zusammenpassen.

Danke mein Herr! Ich werde mich darum kümmern und hoffentlich in der Lage sein, meine Frage zu aktualisieren, wenn ich auf etwas stoße, das ich nicht verstehe.
Ich persönlich würde CSPICE empfehlen , das die NASA verwendet, aber SOFA ist gut dafür.
Da das OP nach einer C#-Version suchte und anscheinend bereits etwas Kontakt mit SOFA hatte, schien dies die logische Wahl zu sein. Es kommt auch mit den eingebauten Ephemeriden mit angemessener Genauigkeit: epv00für die Erdposition (umkehrbar für die Sonnenposition) und plan94für die Planeten. Erspart das Herunterladen zusätzlicher Kernel
Da das CSPICE-Toolkit in C bereitgestellt wird, wie würde ich es in C# verwenden? Ich bin eigentlich ziemlich neu in der Programmierung, und realistischerweise habe ich keinen Kontakt zu SOFA, habe nur davon gehört, als ich nach früheren Anfragen zu meinem Ziel gesucht habe. Welche wäre einfacher umzusetzen? Ich habe kein Problem damit, zusätzliches Zeug zu installieren, solange es einigermaßen einfach ist. Außerdem würden alle Tutorials oder Ratschläge / Hinweise in die richtige Richtung zur Implementierung sicherlich einen sehr langen Weg zurücklegen und mir viel Zeit sparen. Ansonsten freue ich mich darauf, für einen Tag oder so zu lernen und damit zu kämpfen!
Der einfachste Weg wäre meiner Meinung nach, einen Spaziergang auf der wilden Seite zu machen und ein wenig Python auszuprobieren. Es gibt ein Beispiel in dieser Antwort und wenn topo.at(times).observe(sun).apparent().altaz()es nicht klar genug ist, lassen Sie es mich wissen und ich kann weiter helfen. xkcd.com/353
Ich mache das für meine Arbeit und sie sind im Moment ziemlich gut in der .NET-Umgebung mit C# eingerichtet. So sehr ich mir auch wünsche, ich könnte nur Python verwenden, ist es für meinen Fall ein bisschen weit hergeholt, da ich es implementieren kann es mit den SOFA-Funktionen. Ich habe die SOFA-Dokumentation durchgelesen, sie haben bereits äquivalente C#-Funktionen auf Github veröffentlicht, und dies scheint das Potenzial zu haben, wirklich gut zu funktionieren. Danke euch allen!

Die Antwort von @astrosnapper ist wahrscheinlich die, die Sie wollen. Aber wenn Sie etwas möchten, das Sie selbst implementieren können, werfen Sie einen Blick auf astronomische Algorithmen in dieser Antwort

Dies ist etwas, in das Sie sich ein wenig einarbeiten müssen, aber wenn Sie gerne programmieren, ist es möglicherweise genau das, wonach Sie suchen. Die Gaisma -Website ist einer meiner Favoriten im Internet - einfach zu bedienen und präsentiert eine Menge Informationen in leicht verständlichen Grafiken. Klicken Sie sich um!

Ich glaube , dass diese Seite Algorithmen aus der Sammlung verwendet , die auf dieser NOAA - Seite zu finden ist . Klicken Sie sich auch dort um. Sie stellen Excel-Tabellen zur Verfügung, die die Algorithmen und andere Ressourcen enthalten. Die "Haupt"-Ressource ist eine Sammlung von Algorithmen, die im Buch Astronomical Algorithms - Jean Meeus veröffentlicht wurden . Suchen Sie nach dem Buchtitel und Sie werden feststellen, dass es viele ähnlich betitelte Bücher gibt. Ich würde empfehlen, wenn möglich in eine Bibliothek zu gehen, weil es (meiner Meinung nach) immer gut ist, in Bibliotheken zu gehen. Teile davon sind jedoch online zu finden. Beispielsweise enthalten einige Seiten aus dem Buch Astronomical Formulas for Calculators (1988) ein interessantes Inhaltsverzeichnis.

Wow, das sind großartige Ressourcen. Danke sehr!

IAU SOFA und SPICE sind für das, was Sie brauchen, übertrieben und würden erfordern, einen C-zu-C#-Wrapper um sie herum zu schreiben. Eine Implementierung von VSOP87 in C# ist alles, was Sie wirklich brauchen. Dies wurde verwendet, um den Fünf-Jahrtausend-Katalog der Sonnenfinsternisse der NASA zu erstellen . Der verlinkte Code hat Funktionen für getEarth() und getMoon(), die die heliozentrischen XYZ-Koordinaten zurückgeben, die Sonne steht immer bei 0,0,0. Um geozentrische Koordinaten zu erhalten, subtrahieren Sie einfach die Position der Erde von den Positionen von Mond und Sonne.

Sie sollten sich auch die Besselschen Elemente ansehen , das sind Elemente, die vorberechnet werden, um alle Daten zu generieren, die Sie auf den Seiten der NASA sehen. Diese enthalten bereits alle Berechnungen für Lichtzeit, Präzession, Nutation, Aberration usw. Es gibt Referenzen auf der Wikipedia-Seite, aber die praktischste ist Elements of Solar Eclipses von Jean Meeus. Um eine Vorstellung davon zu bekommen, was sie tun können, habe ich diese Methode verwendet, um meine Eclipse Map App zu erstellen . Sie können die Besselschen Elemente entweder aus dem Buch von Meeus oder aus dem Katalog der NASA verwenden. Sie finden die Elemente im NASA-Katalog, nachdem Sie sich zu den Details durchgeklickt haben, z. B. hier der für die Sonnenfinsternis vom 21. August 2017 .

Der Vorteil der Verwendung von Besselschen Elementen anstelle einer direkten Berechnung besteht erstens darin, dass ein Großteil der Arbeit bereits erledigt ist (z. B. Präzession, Nutation ...). Zweitens sind sie recheneffizienter, Dinge wie die Dauer der Sonnenfinsternis für einen bestimmten Breitengrad/Längengrad werden direkt gelöst, anstatt durch Iteration, bei der Sie die Positionen, Präzessionen, Nutationen, Lichtzeiten usw. für jeden Zeitschritt neu berechnen müssen.

Jede Eclipse-Seite im NASA-Katalog hat auch eine JavaScript-Implementierung zur Verwendung von Besselschen Elementen, um die lokalen Umstände auf der angezeigten Karte anzuzeigen. Aber ohne eine Referenz wie das Buch von Meeus, um zu erklären, was vor sich geht, könnte der Code etwas schwer zu befolgen sein.

Beachten Sie den Namen Xavier Jubier im NASA-Quellcode, er hat auch seine eigene Seite über Sonnenfinsternisse, hat eine ähnliche JavaScript-Implementierung und kann auch eine weitere Quelle für Besselsche Elemente sein.