From a6836b8779c2deb0736daa118efb592d21c966dc Mon Sep 17 00:00:00 2001
From: "Pier Francesco A. Bachini" <pierfrancesco.bachini@skywarder.eu>
Date: Thu, 20 Feb 2025 00:27:55 +0100
Subject: [PATCH] [ADA] Update Montecarlo with run_ada comparison

---
 simulator/mainMontecarlo.m                   | 24 ++++++-
 simulator/montecarlo/plotsMontecarlo.m       | 71 +++++++++++++-------
 simulator/src/std_run_parts/std_subsystems.m |  4 +-
 3 files changed, 73 insertions(+), 26 deletions(-)

diff --git a/simulator/mainMontecarlo.m b/simulator/mainMontecarlo.m
index e75023d1..9aeb135d 100644
--- a/simulator/mainMontecarlo.m
+++ b/simulator/mainMontecarlo.m
@@ -115,6 +115,7 @@ for alg_index = 4
     motor_K = settings.motor.K;
 
     parfor i = 1:N_sim
+    % for i = 1:N_sim
         rocket_vec{i} = copy(rocket);
         settings_mont = settings_mont_init;
         settings_mont.motor.expThrust = stoch.thrust(i,:);                      % initialize the thrust vector of the current simulation (parfor purposes)
@@ -314,7 +315,25 @@ for alg_index = 4
     p_50 = normcdf([settings.z_final-50, settings.z_final+50],apogee.altitude_mean,apogee.altitude_std);
     apogee.accuracy_gaussian_50 =( p_50(2) - p_50(1) )*100;
 
-    
+    %% 
+    clc
+    for ii = 1:N_sim
+        if sum(save_thrust{ii}.sensors.ada.apo_times == -1) > 1
+            disp("Problems with ADA " + num2str(ii));
+        end
+    end
+
+    %%
+
+    ada_diff = zeros(N_sim, 1);
+    for ii = 1:N_sim
+        if save_thrust{ii}.sensors.old_ada.t_apogee ~= -1
+            ada_diff(ii) = save_thrust{ii}.sensors.ada.t_apogee - save_thrust{ii}.sensors.old_ada.t_apogee;
+        else
+            ada_diff(ii) = -1;
+        end
+    end
+
     %% PLOTS
 
     plotsMontecarlo;
