diff --git a/commonFunctions/sensors/Sensor_with_fault_sim.m b/commonFunctions/sensors/Sensor_with_fault_sim.m index 78b3c0b5b54b3e2e99db86f5087045160c7f35d0..df90bce7ca7db7d69d5cb2a2369a1e865d211b54 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 71621e879c9349da592ebb451c7052f587372e3d..156f11e2ddeb1099876b8701114b7de551097c5d 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 9e915f632ea6a21d3af2b1fca5d98fea4beaaded..3971f28400e7cd83b572f8c1af0d46dca3419f73 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 a8a7cf23c0d73f1ecfb21564cb41133b7b2cf314..9404cc0d3db79d2d2aa310d98695f4529455d17a 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 59246920dfe323bd2cfa901a71f8f99425577a30..79c21996b37d5c3d08c43a4382e846d7d233c5d2 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