Гравитационные маневры

Гравитационные маневры представляют собой технологию, используемую космическими миссиями для изменения орбиты и скорости космических аппаратов с минимальными затратами энергии. Эта техника включает в себя использование силы гравитации планет или других небесных тел для увеличения скорости космического аппарата при его прохождении вблизи этих объектов. Гравитационные маневры позволяют не только эффективно управлять траекторией полета, но и значительно увеличивать дальность путешествий, что особенно актуально для межпланетных миссий. Правильное планирование таких маневров может сократить время полета и сократить затраты на топливо, что делает их важным инструментом в астрономии и исследовании космоса.

Что такое гравитационный манёвр?

Гравитационный манёвр — это придание космическому аппарату нужных величины и направления за счёт энергии небесного тела.

Первый в истории такой манёвр был совершён советской межпланетной станцией Луна-3 в 1959 году. Под действием гравитации Луны её орбитальная плоскость сместилась. Это позволило аппарату вернуться к Земле по нужной траектории, пролетев по возвращении над наблюдательными станциями.

«Вояджер-2», покинувший землю в 1977 году, сократил за счёт гравитационных манёвров у Юпитера, Сатурна и Урана срок полёта к Нептуну на 18 лет (по сравнению с полётом по гомановской траектории).

613f4ad7645a1f5502a17d8c82c04ef2.png

Как это работает?

27f1c8c63c797153e46aa7fbabb84501.png

На рисунке представлена схема манёвра. Здесь вектора v0 и v- скорости космического аппарата в гелиоцентрической СО до попадания в сферу гравитационного влияния планеты и после её преодоления. Bектора v'0 и v' — те же скорости, но в СО планеты. Вектор u — скорость планеты.

 Космический аппарат, попав в поле тяжести планеты, сначала ускоряется, а затем покидая её, тормозится. При этом скорость аппарата относительно планеты после того,   как он покинет сферу её влияния, останется по модулю равной изначальной: |v'0 |= |v'|

 Направление её однако поменяется. Из-за этого скорость космического аппарата в гелиоцентрической СО:

a6740eb50d535abafab3882b8d4480bf.png

  изменит не только направление, но и величину.

Таким образом аппарат использует энергию планеты для придания своей скорости нужной величины и направления.

График изменения модуля скорости, построенный программой на языке Python, показывает более детально, как изменяется модуль скорости аппарата в процессе взаимодействия с небесным телом.

afd9bed2f1b01534f927841641e1ac9e.png

Математическое описание движения космического аппарата в процессе совершения гравитационного манёвра.

1f2a66bd4d9f321d681cdbec30cadeda.png

Перейдем в систему отсчета, связанную с планетой. Чтобы тело в конечном итоге преодолело гравитационное поле планеты, оно должно двигаться по гиперболе (в предельном случае — по параболе). Причём сама планета находится в одном из её фокусов. По свойству гиперболы, разность между расстояниями от некоторой её точки до её фокусов одинакова для всех точек гиперболы. Приравняем эти разности для точки X и для точки, бесконечно удалённой от планеты:

16226a1360e565b1b3ac0b38710a00dd.png

Запишем закон сохранения энергии:

21e69d9926bd0a933e016eccdd4881c3.png

И закон сохранения момента импульса:

aca95f21231c02a027a237cf3cd195bf.png

Решив систему из этих уравнений (где ℓ — прицельная дальность), получим:

1fe98ce2b264f57b87f7541aa70369c3.png

Прицельная дальность не может быть меньше эффективного радиуса планеты (прицельной дальности, при которой аппарат коснётся поверхности земли). Поэтому предельный случай:

fc344e1a9aaa65aa921861cf848f79f5.png

Чтобы найти эффективный радиус, вновь воспользуемся законом сохранения энергии и законом сохранения момента импульса:

6f532dd41101e373653fc2306f5d265d.png

Решив систему, получим:

15a76d8210253dcd8b5d890285d4a4a2.png

где v2 — вторая космическая скорость планеты:

a49dfcd0bf7d96911e6de5129ab9843b.png

