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