¿Cálculo de coordenadas a partir de los parámetros de la base de datos de cuerpos pequeños del JPL?

Me gustaría escribir un script que pueda calcular la distancia entre dos asteroides en algún momento, dado algún objeto en la base de datos de asteroides y cometas del JPL , por lo que los parámetros disponibles están restringidos al menú que proporcionan allí. Solo obtener coordenadas espaciales consistentes para objetos (en cualquier sistema de coordenadas, no me importa la definición del sistema) en un valor de tiempo sería suficiente para hacer esto.

Las conversiones triviales no me van a molestar, como pasar de coordenadas esféricas a cartesianas, o convertir fecha/mes/año a coma flotante. Tengo más problemas para entender cuáles son esos parámetros y qué hacer con ellos.

En términos de grados de libertad, finalmente espero 3 funciones que tomen un parámetro de entrada (tiempo) y proporcionen una coordenada espacial (x, y, z). Dada la especificación de este problema, creo que necesito 5 parámetros libres. Digo esto para cubrir la extensión a lo largo de cada coordenada, el desplazamiento de tiempo para ese período y la orientación angular de la elipse orbital. El período orbital es redundante con los datos espaciales ya que conozco el GM del sol, así que no necesito otro para eso. La base de datos JPL tiene una gran cantidad de parámetros con poco significado obvio. Mi pregunta es sobre el uso de estos. ¿Cuáles necesito y cómo debo usarlos?

Estos son algunos de los más prometedores, tendré que clasificarlos en categorías. Ahora, entiendo que JED es probablemente una unidad de tiempo (no es difícil). Entiendo que epoch es probablemente un tiempo de referencia y podría ser necesario, pero no contará para mis 5 variables libres esperadas.

relacionado al tiempo

  • tp, tiempo de paso del perihelio, JED
  • época, época de osculación, JED (sin contar)

parámetros orbitales tradicionales

  • a, eje semi-mayor, AU
  • e, excentricidad

conceptos de compensación espacial

  • i, inclinación, grados
  • peri, argumento del perihelio, grado
  • nodo, longitud del nodo ascendente, grados

Sé que esta pregunta suena como Wikipedia/libro de texto que podría buscar fácilmente. Entonces, vayamos a Wikipedia para conocer su método de cálculo de coordenadas de un cuerpo en órbita. Se basan en la anomalía verdadera (o anomalía media) para establecer el punto de inicio temporal. JPL parece tener una anomalía media, pero debo estar perdiendo algo para ese método. Ese parámetro se ocupa de la ubicación del objeto en algún momento , y el parámetro (variable M) no proporciona ningún tipo de punto de referencia para usar. De hecho, mi idea de que epoch es un tiempo de referencia para otros parámetros es pura especulación de mi parte. Ese parámetro (y solo ese parámetro) es el mismo para todos los objetos en la base de datos, así que pensé que la interpretación tenía sentido, pero podría estar equivocado.

Sospecho que algunos parámetros son redundantes y que el tiempo de paso del perihelio o la anomalía media podrían usarse en su propia secuencia de cálculo única. No me importa qué enfoque use, solo necesito uno que funcione.

¿Cuál es la forma más fácil para mí de obtener un libro de cocina para comenzar a escribir este script para obtener las coordenadas de los objetos en la base de datos?

Gracias de antemano por considerar una pregunta tan detallada.


Permítanme tomar un poco más de espacio (en una pregunta ya llena) para responder a un comentario.

nos estás pidiendo que escribamos un capítulo de un libro. Eso es demasiado para un tipo de pregunta de preguntas y respuestas de stackexchange.

Ese libro de texto tendría capítulos tremendamente cortos. Pero reconozco el peligro de que esta pregunta parezca "¡explícame la mecánica orbital!" porque eso no es lo que tengo en mente. Entonces, en lugar de tratar de decir esto con palabras, permítanme decirlo con ecuaciones.

R = a 1 mi 2 1 + mi porque T A X = R ( porque norte porque ( T A + w ) pecado norte pecado ( T A + w ) ) porque i Y = R ( pecado norte porque ( T A + w ) + porque norte pecado ( T A + w ) ) porque i Z = R pecado ( T A + w ) pecado i

Acabo de encontrar esto en formularios de física , y casi responde a mi pregunta, aparte de algunos problemas de procesamiento... si lo interpreté correctamente. La fuente no tenía paréntesis consistentes, pero la forma anterior se ajusta a mi imagen matemática del problema. Obtener TA tampoco debería ser difícil, considerando que todo lo que necesito es una solución programable . Pero todavía no he visto un formulario para TA que obviamente podría obtenerse con la hora actual.

Eso debería faltar solo una expresión adicional o algunos otros detalles similares. Ojalá pudiera obtener un código del kit de herramientas SPICE que hace lo mismo, pero su fuente es probablemente 10,000 líneas de código, haciendo todo tipo de cosas irrelevantes. Si las ecuaciones anteriores son correctas, esto realmente solo debería requerir solo 1 o 2 cosas más pequeñas y concisas.

