Community Engee

Моделирование посадки космического аппарата на Венеру

Author
avatar-goltsevgoltsev
Notebook

Расчет параметров траектории спускаемого аппарата при посадке на Венеру

Введение

В данной статье приведен один из возможных вариантов математического обеспечения для исследования динамики неуправляемого движения спускаемых аппаратов, созданное на основе обобщения опыта проектирования, отработки и эксплуатации аппаратов типа "Венера" и "Марс" второго и третьего поколений. Приводятся обобщенные данные, характеризующие динамику спуска в атмосферах планет типа "Венера 9-16", "Вега-1,2" и "Марс-3,6". При данном моделирования рассматривается процесс посадки на Венеру и заданы параметры её атмосферы.

Венера является одной из самых изучаемых планет Солнечной системы. И не удивительно, поскольку Венера- это ближайшая к нам планета Солнечной системы. На протяжении второй половины 20века и начала 21 века были запущены на Венеру очень много космических аппаратов(начиная с Венеры 1). Тем более, что 8 июня 1975 года космическим аппаратом Венера 9 были получены первые черно-белые снимки поверхности Венеры. От того ,как пройдет посадка спускаемого аппарата зависит дальнейшее исследование планеты и получение информации о ней. Посадка бывает активной и пассивной. Активная посадка отличается от пассивной тем, что в пассивной посадке не используются посадочные механизмы, такие как парашют или тормозной механизм. В активной посадке используется парашют, чтобы снизить скорость аппарата.

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

Подключаемые библиотеки:

In [ ]:
using Plots
using Pkg
using Polynomials
using LinearAlgebra

Константы характеризующие атмосферу планеты:

In [ ]:
# высота (метры), температура (по данным), давление (в мм рт.ст.)
data = [
    0    462    92.10;
    5    424    66.65;
    10   385    47.39;
    15   348    33.04;
    20   306    22.52;
    25   264    14.93;
    30   222    9.851;
    35   180    5.917;
    40   143    3.501;
    45   110    1.979;
    50   75     1.066;
    55   27     0.5314;
    60  -10     0.2357;
    65  -30     0.09765;
    70  -43     0.03690;
    80  -76     0.004760;
    90  -104    0.0003736;
    100 -112    0.00002660]
# Высота в метрах
h = data[:, 1] * 1000
# Температура в Кельвинах
T = data[:, 2] .+ 273
# Атмосферное давление в мм рт. ст.
P = data[:, 3]
# Молярная масса воздуха (г/моль)
M = 28.98
# Универсальная газовая постоянная (Дж/(моль·К))
R = 8.314
# Расчет плотности воздуха
ro = P .* M ./ (R .* T)
x = h
y = ro
Out[0]:
18-element Vector{Float64}:
 0.43677789614763396
 0.3333156739992594
 0.25104361267075787
 0.18545425386897604
 0.13557455368994928
 0.09691118030702738
 0.06936868808362674
 0.04552937915301247
 0.029335070825854445
 0.01801089860068047
 0.010677419890006886
 0.006174313206639404
 0.0031238645520725956
 0.001400729692887499
 0.0005592254029348088
 8.422268597155554e-5
 7.705636603547448e-6
 5.75896078903055e-7

Интерполяция параметров атмосферы с помощью МНК

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

In [ ]:
n = length(x);
Sx = sum(x)
Sx2 = sum(x.^2)
Sx3 = sum(x.^3)
Sx4 = sum(x.^4)
Sx5 = sum(x.^5)
Sx6 = sum(x.^6)
Sx7 = sum(x.^7)
Sx8 = sum(x.^8)
Sx9 = sum(x.^9)
Sx10 = sum(x.^10)
Sx11 = sum(x .^11)
Sx12 = sum(x .^12)
Sy = sum(y)
Sxy = sum(x .*y)
Sx2y = sum(x .^2 .*y)
Sx3y = sum(x.^3 .*y)
Sx4y = sum(x.^4 .*y)
Sx5y = sum(x.^5 .*y)
Sx6y = sum(x.^6 .*y)

#F(x) = a0+a1*x+a2*x^2+a3*x^3+a4*x^4+a5*x^5+a6*x^6;
# поиск коэффициентов
A = [n  Sx   Sx2  Sx3 Sx4  Sx5   Sx6;
    Sx  Sx2  Sx3  Sx4 Sx5  Sx6   Sx7;
    Sx2  Sx3  Sx4 Sx5  Sx6  Sx7  Sx8;
    Sx3  Sx4 Sx5  Sx6  Sx7  Sx8  Sx9; 
    Sx4 Sx5  Sx6  Sx7  Sx8  Sx9  Sx10;
    Sx5  Sx6  Sx7  Sx8  Sx9 Sx10 Sx11;
    Sx6  Sx7  Sx8  Sx9 Sx10 Sx11 Sx12];
