Generate Pluto lander model
Generate a CAD model of a Pluto lander. Creates power and mass reports of the model and exports it to OBJ. Saves the model in PlutoLander.mat which is used by other demos. The model may be generated with the solar arrays stowed or deployed.
See also BuildCADModel, CreateBody, CreateComponent, CreateReport, ExportOBJ, ThrusterCAD, PanelFrame, StarCameraBasicModel, Constant, SaveStructure, ShapedStrut, Q2Mat, U2Q, Unit, LandingLegsCAD
Contents
%-------------------------------------------------------------------------- % Copyright (c) 2014 Princeton Satellite Systems, Inc. % All rights reserved. %-------------------------------------------------------------------------- % Since 2016.1 %-------------------------------------------------------------------------- % Multibody switch multiBody = false; arraysStowed = true;
Constants
rhoCarbonFiber = 1600; rhoAluminum = 2700; rhoGlass = 2400; rhoSteel = 8000; rhoTungsten = 15630; inToM = 0.0254; rhoSolarPanel = 63/(8.3*2.3); % Dawn spacecraft areal mass (kg/m2) lToM3 = 0.001; % Liters to cubic meters
Mission information
massFuel = 80; massTotal = 150+massFuel; aRatio = 1.5; gPluto = 0.62; thrust = aRatio*gPluto*massTotal;
Spacecraft hardware parameters
% Thrusters densityADN = 1.1679e+03; % ADN green fuel massTank = massFuel*[1 1]/2; nTanks = length(massTank); volTank = massTank./densityADN; scale = 27.8*0.0254/168; dT = 11.8*0.0254; massThruster = 10.8/2.205; [vT, fT] = ThrusterCAD( [0;0;-1], dT, scale*99, 20, 15*scale, 44*scale, 5*scale ); rThruster = [0;0;0.2]; % Inertia inertia = [1.1565 -0.0074 0.0561;... -0.0074 1.0380 0.02281;... 0.0561 0.0228 0.7354]; % Fuel tank fTank = 49/656; rTank = (volTank/(4*pi/3)).^(1/3); % Bus zBox = 2.4*max(rTank); xBox = 4.8*max(rTank); yBox = xBox; panelThickness = 0.004; xTank = 0.8*max(rTank)*1.3; rATank = [xTank*[1 -1;1 -1];zBox*[1 1]/2]; % Star camera cameraAperture = 12.5; cameraFocalLength = 25.0; cameraLengthSunShade = 35.0; cameraApertureSunShade = 25.0; massCamera = 0.25; rCamera = 0.4*[xBox -xBox;-yBox yBox;zBox zBox]; uC = [0;0;1]; v1 = Unit([1;-1;-1]); v2 = Unit([-1;1;-1]); b1 = Q2Mat(U2Q(uC,v1)); b2 = Q2Mat(U2Q(uC,v2)); bCamera = {b1 b2}; % Omni antennas powerOmni = 2; xOmni = [xBox xBox; yBox -yBox; 0 0]/2; rOmni = 0.002; c = Constant('speed of light')*1000; % m/s fComm = 2e9; % sband lOmni = 0.5*c/fComm; massOmni = lOmni*pi*rOmni^2*rhoAluminum; bOmni = {[1 0 0;0 0 1;0 -1 0] [1 0 0;0 0 -1;0 1 0]}; % IMU LN-200S radiusIMU = 0.0889/2; hIMU = 0.0851; massIMU = 0.748; dIMU.manufacturer = 'Northrop Grumman'; dIMU.name = 'LN-200S'; powerIMU = 12; % Sun Sensors massSunSensor = 0.035; xSunSensor = 0.06; ySunSensor = 0.03; zSunSensor = 0.012; bSunSensor = [1 -1 2 -2 3 -3]; powerSunSensor = 0.6; % Processing boards - 3U CompactPCI boards nBoards = 5; powerBoard = 12; xChassis = 0.16 + 0.02; yChassis = 0.1 + 0.02; zChassis = 0.02*nBoards + 0.02; massChassis = 1; % Solar arrays massSAD = 0.2; solarPanelThickness = 0.004; strutLength = yBox/3; nPanels = 2; panelLength = 1; panelWidth = 2; massSolarPanel = panelLength*panelWidth*rhoSolarPanel; solarPanelEff = 0.295; zSolarWing = zBox/2; arrayMassFront = 0.5*solarPanelThickness*panelLength*panelWidth*nPanels*rhoGlass; arrayMassBack = 0.5*solarPanelThickness*panelLength*panelWidth*nPanels*rhoCarbonFiber; massStrut = 0.1; yPanel = 0.03; bX = [ 1 0 0;0 0 -1;0 1 0]'; bY = [-1 0 0;0 1 0;0 0 -1]; % Battery power = 0.8*2*1000; powerNight = 5; massBattery = powerNight*24*15/135; % Saft batteries volBattery = powerNight*24*15/250; wBattery = (2*volBattery*lToM3)^(1/3); % One length is half the others
Initialize BuildCADModel and create the Core body
BuildCADModel( 'initialize' ); BuildCADModel( 'set name' , 'PlutoLander' ); BuildCADModel( 'set units', 'mks' ); % Core m = CreateBody('make','name','Core'); BuildCADModel('add body', m ); if( multiBody ) rHinge = [0;0;strutLength]; else rHinge = [0;0;0]; end m = CreateBody('make','name','SolarWing','rHinge',rHinge,'previousBody',1); BuildCADModel('add body', m ); if( ~multiBody ) zPanel = zBox+panelWidth/2; zStrut = zBox; end % This creates the connections between the bodies BuildCADModel( 'compute paths' );