Lo más fácil, si insiste en escribirlo en lugar de simplemente importarlo a un paquete listo, probablemente sería usar una buena biblioteca. Si Python funciona para ti, te sugiero PyEphem .
@TildalWave Investigándolo. Mi gran pregunta ahora es si los asteroides están incluidos de fábrica, o si hay alguna otra forma de obtener el formato de archivo XEphem con una lista de asteroides relativamente reciente.
@AlanSE, nos está pidiendo que escribamos un capítulo de un libro. Eso es demasiado para un tipo de pregunta de preguntas y respuestas de stackexchange.
Hay un archivo de datos en formato pyephem/xephem en ftp.lowell.edu/pub/elgb/astorb.dat.gz con ~1600 asteroides. He tenido cierto éxito con PyEphem, aunque la biblioteca subyacente es un poco... excéntrica.

Respuestas (2)

Use esta página para generar kernels SPICE para los cuerpos de interés y luego use las rutinas SPICE para calcular lo que quiera al contenido de su corazón.


Aarrr. No sé por qué estás reinventando la rueda.

Muy bien, rata de pantoque escorbuto, aquí está:

X = a ( porque τ mi )
y = a 1 mi 2 pecado τ
z = 0

Eso se lo daré a usted en el avión. Entonces estarás girando el avión con la transformación de Euler del lubber terrestre en Ω , i , ω (longitud del nodo ascendente, inclinación y argumento del periapsis), multiplicando en su matriz por el vector de arriba:

( porque ω porque Ω porque i pecado ω pecado Ω porque Ω pecado ω porque i porque ω pecado Ω pecado i pecado Ω porque i porque Ω pecado ω + porque ω pecado Ω porque i porque ω porque Ω pecado ω pecado Ω porque Ω pecado i pecado i pecado ω porque ω pecado i porque i )

Vosotros también estaréis necesitados cuando sea el momento ( m siendo th' GRAMO METRO del sol):

t = a 3 m ( τ mi pecado τ )

tu τ = 0 y t = 0 siendo tu tiempo un periapsis. Usted está viendo que ev'ry 2 π en τ , será uno cada vez que gira alrededor del sol.

Si tu escorbuto roca se está acercando a un planeta, entonces estás perdiendo el tiempo, ya que la órbita te está cambiando.

No sé si esta respuesta prueba que puedes escribir respuestas sólidas de mecánica orbital mientras estás un poco borracho un sábado por la noche, o si me falta una gran referencia cultural. De cualquier manera, jajaja :)
Te lo estarás perdiendo .
@MarkAdler -- Más uno. Tu comentario llega un día tarde por usar lenguaje pirata, pero tu respuesta es acertada, particularmente sobre el lubber Euler. (Mi comentario también tiene un día de retraso, así que ahora volveré a hablar normalmente). Cualquier pirata sabe que la forma correcta de representar la orientación es a través de alabeo, cabeceo y guiñada. Sería útil resolver la ecuación inversa de Kepler para esta respuesta (ya sabes t , entonces, ¿cómo resolver para τ ?)
Pensé que para eso es el ron, para compensar el balanceo, el cabeceo y la guiñada :)
!$$SOF
    COMMAND = 'DES=2010 VQ'
    CENTER =  '500@0'
    MAKE_EPHEM = 'YES'
    TABLE_TYPE = 'VECTORS'
    START_TIME = '2017-04-01 00:00:00'
    STOP_TIME = '2017-04-01 00:00:01'
    STEP_SIZE = '1'
    OUT_UNITS =  'AU-D'
    VECT_TABLE =  '3'
    REF_PLANE =  'ECLIPTIC'
    REF_SYSTEM =  'J2000'
    VECT_CORR =  'NONE'
    VEC_LABELS =  'NO'
    CSV_FORMAT =  'YES'
    OBJ_DATA =  'YES'
    !$$EOF

devuelve coordenadas heliocéntricas:

$$SOE
2457844.500000000, A.D. 2017-Apr-01 00:00:00.0000,  7.539123579055962E-01,  7.098001692200981E-01,  1.408370538460704E-03, -1.019002972030220E-02,  1.127277705358026E-02,  9.280758228718769E-05,  5.980387083611182E-03,  1.035471924841630E+00,  3.082270281389151E-04,
2457844.500011574, A.D. 2017-Apr-01 00:00:01.0000,  7.539122399654240E-01,  7.098002996920419E-01,  1.408371612622512E-03, -1.019003207292571E-02,  1.127277484368998E-02,  9.280757740530809E-05,  5.980387104214990E-03,  1.035471928409068E+00,  3.082263804494916E-04,
$$EOE

Aquí las coordenadas XYZ son como:

JDTDB,            Calendar Date (TDB),                      X,                      Y,                      Z,                     VX,                     VY,                     VZ,                     LT,                     RG,                     RR,

El otro asteroide:

COMMAND = 'DES=2008 LD'
CENTER =  '500@0'
MAKE_EPHEM = 'YES'
TABLE_TYPE = 'VECTORS'
START_TIME = '2017-04-01 00:00:00'
STOP_TIME = '2017-04-01 00:00:01'
STEP_SIZE = '1'
OUT_UNITS =  'AU-D'
VECT_TABLE =  '3'
REF_PLANE =  'ECLIPTIC'
REF_SYSTEM =  'J2000'
VECT_CORR =  'NONE'
VEC_LABELS =  'NO'
CSV_FORMAT =  'YES'
OBJ_DATA =  'YES'
!$$EOF

....
entonces hazsqrt(dx^2+dy^2+dz^2)