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