헤일로 궤도(halo orbit)는 라그랑지 포인트 L1, L2, L3 포인트를 중심으로 형성되는 3차원 주기궤도(periodic orbit)이다.
앞서 살펴본 주기궤도의 조건 (https://pasus.tistory.com/277)에 따라 헤일로 궤도는 (x-z) 평면에 대해 대칭이고, (x-z) 평면을 직각으로 통과한다. 따라서 시간
헤일로 궤도를 구하기 위해서는 반주기(
헤일로 궤도는 선형화 운동 방정식에서는 존재하는 않는 비선형적인 궤도다. 선형 방정식의 해는 다음과 같았다 (https://pasus.tistory.com/273).
여기서 진폭을 충분히 키워서 선형화 범위를 넘어서게 한다면 비선형 효과로 인하여
따라서 전통적으로 헤일로 궤도를 계산할 때는
논문
"Halo Orbit Formulation for the ISEE-3 Mission, David L. Richardson, J. of Guidance and Control, 1980"
보고서
"Periodic and Quasi Periodic Halo Orbits in the Earth-Sun/Earth-Moon Systems, David L. Richardson, FDSS Contract #NNG10CP02C, Advanced Mission Design, 2010"
을 참고하면 된다.
리야프노프 궤도와 달리 헤일로 궤도는 초기조건에 대한 추측값(initial guess)을 얻기 위해서 선형화 방정식 대신에 Richardson이 논문에서 제안한 3차 근사식을 적용한다. 헤일로 궤도의 계산 절차는 다음과 같다.
1. Richardson의 3차 근사식을 이용하여 초기조건의 추측값을 계산한다.
2. 초기조건의 추측값을 이용하여 CR3BP의 무차원 비선형 운동방정식을
여기서
이다. CR3BP 비선형 운동방정식의 매트랩 코드는 다음과 같다.
function X_dot = cr3bp_ode_3d(t, X, mu)
% CR3BP nonlinear differential equation 3D version
% input:
% t
% X: [x, y, z, vx, vy, vz]
% mu
% output:
% X_dot
%
% coded by st.watermelon
X_dot = zeros(6,1);
% unpack
x = X(1);
y = X(2);
z = X(3);
vx = X(4);
vy = X(5);
vz = X(6);
% paramter computation
r1 = sqrt((x+mu)^2 + y^2 + z^2);
r2 = sqrt((x+mu-1)^2 + y^2 + z^2);
% X_dot computation
X_dot(1) = vx;
X_dot(2) = vy;
X_dot(3) = vz;
X_dot(4) = 2*vy + x - (1-mu)*(x+mu)/r1^3 - mu*(x+mu-1)/r2^3;
X_dot(5) = -2*vx + y - (1-mu)*y/r1^3 - mu*y/r2^3;
X_dot(6) = -(1-mu)*z/r1^3 - mu*z/r2^3;
3. 시간
여기서
이며, 각 성분은 다음과 같이 계산된다.
식 (5)의 미분방정식을 시간
이에 대한 해당하는 매트랩 코드는 다음과 같다.
function Phi_dot = state_trans_ode_3d(t, Phi, mu)
%
% CR3BP state transition matrix differential equation 3D version
% input:
% t
% Phi: 36x1 for state transition matrix
% 6x1 for cr3bp state
% mu
% output
% Phi_dot: 36x1 for state transition matrix dot
% 6x1 for cr3bp state
%
% coded by st.watermelon
Phi_dot = zeros(42,1);
% unpack
x = Phi(37);
y = Phi(38);
z = Phi(39);
vx = Phi(40);
vy = Phi(41);
vz = Phi(42);
% parameter computation
r1 = sqrt((x+mu)^2 + y^2 + z^2);
r2 = sqrt((x+mu-1)^2 + y^2 + z^2);
Uxx = -1 - 3*(1-mu)*(x+mu)^2/r1^5 - 3*mu*(x+mu-1)^2/r2^5 + (1-mu)/r1^3 + mu/r2^3;
Uyy = -1 - 3*(1-mu)*y^2/r1^5 - 3*mu*y^2/r2^5 + (1-mu)/r1^3 + mu/r2^3;
Uxy = -3*(1-mu)*(x+mu)*y/r1^5 - 3*mu*(x+mu-1)*y/r2^5;
Uzz = -3*(1-mu)*z^2/r1^5 - 3*mu*z^2/r2^5 + (1-mu)/r1^3 + mu/r2^3;
Uxz = -3*(1-mu)*(x+mu)*z/r1^5 - 3*mu*(x+mu-1)*z/r2^5;
Uyz = -3*(1-mu)*y*z/r1^5 - 3*mu*y*z/r2^5;
% Phi_dot computation
A = [0 0 0 1 0 0;
0 0 0 0 1 0;
0 0 0 0 0 1;
-Uxx -Uxy -Uxz 0 2 0;
-Uxy -Uyy -Uyz -2 0 0;
-Uxz -Uyz -Uzz 0 0 0];
PHI = reshape(Phi(1:36),6,6);
PHI_dot = A * PHI;
Phi_dot(1:36) = reshape(PHI_dot,36,1);
Phi_dot(37) = vx;
Phi_dot(38) = vy;
Phi_dot(39) = vz;
Phi_dot(40) = 2*vy + x - (1-mu)*(x+mu)/r1^3 - mu*(x+mu-1)/r2^3;
Phi_dot(41) = -2*vx + y - (1-mu)*y/r1^3 - mu*y/r2^3;
Phi_dot(42) = -(1-mu)*z/r1^3 - mu*z/r2^3;
4. 초기 z축 위치
여기서
식 (9)에서
다시 2번항으로 돌아가서 시간
여기서
function [X0, t1, flag] = dp_cr3bp_3d(X0_guess, mu)
%
% Differential correction for CR3BP 3D version
% input:
% X0_guess: initial guess from linear dynamics
% = [x0 0 z0 0 vy0 0]'
% mu
% output
% X0: corrected initial condition
% t1: corrected half period (T/2)
%
% coded by st.watermelon
% setup
max_iter = 100; % maximum DC iteration
absTol = 1e-15;
relTol = 3e-14;
X0 = X0_guess;
for iter = 1: max_iter
fprintf("iter %2d \n", iter)
% compute t1 and x, z, vx, vy, vz and state transition matrix at y=0
tspan = [0 10];
Phi0(1:36) = reshape(eye(6),36,1);
Phi0(37:42) = X0;
opt = odeset('RelTol',relTol,'AbsTol',absTol,'Events',@events);
[t, Phi, t1, Phi_t1, ie] = ode113(@(t,Phi) state_trans_ode_3d(t,Phi,mu), tspan, Phi0, opt);
t1 = t1(end);
Phi_t1 = Phi_t1(end,:);
PHI_t1 = reshape(Phi_t1(1:36), 6,6);
x1 = Phi_t1(37);
y1 = Phi_t1(38);
z1 = Phi_t1(39);
vx1 = Phi_t1(40);
vy1 = Phi_t1(41);
vz1 = Phi_t1(42);
r1 = sqrt((x1+mu)^2 + y1^2 + z1^2);
r2 = sqrt((x1+mu-1)^2 + y1^2 + z1^2);
vxdot1 = 2*vy1 + x1 - (1-mu)*(x1+mu)/r1^3 - mu*(x1+mu-1)/r2^3;
vzdot1 = -(1-mu)*z1/r1^3 - mu*z1/r2^3;
if (abs(vx1) <= 1e-11) && (abs(vz1) <= 1e-11)
break;
end
% update initial condition x0 and vy0
PP = [PHI_t1(2,1) PHI_t1(2,5) vy1;
PHI_t1(4,1) PHI_t1(4,5) vxdot1;
PHI_t1(6,1) PHI_t1(6,5) vzdot1 ];
deltv = PP\[0; -vx1; -vz1];
% learning rate
eta = 1-0.9^iter;
X0(1,1) = X0(1,1) + eta*deltv(1);
X0(5,1) = X0(5,1) + eta*deltv(2);
end
if iter == max_iter
flag = 1;
else
flag = 0;
end
end % end of function
function [value,isterminal,direction] = events(t,Phi)
%
value = Phi(38); % event y=0
isterminal = 1; % stop integration
direction = -1; % negative direction
end
다음 그림은




다음 그림은


다음 그림은 지구-달 시스템의 L1 과 L2 포인트 헤일로 궤도들의 집합을 함께 그린 것이다.

'항공우주 > 우주역학' 카테고리의 다른 글
고전 궤도요소 (Classical Orbital Elements) (0) | 2023.07.24 |
---|---|
[CR3BP] 주기궤도의 안정성 (0) | 2023.07.22 |
[CR3BP] 리야프노프 궤도 (Lyapunov Orbit) 계산 (0) | 2023.07.11 |
[CR3BP] 주기궤도 (Periodic Orbit)의 조건 (0) | 2023.07.04 |
미분보정 (Differential Correction) (0) | 2023.07.03 |
댓글