Design a propulsion system for a low-earth orbit satellite

We assume a constant orbit for drag purposes. You can add any number of Hohmann transfers and any number of phase changes. You can add other maneuvers to this script.

We assume a blowdown system with helium as the pressurant. The momentum calculations assume a fixed center-of-mass offset. If one thruster overwhelms the RWA capacity it recommends a 4 thruster configuration. In that case you use off-pulsing during maneuvers.

See also OrbMnvrHohmann, OrbMnvrPhaseChange, DVOrbitDrag, RocketMass, BDDesign, Period, Constant, CreateLatexTable, DisplayLatexTable

Contents

%--------------------------------------------------------------------------
%   Copyright (c) 2017 Princeton Satellite Systems, Inc.
%   All rights reserved.
%--------------------------------------------------------------------------
%   Since version 2017.1
%--------------------------------------------------------------------------

Constants

year      = 86400*365.25;
degToRad  = pi/180;
rE        = Constant('equatorial radius earth');
g         = 9.806;
u         = 0.1;    % unit of cubesat - 10 cm == 0.1 m
kmToM     = 1000;
mToCm     = 100;
psiToP    = 6895;

User inputs

% Orbit
h         = 400;        % Altitude (km)
e         = 0.001;      % Eccentricity
inc       = 28.6;       % Inclination (deg)
lifetime  = 1;          % Years

% Spacecraft
massPay   = 5;            % Mass payload (kg)
massFuel  = 2;            % Guess (kg)
cD        = 2;            % Drag cofficient worst case
area      = 3*2;          % Biggest face of 6U Cubesat (u)
dTDrag    = 0.25*year;    % Time between drag makeup maneuvers (sec)
momRWA    = 0.1;          % Momentum storage of RWAs allocate to stationkeeping (Nms)
cMOffset  = 0.1*u;        % Center of mass offset
fTank     = 0.05;         % Structural fraction tanks
% Maneuvers - Phase changes
deltaA    = [pi/32 pi/64];	% Angle of phase change (rad)
kTarget   = [2 2];          % Number of orbits to accomplish the phase change

% Maneuvers - Hohmann transfers
dAHoh     = [10 2 3 34];    % Altitude changes for Hohmann transfers (km)

% Thruster parameters
rhoFuel   = 1000;         % Fuel density (kg/m^3);
minPw     = 0.01;         % Minimum pulsewidth (sec)
thrust    = 0.01;         % Thrust (N)
iSp       = 200;          % Specific impulse (sec)
tFuel     = 300;          % Nominal tank temperature (deg-K)
pInitial  = 350*psiToP;   % Initial tank pressure
pFinal    = 100*psiToP;   % Final tank pressure (P)

Compute the Delta-V Budget

massDry   = massPay + fTank*massFuel;
sMA       = rE + h;
nPer      = lifetime*year/Period(sMA);
el        = [sMA inc*degToRad 0 0 e 0];

% ballistic coefficient: m^2/kg, use average mass
b         = cD*area*u^2/(massDry+0.5*massFuel);

% Drag - call DVOrbitDrag twice to get a plot
DVOrbitDrag( el, [-pi,pi], b );
dVDrag    = DVOrbitDrag( el, [-pi,pi], b )*nPer;
dVDragPM  = dVDrag/(lifetime*year)/dTDrag;

% Phase changes
deltaVPC = zeros(1,length(deltaA));
for k = 1:length(deltaA)
  deltaVPC(k) = OrbMnvrPhaseChange( sMA, deltaA(k), kTarget(k) );
end
dVPhase   = sum(deltaVPC);

% Hohmann Transfers
dVHohmann = 0;
dVHohmannMax = 0;
for k = 1:length(dAHoh)
  deltaVH       = OrbMnvrHohmann( sMA, sMA + dAHoh(k) );
  dVHohmann     = dVHohmann + deltaVH.total;
  dVHohmannMax  = max([dVHohmannMax deltaVH.a deltaVH.b]);
end

dVTotal   = dVDrag + dVPhase + dVHohmann;

massFuel    = RocketMass( iSp, massDry, fTank, dVTotal );
rTank       = (massFuel/rhoFuel/(4*pi/3))^(1/3);
[~, massP]	= BDDesign( massFuel, rhoFuel, tFuel, pInitial, pFinal );

