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.
Dados vectores de posición y velocidad inerciales (ECI) centrados en la Tierra y , puedes resolver directamente los elementos orbitales clásicos de la siguiente manera (algoritmos primero, seguidos de pseudocódigo en la parte inferior):
Primero, resuelve el momento angular
entonces el vector de nodo
El vector de excentricidad es entonces
y .
La energía mecánica específica es
Si , después
Ahora,
Y deberá realizar las siguientes comprobaciones: Si , después ,
Si , después , y
Si , después .
Tenga en cuenta que se encontrará con problemas (singularidades) para ciertos casos: órbitas circulares ( ), y órbitas ecuatoriales ( ), 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.
a
? Estoy mirando esta imagen de referencia .n^
? ¿Qué es K^
? ¿Qué es μ
? ¿Qué es r
y en qué se diferencia de r⃗
? ¿Qué hay de v
y v⃗
? ¿Qué es p
?h_K
y n_I
?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 ( ).
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
; %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
% recto semilato
Inclinación
Argumentos del pericentro
Longitud del nodo ascendente
Tiempo de paso del perigeo:
OrbitalPy tiene una elements_from_state_vector
funció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.
h.z
con h.y
y [0, 0, 1]
con [0, 1, 0]
?
Stu
usuario6972
RickNZ