From 44617c524432e4ba0e31d9b2eea71674a3d02e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Disar=C3=B2?= <federico.disaro@skywarder.eu> Date: Thu, 15 Feb 2024 21:11:14 +0100 Subject: [PATCH] [SFD] Added single spike fault --- .../sensors/Sensor_with_fault_sim.m | 15 +++++++++++++- .../initSensorsGemini_Portugal_October_2023.m | 20 ++++++++++++++----- simulator/configs/configFaults.m | 2 ++ simulator/configs/config_sfd_hr.m | 2 +- simulator/src/sensor_plots.m | 3 ++- 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/commonFunctions/sensors/Sensor_with_fault_sim.m b/commonFunctions/sensors/Sensor_with_fault_sim.m index 78b3c0b5..df90bce7 100644 --- a/commonFunctions/sensors/Sensor_with_fault_sim.m +++ b/commonFunctions/sensors/Sensor_with_fault_sim.m @@ -129,6 +129,13 @@ classdef Sensor_with_fault_sim < handle if obj.settings.calerr sensorData(i) = sensorData(i)*obj.gain; end + if obj.settings.ss + if sensorData(i) == obj.value + obj.settings.ss = false; + else + sensorData(i) = obj.value; + end + end if obj.settings.fs if rand > (1 - obj.likelihoodFS) sensorData(i) = obj.value; @@ -185,7 +192,12 @@ classdef Sensor_with_fault_sim < handle obj.gain = gain; obj.settings.calerr = true; end - + + function obj = setSingleSpike(obj, value) + obj.value = value; + obj.settings.ss = true; + end + function obj = setFixedSpiking(obj, value, likelihood) if (likelihood > 0 && likelihood < 1) obj.value = value; @@ -380,6 +392,7 @@ classdef Sensor_with_fault_sim < handle obj.settings.degradation = false; obj.settings.freezing = false; obj.settings.calerr = false; + obj.settings.ss = false; obj.settings.fs = false; obj.settings.is = false; diff --git a/data/Gemini_Portugal_October_2023/initSensorsGemini_Portugal_October_2023.m b/data/Gemini_Portugal_October_2023/initSensorsGemini_Portugal_October_2023.m index 71621e87..156f11e2 100644 --- a/data/Gemini_Portugal_October_2023/initSensorsGemini_Portugal_October_2023.m +++ b/data/Gemini_Portugal_October_2023/initSensorsGemini_Portugal_October_2023.m @@ -16,7 +16,7 @@ sensorSettings.barometer1.noiseVariance = 0.1; % mb if settings.montecarlo && settings.montecarlo_only_fault_sim - sensorSettings.barometer2.fault_time = settings_mont.fault.time(1); + sensorSettings.barometer1.fault_time = settings_mont.fault.time(1); switch settings_mont.fault.type(1) case 1 @@ -30,15 +30,14 @@ if settings.montecarlo && settings.montecarlo_only_fault_sim [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds case 4 sensorSettings.barometer1.setDrift( settings_mont.fault.amp(1) ); - [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds - + [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds otherwise end else sensorSettings.barometer1.fault_time = -1; %if negative it will be generated at random between a max and a min value - sensorSettings.barometer1.max_fault_time = 96; %max seconds to wait before possible fault + sensorSettings.barometer1.max_fault_time = 16; %max seconds to wait before possible fault sensorSettings.barometer1.min_fault_time = 6; %min seconds to wait before possible fault % fault generation @@ -58,7 +57,10 @@ else drift_value_1 = round( settings.fault_sim.min_drift_value + rand()*settings.fault_sim.max_drift_value ); sensorSettings.barometer1.setDrift(drift_value_1); [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds - + case "sSpike" + value_1 = 1e5; + sensorSettings.barometer1.setSingleSpike(value_1); + [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds otherwise end @@ -116,6 +118,10 @@ else drift_value_2 = round( settings.fault_sim.min_drift_value + rand()*settings.fault_sim.max_drift_value ); sensorSettings.barometer2.setDrift(drift_value_2); [sensorSettings.barometer2, fault_time_2] = sensorSettings.barometer2.setErrorTime(); % in seconds + case "sSpike" + value_2 = 1e5; + sensorSettings.barometer2.setSingleSpike(value_2); + [sensorSettings.barometer2, fault_time_2] = sensorSettings.barometer2.setErrorTime(); % in seconds otherwise end @@ -176,6 +182,10 @@ else drift_value_3 = round( settings.fault_sim.min_drift_value + rand()*settings.fault_sim.max_drift_value ); sensorSettings.barometer3.setDrift(drift_value_3); [sensorSettings.barometer3, fault_time_3] = sensorSettings.barometer3.setErrorTime(); % in seconds + case "sSpike" + value_3 = 1e5; + sensorSettings.barometer3.setSingleSpike(value_3); + [sensorSettings.barometer3, fault_time_3] = sensorSettings.barometer3.setErrorTime(); % in seconds otherwise end diff --git a/simulator/configs/configFaults.m b/simulator/configs/configFaults.m index 9e915f63..3971f284 100644 --- a/simulator/configs/configFaults.m +++ b/simulator/configs/configFaults.m @@ -59,6 +59,8 @@ else % fault generation is done randomly between a set of parameters in configfa settings.fault_sim.fault_type(rand_sensor) = "freezing"; case 4 settings.fault_sim.fault_type(rand_sensor) = "drift"; + case 5 + settings.fault_sim.fault_type(rand_sensor) = "sSpike"; end end end diff --git a/simulator/configs/config_sfd_hr.m b/simulator/configs/config_sfd_hr.m index a8a7cf23..9404cc0d 100644 --- a/simulator/configs/config_sfd_hr.m +++ b/simulator/configs/config_sfd_hr.m @@ -1,6 +1,6 @@ %% settings parameters for SFD_HR algorithm -settings.flagSFD_HR = true; +settings.flagSFD_HR = false; % number of consecutive constant values after which a sensor is labled frozen settings.sfd_hr.n_freeze = 5; diff --git a/simulator/src/sensor_plots.m b/simulator/src/sensor_plots.m index 59246920..79c21996 100644 --- a/simulator/src/sensor_plots.m +++ b/simulator/src/sensor_plots.m @@ -18,7 +18,8 @@ xline( [simOutput.sensors.ada.t_apogee], '-', {'ADA apogee detection'}, 'HandleV xline( [simOutput.apogee.time], '-', {'SIMULATION apogee time'}, 'HandleVisibility','off' ); legend -title('Barometer measurements') +xlabel('Time (s)') +ylabel('Pressure (Pa)') %% static pitot vs static presure figure -- GitLab