@@ -343,6 +362,9 @@ for alg_index = 4
 
             case {'2024_Lyra_Portugal_October', '2024_Lyra_Roccaraso_September'}
                 folder = [folder ; "MontecarloResults\"+mission.name+"\"+contSettings.algorithm+"\"+num2str(N_sim)+"sim_Mach"+num2str(100*rocket.airbrakes.maxMach)+"_"+simulationType_thrust+"_"+saveDate]; % offline
+            
+            case {'2025_Orion_Portugal_October', '2025_Orion_Roccaraso_September'}
+                folder = [folder ; "MontecarloResults\"+mission.name+"\"+contSettings.algorithm+"\"+num2str(N_sim)+"sim_Mach"+num2str(100*rocket.airbrakes.maxMach)+"_"+simulationType_thrust+"_"+saveDate]; % offline
         end
 
     end
diff --git a/simulator/montecarlo/plotsMontecarlo.m b/simulator/montecarlo/plotsMontecarlo.m
index c20efe46..2e16b9dc 100644
--- a/simulator/montecarlo/plotsMontecarlo.m
+++ b/simulator/montecarlo/plotsMontecarlo.m
@@ -3,7 +3,7 @@ N_histCol = min(N_sim,25); % best looking if we don't go higher than 200, but if
 sim_per_interval = N_sim/N_histCol;
 
 %% PLOT HISTOGRAM
-montFigures.apogee_histogram_pdf = figure('Color','white','Name','Apogee histogram','Units','Normalized','Position',[0,0,1,1]);
+montFigures.apogee_histogram_pdf = figure('Color','white','Name','Apogee histogram','Units','Normalized','WindowState','maximized');
 
 
 hold on; grid on;
@@ -16,7 +16,7 @@ ylabel('Number of apogees in the same interval')
 title('Reached apogee distribution')
 legend
 
-montFigures.apogee_histogram_cumulative = figure('Color','white','Name','Apogee histogram Cumulative','Units','Normalized','Position',[0,0,1,1]);
+montFigures.apogee_histogram_cumulative = figure('Color','white','Name','Apogee histogram Cumulative','Units','Normalized','WindowState','maximized');
 hold on; grid on;
 xline(settings.z_final-10, 'r--', 'LineWidth', 1,'DisplayName','-10m from target')
 xline(settings.z_final+10, 'r--', 'LineWidth', 1,'DisplayName','+10m from target')
@@ -39,7 +39,7 @@ if ~(strcmp(contSettings.algorithm,'engine')||strcmp(contSettings.algorithm,'NoC
     arb_deploy_time_MEAN = mean(arb_deploy_time_vec);
     arb_deploy_time_MODE = mode(arb_deploy_time_vec);
     % figure
-montFigures.arb_deploy_histogram_pdf = figure('Color','white','Name','Air brakes deployment histogram','Units','Normalized','Position',[0,0,1,1]);
+montFigures.arb_deploy_histogram_pdf = figure('Color','white','Name','Air brakes deployment histogram','Units','Normalized','WindowState','maximized');
     histogram(arb_deploy_time_vec,N_histCol)
     hold on; grid on;
     xline(arb_deploy_time_MEAN,'r--')
@@ -49,7 +49,7 @@ montFigures.arb_deploy_histogram_pdf = figure('Color','white','Name','Air brakes
     title("Airbrakes deployment time's distribution")
     legend('Airbrakes time deploy','Mean', 'Median')
 
-montFigures.arb_deploy_histogram_cumulative = figure('Color','white','Name','Air brakes deployment histogram cumulative','Units','Normalized','Position',[0,0,1,1]);
+montFigures.arb_deploy_histogram_cumulative = figure('Color','white','Name','Air brakes deployment histogram cumulative','Units','Normalized','WindowState','maximized');
     histogram(arb_deploy_time_vec,N_histCol,'Normalization','cdf')
     hold on; grid on;
     xline(arb_deploy_time_MEAN,'r--')
@@ -69,17 +69,17 @@ apogee_time_MEAN = mean(apogee_time_vec);
 apogee_time_MODE = mode(apogee_time_vec);
 
 % figure
-montFigures.apogee_time_histogram_pdf = figure('Color','white','Name','Apogee time histogram','Units','Normalized','Position',[0,0,1,1]);
+montFigures.apogee_time_histogram_pdf = figure('Color','white','Name','Apogee time histogram','Units','Normalized','WindowState','maximized');
 histogram(apogee_time_vec,N_histCol,'DisplayName','Time')
 hold on; grid on;
 xline(apogee_time_MEAN,'r--','DisplayName','Average')
 xline(apogee_time_MODE,'g--','DisplayName','Mode')
-xlabel('Apogee value (m)')
+xlabel('Apogee value (s)')
 ylabel('Number of apogees in the same interval')
 title('Apogee time distribution')
 legend
 
-montFigures.apogee_time_histogram_cumulative = figure('Color','white','Name','Apogee time histogram cumulative','Units','Normalized','Position',[0,0,1,1]);
+montFigures.apogee_time_histogram_cumulative = figure('Color','white','Name','Apogee time histogram cumulative','Units','Normalized','WindowState','maximized');
 histogram(apogee_time_vec,N_histCol,'Normalization','cdf','DisplayName','Time')
 hold on; grid on;
 xline(apogee_time_MEAN,'r--','DisplayName','Average')
@@ -88,9 +88,32 @@ xlabel('Apogee value (m)')
 ylabel('Number of apogees in the same interval')
 title('Cumulative apogee time')
 legend
+
+%% PLOT COMPARISON BETWEEN RUN_ADA AND MAJORITY VOTING ADA
+
+if contSettings.run_old_ada
+    old_ada_apogee_time_vec = zeros(N_sim, 1);
+    for ii = 1:N_sim
+        old_ada_apogee_time_vec(ii) = save_thrust{ii}.sensors.old_ada.t_apogee;
+    end
+    old_ada_apo_time_mean = mean(old_ada_apogee_time_vec);
+    
+    montFigures.apogee_time_ada_comparison = figure('Color','white','Name','Apogee time histogram cumulative','Units','Normalized','WindowState','maximized');
+    histogram(apogee_time_vec, N_histCol, 'DisplayName', 'Majority ADA')
+    hold on; grid on;
+    histogram(old_ada_apogee_time_vec, N_histCol, 'DisplayName', 'run\_ADA');
+    xline(apogee_time_MEAN,'r--','DisplayName','Majority ADA Average')
+    xline(old_ada_apo_time_mean,'r--','DisplayName','run\_ADA Average')
+    xlabel('Apogee value (s)')
+    ylabel('Number of apogees in the same interval')
+    title('Apogee time distribution')
+    legend
+
+end
+
 %% PLOT APOGEE MONTECARLO STATISTICS
 if settings.scenario ~= "descent"
-montFigures.montecarlo_apogee_statistics = figure('Color','white','Name','Monte Carlo apogee statistics','Units','Normalized','Position',[0,0,1,1]);
+montFigures.montecarlo_apogee_statistics = figure('Color','white','Name','Monte Carlo apogee statistics','Units','Normalized','WindowState','maximized');
     subplot(2,1,1)
     plot(1:N_sim,apogee_mu,'DisplayName','Increasing mean')
     ylabel("Mean value")
@@ -103,7 +126,7 @@ end
 
 %% PLOT LANDING MONTECARLO STATISTICS
 if (settings.scenario == "descent" || settings.scenario == "full flight") && settings.parafoil    
-montFigures.montecarlo_landing_statistics = figure('Color','white','Name','Monte Carlo landing statistics','Units','Normalized','Position',[0,0,1,1]);
+montFigures.montecarlo_landing_statistics = figure('Color','white','Name','Monte Carlo landing statistics','Units','Normalized','WindowState','maximized');
     subplot(2,1,1)
     plot(1:N_sim,landing_mu,'DisplayName','Increasing mean')
     ylabel("Mean value")
@@ -115,7 +138,7 @@ montFigures.montecarlo_landing_statistics = figure('Color','white','Name','Monte
 end
 
 %% PLOT CONTROL
-montFigures.control_action = figure('Color','white','Name','Control action','Units','Normalized','Position',[0,0,1,1]);
+montFigures.control_action = figure('Color','white','Name','Control action','Units','Normalized','WindowState','maximized');
 for i = floor(linspace(1,N_sim,5))
     plot(save_thrust{i}.t,save_thrust{i}.Y(:,14))
     hold on; grid on;
@@ -126,7 +149,7 @@ ylabel('Servo angle \alpha (rad)')
 legend(contSettings.algorithm);
 
 %% PLOT APOGEE wrt THRUST
-montFigures.apogee_wrt_thrust = figure('Color','white','Name','Apogee wrt thrust','Units','Normalized','Position',[0,0,1,1]);
+montFigures.apogee_wrt_thrust = figure('Color','white','Name','Apogee wrt thrust','Units','Normalized','WindowState','maximized');
 hold on; grid on;
 scatter(thrust_percentage,apogee.altitude,'.')  
 yline(settings.z_final-10,'r--')
@@ -139,7 +162,7 @@ ylim([min(apogee.altitude)-20 max(apogee.altitude)+20])
 legend(contSettings.algorithm);
 
 %% PLOT APOGEE wrt MASS OFFSET
-montFigures.apogee_wrt_mass_offset = figure('Color','white','Name','Apogee wrt mass offset','Units','Normalized','Position',[0,0,1,1]);
+montFigures.apogee_wrt_mass_offset = figure('Color','white','Name','Apogee wrt mass offset','Units','Normalized','WindowState','maximized');
 hold on; grid on;
 scatter(stoch.mass_offset,apogee.altitude,'.')
 yline(settings.z_final-10,'r--')
@@ -152,7 +175,7 @@ ylim([min(apogee.altitude)-20 max(apogee.altitude)+20])
 legend(contSettings.algorithm);
 
 %% PLOT APOGEE wrt RAIL OMEGA
-montFigures.apogee_wrt_rail_OMEGA= figure('Color','white','Name','Apogee wrt rail elevation','Units','Normalized','Position',[0,0,1,1]);
+montFigures.apogee_wrt_rail_OMEGA= figure('Color','white','Name','Apogee wrt rail elevation','Units','Normalized','WindowState','maximized');
 hold on; grid on;
 scatter(rad2deg(stoch.OMEGA_rail),apogee.altitude,'.')
 yline(settings.z_final-10,'r--')
@@ -167,19 +190,19 @@ legend(contSettings.algorithm);
 %% PLOT SHUTDOWN TIME 2D
 %%% t_shutdown histogram
 if settings.scenario~= "descent"
-    montFigures.t_shutdown_histogram_pdf = figure('Color','white','Name','Shutdown time histogram','Units','Normalized','Position',[0,0,1,1]);
+    montFigures.t_shutdown_histogram_pdf = figure('Color','white','Name','Shutdown time histogram','Units','Normalized','WindowState','maximized');
     histogram(t_shutdown.value,N_histCol)
     xlabel('Shutdown time (s)')
     ylabel('Number of shutdowns in the same time interval')
     title('Engine shutdown time distribution')
     
-    montFigures.t_shutdown_histogram_cumulative = figure('Color','white','Name','Shutdown time histogram cumulative','Units','Normalized','Position',[0,0,1,1]);
+    montFigures.t_shutdown_histogram_cumulative = figure('Color','white','Name','Shutdown time histogram cumulative','Units','Normalized','WindowState','maximized');
     histogram(t_shutdown.value,N_histCol,'Normalization','cdf')
     xlabel('Shutdown time (s)')
     ylabel('Shutdown time cdf')
     title('Engine shutdown time cumulative distribution')
  %%% t_shutdown wrt wind
-    montFigures.tShutdown_wind = figure('Color','white','Name','Shutdown time wrt wind','Units','Normalized','Position',[0,0,1,1]);
+    montFigures.tShutdown_wind = figure('Color','white','Name','Shutdown time wrt wind','Units','Normalized','WindowState','maximized');
     subplot(1,3,1)
     for i = 1:N_sim
         plot(wind_el(i),save_thrust{i}.sensors.mea.t_shutdown,'.')
@@ -238,7 +261,7 @@ end
 
 %% Predicted apogee
 if (strcmp(contSettings.algorithm,'engine') || strcmp(contSettings.algorithm,'complete'))
-    montFigures.apogee_prediction = figure('Color','white','Name','Apogee prediction','Units','Normalized','Position',[0,0,1,1]);
+    montFigures.apogee_prediction = figure('Color','white','Name','Apogee prediction','Units','Normalized','WindowState','maximized');
     scatter(apogee.prediction_last_time,apogee.prediction,'k','DisplayName','Prediction');
     hold on;  grid on;
     scatter(apogee.prediction_last_time,apogee.altitude,'r','DisplayName','Simulated');
@@ -249,7 +272,7 @@ if (strcmp(contSettings.algorithm,'engine') || strcmp(contSettings.algorithm,'co
 end
 
 %% PLOT APOGEE 3D
-montFigures.apogee_3D_wind_thrust = figure('Color','white','Name','Apogee 3D wind thrust','Units','Normalized','Position',[0,0,1,1]);
+montFigures.apogee_3D_wind_thrust = figure('Color','white','Name','Apogee 3D wind thrust','Units','Normalized','WindowState','maximized');
 %%%%%%%%%% wind magnitude - thrust - apogee
 subplot(2,2,1)
 hold on; grid on;
@@ -327,7 +350,7 @@ for i =1:N_sim
     max_force_kg(i) = max(abs(force))/9.81;
 end
 
-montFigures.dynamic_pressure_and_forces = figure('Color','white','Name','Dynamic pressure and forces','Units','Normalized','Position',[0,0,1,1]);
+montFigures.dynamic_pressure_and_forces = figure('Color','white','Name','Dynamic pressure and forces','Units','Normalized','WindowState','maximized');
 %%%%%%%%%%% max dynamic pressure (Pa)
 subplot(2,1,1)
 histogram(qdyn_max,N_histCol)
@@ -348,7 +371,7 @@ for i = 1:length(save_thrust)
     est_mass(i) = save_thrust{i}.sensors.mea.mass(end);
     true_mass(i) = save_thrust{i}.sensors.mea.true_mass_at_shutdown;
 end
-montFigures.estimated_mass_histogram_pdf = figure('Color','white','Name','Estimated mass histogram','Units','Normalized','Position',[0,0,1,1]);
+montFigures.estimated_mass_histogram_pdf = figure('Color','white','Name','Estimated mass histogram','Units','Normalized','WindowState','maximized');
 histogram(est_mass,N_histCol)
 hold on;
 histogram(true_mass,N_histCol,'DisplayName','Simulated')
@@ -357,7 +380,7 @@ xlabel('Mass [kg]')
 ylabel('Number of simulations')
 title('Estimated final mass')
 
-montFigures.estimated_mass_histogram_cumulative = figure('Color','white','Name','Estimated mass histogram cumulative','Units','Normalized','Position',[0,0,1,1]);
+montFigures.estimated_mass_histogram_cumulative = figure('Color','white','Name','Estimated mass histogram cumulative','Units','Normalized','WindowState','maximized');
 histogram(est_mass,N_histCol,'DisplayName','Estimated','Normalization','cdf')
 hold on;
 histogram(true_mass,N_histCol,'DisplayName','Simulated','Normalization','cdf')
@@ -377,7 +400,7 @@ for ii = 1:N_sim
 end
 
 %%%%%%%%%%%%%%%% landing position w.r.t. target
-montFigures.landing_ellipses = figure('Color','white','Name','Landing ellipses','Units','Normalized','Position',[0,0,1,1]);
+montFigures.landing_ellipses = figure('Color','white','Name','Landing ellipses','Units','Normalized','WindowState','maximized');
 scatter(landing.position(:,1),landing.position(:,2),'k.','DisplayName','Landings')
 hold on;
 scatter(settings.payload.target(1),settings.payload.target(2),'DisplayName','Target')
@@ -394,7 +417,7 @@ legend
 
 %% Parafoil trajectories
 
-montFigures.prf_trajs = figure('Color','white','Name','Parafoil trajectories','Units','Normalized','Position',[0,0,1,1]);
+montFigures.prf_trajs = figure('Color','white','Name','Parafoil trajectories','Units','Normalized','WindowState','maximized');
 for ii = 1:N_sim
 plot3(save_thrust{ii}.Y(idx_dep:end, 2), save_thrust{ii}.Y(idx_dep:end, 1), -save_thrust{ii}.Y(idx_dep:end, 3));
 hold on;
@@ -409,7 +432,7 @@ title('Parafoil trajectories')
 % useful for realistic opening loads
 % TODO: 
 % - modify into histogram
-montFigures.apogee_velocity = figure('Color','white','Name','Apogee velocity','Units','Normalized','Position',[0,0,1,1]);
+montFigures.apogee_velocity = figure('Color','white','Name','Apogee velocity','Units','Normalized','WindowState','maximized');
 subplot(3,1,1)
 plot(apogee.horizontalSpeedX)
 title('vn')
diff --git a/simulator/src/std_run_parts/std_subsystems.m b/simulator/src/std_run_parts/std_subsystems.m
index 025f9ceb..1cd97027 100644
--- a/simulator/src/std_run_parts/std_subsystems.m
+++ b/simulator/src/std_run_parts/std_subsystems.m
@@ -8,7 +8,9 @@ This function runs all subsystems in a simulated environment
 
 %% ADA
 if settings.flagADA && settings.dataNoise
-    % [sensorData, sensorTot, settings.ada, flagApogee, flagOpenPara]   =  run_ADA(sensorData, sensorTot, settings,t1);
+    if contSettings.run_old_ada
+        [sensorData, sensorTot]   =  run_ADA(sensorData, sensorTot, settings,t1);
+    end
 
     [sensorData, sensorTot, settings.ada, flagApogee, flagOpenPara] = run_Majority_ADA(Tf, contSettings.ADA_N_instances, settings.ada, settings.frequencies.ADAFrequency, sensorData, sensorTot, currentState, engineT0);
 end
-- 
GitLab