¿Cómo calcular programáticamente elementos orbitales usando vectores de posición/velocidad?

Me gustaría construir un software mecánico orbital desde cero. Creo que esta sería una excelente manera de aprender los pasos necesarios para calcular diferentes elementos orbitales de Kepler de un objeto, trazar órbitas y predecir dónde estará el objeto en algún momento futuro.

Específicamente, quiero comenzar con el cálculo de los elementos keplarianos. Las entradas que le daría al programa serían los vectores de posición y velocidad, junto con un tiempo. Estos vectores de entrada serán relativos al centro de la Tierra, por lo que es posible que también deba hacer una transferencia de coordenadas si quiero usar una ubicación específica en la superficie como punto de referencia.

He visto las matemáticas para calcular los elementos orbitales de Kepler en este libro , y sé que se ha desarrollado mucho software a lo largo de los años para calcularlos, pero me está costando unirlos. Las matemáticas en el libro son un poco confusas, y creo que sería más fácil para mí entender si viera los pasos "escritos" en un lenguaje de programación.

Puedo usar R o Python. Código vectorizado de la mayoría de los idiomas que debería poder traducir a uno de estos dos. ¡Gracias! @Chris Voy a actualizar la pregunta una vez más con un poco más de información sobre mis problemas para traducir las matemáticas en código.
Visite orsa.sourceforge.net para conocer sus soluciones/métodos. Larga discusión aquí physicsforums.com/showthread.php?t=232778 . Y para la simulación básica de Python F = ma: cincuenta ejemplos.readthedocs.org/en/latest/gravity.html
FWIW, si su objetivo es calcular la posición futura, normalmente hay pocas razones para convertir el vector de posición y velocidad en elementos keplerianos. Simplemente calcule y aplique el arrastre y la fuerza de la gravedad en su ubicación y velocidad actuales e integre hacia adelante en pequeños pasos.

Respuestas (3)

Dados vectores de posición y velocidad inerciales (ECI) centrados en la Tierra r y v , puedes resolver directamente los elementos orbitales clásicos ( a , mi , i , Ω , ω , v ) de la siguiente manera (algoritmos primero, seguidos de pseudocódigo en la parte inferior):

Primero, resuelve el momento angular

h = r × v

entonces el vector de nodo

norte ^ = k ^ × h
que se utilizará más adelante.

El vector de excentricidad es entonces

mi = ( v 2 m / r ) r ( r v ) v m

y mi = | mi | .

La energía mecánica específica es

mi = v 2 2 m r

Si mi 1 , después

a = m 2 mi
pags = a ( 1 mi 2 )
De lo contrario,
pags = h 2 m
a =

Ahora,

i = porque 1 h k h
Ω = porque 1 norte yo norte
ω = porque 1 norte mi norte mi
v = porque 1 mi r mi r

Y deberá realizar las siguientes comprobaciones: Si norte j < 0 , después Ω = 360 Ω ,

Si mi k < 0 , después ω = 360 ω , y

Si r v < 0 , después v = 360 v .

Tenga en cuenta que se encontrará con problemas (singularidades) para ciertos casos: órbitas circulares ( mi 0 ), y órbitas ecuatoriales ( i 0 ), particularmente. En estos casos, normalmente introduce una variable nueva y menos problemática, como la longitud media o la longitud real del perigeo.

h=cross(r,v)
nhat=cross([0 0 1],h)

evec = ((mag(v)^2-mu/mag(r))*r-dot(r,v)*v)/mu
e = mag(evec)

energy = mag(v)^2/2-mu/mag(r)

if abs(e-1.0)>eps
   a = -mu/(2*energy)
   p = a*(1-e^2)
else
   p = mag(h)^2/mu
   a = inf

i = acos(h(3)/mag(h))

Omega = acos(n(1)/mag(n))

if n(2)<0
   Omega = 360-Omega

argp = acos(dot(n,evec)/(mag(n)*e))

if e(3)<0
   argp = 360-argp