Components
if arraysStowed % Stow the arrays with a portion of a panel showing tStowed = 0.1; m = CreateComponent( 'make', 'box', 'x',xBox, 'y',yBox, 'z',tStowed,... 'faceColor', 'aluminum', 'rA', [0;0;zBox+tStowed/2], 'mass', 2*massSolarPanel+massStrut,... 'name','Solar Arrays Stowed', 'body', 2,... 'inside', 0, 'power', 0 ); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'box', 'x',xBox, 'y',yBox, 'z',solarPanelThickness,... 'faceColor', 'solar cell', 'rA', [0;0;zBox+tStowed], 'mass', 0,... 'name','Solar Array Face', 'body', 2,... 'inside', 0, 'power', -250 ); BuildCADModel( 'add component', m ); else % Solar Array 1 m = CreateComponent( 'make', 'box', 'x',panelWidth, 'y',nPanels*panelLength, 'z',solarPanelThickness,... 'faceColor', 'solar cell', 'rA', [0;yPanel+panelLength;zPanel], 'mass', massSolarPanel,... 'name','Solar Array +Y', 'body', 2,... 'inside', 0, 'power', -power/2 ); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'box', 'x',panelWidth, 'y',nPanels*panelLength, 'z',solarPanelThickness,... 'faceColor', [0 0 0], 'rA', [0;yPanel+panelLength;zPanel-solarPanelThickness], 'mass', 0,... 'name','Solar Array +Y back', 'body', 2,... 'inside', 0, 'power', 0 ); BuildCADModel( 'add component', m ); % Solar Array 2 m = CreateComponent( 'make', 'box', 'x',panelWidth, 'y',nPanels*panelLength, 'z',solarPanelThickness,... 'faceColor', 'solar cell', 'rA', [0;-yPanel-panelLength;zPanel], 'mass', massSolarPanel,... 'name','Solar Array -Y', 'body', 2,... 'inside', 0, 'power', -power/2 ); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'box', 'x',panelWidth, 'y',nPanels*panelLength, 'z',solarPanelThickness,... 'faceColor', [0 0 0], 'rA', [0;-yPanel-panelLength;zPanel-solarPanelThickness], 'mass', 0,... 'name','Solar Array -Y back', 'body', 2,... 'inside', 0, 'power', 0 ); BuildCADModel( 'add component', m ); % Vertical strut m = CreateComponent( 'make', 'cylinder', 'rUpper', 0.01, 'rLower', 0.01, 'h', panelWidth/2, 'n', 24, 'rA',[0;0;zStrut],... 'name', 'Motor', 'body', 1, 'mass', massStrut,'power',0, ... 'faceColor', [0 0 0], 'inside', 1); BuildCADModel( 'add component', m ); end