b = [Sy,
    Sxy,
    Sx2y,
    Sx3y,
    Sx4y,
    Sx5y,
    Sx6y ];
Ai = inv(A)
A2 = Ai*b; # коэффициенты полинома

Функция описывающая параметры атмосферы

In [ ]:
function F(X,A2)
      return     A2[1] + A2[2]*X+ A2[3]*X^2+A2[4]*X^3+A2[5]*X^4+A2[6]*X^5+A2[7]*X^6
end
y2 = zeros(length(x),1)
for i = 1:length(x)
   y2[i] = F(x[i],A2)
end

Построение на графике исходных точек:

In [ ]:
plot(x,y,title="Плотность атмосферы (замер)")
Out[0]:

Построение на графике точек посчитанных методом МНК.

In [ ]:
plot(x,y2,title="Плотность атмосферы (интерполяция)")
Out[0]:

Моделирование траектории движения спускаемого аппарата (кусочно)

В рамках данной статьи, предполагается что траектория спускаемого аппарата состоит из трех участков:

  1. Пассивное торможение. Спускаемый аппарат входит в атмосферу планеты и под воздействием динамического трения у него снижается скорость движения. Данный режим длится до тех пор пока скорость не позволит раскрыть парашют.

  2. Пассивное торможение с раскрытым парашютом. Наиболее длинный участок траектории, спускаемый аппарат плавно теряет скорость и высоту.

  3. Активное торможение. Завершающий участок траектории на котором происходит включение тормозного двигателя и торможение.

    Для моделирования движения будет использоваться система дифференциальных уравнений

Дифференциальное уравнение описывающее движение

In [ ]:
function odefcn2(t, x, S, A2, F_torm)
    k = F(x[4],A2)          # коэффициент лобового сопротивления
    m = 10                # масса тела
    dxdt = zeros(4)
    dxdt[1] = -x[1]*k/m*S      # Vx
    dxdt[2] = -9.87 - k/m*x[2]+F_torm/m # Vy
    dxdt[3] = x[1]             # x
    dxdt[4] = x[2]             # y
    return dxdt
end
Out[0]:
odefcn2 (generic function with 1 method)

Функция в которой реализован метод Эйлера

In [ ]:
function euler_step(f, t, x, dt, S,A2,F_torm)
    dx = f(t, x, S, A2,F_torm)
    return x + dt * dx
end
Out[0]:
euler_step (generic function with 1 method)

Расчет точек первого участка траектории

In [ ]:
# Начальные условия
t = 0.0
t_final = 200
dt = 0.05
# в рамках моделирования для решения ДУ время берем с запасом
# лишний массив данных будет отсекаться и сопрряжение с участком активного
# торможения будет проходить по высоте
H_sw1 = 70000; # высота раскрытия парашута
H_sw2 = 50000; # высота начала торможения щитком
h_eps = 100; # погрешность определения высоты
V0 = 11200;
fi = 20/180*pi;
Vx0 = V0*cos(fi); # начальная проекция скорости по Х
Vy0 = -V0*sin(fi); # начальная проекция скорости по Х
X0 = 0;
Y0 = 100000;
S = 3.0  # площадь лобового сопротивления спускаемого аппарата
# начальное состояние (например, все нули)
x = [Vx0, Vy0, X0, Y0]
F_torm = 0
times = []
N = Int((t_final-t)/dt)
VX1 = zeros(N,1)
VY1 = zeros(N,1)
X1 = zeros(N,1)
Y1 = zeros(N,1)
times1 = zeros(N,1)
j = 1
while t <= t_final
   x = euler_step(odefcn2, t, x, dt, S,A2,F_torm)
   VX1[j] = x[1]
   VY1[j] = x[2]
   X1[j] = x[3]
   Y1[j] = x[4]
   times1[j] = t
   j = j+1
   t += dt
end

Расчет ускорений на первом участке траектории

In [ ]:
AX1 = zeros(N,1)
AY1 = zeros(N,1)
alfa = zeros(N,1)
for i = 1:(length(VX1)-1)
    AX1[i] = (VX1[i+1]-VX1[i])/dt;
    AY1[i] = (VY1[i+1]-VY1[i])/dt;
    alfa[i] = atan((Y1[i+1]-Y1[i])/(X1[i+1]-X1[i]));
end

Расчет точки окончания первого участка траектории

In [ ]:
N_sw1 = 0
for i = 1:(length(VX1)-1)
   if (Y1[i]< H_sw1+h_eps) && (Y1[i]> H_sw1-h_eps)
    N_sw1 = i
    break
   end
end
print(N_sw1)
155

Расчет точек второго участка траектории