nu = acos(dot(evec,r)/(e*mag(r))

if dot(r,v)<0
   nu = 360 - nu

Nota : esto se deriva del método establecido en Fundamentos de astrodinámica y aplicaciones , de Vallado, 2007.

Finalmente recreado en Python. ¡Gracias por la ayuda! Fue bastante fácil y ahora entiendo las matemáticas mucho mejor.
Me encantaría ver la demostración de estas ecuaciones, así como su aplicación en un problema real que deriva un conjunto de elementos orbitales. ¿Son necesarios los elementos orbitales si tiene estos vectores de posición y velocidad para empezar? Parece que el cálculo vectorial puede manejar esto de manera bastante simple. Además, estoy confundido por el hecho de que no definiste al pequeño mu. Además, el vector v es la primera derivada temporal del vector r. El n-hat es un vector unitario, pero no mostraste las matemáticas para convertirlo en unidades. ¿Cuáles son los valores subíndices de n y h? Además, no pudo mostrar cómo derivar la anomalía media y el movimiento medio.
¿Qué pasa con el cálculo de la anomalía media?
¿Hay alguna diferencia entre nhat y n? No estoy seguro de qué es n (suponiendo que nhat sea el vector de nodo), pero se ha utilizado para calcular el argumento de periapsis. Supongo que n es lo mismo que nhat y n se usó por error.
Para la programación, preferiría relaciones equivalentes usando la función atan2, porque realizará resoluciones de cuadrante automáticamente y lo protegerá de la necesidad de verificar el rango antes de la mayoría de los usos de acos anteriores. (A veces, la precisión numérica hará que el argumento de una función acos esté ligeramente fuera del rango válido de -1,00000 a +1,00000. Cuando eso sucede, el programa, como se muestra, fallará). También es posible que h sea cero, permitiendo una división por cero error.
¿Qué khat en la segunda línea? Veo en el código de muestra que es [0 0 1] ¿es ese el vector normal del plano ecuatorial terrestre?
Un problema es que esto es tomar un punto r y v y convertirlo en elementos en ese instante, que no serán los valores medios habituales en un conjunto de elementos de dos líneas. Lo que la gente hace para generar un TLE a partir de vectores es propagar el vector hacia adelante mediante la integración numérica y luego ajustar los términos del TLE para que coincida. Si está razonablemente alto, entonces probablemente pueda ignorar el término de arrastre. Si no necesita una precisión súper alta, puede modelar la Tierra como una masa puntual.
¿Qué es a? Estoy mirando esta imagen de referencia .
¿Qué es el vector de nodo n^? ¿Qué es K^? ¿Qué es μ? ¿Qué es ry en qué se diferencia de r⃗? ¿Qué hay de vy v⃗? ¿Qué es p?
¿Qué es h_Ky n_I?
@MattJessick ¿Cómo harías esto usando Atan2?

La primera clave para resolver esto es obtener el sistema de coordenadas correcto. Hay dos sistemas de coordenadas de uso común para tales cosas. Son los marcos Earth Centered Earth Fixed (ECEF) y Earth Centered Interial (ECI) . A medianoche, estos dos se alinean exactamente, pero divergen en otros momentos, según la rotación de la Tierra. ECEF funciona mejor para las cosas en la Tierra (si no se está moviendo, debe tener una velocidad de 0. ECEF tiene esto en cuenta, la velocidad de ECI hará que se mueva con la rotación de la Tierra), ECI funciona mejor para las cosas en órbita (en órbita). a los objetos no les importa la rotación de la Tierra, al menos, a la física no le importa). ¡Asegúrate de que los sistemas de coordenadas sean correctos!

