From ef998ae439a16ba3a0f51dec2beae0df08d365ae Mon Sep 17 00:00:00 2001 From: Mauco03 <marco.gaibotti@skywarder.eu> Date: Tue, 4 Feb 2025 09:06:23 +0100 Subject: [PATCH] [handle-value-conversion] Updating parachute Testing if to convert parachute from heterogeneous array to cell array --- classes/@Rocket/Rocket.m | 4 +- classes/@Rocket/updateOverridable.m | 1 + classes/bays/@Motor/loadData.m | 5 +- .../config/paraConfig.m | 146 +++++++++--------- .../config/rocketConfig.m | 9 +- 5 files changed, 85 insertions(+), 80 deletions(-) diff --git a/classes/@Rocket/Rocket.m b/classes/@Rocket/Rocket.m index 61d7be1..1dd3d61 100644 --- a/classes/@Rocket/Rocket.m +++ b/classes/@Rocket/Rocket.m @@ -51,6 +51,7 @@ classdef Rocket < Config parachutes cell % [-] (nParachutes, nStages) Parachutes onboard coefficients struct % [-] Aerodynamic coefficients + coefficientsHighAOA struct % [-] Aerodynamic coefficients at high angle of attack end properties(Access = private) @@ -100,7 +101,6 @@ classdef Rocket < Config options.checkGeometry logical = true end obj@Config(mission, varsIn); - if isempty(mission.name), return; end %% Initialize base properties bayNames = camel2UpperSnake(obj.getProperties(Superclass='Bay')); @@ -117,6 +117,8 @@ classdef Rocket < Config [overridables{2, :}] = deal(false); obj.overrides = dictionary(overridables{:}); + if isempty(mission.name), return; end + %% Loading data if isempty(varsIn) varsIn = obj.getConfig(mission.configPath); diff --git a/classes/@Rocket/updateOverridable.m b/classes/@Rocket/updateOverridable.m index 7c01974..d984558 100644 --- a/classes/@Rocket/updateOverridable.m +++ b/classes/@Rocket/updateOverridable.m @@ -4,6 +4,7 @@ obj.overrides(name) = true; if isempty(value) obj.overrides(name) = false; + if ~all(values(obj.bayStatus)), return; end obj = obj.updateNoMotor(); obj = obj.update(); end diff --git a/classes/bays/@Motor/loadData.m b/classes/bays/@Motor/loadData.m index 460082b..30a56a7 100644 --- a/classes/bays/@Motor/loadData.m +++ b/classes/bays/@Motor/loadData.m @@ -27,7 +27,10 @@ end if obj.type == "Hybrid" obj.length = chosenMotor.L; - obj.tankLength = chosenMotor.Ltank; + obj.tankLength = chosenMotor.Ltank; + if isempty(obj.tankLength) + obj.tankLength = chosenMotor.LtankPr + chosenMotor.LtankOx; + end obj.fuelMass = chosenMotor.mFu; obj.oxidizerMass = chosenMotor.mOx; inertiaRaw = [chosenMotor.Ixx;chosenMotor.Iyy;chosenMotor.Izz]; diff --git a/missions/2025_Orion_Portugal_October/config/paraConfig.m b/missions/2025_Orion_Portugal_October/config/paraConfig.m index cd32775..7ac5c7e 100644 --- a/missions/2025_Orion_Portugal_October/config/paraConfig.m +++ b/missions/2025_Orion_Portugal_October/config/paraConfig.m @@ -1,96 +1,96 @@ % CONFIG - This script contains information about the parachutes onboard % parachute 1 -para(1, 1) = Parachute(); +para{1, 1} = Parachute(); -para(1, 1).name = 'DROGUE chute'; -para(1, 1).surface = 0.6; % [m^2] Surface -para(1, 1).mass = 0.5; % [kg] Parachute Mass -para(1, 1).cd = 0.75; % [/] Parachute Drag Coefficient -para(1, 1).cl = 0; % [/] Parachute Lift Coefficient -para(1, 1).openingTime = 0.1; % [s] drogue opening delay -para(1, 1).finalAltitude = 350; % [m] Final altitude of the parachute -para(1, 1).cx = 1.4; % [/] Parachute Longitudinal Drag Coefficient -para(1, 1).chordLength = 1.5; % [m] Shock Chord Length -para(1, 1).chordK = 7200; % [N/m^2] Shock Chord Elastic Constant -para(1, 1).chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient -para(1, 1).m = 1; % [m^2/s] Coefficient of the surface vs. time opening model -para(1, 1).nf = 12; % [/] Adimensional Opening Time -para(1, 1).expulsionSpeed = 5; % [m/s] Expulsion Speed -para(1, 1).forceCoefficient = 1.8; % [-] Empirical coefficient to obtain correct peak force at deployment +para{1, 1}.name = 'DROGUE chute'; +para{1, 1}.surface = 0.6; % [m^2] Surface +para{1, 1}.mass = 0.5; % [kg] Parachute Mass +para{1, 1}.cd = 0.75; % [/] Parachute Drag Coefficient +para{1, 1}.cl = 0; % [/] Parachute Lift Coefficient +para{1, 1}.openingTime = 0.1; % [s] drogue opening delay +para{1, 1}.finalAltitude = 350; % [m] Final altitude of the parachute +para{1, 1}.cx = 1.4; % [/] Parachute Longitudinal Drag Coefficient +para{1, 1}.chordLength = 1.5; % [m] Shock Chord Length +para{1, 1}.chordK = 7200; % [N/m^2] Shock Chord Elastic Constant +para{1, 1}.chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient +para{1, 1}.m = 1; % [m^2/s] Coefficient of the surface vs. time opening model +para{1, 1}.nf = 12; % [/] Adimensional Opening Time +para{1, 1}.expulsionSpeed = 5; % [m/s] Expulsion Speed +para{1, 1}.forceCoefficient = 1.8; % [-] Empirical coefficient to obtain correct peak force at deployment % parachute 2 -para(2, 1) = Parachute(); +para{2, 1} = Parachute(); -para(2, 1).name = 'MAIN chute'; -para(2, 1).surface = 13.5; % [m^2] Surface -para(2, 1).mass = 1.75; % [kg] Parachute Mass -para(2, 1).cd = 0.65; % [/] Parachute Drag Coefficient -para(2, 1).cl = 0; % [/] Parachute Lift Coefficient -para(2, 1).openingTime = 0.9; % [s] drogue opening delay -para(2, 1).finalAltitude = 0; % [m] Final altitude of the parachute -para(2, 1).cx = 1.6; % [/] Parachute Longitudinal Drag Coefficient -para(2, 1).chordLength = 6; % [m] Shock Chord Length -para(2, 1).chordK = 3000; % [N/m^2] Shock Chord Elastic Constant -para(2, 1).chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient -para(2, 1).m = 1; % [m^2/s] Coefficient of the surface vs. time opening model -para(2, 1).nf = 8.7; % [/] Adimensional Opening Time -para(2 ,1).expulsionSpeed = 0; % [m/s] Expulsion Speed -para(2, 1).forceCoefficient = 2.2; % [-] Empirical coefficient to obtain correct peak force at deployment +para{2, 1}.name = 'MAIN chute'; +para{2, 1}.surface = 13.5; % [m^2] Surface +para{2, 1}.mass = 1.75; % [kg] Parachute Mass +para{2, 1}.cd = 0.65; % [/] Parachute Drag Coefficient +para{2, 1}.cl = 0; % [/] Parachute Lift Coefficient +para{2, 1}.openingTime = 0.9; % [s] drogue opening delay +para{2, 1}.finalAltitude = 0; % [m] Final altitude of the parachute +para{2, 1}.cx = 1.6; % [/] Parachute Longitudinal Drag Coefficient +para{2, 1}.chordLength = 6; % [m] Shock Chord Length +para{2, 1}.chordK = 3000; % [N/m^2] Shock Chord Elastic Constant +para{2, 1}.chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient +para{2, 1}.m = 1; % [m^2/s] Coefficient of the surface vs. time opening model +para{2, 1}.nf = 8.7; % [/] Adimensional Opening Time +para{2, 1}.expulsionSpeed = 0; % [m/s] Expulsion Speed +para{2, 1}.forceCoefficient = 2.2; % [-] Empirical coefficient to obtain correct peak force at deployment %% PAYLOAD CHUTES % parachute 1 -para(1, 2) = Parachute(); +para{1, 2} = Parachute(); -para(1, 2).name = "Parafoil DROGUE"; -para(1, 2).surface = 0.11; % [m^2] Surface -para(1, 2).mass = 0.1; % [kg] Parachute Mass -para(1, 2).cd = 1.2; % [/] Parachute Drag Coefficient -para(1, 2).cl = 0; % [/] Parachute Lift Coefficient -para(1, 2).openingTime = 1; % [s] drogue opening delay -para(1, 2).finalAltitude = 450; % [m] Final altitude of the parachute -para(1, 2).cx = 1.4; % [/] Parachute Longitudinal Drag Coefficient -para(1, 2).chordLength = 1.5; % [m] Shock Chord Length -para(1, 2).chordK = 7200; % [N/m^2] Shock Chord Elastic Constant -para(1, 2).chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient -para(1, 2).m = 1; % [m^2/s] Coefficient of the surface vs. time opening model -para(1, 2).nf = 12; % [/] Adimensional Opening Time -para(1, 2).expulsionSpeed = 10; % [m/s] Expulsion Speed -para(1, 2).forceCoefficient = 0; % [-] Empirical coefficient to obtain correct peak force at deployment +para{1, 2}.name = "Parafoil DROGUE"; +para{1, 2}.surface = 0.11; % [m^2] Surface +para{1, 2}.mass = 0.1; % [kg] Parachute Mass +para{1, 2}.cd = 1.2; % [/] Parachute Drag Coefficient +para{1, 2}.cl = 0; % [/] Parachute Lift Coefficient +para{1, 2}.openingTime = 1; % [s] drogue opening delay +para{1, 2}.finalAltitude = 450; % [m] Final altitude of the parachute +para{1, 2}.cx = 1.4; % [/] Parachute Longitudinal Drag Coefficient +para{1, 2}.chordLength = 1.5; % [m] Shock Chord Length +para{1, 2}.chordK = 7200; % [N/m^2] Shock Chord Elastic Constant +para{1, 2}.chordC = 0; % [Ns/m] Shock Chord Dynamic Coefficient +para{1, 2}.m = 1; % [m^2/s] Coefficient of the surface vs. time opening model +para{1, 2}.nf = 12; % [/] Adimensional Opening Time +para{1, 2}.expulsionSpeed = 10; % [m/s] Expulsion Speed +para{1, 2}.forceCoefficient = 0; % [-] Empirical coefficient to obtain correct peak force at deployment % parachute 2 -para(2, 2) = Wing(); +para{2, 2} = Wing(); -para(2, 2).name = "Parafoil AIRFOIL"; -para(2, 2).mass = 0.40; % [kg] Wing Mass -para(2, 2).openingTime = 0; % [s] Wing opening delay +para{2, 2}.name = "Parafoil AIRFOIL"; +para{2, 2}.mass = 0.40; % [kg] Wing Mass +para{2, 2}.openingTime = 0; % [s] Wing opening delay -para(2, 2).surface = 0.11; % [m^2] Surface -para(2, 2).deltaSMax = 0.1; % max value +para{2, 2}.surface = 0.11; % [m^2] Surface +para{2, 2}.deltaSMax = 0.1; % max value -para(2, 2).semiWingSpan = 2.55/2; % [m] settings.para(2, 2).b: semiwingspan - vela nuova: 2.55/2; - vela vecchia: 2.06/2; -para(2, 2).MAC = 0.8; % [m] mean aero chord -para(2, 2).surface = 2.04; % [m^2] parafoil surface - vela nuova 2.04; - vela vecchia: 1.64; -para(2, 2).inertia = [0.42, 0, 0.03; +para{2, 2}.semiWingSpan = 2.55/2; % [m] settings.para{2, 2}.b: semiwingspan - vela nuova: 2.55/2; - vela vecchia: 2.06/2; +para{2, 2}.MAC = 0.8; % [m] mean aero chord +para{2, 2}.surface = 2.04; % [m^2] parafoil surface - vela nuova 2.04; - vela vecchia: 1.64; +para{2, 2}.inertia = [0.42, 0, 0.03; 0, 0.4, 0; 0.03, 0, 0.053]; % [kg m^2] [3x3] inertia matrix parafoil -para(2, 2).finalAltitude = 0; +para{2, 2}.finalAltitude = 0; -para(2, 2).cd0 = 0.25; -para(2, 2).cdAlpha = 0.12; -para(2, 2).cdSurface = 0.01; +para{2, 2}.cd0 = 0.25; +para{2, 2}.cdAlpha = 0.12; +para{2, 2}.cdSurface = 0.01; -para(2, 2).cl0 = 0.091; -para(2, 2).clAlpha = 0.9; -para(2, 2).clSurface = -0.0035; +para{2, 2}.cl0 = 0.091; +para{2, 2}.clAlpha = 0.9; +para{2, 2}.clSurface = -0.0035; -para(2, 2).cLP = -0.84; -para(2, 2).cLPhi = -0.1; -para(2, 2).cLSurface = -0.0035; +para{2, 2}.cLP = -0.84; +para{2, 2}.cLPhi = -0.1; +para{2, 2}.cLSurface = -0.0035; -para(2, 2).cM0 = 0.35; -para(2, 2).cMAlpha = -0.72; -para(2, 2).cMQ = -1.49; +para{2, 2}.cM0 = 0.35; +para{2, 2}.cMAlpha = -0.72; +para{2, 2}.cMQ = -1.49; -para(2, 2).cNR = -0.27; -para(2, 2).cNSurface = 0.0115; \ No newline at end of file +para{2, 2}.cNR = -0.27; +para{2, 2}.cNSurface = 0.0115; \ No newline at end of file diff --git a/missions/2025_Orion_Portugal_October/config/rocketConfig.m b/missions/2025_Orion_Portugal_October/config/rocketConfig.m index 70935bb..543b878 100644 --- a/missions/2025_Orion_Portugal_October/config/rocketConfig.m +++ b/missions/2025_Orion_Portugal_October/config/rocketConfig.m @@ -1,12 +1,12 @@ % CONFIG - This script sets up rocket's parameters %% ROCKET - OVERRIDES BAYS CONFIG -% rocket = Rocket(); -% -% rocket.diameter = 0.15; % [m] Rocket diameter +rocket = Rocket(); + +rocket.diameter = 0.15; % [m] Rocket diameter % rocket.massNoMotor = []; % [kg] OVERRIDE mass without motor % rocket.inertiaNoMotor = []; % [kg*m^2] OVERRIDE inertia without motor - body axes reference -% rocket.xCgNoMotor = []; % [m] OVERRIDE xCg without motor +% rocket.xcgNoMotor = []; % [m] OVERRIDE xCg without motor % rocket.lengthCenterNoMot = []; % [m] OVERRIDE Center length - no nose, no motor %% PRF - Includes Parafoil + Nose @@ -78,7 +78,6 @@ motor.cutoffTransient = 0.3; % [s] Cut-o %% REAR - Includes Fincan + Boat rear = Rear(); -rear.position = []; % [m] offset from rear.length = 477 * 1e-3; % [m] Total bay length rear.mass = 1736.32 *1e-3; % [kg] Total bay mass rear.inertia = 1e-9*[13662070; 47529495; 47528846]; % [kg*m^2] Total bay inertia (Body reference) -- GitLab