In [ ]:
Vx0_1 = VX1[N_sw1]; # начальная проекция скорости по Х
Vy0_1 = VY1[N_sw1]; # начальная проекция скорости по Х
X0_1 = X1[N_sw1];
Y0_1 = Y1[N_sw1];
In [ ]:
# начальное состояние 
x = [Vx0_1, Vy0_1, X0_1, Y0_1]
t = 0
S = 100; # площадь  парашютов
N = Int((t_final-t)/dt)
VX2 = zeros(N,1)
VY2 = zeros(N,1)
X2 = zeros(N,1)
Y2 = zeros(N,1)
times2 = zeros(N,1)
F_torm = 0
j = 1 
while t <= t_final
    x = euler_step(odefcn2, t, x, dt, S,A2,F_torm)
    VX2[j] = x[1]
    VY2[j] = x[2]
    X2[j] = x[3]
    Y2[j] = x[4]
    times2[j] = t
    j = j+1
    t += dt
end

Проекции ускорения на втором участке траектории

In [ ]:
AX2 = zeros(N,1)
AY2 = zeros(N,1)
alfa2 = zeros(N,1)
for i = 1:(length(VX2)-1)
    AX2[i] = (VX2[i+1]-VX2[i])/dt;
    AY2[i] = (VY2[i+1]-VY2[i])/dt;
    alfa2[i] = atan((Y2[i+1]-Y2[i])/(X2[i+1]-X2[i]));
end

Расчет точки окончания второго участка траектории

In [ ]:
N_sw2 = 0
for i = 1:(length(VX2)-1)
   if (Y2[i]< H_sw2+h_eps) && (Y2[i]> H_sw2-h_eps)
    N_sw2 = i
    break
   end 
end
print(N_sw2)
102

Расчет точек третьего участка траектории

In [ ]:
Vx0_2 = VX2[N_sw2]; # начальная проекция скорости по Х
Vy0_2 = VY2[N_sw2]; # начальная проекция скорости по Х
X0_2 = X2[N_sw2];
Y0_2 = Y2[N_sw2];
In [ ]:
# начальное состояние 
x = [Vx0_2, Vy0_2, X0_2, Y0_2]
t = 0
S = 100; 
F_torm = 1300
N = Int((t_final-t)/dt)
VX3 = zeros(N,1)
VY3 = zeros(N,1)
X3 = zeros(N,1)
Y3 = zeros(N,1)
times3 = zeros(N,1)
j = 1  
while t <= t_final
    x = euler_step(odefcn2, t, x, dt, S,A2,F_torm)
    VX3[j] = x[1]
    VY3[j] = x[2]
    X3[j] = x[3]
    Y3[j] = x[4]
    times3[j] = t
    j = j+1
    t += dt
end

Расчет проекций ускорения для третьего участка траектории

In [ ]:
AX3 = zeros(N,1)
AY3 = zeros(N,1)
alfa3 = zeros(N,1)
for i = 1:(length(VX3)-1)
    AX3[i] = (VX3[i+1]-VX3[i])/dt;
    AY3[i] = (VY3[i+1]-VY3[i])/dt;
    alfa3[i] = atan((Y3[i+1]-Y3[i])/(X3[i+1]-X3[i]));
end

Точка столкновения с поверхностью

In [ ]:
N_sw3 = 0
for i = 1:(length(VX3)-1)
   if (Y3[i]< 0+h_eps) && (Y3[i]> 0-h_eps)
    N_sw3 = i
    break
   end 
end
print(N_sw3)
401

После того как построены участки траектории, соберем их в один массив

In [ ]:
X_all = vcat(X1[1:N_sw1],X2[1:N_sw2],X3[1:N_sw3])
Y_all = vcat(Y1[1:N_sw1],Y2[1:N_sw2],Y3[1:N_sw3])
L_all = zeros(length(X_all)-1,1)
V_all = zeros(length(X_all)-1,1)
A_all = zeros(length(X_all)-1,1)
VX_all = vcat(VX1[1:N_sw1],VX2[1:N_sw2],VX3[1:N_sw3])
VY_all = vcat(VY1[1:N_sw1],VY2[1:N_sw2],VY3[1:N_sw3])
AX_all = vcat(AX1[1:N_sw1],AX2[1:N_sw2],AX3[1:N_sw3])
AY_all = vcat(AY1[1:N_sw1],AY2[1:N_sw2],AY3[1:N_sw3])
for i = 1:(length(X_all)-1)
    L_all[i] = sqrt(X_all[i]^2+Y_all[i]^2);
    V_all[i] = sqrt(VX_all[i]^2+VY_all[i]^2);
    A_all[i] = sqrt(AX_all[i]^2+AY_all[i]^2);
end

Построение графиков содержащих параметры движения

In [ ]:
plot(X_all,Y_all,title="Координаты спускаемого аппарата")
Out[0]:
In [ ]:
plot(V_all,title="Суммарный вектор скорости спускаемого аппарата")
Out[0]:
In [ ]:
plot(A_all, title="Суммарный вектор ускорения спускаемого аппарата")
Out[0]: