Моделирование переброски виртуального космического корабля с Земли на Марс с помощью Python.

Трансфер Хомана был основным методом для всех лунных и межпланетных космических путешествий в течение последних нескольких десятилетий. В этой статье будет смоделирована переброска виртуального космического корабля с Земли на Марс с помощью Python.

Недавно я повторно посетил свои папки Msc и наткнулся на несколько сценариев, с которыми я играл около четырех лет назад, проводя исследования. Для контекста: у меня есть опыт работы в физике, но с тех пор я переключился на управление рисками. В этой статье мы обсудим подход к межпланетным космическим путешествиям, а также реализацию Python.

Что такое трансферная орбита Хомана?

Переходная орбита Хомана — это то, как космический корабль может перемещаться между двумя орбитами, скажем, Землей и Марсом, используя наименьшее количество энергии и, таким образом, считается наиболее эффективным. Он включает в себя ускорение космического корабля на эллиптической орбите. Его перигелий (ближайшая к Солнцу точка гомановой орбиты) находится на внутренней планете, а афелий (наиболее удаленная от Солнца точка гомановой орбиты) — на внешней орбите планеты.

Относительно недавним применением передачи Хомана является миссия Марсианская научная лаборатория (MSL) на Марс, которая заняла примерно девять месяцев. Жизненно важным соображением переходной орбиты Хомана является выбор времени запуска таким образом, чтобы Марс находился именно в том месте, когда туда прибудет космический корабль.

Важнейшие этапы переходной орбиты Хомана включают расчет периода обращения нашего космического корабля. В случае с Землей на Марс это время составляет около 520 дней. Наш космический корабль проходит половину орбиты, поэтому путешествие будет около 260 дней. Используя расстояние, которое преодолевает наш космический корабль, и орбитальный период Марса (около 687 дней), мы находим, что оптимальное время для запуска космического корабля — это когда Марс опережает Землю на 44 градуса по своей орбите, как показано на изображении выше. Отличный способ понять вышеизложенное — проверить Калькулятор планетарных перемещений, симулятор солнечной системы, который рассчитывает перемещения между планетами, лунами и звездами.

Реализация Python

В этом разделе будет рассмотрен код, имитирующий перенос Хомана. Мы начнем с импорта некоторых необходимых библиотек для числовых расчетов и построения графиков.

import numpy as np
import matplotlib as mpl
mpl.use(‘pdf’)
import matplotlib.pyplot as plt
from matplotlib import animation

Приведенный ниже код определяет критический угол, на который Марс должен опережать свою орбиту, то есть 44 градуса. Земля находится в среднем в 150 миллионах километров от Солнца, расстояние, которое мы называем 1 астрономической единицей (а.е.), а Марс находится на расстоянии около 1,52 а.е. от Солнца. Чтобы построить орбиты Земли и Марса, мы используем функцию matplotlib Circle() и задаем им радиусы 1 и 1,52 соответственно.

#Plotting the Earth and Mars orbits
alpha = 44 #degrees (Angle by which should be ahead by)
Earth = plt.Circle((0,0), radius= 1.0,fill=False,color=’blue’)
Mars = plt.Circle((0,0), radius= 1.52,fill=False,color=’brown’)

Движущиеся компоненты, то есть синяя Земля, коричневый Марс и красный космический корабль, определяются через:

#Moving Earth, Mars, and Spacecraft
patch_E = plt.Circle((0.0, 0.0),radius=0.04,fill=True,color=’blue’)
patch_M = plt.Circle((0.0, 0.0),radius=0.03,fill=True,color=’brown’)
patch_H = plt.Circle((0.0, 0.0),radius=0.01,fill=True,color=’red’)

Затем мы определяем две основные функции. Первая функция позволяет нам создать базовый кадр для анимации, т. е. начальное положение всех движущихся частей, тогда как функция анимации принимает единственный параметр — номер кадра i. Функция анимации включает в себя все необходимые орбитальные уравнения, описывающие различные движения. Чтобы узнать больше об этих двух функциях, рассмотрите этот учебник.

def init():
 patch_E.center = (0.0,0.0)
 ax.add_patch(patch_E)
 patch_M.center = (0.0,0.0)
 ax.add_patch(patch_M)
 patch_H.center = (0.0,0.0)
 ax.add_patch(patch_H)
 return patch_E,patch_M,patch_H
def animate(i):
 #Earth
 x_E, y_E = patch_E.center
 x_E = np.cos((2*np.pi/365.2)*i)
 y_E = np.sin((2*np.pi/365.2)*i)
 patch_E.center = (x_E, y_E)
#Mars
 x_M, y_M = patch_M.center
 x_M = 1.52*np.cos((2*np.pi/686.98)*i+(np.pi*alpha/180.))
 y_M = 1.52*np.sin((2*np.pi/686.98)*i+(np.pi*alpha/180.))
 patch_M.center = (x_M,y_M)
#Hohmann
 Period = 516.0
 x_H = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period)*i))*np.cos((2*np.pi/Period)*i)
 y_H = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period)*i))*np.sin((2*np.pi/Period)*i)
 patch_H.center = (x_H,y_H)
 return patch_E,patch_M,patch_H

Для создания анимации мы настроили файлы фильмов с помощью функции Writer(), которая дает нам контроль над количеством кадров в секунду (fps) и битрейтом. В приведенном ниже коде мы также устанавливаем макет нашего графика, то есть размеры шрифта и меток. Чтобы лучше направлять взгляд, мы определяем произвольно выбранные серые маркеры вдоль траектории нашего космического корабля.

# Set up formatting for the movie files
#plt.rcParams[‘savefig.bbox’] = ‘tight’ # tight garbles the video!!!
Writer = animation.writers[‘ffmpeg’]
writer = Writer(fps=60, metadata=dict(artist=’Me’), bitrate=1800)
plt.rc(‘font’, family=’serif’, serif=’Times’)
plt.rc(‘text’, usetex=True)
plt.rc(‘xtick’, labelsize=8)
plt.rc(‘ytick’, labelsize=8)
plt.rc(‘axes’, labelsize=8)
# Set up path, to guide eye
Period = 516.
x_H_B = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*75)))*np.cos((2*np.pi/Period*75))
y_H_B = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*75)))*np.sin((2*np.pi/Period*75))
x_H_C = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*150)))*np.cos((2*np.pi/Period*150))
y_H_C = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*150)))*np.sin((2*np.pi/Period*150))
x_H_D = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*200)))*np.cos((2*np.pi/Period*200))
y_H_D = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*200)))*np.sin((2*np.pi/Period*200))
x_H_M = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*250)))*np.cos((2*np.pi/Period*250))
y_H_M = 1.26*(1. — 0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*250)))*np.sin((2*np.pi/Period*250))

Наконец, мы собираем нашу полную анимацию, используя приведенный ниже код. Большая часть этого кода устанавливает наш график, различные оси и участки планет, определенные ранее. В критической строке мы вызываем animation.FuncAnimation() вместе с сохранением анимации.

fig, ax = plt.subplots(figsize=(10,8))
#fig.subplots_adjust(left=.15, bottom=.16, right=.99, top=.97)
ax.plot(0,0,color=’orange’,marker=’o’,linestyle=’’,markersize=16,markerfacecolor=’yellow’,label=’Sun’)
ax.plot([],[],color=’blue’,linestyle=’’,marker=’o’,label=’Earth’)
ax.plot([],[],color=’brown’,linestyle=’’,marker=’o’,label=’Mars’)
ax.plot([],[],color=’red’,linestyle=’’,marker=’o’,label=’spacecraft’)
ax.plot(x_H_B,y_H_B,color=’dimgray’,marker =’p’,markerfacecolor=’dimgray’,linestyle=’’,label=’path’)
ax.plot(x_H_C,y_H_C,color=’dimgray’,marker =’p’,markerfacecolor=’dimgray’)
ax.plot(x_H_D,y_H_D,color=’dimgray’,marker =’p’,markerfacecolor=’dimgray’)
ax.plot(x_H_M,y_H_M,color=’dimgray’,marker =’p’,markerfacecolor=’dimgray’)
ax.add_patch(Earth)
ax.add_patch(Mars)
ax.set_xlabel(‘X [AU]’,fontsize=12)
ax.set_ylabel(‘Y [AU]’,fontsize=12)
ax.legend(loc=’best’,fontsize=12)
anim = animation.FuncAnimation(fig, animate,init_func=init,frames=260,interval=40,blit=True)
plt.axis(‘scaled’) #Scale the plot in real time
plt.savefig(‘Hohmann.pdf’)
anim.save(‘Hohmann.mp4’, writer=writer)
plt.show()

Что произойдет, если наш запуск будет отклонен на 10 градусов?

Как и ожидалось, изменение угла старта с 44 до 54 градусов приводит к тому, что наш космический аппарат «совсем немного» не попадает в точку перехвата с Марсом.

Это все, что касается этой статьи, и я надеюсь, что она была вам интересна! Дайте мне знать, если вы создали какие-нибудь классные анимации на Python.

Спасибо за чтение!

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.