Воспользовавшись полученным соотношением, можно найти максимальный угол отклонения как функцию скорости сближения с планетой:

313aff129f486234ce32d9ca87e7b1b9.png

Модуль вектора изменения скорости равен:

bd9a18059c89bf066b127219a1105706.png

Подставив в это выражение значение угла и продифференцировав, получим, что максимальный модуль вектора приращения скорости достигается при скорости сближения:

beb5ebbdee83e3fefbdfb712e7e1e664.png

где v1 — первая космическая скорость для данной планеты. Аппарат при этом отклонится от первоначальной траектории в СО планеты на 60 градусов.

Ниже в таблице приведены значения максимального приращения скорости для тел солнечной системы (в км/c).

Меркурий

3, 01

Юпитер

42,73

Венера

7,33

Сатурн

25,62

Земля

7,91

Уран

15,18

Луна

1,68

Нептун

16,73

Марс

3,56

Плутон

1,09

Код.

import matplotlib.pyplot as plt
import numpy as np

# Constants
G = 6.67430e-11  # Gravitational constant
M_p = 5.972e24  # Mass of the planet (in kg)
M_s = 1000  # Mass of the spacecraft (in kg)
r_p = 6.371e6  # Radius of the planet (in meters)

# Initial conditions
x_p, y_p = 0, 0  # Initial coordinates of the planet
v_px, v_py = 0, 0.5e3  # Initial velocity of the planet
x_s, y_s = 3 * r_p, -4 * r_p  # Initial position of the spacecraft
v_x, v_y = -7e3, 3e3  # Initial velocity of the spacecraft (tuned for hyperbolic orbit)
dt = 10  # Time step (in seconds)
num_steps = 785  # Number of steps for the simulation

# Lists to store trajectory data, speed, and distance
x_trajectory, y_trajectory = [], []
x_planet_trajectory, y_planet_trajectory = [], []
speed, distance = [], []

# Calculate initial distance between planet and spacecraft
initial_distance = np.sqrt((x_s - x_p)**2 + (y_s - y_p)**2)

for _ in range(num_steps):
    r = np.sqrt((x_s - x_p)**2 + (y_s - y_p)**2)
    if r <= r_p:
        print("Crash! The spacecraft has collided with the planet.")
        break

    # Gravitational acceleration
    a_x = -G * M_p * (x_s - x_p) / r**3
    a_y = -G * M_p * (y_s - y_p) / r**3

    # Update velocities
    v_x += a_x * dt
    v_y += a_y * dt

    # Update positions
    x_s += v_x * dt
    y_s += v_y * dt
    x_p += v_px * dt
    y_p += v_py * dt

    # Store trajectory data
    x_trajectory.append(x_s)
    y_trajectory.append(y_s)
    x_planet_trajectory.append(x_p)
    y_planet_trajectory.append(y_p)

    # Calculate and store speed and distance
    speed.append(np.sqrt(v_x**2 + v_y**2))
    distance.append(r)

# Plotting the trajectory of the spacecraft and planet
plot_limit = 2 * initial_distance  # Set plot limit to 2 times the initial distance

# Trajectory plot
fig1, ax1 = plt.subplots(figsize=(10, 10))
ax1.plot(x_trajectory, y_trajectory, label='Spacecraft Trajectory')
ax1.plot(x_planet_trajectory, y_planet_trajectory, label='Planet Trajectory', linestyle='--')
ax1.plot(x_p, y_p, 'ro', markersize=10, label='Planet')  # Planet
ax1.plot(x_trajectory[0], y_trajectory[0], 'go', markersize=8, label='Start Point')  # Start point of the spacecraft (dynamic)
ax1.set_aspect('equal', adjustable='box')
ax1.set_xlabel('X coordinate (m)')
ax1.set_ylabel('Y coordinate (m)')
ax1.set_title('Trajectory of the Spacecraft with Moving Planet (Hyperbolic)')
ax1.set_xlim(-plot_limit, plot_limit)  # Set x-axis limits
ax1.set_ylim(-plot_limit, plot_limit)  # Set y-axis limits
ax1.grid(True)  # Add grid for better visualization
ax1.legend()

