Calcular la posición del Sol en ECEF

Estoy haciendo un simulador de órbita muy básico en C# usando Helix Toolkit.

Quiero colocar el objeto de iluminación Helix en el sol, pero también poder calcular el eclipse solar por la luna y la tierra para un satélite (posición definida en ECEF).

Después de una breve investigación, estoy leyendo que obtener un cálculo preciso de la posición del sol en ECEF es mucho trabajo.

¿Hay algún algoritmo que pueda realizar este cálculo por mí que pueda incluir en un método UpdateSunPosition() para que pueda tener un cálculo de posición del sol razonablemente preciso en ECEF?

Tal vez tenga que descartar las ambiciones de cálculo del eclipse por ahora, en lugar de calcular la posición geográfica del sol para obtener la declinación y el ángulo horario de Greenwich, llamar a esos latitud y longitud, y luego simplemente darle una altitud satisfactoria.

He notado que la gente se refiere mucho a SOFA cuando habla de esto, pero no estoy seguro de qué es SOFA o si puedo usarlo en C#. Estoy bastante seguro de que no funciona en un entorno .NET como Visual Studio, pero corríjame si me equivoco.

Agradezco todas y cada una de las sugerencias o ideas que alguien pueda ofrecer aquí.

Respuestas (3)

SOFA es el Estándar de Astronomía Fundamental, aprobado por la Unión Astronómica Internacional (IAU) como el estándar canónico para calcular posiciones y tiempo en astronomía. Está disponible en versiones C y F77 como estándar, y los contenedores se han escrito en otros lenguajes, sobre todo en Python como parte de AstroPy. Para su propósito, la parte de terceros del sitio web menciona la biblioteca World Wide Astronomy (WWA), que es C#, por lo que valdría la pena buscar su aplicación. Recomendaría leer los Libros de cocina de SOFA , particularmente los de Actitud terrestre y Escalas de tiempo para tener una mejor idea de cómo encajan los (muchos) diversos sistemas de tiempo y coordenadas.

¡Gracias Señor! Lo investigaré y, con suerte, podré actualizar mi pregunta si me encuentro con algo que no entiendo.
Personalmente recomendaría CSPICE , que es lo que usa la NASA, pero SOFA es bueno para hacerlo.
Dado que el OP buscaba una versión de C# y parecía tener cierta exposición a SOFA, parecía la opción lógica. También viene con las efemérides de precisión razonable incorporadas: epv00para la posición de la Tierra (reversible para la posición del Sol) y plan94para los planetas. Ahorra tener que descargar núcleos adicionales
Dado que el kit de herramientas CSPICE se proporciona en C, ¿cómo lo usaría en C#? De hecho, soy bastante nuevo en la programación y, de manera realista, no tengo exposición a SOFA, solo escuché sobre él cuando buscaba consultas previas hacia mi objetivo. ¿Cuál sería más fácil de implementar? No tengo problemas para instalar cosas adicionales siempre que sea razonablemente simple de hacer. Además, cualquier tutorial o consejo/indicador en la dirección correcta para implementar esto seguramente me ayudaría mucho y me ahorraría mucho tiempo. De lo contrario, ¡espero aprender y luchar con esto por un día más o menos!
En mi opinión, la forma más fácil sería dar un paseo por el lado salvaje y probar un poco de Python. Hay un ejemplo en esta respuesta y, si topo.at(times).observe(sun).apparent().altaz()no está lo suficientemente claro, hágamelo saber y puedo ayudar más. xkcd.com/353
Estoy haciendo esto para mi trabajo y están bastante configurados en el entorno .NET con C# en este momento, así que por mucho que me gustaría poder usar python, es un poco exagerado para mi caso ya que puedo implementar con las funciones SOFA. He estado leyendo la documentación de SOFA, ya tienen funciones de C# equivalentes publicadas en github, y esto parece tener potencial para funcionar realmente bien. ¡Gracias a todos!

La respuesta de @ astrosnapper es probablemente la que desea. Pero si desea algo que pueda implementar usted mismo, eche un vistazo a los algoritmos astronómicos en esta respuesta

Esto es algo en lo que tendrá que profundizar un poco, pero si le gusta programar, puede ser exactamente lo que está buscando. El sitio web de Gaisma es uno de mis favoritos en Internet: es fácil de usar y presenta mucha información en gráficos fáciles de entender. Haga clic alrededor!

Creo que este sitio utiliza algoritmos de la colección que se encuentra en este sitio de la NOAA . Haga clic alrededor de allí también. Proporcionan hojas de cálculo de Excel que contienen los algoritmos y otros recursos. El recurso "principal" es una colección de algoritmos publicados en el libro Astronomical Algorithms - Jean Meeus . Busque el título de los libros y encontrará que hay muchos libros con títulos similares. Recomiendo ir a una biblioteca si es posible, porque (en mi opinión) siempre es bueno ir a bibliotecas. Sin embargo, partes de estos se pueden encontrar en línea. Por ejemplo, algunas páginas que se muestran del libro Fórmulas astronómicas para calculadoras (1988) incluyen una tabla de contenido interesante.

Wow estos son grandes recursos. ¡Muchos gracias!

IAU SOFA y SPICE son excesivos para lo que necesita, y requerirían escribir un contenedor de C a C # alrededor de ellos. Una implementación de VSOP87 en C# es todo lo que realmente necesita. Esto es lo que se utilizó para crear el Catálogo de Eclipses Solares de los Cinco Milenios de la NASA . El código vinculado tiene funciones para getEarth() y getMoon() que devuelven las coordenadas XYZ heliocéntricas, el sol siempre estará en 0,0,0. Para obtener coordenadas geocéntricas, simplemente reste la posición de la Tierra de las posiciones de la Luna y el Sol.

También querrá ver los elementos besselianos , estos son elementos que se calculan previamente para generar todos los datos que ve en las páginas de la NASA. Estos ya incluyen todos los cálculos de tiempo de luz, precesión, nutación, aberración, etc. Hay referencias en la página de Wikipedia, pero la más práctica es Elements of Solar Eclipses de Jean Meeus. Para tener una idea de lo que pueden hacer, utilicé este método para crear mi Eclipse Map App . Puede usar los Elementos Besselianos del libro de Meeus o del catálogo de la NASA. Encontrará los elementos en el catálogo de la NASA después de hacer clic en los detalles, por ejemplo, aquí está el del Eclipse del 21 de agosto de 2017 .

El beneficio de usar Elementos Besselianos en lugar del cálculo directo es, en primer lugar, que gran parte del trabajo ya está hecho (p. ej., precesión, nutación...). En segundo lugar, son más eficientes desde el punto de vista computacional, cosas como la duración del eclipse para una latitud/longitud determinada se resuelven directamente en lugar de iteraciones en las que debe volver a calcular las posiciones, la precesión, la nutación, el tiempo de luz, etc. para cada paso de tiempo.

Cada página de eclipses en el catálogo de la NASA también tiene una implementación de JavaScript de cómo usar Besselian Elements para mostrar las circunstancias locales en el mapa que muestran. Pero puede encontrar el código un poco difícil de seguir sin una referencia como el libro de Meeus para explicar lo que está pasando.

Tenga en cuenta el nombre Xavier Jubier en el código fuente de la NASA, también tiene su propio sitio sobre eclipses solares, tiene una implementación de JavaScript similar y también puede ser otra fuente de Besselian Elements.