Design a Pluto mission using DFD
Perform a Lambert analysis for trajectories over a number of years, considering the true planetary positions (from the almanac).
------------------------------------------------------------------------ See also Constant, Plot2D, TimeDisplay, Date2JD, Mag, LambertTOF, RocketMass, PlanetPosition ------------------------------------------------------------------------
Contents
%-------------------------------------------------------------------------- % Copyright (c) 2015 Princeton Satellite Systems, Inc. % All Rights Reserved. %-------------------------------------------------------------------------- % Since 2016.1 %-------------------------------------------------------------------------- % Parameters mP = 1000; % payload mass (kg) kWPerKg = 0.71; % specific power tankF = 0.02; % ratio of tank mass to fuel mass eff = 0.5; % Power to thrust conversion efficiency % Specify a delta-V for comparison dVTotal = 65; % km/s fDuration = 0.15; % fraction of duration that is burn time power = 2e3; % kW % Constants muSun = Constant('mu sun'); muPluto = Constant('mu pluto'); rPluto = Constant('equatorial radius pluto'); g = 9.806; % Epoch jD0 = Date2JD([2016 1 1 0 0 0]); PlanetPosition( 'initialize', [3 9] ); h = 600; % orbital altitude at Pluto (km) dVOrbit = sqrt(muPluto/(rPluto+h)); % launch vehicle mass to heliocentric orbit k = 1; lV{k,1} = 8000; lV{k,2} = 'Delta IV Heavy'; k = k + 1; lV{k,1} = 13200; lV{k,2} = 'Falcon 9 Heavy'; k = k + 1; lV{k,1} = 22000; lV{k,2} = 'SLS Block 1'; k = k + 1; lV{k,1} = 46000; lV{k,2} = 'SLS Block 4'; k = k + 1;
Lambert Analysis - varying start date, fixed duration
nYears = 4; nA = 100; nPP = 25; start = linspace(0,nA); nS = length(start); duration = nYears*365.25; % days dVs = zeros(1,nS*nPP); dVMax = zeros(1,nS); dVMin = zeros(1,nS); p = 1; time = zeros(1,nS*nPP); for j = 1:nS dVThis = zeros(1,nPP); for k = 1:nPP days = (k-1)*365/nPP; time(p) = start(j)*365.25+days; jDS = jD0+start(j)*365.25+days; [r0, ~, v] = PlanetPosition( 'update', jDS ); [rI, ~, vI] = PlanetPosition( 'update', jDS+duration ); [vT, a] = LambertTOF( r0(:,1), rI(:,2), duration*86400, 1, muSun ); dV = Mag(vT(:,1) - v(:,1)) + Mag(vT(:,2) - vI(:,2)); dVs(p) = dV + dVOrbit; dVThis(k) = dVs(p); p = p+1; end dVMin(j) = min(dVThis); dVMax(j) = max(dVThis); end Plot2D(time/365,dVs,'Start Date (years)','Delta-V (km/s)',sprintf('Lambert Results - %d Years Duration',nYears)) hold on plot(start,dVMin) plot(start,dVMax)
Compare DFD to fission electric (Vasimr type engine) - Specific Power Plot
Specify a duration of the mission. Specify the amount of the duration that is burn time. Exhaust velocity is driven by the thrust.
tol = 10; specificPower = linspace(0.03,2); nP = length(specificPower); mT = zeros(1,nP); mE = zeros(1,nP); mF = zeros(1,nP); uE = zeros(1,nP); thrust = zeros(1,nP); duration = nYears*365.25*86400; % Calculate thrust needed to achieve delta-V in the specified burn duration; % use the power equation to compute exhaust for k = 1:nP dM = 100; mE(k) = power/specificPower(k); mD = mE(k) + mP; % add payload mass mT(k) = mD; mFOld = 0; while( dM > tol ) % average mass includes 1/2 the fuel mAv = mT(k) - 0.5*mFOld; thrust(k) = mAv*dVTotal*1000/(fDuration*duration); uE(k) = 2*power*1e3*eff/thrust(k); % Power needs to be in W try [mF(k),mT(k)] = RocketMass( uE(k)/g, mD, tankF, dVTotal ); dM = abs(mF(k)-mFOld); accel = thrust(k)/(mT(k) - 0.5*mF(k)); catch mF(k) = 0; mT(k) = 0; thrust(k) = 0; uE(k) = 0; dM = -1; end mFOld = mF(k); end end
Plot
Plot2D(specificPower,[uE/g;thrust],'Specific Power (kW/kg)',{'Isp (s)','Thrust (N)'},'Thrust and Isp') uE_dfd = interp1(specificPower,uE/g,kWPerKg); subplot(2,1,1) hold on plot(kWPerKg,uE_dfd,'*'); subplot(2,1,2) hold on thrust_dfd = interp1(specificPower,thrust,kWPerKg); plot(kWPerKg,thrust_dfd,'*'); titlestr = sprintf('Mass for %d Year Mission/ %d km/s Delta-V/ 2 MW Power Plant',nYears,dVTotal); [~,hA] = Plot2D(specificPower,[mT;mF;mE],'Specific Power (kW/kg)','Mass (kg)',titlestr,'ylog'); xLim = get(gca,'xlim'); yLim = get(gca,'ylim'); % launch vehicle for k = 1:4 line(xLim, [lV{k,1},lV{k,1}],yLim,'color',[0 0.9 0.9]); text(0.8*xLim(2),0.85*lV{k,1},lV{k,2},'fontsize',12); end line(kWPerKg*[1 1], yLim,'color',[0 0.8 0]); text(1.03*kWPerKg, 1.5*yLim(1),'DFD','fontsize',12); line([0.06 0.06],yLim,'color',[0 0.8 0]); text(0.07,1.5*yLim(1),'Fission','fontsize',12); set(gca,'fontsize',11) legend(hA.h,{'Total','Fuel','Engine'})
DV and duration analysis
DFD, Nuclear Electric, Nuclear Thermal, Chemical
k = 1; tech{k} = 'Chemical'; uETech(k) = 462*g; k = k + 1; tech{k} = 'Nuclear Thermal'; uETech(k) = 900*g; k = k + 1; tech{k} = 'DFD'; uETech(k) = 100e3; k = k + 1; tech{k} = 'Nuclear Electric Hall'; uETech(k) = 20e3; k = k + 1; tech{k} = 'Nuclear Electric VASIMR'; uETech(k) = 49e3; [r0, ~, v] = PlanetPosition( 'update', jD0 ); % Delta-V analysis considering location of Pluto disp('Run loop over start dates and mission duration...') years = linspace(1,30,200); nY = length(years); start = linspace(0,20*365,600); nS = length(start); dVTotal = zeros(1,nY); TimeDisplay( 'initialize', 'Pluto Lambert Loop', nY ); for k = nY:-1:1 dVJ = zeros(1,nS); for j = 1:nS jDS = jD0+start(j); [r0, ~, v] = PlanetPosition( 'update', jDS ); duration = years(k)*365.25; % days [rI, ~, vI] = PlanetPosition( 'update', jDS+duration ); [vT, a] = LambertTOF( r0(:,1), rI(:,2), duration*86400, 1, muSun ); dV = Mag(vT(:,1) - v(:,1)) + Mag(vT(:,2) - vI(:,2)); dVJ(j) = dV + dVOrbit; end dVTotal(k) = min(dVJ); TimeDisplay('update'); end TimeDisplay('close'); disp('Done.')
Plot
figure('Name','Theoretical Maximum Delta-V') plot(years,dVTotal) grid on xlabel('Pluto Transfer Time (yrs)','fontsize',12); ylabel('Lambert \Delta V (km/s)','fontsize',12); title('Theoretical Maximum Delta-V','fontsize',14,'fontweight','bold'); maxDV = uETech*log((1+tankF)/tankF)/1000; hold on; for k = 1:length(uETech) str = sprintf('%s\n Isp: %.0f s',tech{k},uETech(k)/g); j = find(dVTotal < maxDV(k),1); if ~isempty(j) line([years(j);years(j)],[0,dVTotal(j)+2],'color',[1 0 0]); text(years(j),4+dVTotal(j),str,'fontsize',12); p(k) = plot(years(j),2+dVTotal(j),'.'); end end set(gca,'fontsize',11) %--------------------------------------
Run loop over start dates and mission duration... Done.