From e18c006b6bdb3777db2b41fc2aa03acd76189b5a Mon Sep 17 00:00:00 2001
From: "Pier Francesco A. Bachini" <pierfrancesco.bachini@skywarder.eu>
Date: Thu, 25 Jul 2024 16:09:16 +0200
Subject: [PATCH] [gnc] Update Parafoil class and ode with control structure

---
 classes/components/Parafoil.m                 |  8 ++------
 functions/odeFunctions/descentParafoil.m      | 19 ++++++++++---------
 .../config/paraConfig.m                       |  6 ------
 missions/missionConfig.m                      |  3 +--
 4 files changed, 13 insertions(+), 23 deletions(-)

diff --git a/classes/components/Parafoil.m b/classes/components/Parafoil.m
index d02cc7b..6a60eb0 100644
--- a/classes/components/Parafoil.m
+++ b/classes/components/Parafoil.m
@@ -14,12 +14,6 @@ classdef Parafoil < Para
         name            = '' 
         surface         double          % [m^2]    Surface
         deltaSMax       double          % [-]      Aerodynamic control coefficient - symmetric, max value
-        
-        uMax
-        uMin
-        identification
-        deltaATau
-        maxSpeed
 
         mass            double          % [kg]     Parafoil Mass
         openingTime     double          % [s]      Parafoil opening time (delay + time to get fully open)
@@ -47,6 +41,8 @@ classdef Parafoil < Para
 
         cNR             double          % [-] aerodynamic control coefficient - asymetric, Cnr
         cNSurface       double          % [-] aerodynamic control coefficient - asymetric, CnDeltaA
+    
+        controlParams = []              % Struct containing all the control parameters
     end
 
     properties(SetAccess = private)
diff --git a/functions/odeFunctions/descentParafoil.m b/functions/odeFunctions/descentParafoil.m
index 104a272..17b484b 100644
--- a/functions/odeFunctions/descentParafoil.m
+++ b/functions/odeFunctions/descentParafoil.m
@@ -134,11 +134,11 @@ end
 % Saturation on servo angle, needed if the actuation is faster than the
 % integration step
 if isControlActive
-    if deltaA > parafoil.uMax
-        deltaA = parafoil.uMax;
+    if deltaA > parafoil.controlParams.uMax
+        deltaA = parafoil.controlParams.uMax;
         isAngleSaturated = true;
-    elseif deltaA < parafoil.uMin
-        deltaA = parafoil.uMin;
+    elseif deltaA < parafoil.controlParams.uMin
+        deltaA = parafoil.controlParams.uMin;
         isAngleSaturated = true;
     end
 end
@@ -187,7 +187,7 @@ angAcc = inverseInertia*(momentAero - cross(omega, inertia * omega));
 dDeltaA = 0;
 if isControlActive && ~isAngleSaturated
     deltaARef = control.deltaARef;
-    if ~parafoil.identification
+    if ~parafoil.controlParams.identification
         % set velocity of servo (air brakes)
         if length(deltaARef) == 2                                    % for the recallOdeFunction
             if theta < control.timeChangeRef
@@ -204,9 +204,9 @@ if isControlActive && ~isAngleSaturated
         deltaARef = deltaARef(idxDeltaA, 2);
     end
 
-    dDeltaA = (deltaARef-deltaA)/parafoil.deltaATau;
-    if abs(dDeltaA) > parafoil.maxSpeed
-        dDeltaA = sign(deltaARef-deltaA)*parafoil.maxSpeed;      % concettualmente sta roba è sbagliata perchè dipende dal passo di integrazione, fixare
+    dDeltaA = (deltaARef-deltaA)/parafoil.controlParams.deltaA_tau;
+    if abs(dDeltaA) > parafoil.controlParams.deltaA_maxSpeed
+        dDeltaA = sign(deltaARef-deltaA)*parafoil.controlParams.deltaA_maxSpeed;      % concettualmente sta roba è sbagliata perchè dipende dal passo di integrazione, fixare
     end
 end
 
@@ -219,7 +219,7 @@ dY(14) = dDeltaA;
 
 if nargout == 2 || ~isempty(wrapper)
     parout.state = [];
-    parout.interp = [];
+    parout.interp.mass = mass;
 
     parout.wind.body = windVels;
     parout.wind.NED = [uw; vw; ww];
@@ -234,6 +234,7 @@ if nargout == 2 || ~isempty(wrapper)
     parout.air = [];
 
     parout.accelerations.body = bodyAcc;
+    parout.accelerometer.body_acc = forceAero/mass;
     
     parout.coeff = [];
     parout.uncertanty = [];
diff --git a/missions/2024_Lyra_Portugal_October/config/paraConfig.m b/missions/2024_Lyra_Portugal_October/config/paraConfig.m
index 6c8e927..59d2a43 100644
--- a/missions/2024_Lyra_Portugal_October/config/paraConfig.m
+++ b/missions/2024_Lyra_Portugal_October/config/paraConfig.m
@@ -67,12 +67,6 @@ para(2, 2).openingTime = 0;              % [s] Parafoil opening delay
 para(2, 2).surface = 0.11;                % [m^2]   Surface
 para(2, 2).deltaSMax =  0.1;                       % max value
 
-uMax = 0;
-uMin = 0;
-identification = 0;
-deltaATau = 0;
-maxSpeed = 0;
-
 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;
diff --git a/missions/missionConfig.m b/missions/missionConfig.m
index dc15caf..ab8c15d 100644
--- a/missions/missionConfig.m
+++ b/missions/missionConfig.m
@@ -4,5 +4,4 @@
 % such as the current mission. The config "BIOS"
 mission = Mission();
 
-mission.name = '2023_Gemini_Roccaraso_September';
-% mission.name = '2024_Lyra_Portugal_October';
\ No newline at end of file
+mission.name = '2024_Lyra_Portugal_October';
\ No newline at end of file
-- 
GitLab