Bus Frame
[v, f] = PanelFrame( xBox, yBox, panelThickness, panelThickness ); massFrame = 2*(xBox + yBox)*panelThickness^2*rhoCarbonFiber; m = CreateComponent( 'make', 'generic', 'vertex', v, 'face', f,... 'faceColor', 'gold foil','rA', [0;0;zBox-2*panelThickness],... 'mass', massFrame, 'name', 'Top Frame', 'body', 1, 'inside', 0 ); BuildCADModel( 'add component', m ); v = ([1 0 0; 0 1 0; 0 0 -1]*v')'; m = CreateComponent( 'make', 'generic', 'vertex', v, 'face', f,... 'faceColor', 'gold foil','rA', [0;0;2*panelThickness],... 'mass', massFrame, 'name', 'Bottom Frame', 'body', 1, 'inside', 0 ); BuildCADModel( 'add component', m ); z1 = 2*panelThickness; z2 = z1 + zBox-2*panelThickness; c = []; c.x = [ -0.250 0 0 0.250 0.250 0 0 -0.250]*inToM; c.y = [ 0.375 0.375 0.125 0.125 -0.375 -0.375 -0.125 -0.125]*inToM; [v, f] = ShapedStrut( [0;0;z1], [0;0;z2], c ); angle = 0; sX = [1 1 -1 -1]; sY = [1 -1 -1 1]; massStrut = panelThickness^2*zBox*rhoCarbonFiber; for k = 1:4 angle = angle + pi/2; xF = sX(k)*(xBox/2 - panelThickness/2); yF = sY(k)*(yBox/2 - panelThickness/2); b = [cos(angle) sin(angle) 0;-sin(angle) cos(angle) 0;0 0 1]; vR = (b*v')'; m = CreateComponent( 'make', 'generic', 'vertex', vR, 'face', f,... 'faceColor', 'gold foil','rA', [xF;yF;0], ... 'mass', massStrut, 'name', ['z strut' num2str(k)], 'body', 1,... 'inside',0 ); BuildCADModel( 'add component', m ); end

Panels
panelName = {'+X' '-X' '+Y' '-Y' '+Z' '-Z'}; color = {'gold foil' 'gold foil' 'gold foil' 'gold foil' 'gold foil' 'radiator'}; xLoc = (xBox - panelThickness)/2; yLoc = (yBox - panelThickness)/2; zLoc = (zBox - panelThickness)/2; wX = xBox - 2*panelThickness; wY = yBox - 2*panelThickness; wZ = zBox - 2*panelThickness; th = panelThickness; zH = zBox/2; rAP = [ xLoc -xLoc 0 0 0 0 ;... 0 0 yLoc -yLoc 0 0;... zH zH zH zH zBox 0]; dP = [ th th wX wX wX wX ;... wY wY th th wY wY;... wZ wZ wZ wZ th th]; for k = 1:6 massPanel = dP(1,k)*dP(2,k)*dP(3,k)*rhoCarbonFiber; m = CreateComponent( 'make', 'box', 'x', dP(1,k), 'y',dP(2,k), 'z',dP(3,k),... 'faceColor', color{k}, 'rA', rAP(:,k), 'mass', massPanel,... 'name', ['Panel ' panelName{k}], 'body', 1,... 'inside', 0 ); BuildCADModel( 'add component', m ); end % Landing legs rL = 35; [v, f] = LandingLegsCAD('scale',0.012,'xy spacing',rL); m = CreateComponent( 'make', 'generic', 'v',v,'f',f,... 'faceColor', [1 0.84 0] ,'rA', [0;0;0],... 'name', 'Landing Legs','inside',0); BuildCADModel( 'add component', m ); % Battery rB = 0.5*([0;yBox;0] + [-2*panelThickness;-wBattery-2*panelThickness;wBattery/2]); m = CreateComponent( 'make', 'box','x', wBattery, 'y', wBattery, 'z', wBattery/2,... 'faceColor', [0 1 0] ,'rA', rB,'mass',massBattery,... 'name', 'Battery 1','inside',1); BuildCADModel( 'add component', m ); % Omni antennas for k = 1:2 m = CreateComponent( 'make', 'cylinder', 'rUpper', rOmni, 'rLower', rOmni, 'h', lOmni, 'n', 24, 'rA',xOmni(:,k),'b',bOmni{k},... 'name', sprintf('Omni %d',k), 'body', 1, 'mass', massOmni,'power',powerOmni, ... 'faceColor', [0 0 0], 'inside', 1); BuildCADModel( 'add component', m ); end % Fuel tanks - wet for k = 1:nTanks m = CreateComponent( 'make', 'sphere','radius', rTank(k),'n',20,... 'faceColor', [0 1 0] ,'rA', rATank(:,k),'mass',(1+fTank)*massFuel/nTanks,... 'name', sprintf('HPGP Tank %d',k),'inside',1); BuildCADModel( 'add component', m ); end % Star cameras [v, f] = StarCameraBasicModel( cameraAperture, cameraFocalLength, cameraApertureSunShade, cameraLengthSunShade ); m = CreateComponent( 'make', 'generic', 'v', v, 'f', f, 'b', bCamera{1},... 'rA', rCamera(:,1), 'name', 'Star Camera 1', 'body', 1, 'mass', massCamera ); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'generic', 'v', v, 'f', f, 'b', bCamera{2},... 'rA', rCamera(:,2), 'name', 'Star Camera 2', 'body', 1, 'mass', massCamera ); BuildCADModel( 'add component', m ); % IMU rIMU = [ xBox/2-radiusIMU-4*panelThickness;... yBox/2-radiusIMU-4*panelThickness;... panelThickness]; m = CreateComponent( 'make', 'cylinder', 'rUpper', radiusIMU, 'rLower',radiusIMU,'h',hIMU,... 'inside', 1,'deviceInfo',dIMU,'mass',massIMU,... 'rA', rIMU, 'name', 'IMU', 'body', 1, 'faceColor', [0 0 1], 'power', powerIMU ); BuildCADModel( 'add component', m ); % Chassis m = CreateComponent( 'make', 'box', 'x', xChassis, 'y', yChassis, 'z', zChassis, 'faceColor', [0 0.5 0.5],... 'rA', [-xBox/2 + xChassis/2 + 2*panelThickness; -yBox/2 + yChassis/2 + 2*panelThickness; zBox - zChassis/2 - 2*panelThickness],... 'mass', massChassis, 'name', 'C&DH Box', 'body', 1, 'inside', 1 ); BuildCADModel( 'add component', m ); m = CreateComponent( 'make', 'generic', 'v', vT, 'f', fT, 'faceColor', [0 0.5 0.5],... 'rA', rThruster, 'mass', massThruster, 'name', 'Thruster', 'body', 1, 'inside', 0 ); BuildCADModel( 'add component', m ); % Misc payload rPayload = [xTank*[1 -1;-1 1];zBox*[1 1]/2]; %BuildCADModel( 'update body mass properties' ); g = BuildCADModel( 'get model' ); mPayload = massTotal-g.mass.mass; for k = 1:2 m = CreateComponent( 'make', 'box', 'x',2*rTank(1), 'y', 2*rTank(1), 'z',2*rTank(1),... 'faceColor', 'magenta' ,'rA', rPayload(:,k),'mass',mPayload/2,... 'name', sprintf('Payload %d',k),'inside',1); BuildCADModel( 'add component', m ); end

Add subsystems
if 1 BuildCADModel( 'add subsystem', 'ACS', {'star camera','rwa','imu'} ); BuildCADModel( 'add subsystem', 'Propulsion', {'thruster','tank'} ); BuildCADModel( 'add subsystem', 'Telemetry and Command', {'C&DH', 'omni', 'signal','processor', 'antenna', 'board'} ); BuildCADModel( 'add subsystem', 'Power Lander', {'solar array', 'battery', 'motor'} ); BuildCADModel( 'add subsystem', 'Structure', {'legs', 'panel', 'frame', 'strut'} ); BuildCADModel( 'add subsystem', 'Payload', {'payload'} ); end
Update the mass properties to produce the tables
BuildCADModel( 'update body mass properties' ); g = BuildCADModel( 'get model' ); BuildCADModel( 'show vehicle' ) CreateReport( g, 'tex', FileFullpath('PlutoLanderMass'), 'mass', 1, 1, 1 ) CreateReport( g, 'tex', FileFullpath('PlutoLanderPower'), 'power', 1, 1, 1 ) CreateReport( g, 'txt', [], 'mass', 1, 0, false ); CreateReport( g, 'txt', [], 'power', 1, 0, false );
Component Mass Units ACS subsystem Star Camera 1 0.25 kg Star Camera 2 0.25 kg IMU 0.748 kg ACS Subsystem Total 1.248 kg Propulsion subsystem Thruster 4.898 kg HPGP Tank 1 42.99 kg HPGP Tank 2 42.99 kg Propulsion Subsystem Total 90.87 kg Telemetry and Command subsystem C&DH Box 1 kg Omni 1 0.002543 kg Omni 2 0.002543 kg Telemetry and Command Subsystem Total 1.005 kg Power Lander subsystem Solar Arrays Stowed 13.3 kg Solar Array Face 0 kg Battery 1 13.33 kg Power Lander Subsystem Total 26.63 kg Structure subsystem Landing Legs 0 kg Panel +X 2.918 kg Panel -X 2.918 kg Panel +Y 2.918 kg Panel -Y 2.918 kg Panel +Z 5.886 kg Panel -Z 5.886 kg Top Frame 0.09902 kg Bottom Frame 0.09902 kg z strut1 0.01238 kg z strut2 0.01238 kg z strut3 0.01238 kg z strut4 0.01238 kg Structure Subsystem Total 23.69 kg Payload subsystem Payload 1 43.27 kg Payload 2 43.27 kg Payload Subsystem Total 86.55 kg Total 230 kg Component Power On Power Standby Units ACS subsystem Star Camera 1 0 0 W Star Camera 2 0 0 W IMU 12 0 W ACS Subsystem Total 12 0 W Propulsion subsystem Thruster 0 0 W HPGP Tank 1 0 0 W HPGP Tank 2 0 0 W Propulsion Subsystem Total 0 0 W Telemetry and Command subsystem C&DH Box 0 0 W Omni 1 2 0 W Omni 2 2 0 W Telemetry and Command Subsystem Total 4 0 W Power Lander subsystem Solar Arrays Stowed 0 0 W Solar Array Face -250 0 W Battery 1 0 0 W Power Lander Subsystem Total -250 0 W Structure subsystem Landing Legs 0 0 W Panel +X 0 0 W Panel -X 0 0 W Panel +Y 0 0 W Panel -Y 0 0 W Panel +Z 0 0 W Panel -Z 0 0 W Top Frame 0 0 W Bottom Frame 0 0 W z strut1 0 0 W z strut2 0 0 W z strut3 0 0 W z strut4 0 0 W Structure Subsystem Total 0 0 W Payload subsystem Payload 1 0 0 W Payload 2 0 0 W Payload Subsystem Total 0 0 W Total -234 0 W


Export to and obj (graphics) file
if arraysStowed SaveStructure(g, FileFullpath('PlutoLander-Stowed')); else ExportOBJ( g, FileFullpath('PlutoLander')); SaveStructure(g, FileFullpath('PlutoLander')); end %-------------------------------------- % PSS internal file version information %-------------------------------------- % $Id: 5e07d26b3705f1ecad7ba150358b1b88ad82a4cd $