Simulate a gravity turn trajectory in 2D.

The goal is to get the vehicle moving horizontally at orbital velocity.

Uses RHSLaunchVehicle2D which has a 'flat' earth. The simulation can handle any number of stages which are set by the arrays d.mSS, d.thrust, d.uE and d.cDA each of which have one element for each stage.

You vary the pitchover angle to get different trajectories. The number in the script gives the vehicle a horizontal trajectory (that begins to drop due to drag) at 53 km. The trajectory is very sensitive to gammaPitchover - on the order of a fraction of a degree.

------------------------------------------------------------------------
See also RHSLaunchVehicle2D, RK4, Plot2D, TimeLabl
------------------------------------------------------------------------

Contents

%-------------------------------------------------------------------------------
%    Copyright (c) 2007 Princeton Satellite Systems, Inc.
%    All Rights Reserved.
%-------------------------------------------------------------------------------

clear d;
dT   = 1;

Control

%--------
gammaPitchover = 10.5*pi/180; % rad
kPitch         = 30;          % steps

Vehicle model

%---------------
% For this demo vehicle, try pitchover of 10.5 degrees at 30 seconds
lv = struct;
lv.mSS          = [ 5000   600  400];  % Dry mass of each stage
lv.mSP          = [30000  8000  20];   % Fuel mass of each stage
lv.thrust       = [600 300 0.5];       % Thrust of each stage (kN)
lv.uE           = [285 285 252]*9.806*1e-3; % Exhaust velocity of each stage (m/s)
lv.mPLD         = 100;
lv.mDot         = lv.thrust ./ lv.uE;
lv.tBurn        = lv.mSP./lv.mDot;
% RHS data
d = LaunchRHSData( 2, lv );
d.cDA          = 0.35*[2 1 1]; % Drag coefficient of each stage times area

Initialization

nSim = floor(sum(lv.tBurn)/dT);

%-----------------------------------------
% [x  h  v  gamma massFuel]
%                x     Downrange distance
%                h     Altitude
%                v     Velocity
%                gamma Flight path angle
%-----------------------------------------
x = [0; 0; 0; pi/2; lv.mSP'];

disp('Initial acceleration should be positive:')
xDot = RHSLaunchVehicle2D( x, 0, d );
disp(xDot(3))

% Store plot points in x
%-----------------------
x = [x zeros(length(x),nSim)];
Initial acceleration should be positive:
       0.00380107726524317

Simulation

%------------
for k = 1:nSim

  % Initiate pitchover
  %-------------------
  if( k == kPitch )
    x(4,k) = pi/2 - gammaPitchover;
    fprintf(1,'\tPitch-over altitude: %f\n',x(2,k));
    fprintf(1,'\tPitch-over velocity: %f\n',x(3,k));
  end

  % Propagate one step
  %-------------------
  x(:,k+1) = RK4( @RHSLaunchVehicle2D, x(:,k), dT, k*dT, d );

  if( x(2,k+1) <= 0 )
    disp('Negative altitude (hit the earth), terminating.')
    break;
  end

end
nSim = k;
x    = x(:,1:(nSim+1));
	Pitch-over altitude: 1.877182
	Pitch-over velocity: 0.139398

Plotting

% Create the time array and label
%--------------------------------
[t, tL] = TimeLabl( (0:nSim)*dT );

% Plot the trajectory
%--------------------
Plot2D( x(1,:), x(2,:), 'X (km)', 'H (km)', 'LV Trajectory');

% Plot the states
%----------------
yL = {'X (km)' 'H (km)' 'V (km/s)' '\gamma (rad)'};
Plot2D( t, x(1:4,:), tL, yL, 'LV States');

% Compute the mass
%-----------------
m = zeros(1,nSim+1);
for k = 1:(nSim+1)
  mF   = x(5:end,k);
  j    = find(mF > 0,1,'first');
  m(k) = sum(mF) + sum(lv.mSS(j:end)) + lv.mPLD;
end

yL = {'LV Mass (kg)'};
for k = 1:length(mF)
  yL = {yL{:} sprintf('Fuel %i (kg)',k)};
end

% Plot the mass
%--------------
Plot2D( t, [m;x(5:end,:)], tL, yL, 'LV Mass');


%--------------------------------------
% PSS internal file version information
%--------------------------------------