Гравитационные маневры представляют собой технологию, используемую космическими миссиями для изменения орбиты и скорости космических аппаратов с минимальными затратами энергии. Эта техника включает в себя использование силы гравитации планет или других небесных тел для увеличения скорости космического аппарата при его прохождении вблизи этих объектов. Гравитационные маневры позволяют не только эффективно управлять траекторией полета, но и значительно увеличивать дальность путешествий, что особенно актуально для межпланетных миссий. Правильное планирование таких маневров может сократить время полета и сократить затраты на топливо, что делает их важным инструментом в астрономии и исследовании космоса.
Что такое гравитационный манёвр?
Гравитационный манёвр — это придание космическому аппарату нужных величины и направления за счёт энергии небесного тела.
Первый в истории такой манёвр был совершён советской межпланетной станцией Луна-3 в 1959 году. Под действием гравитации Луны её орбитальная плоскость сместилась. Это позволило аппарату вернуться к Земле по нужной траектории, пролетев по возвращении над наблюдательными станциями.
«Вояджер-2», покинувший землю в 1977 году, сократил за счёт гравитационных манёвров у Юпитера, Сатурна и Урана срок полёта к Нептуну на 18 лет (по сравнению с полётом по гомановской траектории).
Как это работает?
На рисунке представлена схема манёвра. Здесь вектора v0 и v- скорости космического аппарата в гелиоцентрической СО до попадания в сферу гравитационного влияния планеты и после её преодоления. Bектора v'0 и v' - те же скорости, но в СО планеты. Вектор u - скорость планеты.
Космический аппарат, попав в поле тяжести планеты, сначала ускоряется, а затем покидая её, тормозится. При этом скорость аппарата относительно планеты после того, как он покинет сферу её влияния, останется по модулю равной изначальной: |v'0 |= |v'|
Направление её однако поменяется. Из-за этого скорость космического аппарата в гелиоцентрической СО:
изменит не только направление, но и величину.
Таким образом аппарат использует энергию планеты для придания своей скорости нужной величины и направления.
График изменения модуля скорости, построенный программой на языке Python, показывает более детально, как изменяется модуль скорости аппарата в процессе взаимодействия с небесным телом.
Математическое описание движения космического аппарата в процессе совершения гравитационного манёвра.
Перейдем в систему отсчета, связанную с планетой. Чтобы тело в конечном итоге преодолело гравитационное поле планеты, оно должно двигаться по гиперболе (в предельном случае — по параболе). Причём сама планета находится в одном из её фокусов. По свойству гиперболы, разность между расстояниями от некоторой её точки до её фокусов одинакова для всех точек гиперболы. Приравняем эти разности для точки X и для точки, бесконечно удалённой от планеты:
Запишем закон сохранения энергии:
И закон сохранения момента импульса:
Решив систему из этих уравнений (где ℓ - прицельная дальность), получим:
Прицельная дальность не может быть меньше эффективного радиуса планеты (прицельной дальности, при которой аппарат коснётся поверхности земли). Поэтому предельный случай:
Чтобы найти эффективный радиус, вновь воспользуемся законом сохранения энергии и законом сохранения момента импульса:
Решив систему, получим:
где v2 - вторая космическая скорость планеты:
Воспользовавшись полученным соотношением, можно найти максимальный угол отклонения как функцию скорости сближения с планетой:
Модуль вектора изменения скорости равен:
Подставив в это выражение значение угла и продифференцировав, получим, что максимальный модуль вектора приращения скорости достигается при скорости сближения:
где 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)
initial_distance: Вычисляет начальное расстояние между космическим аппаратом и планетой по формуле Евклидова расстояния.
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: Создает фигуру и ось для графика расстояния.
Строит график расстояния между космическим аппаратом и планетой во времени.
Замечание: время полета подбирался таким образом, чтобы данный график имел вид параболы, где концы имели одинаковыми значениями.
Резюме
Этот код моделирует и визуализирует динамику космического аппарата в гравитационном поле движущейся планеты. Путем итеративного обновления скоростей и позиций и построения данных, он позволяет понять поведение траектории космического аппарата, его скорости и расстояния от планеты во времени.
Графики.
Вывод
Мы смогли объяснить процесс гравитационного маневра с точки зрения физики и математики. Также написали код, который подтвердил нашу теорию.
CBET_TbMbI
Хмм... Попробуйте запустить свой код с такими начальными условиями, чтобы аппарат летал вокруг планеты по орбите и проследите хотя бы пару оборотов. Скорость планеты можно принять нулевой.
Если получится эллипс, в одном из фокусов которого будет планета, то, вероятно, всё хорошо. Но у меня есть подозрение, что аппарат начнёт накручивать спирали или ось его орбиты будет смещаться.
Physmat Автор
Так и будет. Если перейти в систему отсчёта связанной с планетой, то при орбите в виде эллипса, он будет выглядеть как спираль. Так как сама система движется поступательно.
Но нам этот случай не особо интересен. Так как наша задача ускориться, при замедлении будут аналогичные решения.
CBET_TbMbI
Если планета неподвижна, то орбита аппарата должна быть строго эллипсом.
С точки зрения науки, это на самом деле неинтересный случай (это просто законы Кеплера), но он интересен с точки зрения проверки алгоритма. Если вместо эллипса получится что-то иное, значит алгоритм неточен.