Bien, entonces tienes una posición y velocidad en coordenadas ECI, ¿qué haces? Hay un documento excelente que describe todo el proceso, del cual copiaré las fórmulas finales aquí. También hay algunas buenas fuentes aquí , aquí y aquí . Recomiendo encarecidamente leerlos detenidamente. La incertidumbre es mucho más difícil, así que supongamos que tiene un conocimiento perfecto de la velocidad y la posición. Específicamente, los 6 Elementos Keplarianos clásicos son excentricidad (e), inclinación (i), ascensión recta del nodo ascendente ( Ω ), argumento del perigeo ( ω ), semieje mayor (a), y tiempo de paso del perigeo ( T O ).

Debo mencionar que estoy siguiendo principalmente el método de determinación orbital de Laplace , existe una metodología competidora conocida como el método de Gauss. Pero finalmente esto se redujo a descifrar el código de Matlab .

Semieje mayor

W s = 1 2 v 2 s mus . / r ;

a = metro tu s / 2. / W s ; %semieje mayor

Excentricidad

L = [rs(2,:).*vs(3,:) - rs(3,:).*vs(2,:);...
     rs(3,:).*vs(1,:) - rs(1,:).*vs(3,:);...
     rs(1,:).*vs(2,:) - rs(2,:).*vs(1,:)]; %angular momentum

pags = L 2 . / metro tu s ; % recto semilato

mi = 1 pags / a ;

Inclinación

yo = a t a norte ( L ( 1 , : ) 2 + L ( 2 , : ) 2 L ( 3 , : ) ) ;

Argumentos del pericentro

ω = a t a norte 2 ( ( v s ( 1 , : ) . L ( 2 , : ) v s ( 2 , : ) . L ( 1 , : ) ) . / metro tu s r s ( 3 , : ) . / r ) . / ( mi . s i norte ( yo ) ) ( ( L 2 s . v s ( 3 , : ) ) . / metro tu s ( L ( 1 , : ) . r s ( 2 , : ) L ( 2 , : ) . r s ( 1 , : ) ) . / ( L 2 s . r ) ) . / ( mi . s i norte ( yo ) ) )

Longitud del nodo ascendente

Ω = a t a norte 2 ( L ( 2 , : ) , L ( 1 , : ) ) ;

Tiempo de paso del perigeo:

T 0 = ( mi mi . s i norte ( mi ) ) . / metro tu s . a . 3

El método de Laplace es uno de determinación de la órbita inicial a partir de mediciones de ángulos y (creo) mucho más allá del alcance de lo que OP está buscando. Si tiene posición y velocidad ECI, obtener elementos keplerianos es solo una simple transformación de coordenadas .
@Chris: Sabía que tenía que haber una manera más fácil de hacer la transformación... Suspiro.
¿Qué pasa con el sistema de coordenadas en términos de lateralidad y orientación? Por lo que puedo decir, la mayoría de las guías usan Z-is-up. ¿Cómo se implementarían estas fórmulas en un sistema Y-is-up para zurdos, como Unity, o un sistema Y-is-up para diestros, como Godot?

OrbitalPy tiene una elements_from_state_vectorfunción útil que hace exactamente eso:

https://github.com/RazerM/orbital/blob/0.7.0/orbital/utilities.py#L252

Puede verificar que las matemáticas sean las mismas que en la respuesta del usuario 29.

¡Oye, eso es genial! Estoy deseando probarlo. En el segundo ejemplo de los documentos, titulado " Crear órbita molniya ", ¿puede OrbitalPy implementar la precesión? ¿Hay un lugar para agregar un J2? (y creo que Molniya debería estar en mayúscula, creo que califica como un nombre propio).
No estoy familiarizado con OrbitalPy, pero a partir del análisis limitado que hice del código fuente, parece que hace una propagación kepleriana pura de dos cuerpos, sin ninguna perturbación, por lo que no hay correcciones elipsoidales.
¿Está escrito con un sistema de coordenadas "Z-is-up" en mente? Si tengo un sistema de coordenadas "Y-is-up", ¿debo cambiar h.zcon h.yy [0, 0, 1]con [0, 1, 0]?
"El argumento del periapsis es el ángulo entre el vector de excentricidad y su componente x". ¿Por qué?