From 0e7277b0aaee847c303491e9fb97894de812dce9 Mon Sep 17 00:00:00 2001 From: Stefano Belletti <stefano.belletti@skywarder.eu> Date: Sat, 21 Dec 2024 16:55:00 +0100 Subject: [PATCH] New noises implementation, time added to acquisition_sys --- commonFunctions/sensors/Sensor2D.m | 28 +++--- commonFunctions/sensors/Sensor3D.m | 35 ++++++- commonFunctions/sensors/SensorFault.m | 33 +++++-- commonFunctions/sensors/SensorGPS.m | 4 +- commonFunctions/sensors/acquisition_Sys.m | 20 ++-- .../initSensors2024_Lyra_Portugal_October.m | 92 +++++++++++++++---- 6 files changed, 159 insertions(+), 53 deletions(-) diff --git a/commonFunctions/sensors/Sensor2D.m b/commonFunctions/sensors/Sensor2D.m index e7f35d8..3106223 100644 --- a/commonFunctions/sensors/Sensor2D.m +++ b/commonFunctions/sensors/Sensor2D.m @@ -19,6 +19,7 @@ classdef Sensor2D < handle % noises noiseType; % White (default) or Pink noiseDataTrack1; + noiseFactor; noiseVariance; % Defining gaussian white noise % offset @@ -32,11 +33,11 @@ classdef Sensor2D < handle % creating a new sensor end - function [outputArg] = sens(obj,inputArg,temp) + function [outputArg] = sens(obj,inputArg,temp,t) inputArg = obj.addOffset(inputArg); inputArg = obj.add2DOffset(inputArg,temp); inputArg = obj.addTempOffset(inputArg,temp); - inputArg = obj.addNoise(inputArg); + inputArg = obj.addNoise(inputArg,t); inputArg = obj.quantization(inputArg); inputArg = obj.saturation(inputArg); outputArg = inputArg; @@ -65,15 +66,20 @@ classdef Sensor2D < handle outputArg = inputArg; end - function outputArg = addNoise(obj,inputArg) - if isempty(obj.noiseType) - obj.noiseType = "white"; - end - - if obj.noiseType == "white" - inputArg = inputArg+sqrt(obj.noiseVariance).*randn(length(inputArg),1); - elseif obj.noiseType == "pink" - % TBI + function outputArg = addNoise(obj,inputArg,t) + if ~isempty(obj.noiseVariance) % check for old results + inputArg = inputArg + sqrt(obj.noiseVariance).*randn(length(inputArg),1); + elseif ~isempty(obj.noiseDataTrack1) + if strcmp(obj.noiseType, "white") + inputArg = inputArg + sqrt(obj.noiseDataTrack1*obj.noiseFactor).*randn(length(inputArg),1); + elseif strcmp(obj.noiseType, "pink") + for ii = 1:length(obj.noiseDataTrack1.peaks_vect_f) + inputArg = inputArg + obj.noiseDataTrack1.peaks_vect_val(ii)*obj.noiseFactor*sin(2*pi*obj.noiseDataTrack1.peaks_vect_f(ii)*t + randn(1)); + end + inputArg = inputArg + sqrt(obj.noiseDataTrack1.variance*obj.noiseFactor).*randn(length(inputArg),1); + else + error("This noise is not defined") + end end outputArg = inputArg; end diff --git a/commonFunctions/sensors/Sensor3D.m b/commonFunctions/sensors/Sensor3D.m index 03f06aa..e3564e5 100644 --- a/commonFunctions/sensors/Sensor3D.m +++ b/commonFunctions/sensors/Sensor3D.m @@ -34,7 +34,7 @@ classdef Sensor3D < Sensor2D obj.stateWalkZ = 0; end - function [outputArg1,outputArg2,outputArg3] = sens(obj,inputArg1,inputArg2,inputArg3,temp) + function [outputArg1,outputArg2,outputArg3] = sens(obj,inputArg1,inputArg2,inputArg3,temp,t) [inputArg1,inputArg2,inputArg3] = obj.tranformAxis(inputArg1,inputArg2,inputArg3); [inputArg1,inputArg2,inputArg3] = obj.addOffset3D(inputArg1,inputArg2,inputArg3); [inputArg1,inputArg2,inputArg3] = obj.randomWalk(inputArg1,inputArg2,inputArg3); @@ -51,9 +51,7 @@ classdef Sensor3D < Sensor2D inputArg2 = obj.addTempOffset(inputArg2,temp); inputArg3 = obj.addTempOffset(inputArg3,temp); - inputArg1 = obj.addNoise(inputArg1); - inputArg2 = obj.addNoise(inputArg2); - inputArg3 = obj.addNoise(inputArg3); + [inputArg1,inputArg2,inputArg3] = obj.addNoise3D(inputArg1,inputArg2,inputArg3,t); inputArg1 = obj.quantization(inputArg1); inputArg2 = obj.quantization(inputArg2); @@ -124,6 +122,35 @@ classdef Sensor3D < Sensor2D outputArg2 = inputArg2; outputArg3 = inputArg3; end + + function [outputArg1,outputArg2,outputArg3] = addNoise3D(obj,inputArg1,inputArg2,inputArg3,t) + if ~isempty(obj.noiseVariance) % check for old results + inputArg1 = inputArg1 + sqrt(obj.noiseVariance).*randn(length(inputArg1),1); + inputArg2 = inputArg2 + sqrt(obj.noiseVariance).*randn(length(inputArg2),1); + inputArg3 = inputArg3 + sqrt(obj.noiseVariance).*randn(length(inputArg3),1); + elseif ~isempty(obj.noiseDataTrack1) + if strcmp(obj.noiseType, "white") + inputArg1 = inputArg1 + sqrt(obj.noiseDataTrack1*obj.noiseFactor).*randn(length(inputArg1),1); + inputArg2 = inputArg2 + sqrt(obj.noiseDataTrack2*obj.noiseFactor).*randn(length(inputArg2),1); + inputArg3 = inputArg3 + sqrt(obj.noiseDataTrack3*obj.noiseFactor).*randn(length(inputArg3),1); + elseif strcmp(obj.noiseType, "pink") + for ii = 1:length(obj.noiseDataTrack1.peaks_vect_f) + inputArg1 = inputArg1 + obj.noiseDataTrack1.peaks_vect_val(ii)*obj.noiseFactor*sin(2*pi*obj.noiseDataTrack1.peaks_vect_f(ii)*t + randn(1)); + inputArg2 = inputArg2 + obj.noiseDataTrack2.peaks_vect_val(ii)*obj.noiseFactor*sin(2*pi*obj.noiseDataTrack2.peaks_vect_f(ii)*t + randn(1)); + inputArg3 = inputArg3 + obj.noiseDataTrack3.peaks_vect_val(ii)*obj.noiseFactor*sin(2*pi*obj.noiseDataTrack3.peaks_vect_f(ii)*t + randn(1)); + end + inputArg1 = inputArg1 + sqrt(obj.noiseDataTrack1.variance*obj.noiseFactor).*randn(length(inputArg1),1); + inputArg2 = inputArg2 + sqrt(obj.noiseDataTrack2.variance*obj.noiseFactor).*randn(length(inputArg2),1); + inputArg3 = inputArg3 + sqrt(obj.noiseDataTrack3.variance*obj.noiseFactor).*randn(length(inputArg3),1); + else + error("This noise is not defined") + end + end + + outputArg1 = inputArg1; + outputArg2 = inputArg2; + outputArg3 = inputArg3; + end end end diff --git a/commonFunctions/sensors/SensorFault.m b/commonFunctions/sensors/SensorFault.m index 8d7b6b6..c201e86 100644 --- a/commonFunctions/sensors/SensorFault.m +++ b/commonFunctions/sensors/SensorFault.m @@ -19,6 +19,10 @@ classdef SensorFault < handle bit; % number of bits for the sensor ( if available) resolution; % resolution of the sensor + % noises + noiseType; % White (default) or Pink + noiseDataTrack1; + noiseFactor; noiseVariance; % Varianze for the gaussian white noise offset; % Offset in all directions @@ -65,7 +69,7 @@ classdef SensorFault < handle obj = obj.reset(); end - function outputArg = sens(obj,inputArg,temp) + function outputArg = sens(obj,inputArg,temp,t) %SENS Method to use the sensor. % Gets the simulation data and extract the unideal sensor % output @@ -83,7 +87,7 @@ classdef SensorFault < handle % a characteristic of the transducer or sensor in question that % we already know it's present. inputArg=obj.add2DOffset(inputArg,temp); - inputArg=obj.whiteNoise(inputArg); + inputArg=obj.addNoise(inputArg,t); inputArg=obj.addOffset(inputArg); inputArg=obj.addTempOffset(inputArg,temp); inputArg=obj.quantization(inputArg); @@ -275,7 +279,7 @@ classdef SensorFault < handle end - function outputArg = whiteNoise(obj,inputArg) + function outputArg = addNoise(obj,inputArg,t) %WHITE_NOISE Includes gaussian white noise to the sensor data % Adds gaussian white noise with variance noiseVariance % @@ -288,10 +292,27 @@ classdef SensorFault < handle % Outputs: % outputArg: sensor data with white noise - if (~isempty(obj.noiseVariance)) - %inputArg=inputArg+ones(size(inputArg)).*sqrt(obj.noiseVariance).*randn(1,1);, - inputArg=inputArg+sqrt(obj.noiseVariance).*randn(size(inputArg)); + % if (~isempty(obj.noiseVariance)) + % %inputArg=inputArg+ones(size(inputArg)).*sqrt(obj.noiseVariance).*randn(1,1);, + % inputArg=inputArg+sqrt(obj.noiseVariance).*randn(size(inputArg)); + % end + % outputArg = inputArg; + + if ~isempty(obj.noiseVariance) % check for old results + inputArg = inputArg + sqrt(obj.noiseVariance).*randn(length(inputArg),1); + elseif ~isempty(obj.noiseDataTrack1) + if strcmp(obj.noiseType, "white") + inputArg = inputArg + sqrt(obj.noiseDataTrack1*obj.noiseFactor).*randn(length(inputArg),1); + elseif strcmp(obj.noiseType, "pink") + for ii = 1:length(obj.noiseDataTrack1.peaks_vect_f) + inputArg = inputArg + obj.noiseDataTrack1.peaks_vect_val(ii)*obj.noiseFactor*sin(2*pi*obj.noiseDataTrack1.peaks_vect_f(ii)*t + randn(1)); + end + inputArg = inputArg + sqrt(obj.noiseDataTrack1.variance*obj.noiseFactor).*randn(length(inputArg),1); + else + error("This noise is not defined") + end end + outputArg = inputArg; end diff --git a/commonFunctions/sensors/SensorGPS.m b/commonFunctions/sensors/SensorGPS.m index e1ae5ad..93ee2f0 100644 --- a/commonFunctions/sensors/SensorGPS.m +++ b/commonFunctions/sensors/SensorGPS.m @@ -18,12 +18,12 @@ classdef SensorGPS < Sensor3D obj=obj@Sensor3D(); end - function [outPos, outVel] = sens(obj,state,temp,lat0,lon0) + function [outPos, outVel] = sens(obj,state,temp,lat0,lon0,t) mLat= 1/111132.95225 * state(1) + lat0; mLon= 1 / (111412.87733*cosd(mLat)) * state(2) + lon0; inputArg = [mLat; mLon; state(3:end)]; - [outMeas] = sens@Sensor2D(obj,inputArg,temp); + [outMeas] = sens@Sensor2D(obj,inputArg,temp,t); outPos = outMeas(1:3); outVel = outMeas(4:6); end diff --git a/commonFunctions/sensors/acquisition_Sys.m b/commonFunctions/sensors/acquisition_Sys.m index 1ecefd0..1f6890d 100644 --- a/commonFunctions/sensors/acquisition_Sys.m +++ b/commonFunctions/sensors/acquisition_Sys.m @@ -37,7 +37,7 @@ for i_baro = 1:3 if isfield(sensorData.barometer_sens{i_baro},'time') for ii=1:length(sensorData.barometer_sens{i_baro}.time) sensorData.barometer_sens{i_baro}.measures(ii,1) = sensorSettings.barometer1.sens(sensorData.barometer_sens{i_baro}.measures(ii)/100,... - sensorData.barometer_sens{i_baro}.temperature(ii,1) - 273.15); + sensorData.barometer_sens{i_baro}.temperature(ii,1) - 273.15, t); sensorData.barometer_sens{i_baro}.measures(ii,1) = sensorData.barometer_sens{i_baro}.measures(ii)*100; [~, sensorData.barometer_sens{i_baro}.measures(ii,1)] = sensorSettings.barometer1.applyFailure(sensorData.barometer_sens{i_baro}.measures(ii), t); sensorData.barometer_sens{i_baro}.z(ii,1) = -atmospalt(sensorData.barometer_sens{i_baro}.measures(ii),'None'); @@ -47,7 +47,7 @@ for i_baro = 1:3 if isfield(sensorData.barometer_sens{3},'time') for ii=1:length(sensorData.barometer_sens{i_baro}.time) sensorData.barometer_sens{i_baro}.measures(ii,1) = sensorSettings.barometer2.sens(sensorData.barometer_sens{i_baro}.measures(ii)/100,... - sensorData.barometer_sens{i_baro}.temperature(ii,1) - 273.15); + sensorData.barometer_sens{i_baro}.temperature(ii,1) - 273.15, t); sensorData.barometer_sens{i_baro}.measures(ii,1) = sensorData.barometer_sens{i_baro}.measures(ii)*100; [~, sensorData.barometer_sens{i_baro}.measures(ii,1)] = sensorSettings.barometer2.applyFailure(sensorData.barometer_sens{i_baro}.measures(ii), t); sensorData.barometer_sens{i_baro}.z(ii,1) = -atmospalt(sensorData.barometer_sens{i_baro}.measures(ii),'None'); @@ -57,7 +57,7 @@ for i_baro = 1:3 if isfield(sensorData.barometer_sens{3},'time') for ii=1:length(sensorData.barometer_sens{i_baro}.time) sensorData.barometer_sens{i_baro}.measures(ii,1) = sensorSettings.barometer3.sens(sensorData.barometer_sens{i_baro}.measures(ii)/100,... - sensorData.barometer_sens{i_baro}.temperature(ii,1) - 273.15); + sensorData.barometer_sens{i_baro}.temperature(ii,1) - 273.15, t); sensorData.barometer_sens{i_baro}.measures(ii,1) = sensorData.barometer_sens{i_baro}.measures(ii)*100; [~, sensorData.barometer_sens{i_baro}.measures(ii,1)] = sensorSettings.barometer3.applyFailure(sensorData.barometer_sens{i_baro}.measures(ii), t); sensorData.barometer_sens{i_baro}.z(ii,1) = -atmospalt(sensorData.barometer_sens{i_baro}.measures(ii),'None'); @@ -92,19 +92,19 @@ if isfield(sensorData.accelerometer,'time') sensorData.accelerometer.measures(ii,1)*1000/9.81,... sensorData.accelerometer.measures(ii,2)*1000/9.81,... sensorData.accelerometer.measures(ii,3)*1000/9.81,... - 14.8500); + 14.8500, t); [sensorData.gyro.measures(ii,1),sensorData.gyro.measures(ii,2),sensorData.gyro.measures(ii,3)] = ... sensorSettings.gyroscope.sens( ... sensorData.gyro.measures(ii,1)*1000*360/2/pi,... sensorData.gyro.measures(ii,2)*1000*360/2/pi,... sensorData.gyro.measures(ii,3)*1000*360/2/pi,... - 14.8500); + 14.8500, t); [sensorData.magnetometer.measures(ii,1),sensorData.magnetometer.measures(ii,2),sensorData.magnetometer.measures(ii,3)] = ... sensorSettings.magnetometer.sens( ... sensorData.magnetometer.measures(ii,1)*0.01,... sensorData.magnetometer.measures(ii,2)*0.01,... sensorData.magnetometer.measures(ii,3)*0.01,... - 14.8500); + 14.8500, t); sensorData.accelerometer.measures(ii,:) = sensorData.accelerometer.measures(ii,:)*9.81/1000; sensorData.gyro.measures(ii,:) = sensorData.gyro.measures(ii,:)*2*pi/360/1000; end @@ -129,7 +129,7 @@ if isfield(sensorData.gps,'time') sensorData.gps.velocityMeasures(ii,3); ]; [sensorData.gps.positionMeasures(ii,1:3),sensorData.gps.velocityMeasures(ii,1:3)] = ... - sensorSettings.GPS.sens(gps_data, 14.8500, sensorSettings.lat0, sensorSettings.lon0); + sensorSettings.GPS.sens(gps_data, 14.8500, sensorSettings.lat0, sensorSettings.lon0, t); end if length(sensorData.gps.time)>1 @@ -148,9 +148,9 @@ if isfield(sensorData.pitot,'time') airspeed = zeros(length(sensorData.pitot.time),1); for ii=1:length(sensorData.pitot.time) sensorData.pitot.pTotMeasures(ii) = sensorSettings.pitot_total.sens(sensorData.pitot.pTotMeasures(ii)/100,... - sensorData.pitot.temperature(ii) - 273.15); + sensorData.pitot.temperature(ii) - 273.15, t); sensorData.pitot.pStatMeasures(ii) = sensorSettings.pitot_static.sens(sensorData.pitot.pStatMeasures(ii)/100,... - sensorData.pitot.temperature(ii) - 273.15); + sensorData.pitot.temperature(ii) - 273.15, t); sensorData.pitot.pTotMeasures(ii) = sensorData.pitot.pTotMeasures(ii)*100; sensorData.pitot.pStatMeasures(ii) = sensorData.pitot.pStatMeasures(ii)*100; gamma = 1.4; @@ -180,7 +180,7 @@ end %% Chamber Pressure acquisition loop if contains(mission.name,'2023') || contains(mission.name,'2024') || contains(mission.name,'2025') for ii=1:length(sensorData.chamberPressure.time) - sensorData.chamberPressure.measures(ii) = sensorSettings.comb_chamber.sens(sensorData.chamberPressure.measures(ii)*1000,50); % 50 temperature in °C (random) + sensorData.chamberPressure.measures(ii) = sensorSettings.comb_chamber.sens(sensorData.chamberPressure.measures(ii)*1000,50,t); % 50 temperature in °C (random) sensorData.chamberPressure.measures(ii) = sensorData.chamberPressure.measures(ii)/1000; end if length(sensorData.chamberPressure.time)>1 diff --git a/data/2024_Lyra_Portugal_October/initSensors2024_Lyra_Portugal_October.m b/data/2024_Lyra_Portugal_October/initSensors2024_Lyra_Portugal_October.m index 2d5a3ff..6a30ede 100644 --- a/data/2024_Lyra_Portugal_October/initSensors2024_Lyra_Portugal_October.m +++ b/data/2024_Lyra_Portugal_October/initSensors2024_Lyra_Portugal_October.m @@ -14,7 +14,13 @@ sensorSettings.barometer1.maxMeasurementRange = 1000; % 11 sensorSettings.barometer1.minMeasurementRange = 0; % 300, 10 in mbar sensorSettings.barometer1.bit = 24; % adc on rocket is 24 bits sensorSettings.barometer1.resolution = (sensorSettings.barometer1.maxMeasurementRange -sensorSettings.barometer1.minMeasurementRange)/(2^sensorSettings.barometer1.bit); -sensorSettings.barometer1.noiseVariance = 1; % mbar^2 + + + +sensorSettings.barometer1 = loadSensorNoiseData(sensorSettings.barometer1, Lyra_Port_sensor_vect, "main_Main_StaticPressureData1.csv", 1); +% sensorSettings.barometer1.noiseVariance = 1; % mbar^2 + + sensorSettings.barometer1.fault_time = 9; % 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 @@ -43,7 +49,13 @@ sensorSettings.barometer2.maxMeasurementRange = 1000; % 11 sensorSettings.barometer2.minMeasurementRange = 0; % 300, 10 in mbar sensorSettings.barometer2.bit = 24; % adc on rocket is 24 bits sensorSettings.barometer2.resolution = (sensorSettings.barometer2.maxMeasurementRange -sensorSettings.barometer2.minMeasurementRange)/(2^sensorSettings.barometer2.bit); -sensorSettings.barometer2.noiseVariance = 1; % mbar^2 + + + +sensorSettings.barometer2 = loadSensorNoiseData(sensorSettings.barometer2, Lyra_Port_sensor_vect, "main_Main_StaticPressureData2.csv", 1); +% sensorSettings.barometer2.noiseVariance = 1; % mbar^2 + + sensorSettings.barometer2.fault_time = -1; % if negative it will be generated at random between a max and a min value sensorSettings.barometer2.max_fault_time = 96; % max seconds to wait before possible fault @@ -72,7 +84,13 @@ sensorSettings.barometer3.maxMeasurementRange = 4060; % 11 sensorSettings.barometer3.minMeasurementRange = 260; % 300, 10 in mbar sensorSettings.barometer3.bit = 24; sensorSettings.barometer3.resolution = (sensorSettings.barometer3.maxMeasurementRange -sensorSettings.barometer3.minMeasurementRange)/(2^sensorSettings.barometer3.bit); -sensorSettings.barometer3.noiseVariance = 4.06; % guess in mbar + + + +sensorSettings.barometer3 = loadSensorNoiseData(sensorSettings.barometer3, Lyra_Port_sensor_vect, "main_Boardcore_LPS28DFWData.csv", 1); +% sensorSettings.barometer3.noiseVariance = 4.06; % guess in mbar + + sensorSettings.barometer3.fault_time = -1; % if negative it will be generated at random between a max and a min value sensorSettings.barometer3.max_fault_time = 96; % max seconds to wait before possible fault @@ -100,7 +118,14 @@ sensorSettings.accelerometer = Sensor3D(); sensorSettings.accelerometer.maxMeasurementRange = 16000; % 2000, 4000, 8000, 16000 in mg sensorSettings.accelerometer.minMeasurementRange = -16000; % -2000, -4000, -8000, -16000 in mg sensorSettings.accelerometer.bit = 16; -sensorSettings.accelerometer.noiseVariance = 10; % guess in mg + + + +sensorSettings.accelerometer = loadSensorNoiseData(sensorSettings.accelerometer, Lyra_Port_sensor_vect, "main_Boardcore_LSM6DSRXData.csv", 1); +% sensorSettings.accelerometer.noiseVariance = 10; % guess in mg + + + sensorSettings.accelerometer.offsetX = 0; % +-90 in mg sensorSettings.accelerometer.offsetY = 0; % +-90 in mg sensorSettings.accelerometer.offsetZ = 0; % +-90 in mg @@ -113,7 +138,14 @@ sensorSettings.gyroscope = Sensor3D(); sensorSettings.gyroscope.maxMeasurementRange = 245e3; % 245e3, 500e3, 2000e3 in mdps sensorSettings.gyroscope.minMeasurementRange = -245e3; % -245e3, -500e3, -2000e3 in mdps sensorSettings.gyroscope.bit = 16; -sensorSettings.gyroscope.noiseVariance = 50; % guess in mdps 100 was original + + + +sensorSettings.gyroscope = loadSensorNoiseData(sensorSettings.gyroscope, Lyra_Port_sensor_vect, "main_Boardcore_LSM6DSRXData.csv", 2); +% sensorSettings.gyroscope.noiseVariance = 50; % guess in mdps 100 was original + + + sensorSettings.gyroscope.offsetX = 0; % +-30e3 in mdps sensorSettings.gyroscope.offsetY = 0; % +-30e3 in mdps sensorSettings.gyroscope.offsetZ = 0; % +-30e3 in mdps @@ -151,13 +183,13 @@ sensorSettings.spheroid = wgs84Ellipsoid; sensorSettings.comb_chamber = Sensor2D(); -sensorSettings.comb_chamber = loadSensorNoiseData(sensorSettings.comb_chamber, Lyra_Port_sensor_vect, "motor_Motor_TopTankPressureData.csv"); +sensorSettings.comb_chamber = loadSensorNoiseData(sensorSettings.comb_chamber, Lyra_Port_sensor_vect, "motor_Motor_TopTankPressureData.csv", 1); sensorSettings.comb_chamber.maxMeasurementRange = 40000; % 1100, 1300 in mbar sensorSettings.comb_chamber.minMeasurementRange = 0; % 300, 10 in mbar -sensorSettings.comb_chamber.noiseVariance = 60000; % mbar +% sensorSettings.comb_chamber.noiseVariance = 60000; % mbar % sensorSettings.comb_chamber.error2dOffset = ep_data; % [p in mbar, T in Celsius, ep in mbar] sensorSettings.comb_chamber.resolution = 1; % random value stolen from baro sensorSettings.comb_chamber.offset = 0; @@ -168,14 +200,16 @@ sensorSettings.pitot_static = Sensor2D(); sensorSettings.pitot_static.maxMeasurementRange = 1034.21; % mbar (15 psi) sensorSettings.pitot_static.minMeasurementRange = 0; sensorSettings.pitot_static.bit = 12; -sensorSettings.pitot_static.noiseVariance = 0.043043; % from flight logs +sensorSettings.pitot_static = loadSensorNoiseData(sensorSettings.pitot_static, Lyra_Port_sensor_vect, "payload_Payload_StaticPressureData.csv", 1); +% sensorSettings.pitot_static.noiseVariance = 0.043043; % from flight logs % total pressure sensorSettings.pitot_total = Sensor2D(); sensorSettings.pitot_total.maxMeasurementRange = 2*1034.21; % mbar (30 psi) sensorSettings.pitot_total.minMeasurementRange = 0; sensorSettings.pitot_total.bit = 12; -sensorSettings.pitot_total.noiseVariance = 2*0.043043; % from flight logs +sensorSettings.pitot_total = loadSensorNoiseData(sensorSettings.pitot_total, Lyra_Port_sensor_vect, "payload_Payload_StaticPressureData.csv", 1); +% sensorSettings.pitot_total.noiseVariance = 2*0.043043; % from flight logs %% total sensor initialization % @@ -185,27 +219,45 @@ sensorSettings.pitot_total.noiseVariance = 2*0.043043; %% Functions -function [obj] = loadSensorNoiseData(obj, vect, name) +function [obj] = loadSensorNoiseData(obj, vect, name, number) len = length(vect); for ii = 1:len found = strcmp(name, vect(ii).name); if found - break + if number>1 + number = number - 1; + else + break + end end end -obj.noiseType = vect(ii).noise_type; - -if strcmp("Sensor2D", class(obj)) - obj.noiseDataTrack1 = vect(ii).track1; -elseif strcmp("Sensor3D", class(obj)) || strcmp("SensorGPS", class(obj)) - obj.noiseDataTrack1 = vect(ii).track1; - obj.noiseDataTrack2 = vect(ii).track2; - obj.noiseDataTrack3 = vect(ii).track3; +if found + obj.noiseType = vect(ii).noise_type; + + if strcmp("Sensor2D", class(obj)) || strcmp("SensorFault", class(obj)) + obj.noiseDataTrack1 = vect(ii).track1; + obj.noiseFactor = vect(ii).factor; + elseif strcmp("Sensor3D", class(obj)) || strcmp("SensorGPS", class(obj)) + obj.noiseDataTrack1 = vect(ii).track1; + obj.noiseDataTrack2 = vect(ii).track2; + obj.noiseDataTrack3 = vect(ii).track3; + obj.noiseFactor = vect(ii).factor; + else + error("Sensor not defined") + end else - error("Not found") + if strcmp("Sensor2D", class(obj)) || strcmp("SensorFault", class(obj)) + obj.noiseDataTrack1 = []; + elseif strcmp("Sensor3D", class(obj)) || strcmp("SensorGPS", class(obj)) + obj.noiseDataTrack1 = []; + obj.noiseDataTrack2 = []; + obj.noiseDataTrack3 = []; + else + error("Sensor not defined") + end end end -- GitLab