Design a spacecraft for the Solar Gravitational Lens mission
You can change parameters to resize the vehicle. The fuel masses must come from a mission sizing script.
See also BuildCADModel, CreateReport, ExportOBJ
Contents
%-------------------------------------------------------------------------- % Copyright (c) 2015 Princeton Satellite Systems, Inc. % All Rights Reserved. %-------------------------------------------------------------------------- % Since 2016.1 %-------------------------------------------------------------------------- % The launch vehicle shroud is 5080 mm by 6096 + 7665
Vehicle parameters
power = 1.7e6; % W nEngines = 1; % Number of engines at power level specPower = 1; % kW/kg massHe3 = 0.24; % kg massD = 3.600e+03; % kg fS = 0.02; % Structural fraction for tanks, kg/kg fuel tank/fuel fInsulation = 0.05; % Fraction for sizing cyrogenic tank insulation
Script controls
exportCAD = 1;
addLander = 0; % the lander is a subassembly
Mission sizing calculations
% Use the density of the fuels as liquids for tank sizing. % He3: 59 kg/m3 as a liquid or 0.1339 g/L at STP rhoHe3 = 0.1339; % kg/m^3 rhoD = 163.83; % kg/m^3 volD = massD/rhoD; volHe3 = massHe3/rhoHe3; rD = (3*volD/(4*pi))^(1/3); rHe3 = (3*volHe3/(4*pi))^(1/3); qSc.power = power; qSc.specPower = specPower; rDTank = (1+fInsulation)*rD; massDTank = (1+fS)*massD; rHe3Tank = (1+fInsulation)*rHe3; massHe3Tank = (1+fS)*massHe3; % Fusion engine %-------------- rEngine = 0.55; lEngine = (10-2)/(10-1)*power*1e-6 + 1.1; lNozzle = 0.8; eta = 0.58; % engine efficiency for sizing radiators
Spacecraft parameters
lengthCylTrans = 2; radiusCylTrans = 1.5; wPayload = 1; lTruss = [1 0.5 1]; massCylTrans = 200; % arbitrary shell mass xDTank = 0; xLander = xDTank + rDTank + lTruss(1) + wPayload + 0.1; xPayload = xDTank + rDTank + wPayload/2 + lTruss(1); xTruss = [xDTank + rDTank, -rDTank-lTruss(2), -rDTank - lTruss(2) - 2*rHe3Tank - lTruss(3)]; xHe3Tank = xTruss(2) - rHe3Tank; xTrans = xTruss(3) - lengthCylTrans; xAntenna = xPayload; xEngine = xTrans - lEngine; xShell = xTruss(3); rShell = 1.05*rDTank; lShell = xTruss(1) - xTruss(3); % Propellant tubes xD1 = [xDTank;0.5*rD;-0.5*rD]; xD2 = [xTrans;0.5*rD;-0.5*rD]; xHe1 = [xHe3Tank;0.3*rHe3;0.3*rHe3]; xHe2 = [xTrans;0.3*rHe3;0.3*rHe3]; rDT = 0.05; rHeT = 0.05; % Radiator radiatorArealMass = 2.75; tempRadiator = 625; tRadiator = 0.1; lengthTruss = 3; % Solar panels solarEff = 0.3; powerSolar = 2000; areaSolar = (powerSolar/1367)/solarEff; % 1367 is solar flux at Earth's orbit ySolar = 2; % m zSolar = 0.5*areaSolar/ySolar; % m xSolar = 0.01; zStrut = 1; massSolar = powerSolar/150; % https://www.orbitalatk.com/space-systems/space-components/solar-arrays/docs/FS007_15_OA_3862%20UltraFlex.pdf rStrutSolar = [-6;0;radiusCylTrans]; rPanelSolar = [-6-xSolar/2;0;radiusCylTrans+zStrut+zSolar/2]; rBackSolar = [-6+xSolar/2;0;radiusCylTrans+zStrut+zSolar/2];
Mass calculations
engine mass is obtained simply from specific power estimate
massEngine = qSc.power/(1000*qSc.specPower); clear s % Build the CAD model BuildCADModel( 'initialize' ); BuildCADModel( 'set name' , 'SGL' ); BuildCADModel( 'set units', 'mks' ); m = CreateBody( 'make', 'name', 'Core' ); BuildCADModel('add body', m ); BuildCADModel( 'compute paths' ); % D2 tank - includes the fuel mass m = CreateComponent( 'make', 'sphere', 'radius', rDTank, 'n', 20, 'faceColor', 'gold foil','inside',0, ... 'rA', [xDTank;0;0], 'mass', massDTank, 'name', 'D2 Tank', 'body', 1 ); BuildCADModel( 'add component', m ); b = [0 0 1;0 1 0;-1 0 0]; m = CreateComponent('make', 'cylinder', 'rUpper', radiusCylTrans, 'rLower', radiusCylTrans,... 'h', lengthCylTrans, 'n', 20, 'b', b, 'faceColor', 'aluminum',... 'inside',0, 'rA', [xTrans;0;0], 'mass', 0, 'name', 'Engine Enclosure', 'body', 1 ); BuildCADModel( 'add component', m ); % Add the solar panels [vPanel, fPanel] = Box( xSolar, ySolar, zSolar, '+x' ); [vBack, fBack] = Box( xSolar, ySolar, zSolar, '-x' ); [vStrut, fStrut] = SolarWingSupport( ySolar, zStrut, 2*xSolar ); bStrutSolar = [0 0 1;1 0 0;0 1 0]; % + Z m = CreateComponent( 'make', 'generic', 'vertex', vPanel, 'face', fPanel,'rA',rPanelSolar,... 'name', 'Solar Wing +Y Cells', 'body', 1, 'faceColor', [0 0 1],'inside', 0 ); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'generic', 'vertex', vBack, 'face', fBack,'rA',rBackSolar,... 'name', 'Solar Wing +Y Back', 'body', 1, 'faceColor', 'black','inside', 0 ); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'generic', 'vertex', vStrut, 'face', fStrut,'rA',rStrutSolar,'b',bStrutSolar,... 'name', 'Solar Wing +Y Strut', 'body', 1, 'faceColor', 'black','inside', 0 ); BuildCADModel( 'add component', m ); % - Z rPanelSolar(3) = -rPanelSolar(3); rBackSolar(3) = -rBackSolar(3); rStrutSolar(3) = - rStrutSolar(3); bStrutSolar = [0 0 1;1 0 0;0 -1 0]; m = CreateComponent( 'make', 'generic', 'vertex', vPanel, 'face', fPanel,'rA',rPanelSolar,... 'name', 'Solar Wing +Y Cells', 'body', 1, 'faceColor', [0 0 1],'inside', 0 ); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'generic', 'vertex', vBack, 'face', fBack,'rA',rBackSolar,... 'name', 'Solar Wing +Y Back', 'body', 1, 'faceColor', 'black','inside', 0 ); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'generic', 'vertex', vStrut, 'face', fStrut,'rA',rStrutSolar,'b',bStrutSolar,... 'name', 'Solar Wing +Y Strut', 'body', 1, 'faceColor', 'black','inside', 0 ); BuildCADModel( 'add component', m ); % Add He3 Tank m = CreateComponent( 'make', 'sphere', 'radius', rHe3Tank, 'n', 20, ... 'faceColor', 'gold foil','inside',0, 'rA', [xHe3Tank;0;0], 'mass', massHe3Tank, 'name', 'He3 Tank', 'body', 1 ); BuildCADModel( 'add component', m ); % Add shell m = CreateComponent('make', 'cylinder', 'rUpper', rShell, 'rLower', rShell,... 'h', lShell, 'n', 20, 'b', b, 'faceColor', 'mirror',... 'inside',0, 'rA', [xShell;0;0], 'mass', massCylTrans,... 'name', 'Shell', 'body', 1 ); BuildCADModel( 'add component', m ); % Add lines [v, f] = TubeBetweenPoints(xD1,xD2,rDT); m = CreateComponent( 'make', 'generic', 'vertex', v, 'face', f,'rA',[0;0;0],... 'name', 'D2 Line', 'body', 1, 'faceColor', 'gold foil','inside', 1 ); BuildCADModel( 'add component', m ); [v, f] = TubeBetweenPoints(xHe1,xHe2,rHeT); m = CreateComponent( 'make', 'generic', 'vertex', v, 'face', f,'rA',[0;0;0],... 'name', 'He3 Line', 'body', 1, 'faceColor', 'gold foil','inside', 1 ); BuildCADModel( 'add component', m ); % Add Engines %------------ massNozzle = 0.05*massEngine; massEngine = 0.95*massEngine; xNozzle = xEngine - lNozzle; rA = [xEngine;0;0]; name = sprintf('Engine %d',1); m = CreateComponent( 'make', 'cylinder', 'rUpper', rEngine, 'rLower', rEngine,... 'h', lEngine, 'n', 20, 'b', b, ... 'faceColor', 'gold foil','inside',0, 'rA', rA,... 'mass', massEngine, 'name', name, 'body', 1 ); BuildCADModel( 'add component', m ); rA = [xNozzle;0;0]; name = sprintf('Magnetic Nozzle %d',1); m = CreateComponent( 'make', 'cylinder', 'rUpper', 0.5*rEngine, 'rLower', rEngine, 'h', lNozzle, 'n', 20, 'b', b, ... 'faceColor', 'black','inside',0, 'rA', rA, 'mass', massNozzle, 'name', name, 'body', 1 ); BuildCADModel( 'add component', m ); % Add Radiators %-------------- heatRadiatedPerSide = (1-eta)*nEngines*qSc.power/4; % for one radiator side sigma = 5.67e-8; area = heatRadiatedPerSide/(sigma*tempRadiator^4); xWidth = lengthCylTrans; yWidth = area/xWidth; massRadiator = radiatorArealMass*area; q = 1; for k = 1:2 name = sprintf('Radiator %d',k); rA = [xTrans + 0.5*lengthCylTrans;q*(radiusCylTrans+lengthTruss);0]; m = CreateComponent( 'make', 'box', 'x', xWidth, 'y', yWidth, 'z', tRadiator, ... 'faceColor', 'radiator','inside',0, 'rA', rA, 'mass', massRadiator, 'name', name, 'body', 1 ); BuildCADModel( 'add component', m ); q = -q; end % Optical communications system mGimbal = 7.5; massAntenna = 2; massTruss = 10; rhoTruss = 409.7/4.55^2; bA = [0 0 1;0 1 0;-1 0 0]; [v, f, l] = Truss( [0;0;0], [4;0;0], 0.25, 6, 0.025 ); lBase = 2.5 + radiusCylTrans; % DOCS 1 m = CreateComponent( 'make', 'generic', 'vertex', v, 'face', f, 'edgeColor','aluminum', 'rA', [xAntenna;0;lBase],... 'name', 'Optical Truss 1', 'body', 1, 'b',bA, 'mass',massTruss,... 'faceColor', 'gold foil', 'inside', 0); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'cylinder', 'rUpper', 0.1, 'rLower',0.1, 'h', 0.2, 'n',12, 'rA', [xAntenna;0;lBase],... 'name', 'Optical Azimuth Gimbal 1', 'body', 1, 'mass', mGimbal/2, ... 'faceColor', 'gold foil', 'inside', 0); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'cylinder', 'rUpper', 0.15, 'rLower',0.15, 'h', 0.8, 'edgeColor','black','b',b,... 'name', 'DOCS1', 'body', 1, 'faceColor', 'black','inside', 0,'mass',massAntenna,... 'rA',[xAntenna-0.4;0;lBase+0.4] ); BuildCADModel( 'add component', m ); % Add trusses %------------ for k = 1:length(xTruss) xBottom = [xTruss(k);0;0]; xTop = [xTruss(k)+lTruss(k);0;0]; nTruss = 2; [v, f] = Truss( xBottom, xTop, rHe3Tank, nTruss, 0.01*rHe3Tank ); c = cos(pi/4); v = ([1 0 0;0 c c;0 -c c]*v')'; s = sprintf('Central Truss %d',k); m = CreateComponent( 'make', 'generic', 'vertex', v, 'face', f,'edgeColor', 'truss' ,'rA',[0;0;0],... 'name', s, 'body', 1, 'faceColor', [0.8 0.1 0.2],'inside', 1 ); BuildCADModel( 'add component', m ); end % Add payload mPayload = 300; m = CreateComponent( 'make', 'box', 'x', wPayload, 'y', wPayload, 'z', wPayload,'faceColor', 'gold foil','inside',0, ... 'rA', [xPayload;0;0], 'mass', mPayload, 'name', 'Payload', 'body', 1 ); BuildCADModel( 'add component', m );

Create mass budget
Add subsystems
BuildCADModel( 'add subsystem', 'ACS', {'star camera','rwa' 'torquer'} ); BuildCADModel( 'add subsystem', 'Propulsion', {'engine' 'fuel' 'radiator' 'nozzle'} ); BuildCADModel( 'add subsystem', 'Fuel', {'tank','line'} ); BuildCADModel( 'add subsystem', 'Insulation', {'shell'} ); BuildCADModel( 'add subsystem', 'Telemetry and Command',{'optical', 'board','DOCS'} ); BuildCADModel( 'add subsystem', 'Structure', {'support', 'frame', 'strut', 'panel','central'} );
Update the mass properties to produce the tables
BuildCADModel( 'update body mass properties' ); g = BuildCADModel( 'get model'); BuildCADModel('show vehicle'); bySubsystem = true; noZero = true; CreateReport( g, 'tex', FileFullpath('SGLMassSummary'), 'mass', bySubsystem, noZero, true ); CreateReport( g, 'tex', FileFullpath('SGLMass'), 'mass', bySubsystem, noZero, false ); CreateReport( g, 'txt', [], 'mass', bySubsystem, noZero, false ); CreateReport( g, 'txt', [], 'mass', bySubsystem, noZero, true );
Component Mass Units ACS subsystem Propulsion subsystem Engine 1 1615 kg Radiator 1 56.74 kg Radiator 2 56.74 kg Magnetic Nozzle 1 85 kg Propulsion Subsystem Total 1813 kg Fuel subsystem D2 Tank 3672 kg He3 Tank 0.2448 kg Fuel Subsystem Total 3672 kg Insulation subsystem Shell 200 kg Insulation Subsystem Total 200 kg Telemetry and Command subsystem Optical Truss 1 10 kg Optical Azimuth Gimbal 1 3.75 kg DOCS1 2 kg Telemetry and Command Subsystem Total 15.75 kg Structure subsystem Miscellaneous subsystem Payload 300 kg Miscellaneous Subsystem Total 300 kg Total 6001 kg Component Mass Units Propulsion Subsystem Total 1813 kg Fuel Subsystem Total 3672 kg Insulation Subsystem Total 200 kg Telemetry and Command Subsystem Total 15.75 kg Miscellaneous Subsystem Total 300 kg Total 6001 kg


Export
if( exportCAD ) ExportOBJ( g, FileFullpath('SGL') ); end % xParam = {'Radiator Area',2*area,... % '3He Mass',massHe3, % 'Total Payload', %-------------------------------------- % PSS internal file version information %-------------------------------------- % $Id: 0631d01f56862a84279874893cc9f52bec63b99f $