From 31a7388c5a1d24ed2212910a196b4fefe6dcaf67 Mon Sep 17 00:00:00 2001 From: Mauco03 <marco.gaibotti@skywarder.eu> Date: Wed, 6 Mar 2024 09:29:52 +0100 Subject: [PATCH] [msa-refactoring][classes] Added matrix Component support Now yoy can create component matrices from config. e.g: see parachuteConfig.m and try creating a Parachute --- classes/Component.m | 25 ++-- classes/Rocket.m | 2 +- classes/components/Environment.m | 2 +- classes/components/Parachute.m | 44 ++++--- .../config/parachuteConfig.m | 113 ++++++++---------- 5 files changed, 100 insertions(+), 86 deletions(-) diff --git a/classes/Component.m b/classes/Component.m index 91d88c8..6db8d02 100644 --- a/classes/Component.m +++ b/classes/Component.m @@ -11,16 +11,27 @@ classdef Component < Config function obj = Component(mission, varsIn) arguments (Input) mission Mission = Mission() - varsIn = 0 + varsIn = [] end obj.mission = mission; %if isempty(mission.name) && nargin > 0, warning('Mission arguments are empty. Returning an uninitialized component...'); end if isempty(mission.name), return; end - if ~isstruct(varsIn) && varsIn == 0 - obj.loadConfig(); - else - obj.loadConfig(varsIn); + if isempty(varsIn), varsIn = obj.getConfig(); end + + fileName = obj.configName; + varName = obj.variableName; + if isempty(varName), varName = strtok(fileName, 'C'); end + + [m, n] = size(varsIn.(varName)); + objMatrix(m,n) = obj; + + for i = 1:m + for j = 1:n + varIn.(varName) = varsIn.(varName)(i,j); + objMatrix(i,j).loadConfig(varIn); + end end + obj = objMatrix; obj.loadData(); end end @@ -56,7 +67,7 @@ classdef Component < Config run(fileName); configObj = eval(varName); case 2 - configObj = varargin{1}.(varName); + configObj = varargin{end}.(varName); otherwise error('Too many input arguments.') end @@ -65,7 +76,7 @@ classdef Component < Config for j = 1:size(fields, 2), obj.(fields{j}) = configObj.(fields{j}); end end - function outputVariables = getConfigVariables(obj) + function outputVariables = getConfig(obj) fileName = obj.configName; filePath = obj.mission.configPath; diff --git a/classes/Rocket.m b/classes/Rocket.m index bddf2d7..11e7907 100644 --- a/classes/Rocket.m +++ b/classes/Rocket.m @@ -36,7 +36,7 @@ classdef Rocket < Bay %% Loading data if nargin == 0, return; end - vars = obj.getConfigVariables(); % Load config once and apply to other bays + vars = obj.getConfig(); % Load config once and apply to other bays obj.nose = Nose(mission, vars); obj.payload = Payload(mission, vars); obj.recovery = Recovery(mission, vars); diff --git a/classes/components/Environment.m b/classes/components/Environment.m index 41ebd8b..47ec3e0 100644 --- a/classes/components/Environment.m +++ b/classes/components/Environment.m @@ -32,7 +32,7 @@ classdef Environment < Component arguments(Input) mission Mission = Mission() motor Motor = Motor() - varIn = 0 + varIn = [] end if nargin > 0 && nargin < 2, error('Too few arguments. Type help for more info'); end if nargin > 3, error('Too many arguments.'); end diff --git a/classes/components/Parachute.m b/classes/components/Parachute.m index 4d26768..e03bac7 100644 --- a/classes/components/Parachute.m +++ b/classes/components/Parachute.m @@ -2,26 +2,40 @@ classdef Parachute < Component %PARACHUTE Summary of this class goes here % Detailed explanation goes here properties - name {mustBeTextScalar} = '' - surface double % [m^2] Surface - mass double % [kg] Parachute Mass - cd double % [/] Parachute Drag Coefficient - cl double % [/] Parachute Lift Coefficient - openingDelay double % [s] drogue opening delay - finalAltitude double % [m] Final altitude of the parachute - cx double % [/] Parachute Longitudinal Drag Coefficient - chordLength double % [m] Shock Chord Length - chordK double % [N/m^2] Shock Chord Elastic Constant - chordC double % [Ns/m] Shock Chord Dynamic Coefficient - m double % [m^2/s] Coefficient of the surface vs. time opening model - nf double % [/] Adimensional Opening Time - expulsionSpeed double + name {mustBeTextScalar} = '' + surface double % [m^2] Surface + mass double % [kg] Parachute Mass + openingDelay double % [s] drogue opening delay + finalAltitude double % [m] Final altitude of the parachute + chordLength double % [m] Shock Chord Length + chordK double % [N/m^2] Shock Chord Elastic Constant + chordC double % [Ns/m] Shock Chord Dynamic Coefficient + expulsionSpeed double + cx double % [/] Parachute Longitudinal Drag Coefficient + cd double % [/] Parachute Drag Coefficient + cl double % [/] Parachute Lift Coefficient + m double % [m^2/s] Coefficient of the surface vs. time opening model + nf double % [/] Adimensional Opening Time end properties(Access = protected) configName = 'parachuteConfig.m' - variableName = 'parachute' + variableName = '' mission Mission end + + methods + function obj = Parachute(mission, varIn) + arguments(Input) + mission Mission = Mission() + varIn = [] + end + % if nargin > 0 && nargin < 2, error('Too few arguments. Type help for more info'); end + % if nargin > 3, error('Too many arguments.'); end + + obj@Component(mission, varIn); + %obj.motor = motor; + end + end end diff --git a/missions/2024_Lyra_Roccaraso_September/config/parachuteConfig.m b/missions/2024_Lyra_Roccaraso_September/config/parachuteConfig.m index e38d18a..90554bc 100644 --- a/missions/2024_Lyra_Roccaraso_September/config/parachuteConfig.m +++ b/missions/2024_Lyra_Roccaraso_September/config/parachuteConfig.m @@ -1,70 +1,59 @@ % CONFIG - This script contains information about the parachutes onboard -parachute = Parachute(); +parachute(1, 1) = Parachute(); -parachute.name = 'DROGUE chute'; -parachute.surface = 1.2219; % [m^2] Surface -parachute.mass = 0.15; % [kg] Parachute Mass -parachute.cd = 0.96; % [/] Parachute Drag Coefficient -parachute.cl = 0; % [/] Parachute Lift Coefficient -parachute.openingDelay = 1; % [s] drogue opening delay -parachute.finalAltitude = 350; % [m] Final altitude of the parachute -parachute.cx = 1.4; % [/] Parachute Longitudinal Drag Coefficient -parachute.chordLength = 1.5; % [m] Shock Chord Length -parachute.chordK = 7200; % [N/m^2] Shock Chord Elastic Constant -parachute.chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient -parachute.m = 1; % [m^2/s] Coefficient of the surface vs. time opening model -parachute.nf = 12; % [/] Adimensional Opening Time -parachute.expulsionSpeed = 5; % [m/s] Expulsion Speed +parachute(1,1).name = 'DROGUE chute'; +parachute(1,1).surface = 1.2219; % [m^2] Surface +parachute(1,1).mass = 0.15; % [kg] Parachute Mass +parachute(1,1).cd = 0.96; % [/] Parachute Drag Coefficient +parachute(1,1).cl = 0; % [/] Parachute Lift Coefficient +parachute(1,1).openingDelay = 1; % [s] drogue opening delay +parachute(1,1).finalAltitude = 350; % [m] Final altitude of the parachute +parachute(1,1).cx = 1.4; % [/] Parachute Longitudinal Drag Coefficient +parachute(1,1).chordLength = 1.5; % [m] Shock Chord Length +parachute(1,1).chordK = 7200; % [N/m^2] Shock Chord Elastic Constant +parachute(1,1).chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient +parachute(1,1).m = 1; % [m^2/s] Coefficient of the surface vs. time opening model +parachute(1,1).nf = 12; % [/] Adimensional Opening Time +parachute(1,1).expulsionSpeed = 5; % [m/s] Expulsion Speed -% %% ROCKET CHUTES -% % parachute 1 -% parachute.para(1, 1).name = 'DROGUE chute'; -% parachute.para(1, 1).surface = 1.2219; % [m^2] Surface -% parachute.para(1, 1).mass = 0.15; % [kg] Parachute Mass -% parachute.para(1, 1).cd = 0.96; % [/] Parachute Drag Coefficient -% parachute.para(1, 1).cl = 0; % [/] Parachute Lift Coefficient -% parachute.para(1, 1).openingDelay = 1; % [s] drogue opening delay -% parachute.para(1, 1).finalAltitude = 350; % [m] Final altitude of the parachute -% parachute.para(1, 1).cx = 1.4; % [/] Parachute Longitudinal Drag Coefficient -% parachute.para(1, 1).chordLength = 1.5; % [m] Shock Chord Length -% parachute.para(1, 1).chordK = 7200; % [N/m^2] Shock Chord Elastic Constant -% parachute.para(1, 1).chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient -% parachute.para(1, 1).m = 1; % [m^2/s] Coefficient of the surface vs. time opening model -% parachute.para(1, 1).nf = 12; % [/] Adimensional Opening Time -% parachute.para(1, 1).expulsionSpeed = 5; % [m/s] Expulsion Speed -% -% % parachute 2 -% parachute.para(2, 1).name = 'MAIN chute'; -% parachute.para(2, 1).surface = 7.34; % [m^2] Surface -% parachute.para(2, 1).mass = 1.05; % [kg] Parachute Mass -% parachute.para(2, 1).cd = 1.75; % [/] Parachute Drag Coefficient -% parachute.para(2, 1).cl = 0; % [/] Parachute Lift Coefficient -% parachute.para(2, 1).finalAltitude = 0; % [m] Final altitude of the parachute -% parachute.para(2, 1).cx = 1.2; % [/] Parachute Longitudinal Drag Coefficient -% parachute.para(2, 1).chordLength = 6; % [m] Shock Chord Length -% parachute.para(2, 1).chordK = 3000; % [N/m^2] Shock Chord Elastic Constant -% parachute.para(2, 1).chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient -% parachute.para(2, 1).m = 1; % [m^2/s] Coefficient of the surface vs. time opening model -% parachute.para(2, 1).nf = 8.7; % [/] Adimensional Opening Time +% parachute 2 +parachute(2, 1) = Parachute(); + +parachute(2, 1).name = 'MAIN chute'; +parachute(2, 1).surface = 7.34; % [m^2] Surface +parachute(2, 1).mass = 1.05; % [kg] Parachute Mass +parachute(2, 1).cd = 1.75; % [/] Parachute Drag Coefficient +parachute(2, 1).cl = 0; % [/] Parachute Lift Coefficient +parachute(2, 1).finalAltitude = 0; % [m] Final altitude of the parachute +parachute(2, 1).cx = 1.2; % [/] Parachute Longitudinal Drag Coefficient +parachute(2, 1).chordLength = 6; % [m] Shock Chord Length +parachute(2, 1).chordK = 3000; % [N/m^2] Shock Chord Elastic Constant +parachute(2, 1).chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient +parachute(2, 1).m = 1; % [m^2/s] Coefficient of the surface vs. time opening model +parachute(2, 1).nf = 8.7; % [/] Adimensional Opening Time % % %% PAYLOAD CHUTES % % parachute 1 -% parachute.para(1, 2).name = "Payload DROGUE"; -% parachute.para(1, 2).surface = 0.11; % [m^2] Surface -% parachute.para(1, 2).mass = 0.15; % [kg] Parachute Mass -% parachute.para(1, 2).cd = 1.2; % [/] Parachute Drag Coefficient -% parachute.para(1, 2).cl = 0; % [/] Parachute Lift Coefficient -% parachute.para(1, 2).openingDelay = 1; % [s] drogue opening delay -% parachute.para(1, 2).finalAltitude = 300; % [m] Final altitude of the parachute -% parachute.para(1, 2).cx = 1.4; % [/] Parachute Longitudinal Drag Coefficient -% parachute.para(1, 2).chordLength = 1.5; % [m] Shock Chord Length -% parachute.para(1, 2).chordK = 7200; % [N/m^2] Shock Chord Elastic Constant -% parachute.para(1, 2).chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient -% parachute.para(1, 2).m = 1; % [m^2/s] Coefficient of the surface vs. time opening model -% parachute.para(1, 2).nf = 12; % [/] Adimensional Opening Time -% parachute.para(1, 2).expulsionSpeed = 10; % [m/s] Expulsion Speed +parachute(1, 2) = Parachute(); + +parachute(1, 2).name = "Payload DROGUE"; +parachute(1, 2).surface = 0.11; % [m^2] Surface +parachute(1, 2).mass = 0.15; % [kg] Parachute Mass +parachute(1, 2).cd = 1.2; % [/] Parachute Drag Coefficient +parachute(1, 2).cl = 0; % [/] Parachute Lift Coefficient +parachute(1, 2).openingDelay = 1; % [s] drogue opening delay +parachute(1, 2).finalAltitude = 300; % [m] Final altitude of the parachute +parachute(1, 2).cx = 1.4; % [/] Parachute Longitudinal Drag Coefficient +parachute(1, 2).chordLength = 1.5; % [m] Shock Chord Length +parachute(1, 2).chordK = 7200; % [N/m^2] Shock Chord Elastic Constant +parachute(1, 2).chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient +parachute(1, 2).m = 1; % [m^2/s] Coefficient of the surface vs. time opening model +parachute(1, 2).nf = 12; % [/] Adimensional Opening Time +parachute(1, 2).expulsionSpeed = 10; % [m/s] Expulsion Speed % % % parachute 2 -% parachute.para(2, 2).name = "Payload AIRFOIL"; -% parachute.para(2, 2).mass = 0.50; % [kg] Parachute Mass -% parachute.para(2, 2).finalAltitude = 0; % [m] Final altitude of the parachute +parachute(2, 2) = Parachute(); + +parachute(2, 2).name = "Payload AIRFOIL"; +parachute(2, 2).mass = 0.50; % [kg] Parachute Mass +parachute(2, 2).finalAltitude = 0; % [m] Final altitude of the parachute -- GitLab