# Speed plot
fig2, ax2 = plt.subplots(figsize=(10, 5))
time = np.arange(0, len(speed) * dt, dt)
ax2.plot(time, speed)
ax2.axhline(speed[0], color='r', linestyle='--', label=f'Начальная скорость: {speed[0]:.2f} м/с')
ax2.axhline(speed[-1], color='g', linestyle='--', label=f'Конечная скорость: {speed[-1]:.2f} м/с')
ax2.set_xlabel('Время (c)')
ax2.set_ylabel('Скорость (м/с)')
ax2.set_title('Зависимость скорости космического аппарата от времени')
plt.minorticks_on()
plt.grid(True)
plt.grid(which = 'minor' , color="grey", alpha=0.25)
ax2.legend()  # Add legend to the plot

# Distance plot
fig3, ax3 = plt.subplots(figsize=(10, 5))
ax3.plot(time, distance)
ax3.set_xlabel('Time (s)')
ax3.set_ylabel('Distance (m)')
ax3.set_title('Distance Between Spacecraft and Planet Over Time')
ax3.grid(True)  # Add grid for better visualization

plt.show()

Объяснение кода.

1. Константы и начальные условия

G = 6.67430e-11  # Гравитационная постоянная в м^3 кг^-1 с^-2
M_p = 5.972e24  # Масса планеты в килограммах
M_s = 1000  # Масса космического аппарата в килограммах
r_p = 6.371e6  # Радиус планеты в метрах
  • G:  Универсальная гравитационная постоянная.

  • M_p:  Масса планеты,  в данном случае Земли.

  • M_s:  Масса космического аппарата.

  • r_p:  Радиус планеты.

2. Начальные позиции и скорости

x_p, y_p = 0, 0  # Начальные координаты планеты
v_px, v_py = 0, 0.5e3  # Начальная скорость планеты
x_s, y_s = 3 * r_p, -4 * r_p  # Начальная позиция космического аппарата
v_x, v_y = -7e3, 3e3  # Начальная скорость космического аппарата
  • x_p,  y_p:  Начальные координаты планеты.

  • v_px,  v_py:  Начальные компоненты скорости планеты.

  • x_s,  y_s:  Начальная позиция космического аппарата,  относительно центра планеты.

  • v_x,  v_y:  Начальные компоненты скорости космического аппарата,  настроенные для гиперболической орбиты.

3. Параметры моделирования

dt = 10  # Временной шаг в секундах
num_steps = 785  # Количество шагов моделирования
  • dt:  Временной шаг для каждого итерации моделирования.

  • num_steps:  Общее количество шагов моделирования.

4. Инициализация хранения данных

x_trajectory, y_trajectory = [], []
x_planet_trajectory, y_planet_trajectory = [], []
speed, distance = [], []
  • x_trajectory,  y_trajectory:  Списки для хранения позиций космического аппарата во времени.

  • x_planet_trajectory,  y_planet_trajectory:  Списки для хранения позиций планеты во времени.

  • speed:  Список для хранения скорости космического аппарата.

  • distance:  Список для хранения расстояния между космическим аппаратом и планетой.

5. Вычисление начального расстояния

initial_distance = np.sqrt((x_s - x_p)**2 + (y_s - y_p)**2)

6. Основной цикл моделирования

for _ in range(num_steps):
    r = np.sqrt((x_s - x_p)**2 + (y_s - y_p)**2)
    if r <= r_p:
        print("Crash! The spacecraft has collided with the planet.")
        break
  • r:  Текущее расстояние между космическим аппаратом и планетой.

  • Если r меньше или равно радиусу планеты,  моделирование останавливается,  указывая на столкновение.

7. Гравитационное ускорение

pythonCopy

a_x = -G * M_p * (x_s - x_p) / r**3
a_y = -G * M_p * (y_s - y_p) / r**3
  • a_x,  a_y:  Компоненты гравитационного ускорения,  действующего на космический аппарат со стороны планеты.

8. Обновление скоростей

