Pluto mission delta-Vs using DFD, Lambert solutions
Use Lambert to calculate the delta-V to Pluto over a range of transit times, from 2 to 10 years. Estimate the total mission mass using specific power to scale the spacecraft, plus allowing for a given tank fraction, thrust efficiency, and a payload of 1000 kg.
See also Constant, SaveStructure, Plot2D, Plot3D, Date2JD, RK4, Mag, LambertTOF, VEscape, RocketMass, FOrbCart, RV2El, PlanetPosition
Contents
%-------------------------------------------------------------------------- % Copyright (c) 2015 Princeton Satellite Systems, Inc. % All Rights Reserved. %-------------------------------------------------------------------------- % Since version 2016.1 %--------------------------------------------------------------------------
Script parameters
These are the parameters that define the mission analysis. For simplicity we must assume a fixed thrust and Isp throughout the mission. The engine mass will be calculated solely based on the specific power.
% Payload mass (kg) mPLD = 1000; % Assume a specific power kWPerKg = 1.2; % Total engine power power = 2e6; % W % Tank structural fraction tankF = 0.02; % Engine thrust thrust = 20; % N % Engine efficiency eff = 0.5; % orbital altitude at Pluto (km) h = 600; % Epoch jD0 = Date2JD([2028 7 2 0 0 0]); % Fusion fuel computations He3_STP = 0.1339; rho3He = 59; % density of liquid 3He, kg/m3 amu3He = 1.6605e-27*3.016; % mass of 3He atom, kg ePerReaction = 18.3; % MeV, energy per D-3He reaction eJPerReaction = ePerReaction*1e6*1.602e-19; % J per reaction
Lambert analysis
Perform an analysis of the transfer to Pluto for an array of mission durations.
% Constants muSun = Constant('mu sun'); muPluto = Constant('mu pluto'); rPluto = Constant('equatorial radius pluto'); aU = Constant('au'); % Mass of the engine, using specific power massDFD = power/kWPerKg/1000; % Exhaust velocity - will be fixed uE = 2*power*eff/thrust; PlanetPosition( 'initialize', [3 9] ); [r0, ~, v] = PlanetPosition( 'update', jD0 ); dVOrbit = VEscape(rPluto+h,muPluto) - sqrt(muPluto/(rPluto+h)); years = linspace(2,10); n = length(years); dV = zeros(1,n); mF = zeros(1,n); mT = zeros(1,n); tAccel = zeros(1,n); hE3 = zeros(1,n); for k = 1:n duration = years(k)*365.25; [rI, ~, vI] = PlanetPosition( 'update', jD0+duration ); vT = LambertTOF( r0(:,1), rI(:,2), duration*86400, 1, muSun ); dV(k) = Mag(vT(:,1) - v(:,1)) + Mag(vT(:,2) - vI(:,2)); dVTotal = dV(k) + dVOrbit; [mF(k),mT(k)] = RocketMass( uE/9.806, mPLD+massDFD, tankF, dVTotal ); accel = thrust/(mT(k) - 0.5*mF(k)); tAccel(k) = dV(k)*1000/accel/86400; % if available, see He3MassFromPower if exist('He3MassFromPower','file') [~,~,vol] = He3MassFromPower( power*tAccel(k)*86400 ); hE3(k) = vol(1); else energy = power*tAccel(k)*86400; mass3He = amu3He*energy/eJPerReaction; hE3(k) = mass3He*1e3/He3_STP; end if tAccel(k)>duration tAccel(k) = 0; dV(k) = 0; mF(k) = 0; mT(k) = 0; hE3(k) = 0; end end yL = {'Total \Delta V (km/s)' 'Total Mass (kg)' 'Accel Time (days)' '^3He (L STP)'}; titleStr = sprintf('Pluto Mission - %d MW DFD %d N Thrust',round(power/1e6),round(thrust)); Plot2D(years,[dV;mT;tAccel;hE3],'Duration (Years)', yL,titleStr) subplot(4,1,2) hold on yy = axis; plot(yy(1:2),9306*[1 1])
Plot the mission
yearsMission = 4; % selected from prior plot duration = yearsMission*365.25; [rI, ~, vI] = PlanetPosition( 'update', jD0+duration ); [vT, a] = LambertTOF( r0(:,1), rI(:,2), duration*86400, 1, muSun ); dV = Mag(vT(:,1) - v(:,1)) + Mag(vT(:,2) - vI(:,2)); dVTotal = dV + dVOrbit; [massFuelPluto, massTotalPluto] = RocketMass( uE/9.806, mPLD+massDFD, tankF, dVTotal ); accel = thrust/(massTotalPluto - 0.5*massFuelPluto); % Calculate the 3He mass for the mission. See also He3MassFromPower in the % FusionPropulsion module, if available. tAccel = dV*1000/accel/86400; energy3He = 18.3*1.6e-19*1e6; % J per D-3He reaction energyTotal = power*tAccel*86400; % accel time only mHe3 = 5.0082e-27; % kg massHe3 = mHe3*energyTotal/energy3He; % Perform a point-mass heliocentric simulation n = 1000; rE = zeros(3,n); rP = zeros(3,n); vM = zeros(1,n); day = jD0 + linspace(0,duration,n); x = [r0(:,1);vT(:,1)]; % Note the 25% increase in velocity rT = zeros(3,n); el = RV2El(x(1:3),x(4:6),muSun); dT = (day(2)-day(1))*86400; % sec for k = 1:n r = PlanetPosition('update',day(k)); rE(:,k) = r(:,1); rP(:,k) = r(:,2); rT(:,k) = x(1:3); vM(1,k) = Mag(x(4:6)); x = RK4(@FOrbCart,x,dT,0,[0;0;0],muSun); end % Plot the trajectory with the planet orbits rE = rE/aU; rP = rP/aU; rT = rT/aU; Plot3D( rE, 'x (aU)', 'y (aU)', 'z (aU)', 'Pluto Trajectory' ) hold on plot3(rP(1,:),rP(2,:),rP(3,:)); plot3(rT(1,:),rT(2,:),rT(3,:)); % Add year labels year = (day - jD0)/365.25; j = ceil(linspace(1,n,5)); for k = 2:5 i = j(k); text(rT(1,i), rT(2,i), rT(3,i),sprintf('- Year %d',floor(year(i)))); end % Plot the velocity magnitude Plot2D(year,vM,'Year','Velocity (km/s)','Velocity') % Store mission data q = struct; q.massHe3 = massHe3; q.massFuel = massFuelPluto; q.massDFD = massDFD; q.massPld = mPLD; q.power = power; q.specPower = kWPerKg; thisP = fileparts(mfilename('fullpath')); SaveStructure(q,fullfile(thisP,'PlutoSpacecraftData')); %--------------------------------------