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. Creates PlutoSpacecraftData.mat which is used by the CAD model for sizing the fuel and power systems.

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'));


%--------------------------------------

% $Id: 5ea6683046bbd766bc08cabbb746138a730b93d8 $