v_x += a_x * dt
v_y += a_y * dt

9. Обновление позиций

x_s += v_x * dt
y_s += v_y * dt
x_p += v_px * dt
y_p += v_py * dt
  • Обновляет позиции как космического аппарата,  так и планеты с использованием их скоростей и временного шага.

10. Сохранение данных

x_trajectory.append(x_s)
y_trajectory.append(y_s)
x_planet_trajectory.append(x_p)
y_planet_trajectory.append(y_p)
speed.append(np.sqrt(v_x**2 + v_y**2))
distance.append(r)

11. Построение графиков

График траектории

fig1, ax1 = plt.subplots(figsize=(10, 10))
ax1.plot(x_trajectory, y_trajectory, label='Spacecraft Trajectory')
ax1.plot(x_planet_trajectory, y_planet_trajectory, label='Planet Trajectory', linestyle='--')
ax1.plot(x_p, y_p, 'ro', markersize=10, label='Planet')  # Планета
ax1.plot(x_trajectory[0], y_trajectory[0], 'go', markersize=8, label='Start Point')  # Начальная точка космического аппарата
ax1.set_aspect('equal', adjustable='box')
ax1.set_xlabel('Координата X (м)')
ax1.set_ylabel('Координата Y (м)')
ax1.set_title('Траектория космического аппарата с движущейся планетой (гиперболическая)')
ax1.set_xlim(-plot_limit, plot_limit)  # Установить пределы по оси X
ax1.set_ylim(-plot_limit, plot_limit)  # Установить пределы по оси Y
ax1.grid(True)  # Добавить сетку для лучшей визуализации
ax1.legend()
  • fig1,  ax1:  Создает фигуру и ось для графика траектории.

  • Строит траектории космического аппарата и планеты.

  • Отмечает начальную позицию космического аппарата и планеты.

График скорости

fig2, ax2 = plt.subplots(figsize=(10, 5))
time = np.arange(0, len(speed) * dt, dt)
ax2.plot(time, speed)
ax2.axhline(speed[0], color='r', linestyle='--', label=f'Начальная скорость: {speed[0]:.2f} м/с')
ax2.axhline(speed[-1], color='g', linestyle='--', label=f'Конечная скорость: {speed[-1]:.2f} м/с')
ax2.set_xlabel('Время (с)')
ax2.set_ylabel('Скорость (м/с)')
ax2.set_title('Зависимость скорости космического аппарата от времени')
plt.minorticks_on()
plt.grid(True)
plt.grid(which = 'minor', color="grey", alpha=0.25)
ax2.legend()
  • fig2,  ax2:  Создает фигуру и ось для графика скорости.

  • Строит график скорости космического аппарата во времени.

  • Добавляет горизонтальные линии для обозначения начальной и конечной скоростей космического аппарата.

График расстояни

fig3, ax3 = plt.subplots(figsize=(10, 5))
ax3.plot(time, distance)
ax3.set_xlabel('Время (с)')
ax3.set_ylabel('Расстояние (м)')
ax3.set_title('Расстояние между космическим аппаратом и планетой во времени')
ax3.grid(True)  # Добавить сетку для лучшей визуализации
  • fig3,  ax3:  Создает фигуру и ось для графика расстояния.

  • Строит график расстояния между космическим аппаратом и планетой во времени.

  • Замечание: время полета подбирался таким образом, чтобы данный график имел вид параболы, где концы имели одинаковыми значениями.

Резюме

Этот код моделирует и визуализирует динамику космического аппарата в гравитационном поле движущейся планеты. Путем итеративного обновления скоростей и позиций и построения данных,  он позволяет понять поведение траектории космического аппарата,  его скорости и расстояния от планеты во времени.

Графики.

89cc466a507ab00a2aaccc2be2130370.png08108e72c6813787f0bc0a028b7beffd.png09bb0dcd67ce719112367c20004bd6a7.png

Вывод.

Мы смогли объяснить процесс гравитационного маневра с точки зрения физики и математики. Также написали код,  который подтвердил нашу теорию.

© Habrahabr.ru