% Find the torque
torque    = thrust*cMOffset;
mass      = massPay + (1+fTank)*massFuel;
accel     = thrust/mass;

dTMax     =  max([dVDragPM  deltaVPC])*kmToM/accel;

deltaMom  = torque*dTMax;

nThrusters = 1;

if( deltaMom > momRWA )
  fprintf(1,'Warning: The change in momentum during a maneuver exceeds the RWA capability.\nWe need to do ACS with thrusters\n');
  nThrusters = 4;
end
Warning: The change in momentum during a maneuver exceeds the RWA capability.
We need to do ACS with thrusters

Format output

Create a latex table. Latex is a word processing language that produces nice technical documentation. CreateLatexTable creates a latex file with this table that can be imported into Latex documents.

k         = 1;
s         = cell(1,2);
s{k,1}    = 'Mass';                               s{k,2} = sprintf('%12.2f (kg)',mass); k = k + 1;
s{k,1}    = 'Mass dry';                           s{k,2} = sprintf('%12.2f (kg)',massDry); k = k + 1;
s{k,1}    = 'Mass fuel';                          s{k,2} = sprintf('%12.2f (kg)',massFuel); k = k + 1;
s{k,1}    = 'Mass pressurant';           	        s{k,2} = sprintf('%12.2e (kg)',massP); k = k + 1;
s{k,1}    = 'Density fuel';                       s{k,2} = sprintf('%12.2f (kg/m^3)',rhoFuel); k = k + 1;
s{k,1}    = 'Tank fraction';                      s{k,2} = sprintf('%12.2f ',fTank); k = k + 1;
s{k,1}    = 'Tank radius';                        s{k,2} = sprintf('%12.2f (cm)',rTank*mToCm); k = k + 1;
s{k,1}    = 'Area';                               s{k,2} = sprintf('%12.1f (u^2)',area); k = k + 1;
s{k,1}    = 'Momentum capacity RWA';              s{k,2} = sprintf('%12.3f (Nms)',momRWA); k = k + 1;
s{k,1}    = 'Semi-major axis';                    s{k,2} = sprintf('%12.1f (km)',sMA); k = k + 1;
s{k,1}    = 'Minimum Pulsewidth';                 s{k,2} = sprintf('%12.4f (s)',minPw); k = k + 1;
s{k,1}    = 'Thrust';                             s{k,2} = sprintf('%12.1e (N)',thrust/nThrusters); k = k + 1;
s{k,1}    = 'I_{sp}';                             s{k,2} = sprintf('%12.1f (s)',iSp); k = k + 1;
s{k,1}    = 'Delta V Drag';                       s{k,2} = sprintf('%12.2f (m/s)',dVDrag*1e3); k = k + 1;
s{k,1}    = 'Delta V Phase Changes';              s{k,2} = sprintf('%12.2f (m/s)',dVPhase*1e3); k = k + 1;
s{k,1}    = 'Delta V Hohmann Transfers';          s{k,2} = sprintf('%12.2f (m/s)',dVHohmann*1e3); k = k + 1;
s{k,1}    = 'Delta V Total';                      s{k,2} = sprintf('%12.2f (m/s)',dVTotal*1e3); k = k + 1;
s{k,1}    = 'Number of thrusters';                s{k,2} = sprintf('%d ', nThrusters); k = k + 1;


DisplayLatexTable(s);
CreateLatexTable(s,'ThrusterDesign');


%--------------------------------------
                     Mass             5.44 (kg) 
                 Mass dry             5.10 (kg) 
                Mass fuel             0.42 (kg) 
          Mass pressurant         6.54e-04 (kg) 
             Density fuel      1000.00 (kg/m^3) 
            Tank fraction                 0.05  
              Tank radius             4.66 (cm) 
                     Area             6.0 (u^2) 
    Momentum capacity RWA           0.100 (Nms) 
          Semi-major axis           6778.1 (km) 
       Minimum Pulsewidth            0.0100 (s) 
                   Thrust           2.5e-03 (N) 
                   I_{sp}             200.0 (s) 
             Delta V Drag           68.37 (m/s) 
    Delta V Phase Changes           59.52 (m/s) 
Delta V Hohmann Transfers           27.64 (m/s) 
            Delta V Total          155.54 (m/s) 
      Number of thrusters                    4