¿Cómo obtener coordenadas centradas en la tierra y fijas en la tierra de Skyfield?

Recientemente comencé a usar Skyfield (python) para encontrar las coordenadas (x, y, z) de las cosas en el espacio. Ahora me gustaría transformar entre coordenadas centradas en la Tierra, fijas en la Tierra (giratorias) e inerciales centradas en la Tierra (no giratorias), ya que las "velocidades de los cohetes" a veces pueden transmitirse por Internet en marcos fijos en la Tierra (giratorios). Ver esta respuesta y esta respuesta

Esto es lo que tengo hasta ahora. Las posiciones baricéntricas son directamente de Skyfield, pero solo estoy restando la posición de la tierra de la posición de la luna para obtener la posición inercial centrada en la tierra. Creo que esto está bien para resultados que no son de precisión, no sé si realmente es eso. fácil o si hay algo sutil que me estoy perdiendo.

Sin embargo, me pregunto si hay un marco "oficial" fijo en la Tierra (giratorio), y si Skyfield tiene un método para convertirlo, o en cualquier marco giratorio en general.

Pitón:

from skyfield.api import load, JulianDate

de421 = load('de421.bsp')

earth = de421['earth']
moon  = de421['moon']
slc40 = earth.topos('28.562 N', '80.577 W')

jd = JulianDate(utc=(2015,12, 22, 1, 48, 0))

epos     = earth.at(jd).position.km # barycentric (ICRS) position of earth
mpos     = moon.at(jd).position.km  # barycentric (ICRS) position of moon
slc40pos = slc40.at(jd).position.km # barycentric (ICRS) position of SLC-40

mpos_ec     = mpos     - epos # earth centered (inertial) position of moon
slc40pos_ec = slc40pos - epos # earth centered (inertial) position of SLC-40
Para aquellos interesados: esta pregunta en GIS stackexchange Características de diferentes métodos para convertir ECEF a LLA vincula a este pdf donde GIS = Sistemas de información geográfica y ECEF = Centrado en la Tierra, Fijo en la Tierra.

Respuestas (1)

Skyfield ≥1.34

Las versiones más recientes de Skyfield introducen un itrsmarco de referencia explícito que gira con la Tierra. Puedes conocerlo a partir de aquí:

Skyfield <1.34

Primero: el principal problema con su técnica de restar las dos posiciones es que no tiene en cuenta el viaje en el tiempo de la luz. En el caso de la observación de la Luna que configuró en su código, el error es de solo unos 38 km, lo que podría estar dentro de sus tolerancias. La forma de solicitar una posición relativa que esté debidamente retroactiva en el tiempo de la luz es a través del observe()método:

mpos_ec = earth.at(jd).observe(moon).position.km

Segundo: tiene razón en que Skyfield actualmente no tiene un soporte integrado de primera clase para un marco de referencia que gira con la Tierra. Probablemente debería agregar uno. Sin embargo, una solución alternativa que debería ponerlo en funcionamiento de inmediato es decirle a Skyfield que desea observar:

  • Desde una ubicación de la Tierra, Skyfield realiza el cálculo de rotación que desea.
  • Pero desde una ubicación de la Tierra cuya latitud y longitud sean cero, de modo que Skyfield no aplique más rotaciones más allá de moverse hacia el marco de referencia giratorio de la Tierra.
  • Y desde una ubicación cuya elevación sea lo suficientemente negativa como para colocarla exactamente en el centro de la Tierra, de modo que no esté aplicando un desplazamiento a la posición de la Luna o lo que sea.

El único truco es que tenemos que hacer la rotación nosotros mismos porque, como notará, la forma en que Skyfield está escrito actualmente solo está dispuesto a aplicar la rotación si está a punto de reducir las coordenadas a polar alt/az para usted. Así que prueba lo siguiente:

# Create an observer at the center of the Earth,
# rotated zero degrees from the Earth's reference frame:

gcrs = earth.topos(
    latitude_degrees=0,
    longitude_degrees=0,
    elevation_m=-6378136.6,
    )

# Ask where the observer was at a given time:

g = gcrs.at(jd)

# Then ask for a relative position as usual:

p = g.observe(moon).position.km
print p

# Now the tricky part: each observer.at() has
# an attribute `altaz_rotation` which is the rotation
# matrix you want to apply:

print einsum('ij...,j...->i...', g.altaz_rotation, p)

¡Déjame saber si los números que obtienes parecen funcionar! Y una vez que haya terminado de reescribir el sistema de tiempo y pueda lanzar Skyfield 1.0, centraré mi atención en hacer que este cálculo sea un poco más conveniente.

¡Excelente! Gracias por la respuesta más la explicación detallada. Informaré de nuevo. Los documentos en línea hacen un gran trabajo al explicar los efectos de la velocidad finita de la luz en las observaciones, pero esto no se puede repetir con la suficiente frecuencia, ¡es tan fácil de olvidar! Ahora mismo en este momento estoy dibujando y animando órbitas de vehículos espaciales en 3D con matplotliby Blender(ver esto y esto )` desde diferentes puntos de vista. ¡Recuerde que estos son marcos diferentes y la luna aparecerá en un lugar diferente!
Sé que np.einsumes muy popular para aquellos que saben cómo usarlo. Para aquellos que no están familiarizados (como yo), las cuatro respuestas a esta pregunta son útiles.
Acabo de cortar y pegar el einsumejemplo de mi propio código fuente, no trato cada vez de recordar cómo funciona desde cero. :)
Si está dibujando una vista del sistema solar desde "afuera", entonces tal vez observe()no tenga sentido: las personas que miran una animación del movimiento de los planetas, tal vez en la que la cámara también se mueve, generalmente parecen esperar ver "dónde están realmente las cosas". son” sin ningún ajuste de tiempo de luz.
¡Es una pregunta/problema muy interesante para pensar y me alegro de que lo hayas mencionado! Mencioné la luna porque era visible desde la segunda etapa de SpaceX mientras desplegaba los once satélites Orbcomm-2 (ver esta pregunta y este GIF ). Para esa "escena", incluir el tiempo de luz sería correcto, y usar g.observe () sería lo suficientemente cercano para la "Policía astronómica" :)
Para aquellos interesados: esta pregunta en GIS stackexchange Características de diferentes métodos para convertir ECEF a LLA vincula a este pdf donde GIS = Sistemas de información geográfica y ECEF = Centrado en la Tierra, Fijo en la Tierra.