Aerospace Engineer and Senior Software Developer
Ingeniero aeroespacial interesado en la astrodinámica computacional. Actualmente trabajo como ingeniero senior de I+D en ANSYS, Inc.
En mi tiempo libre colaboro en proyectos de código abierto en el ámbito científico.
GitHub | Web |
---|---|
jorgepiloto | https://jorgemartinez.space |
¿Por qué todas las misiones se lanzan y llegan a Marte al mismo tiempo?
Misión | Lanzamiento | Llegada |
---|---|---|
Hope (UAE) | 19 Julio 2020 | 9 Febrero 2021 |
Tianwen-1 | 23 Julio 2020 | 10 Febrero 2021 |
Perseverance | 30 Julio 2020 | 18 Febrero 2021 |
Primero, debemos resolver las siguientes preguntas:
El Sistema Solar es complejo de modelar:
El problema de los dos cuerpos se utiliza para describir el movimiento de dos cuerpos que interactúan entre sí. Asume que:
El JPL de la NASA mantiene un conjunto de efemérides de alta precisión. Las efemérides son tablas o modelos que proporcionan las posiciones y velocidades de los cuerpos celestes a lo largo del tiempo.
SPICE data: https://naif.jpl.nasa.gov/naif/data.html
SpiceyPy: https://github.com/AndrewAnnex/SpiceyPy
Existen varios tipos de kernels:
import spiceypy as spice
spice.furnsh("latest_leapseconds.tls")
spice.furnsh("de430.bsp")
utc_time = "2025-09-26 00:00:00"
et = spice.str2et(utc_time)
state, light_time = spice.spkezr("EARTH", et, "J2000", "LT+S", "SUN")
position, velocity = state[:3], state[3:]
print(f"Epoch (UTC): {utc_time}")
print(f"Position: {position} [km]")
print(f"Velocity: {velocity} [km]")
print(f"Light time: {light_time:.6f} [s]")
spice.kclear()
Los objetos en el espacio están sujetos a la fuerza de gravedad. Esto hace que sigan trayectorias cónicas conocidas como órbitas.
Hay diferentes elementos para definir una órbita:
Las órbitas pueden clasificarse según su geometría:
Geometría | Trayectoria | Excentricidad (e) |
---|---|---|
Órbita circular | Círculo perfecto | e = 0 |
Órbita elíptica | Elipse | 0 < e < 1 |
Órbita parabólica | Parábola abierta | e = 1 |
Órbita hiperbólica | Hipérbola abierta | e > 1 |
Son maniobras que cambian instantáneamente la velocidad de una nave espacial. Esto inserta a la nave espacial en una nueva órbita.
Dado que las maniobras impulsivas introducen un \(\Delta v\), es posible calcular el gasto de combustible asociado a la maniobra aplicando la ecuación de Tsiolkovsky.
\[ \Delta v = v_e \ln \left( \frac{m_0}{m_f} \right) \]
Es común utilizar la energía específica como una métrica para comparar el gasto de combustible entre diferentes maniobras.
\[ C_3 = v_\infty^2 \]
Debemos resolver el problema de Lambert para encontrar la órbita entre dos puntos en el espacio.
Conocido:
Calculamos:
Algoritmos desarrollados a lo largo de los últimos años:
Lamberthub es una librería que contiene un conjunto de algoritmos para resolver el problema de Lambert.
from lamberthub import authorYYYY
v1, v2 = authorYYYY(
mu, r1, r2, tof, M=0, prograde=True, low_path=True, # Type of solution
maxiter=35, atol=1e-5, rtol=1e-7, full_output=False # Iteration config
)
Las velocidades de lanzamiento y llegada se usan para calcular los impulsos de la de la maniobra.
Ahora que sabemos cómo resolver el problema de Lambert, podemos planificar un viaje entre planetas.
from lamberthub import izzo2015 as lambert
import spiceypy as spice
MU_SUN = 1.32712440018e11 # Gravitational parameter of the Sun in [km^3/s^2]
norm = lambda vector: sum(x**2 for x in vector) ** 0.5
furnsh_kernels = lambda *kernels: list(map(spice.furnsh, kernels))
def get_state_for_body_at_epoch(body, et):
state, light_time = spice.spkezr(body, et, "J2000", "LT+S", "SSB")
return state[:3], state[3:], light_time
furnsh_kernels("de430.bsp", "latest_leapseconds.tls", "pck00011.tpc")
departure_time, arrival_time = spice.str2et("2025-01-01 00:00:00"), spice.str2et("2025-03-01 00:00:00")
tof = arrival_time - departure_time
earth_pos, earth_vel, _ = get_state_for_body_at_epoch("EARTH_BARYCENTER", departure_time)
mars_pos, mars_vel, _ = get_state_for_body_at_epoch("MARS_BARYCENTER", arrival_time)
v1, v2 = lambert(MU_SUN, earth_pos, mars_pos, tof)
delta_v1, delta_v2 = abs(norm(v1) - norm(earth_vel)), abs(norm(mars_vel) - norm(v2))
print(f"Delta-v departure: {delta_v1:.2f} [km/s]")
print(f"Delta-v arrival: {delta_v2:.2f} [km/s]")
¿Y si resolvemos el problema para diferentes combinaciones de fechas de salida y llegada?
Fecha de salida | Fecha de llegada | Delta-v salida [km/s] | Delta-v llegada [km/s] |
---|---|---|---|
2025-01-01 | 2025-04-01 | 3.11 | 2.80 |
2025-01-01 | 2025-05-01 | 2.09 | 4.67 |
2025-01-01 | 2025-06-01 | 1.87 | 5.07 |
Es difícil identificar la mejor combinación de fechas a simple vista. Vamos a usar un mapa de contornos para visualizar los resultados.
Mapa de contornos que muestra la energía necesaria para viajar entre dos órbitas en función de las fechas de salida y llegada.
Forma rápida de visualizar el espacio de soluciones:
En misiones complejas, optimizar la trayectoria puede ser complicado. La imagen muestra la trayectoria de la sonda Cassini a Saturno.
Existen diversas herramientas para optimizar trayectorias:
Categoría | Ventajas | Desventajas | Uso típico |
---|---|---|---|
Evolutivos | Buena exploración global, multiobjetivo | Lentitud, alto cómputo | Flybys múltiples |
Metaheurísticas | Simples, fáciles de aplicar | Precisión limitada | Exploración inicial |
Control Óptimo | Alta precisión, refinamiento | Difíciles, condiciones frágiles | Ajuste final |
Normalmente, los algoritmos se programan en un leguaje compilado y se exponen a través de bindings a Python.
Copyright © 2025 Jorge Martinez