From 9107f16f2155ab46caed0c1e25168ba425630526 Mon Sep 17 00:00:00 2001
From: Stefano Belletti <stefano.belletti@skywarder.eu>
Date: Fri, 17 Jan 2025 11:40:12 +0100
Subject: [PATCH] New function update - Sensor1D

---
 commonFunctions/sensors/Sensor1D.m            | 72 +++++++++++++++++--
 .../initSensors2024_Lyra_Portugal_October.m   | 18 +++--
 2 files changed, 80 insertions(+), 10 deletions(-)

diff --git a/commonFunctions/sensors/Sensor1D.m b/commonFunctions/sensors/Sensor1D.m
index 7730774..5b4d509 100644
--- a/commonFunctions/sensors/Sensor1D.m
+++ b/commonFunctions/sensors/Sensor1D.m
@@ -44,6 +44,73 @@ classdef Sensor1D < handle
             inputArg = obj.saturation(inputArg);
             outputArg = inputArg;
         end
+
+        function [] = update(obj,varargin)
+            if isa(obj,'SensorGPS')
+                error("Do not use .update for class SensorGPS")
+            end
+
+            if isempty(obj.minMeasurementRange)
+                error("Empty minMeasurementRange")
+            end
+            if isempty(obj.maxMeasurementRange)
+                error("Empty minMeasurementRange")
+            end
+
+            if isempty(obj.resolution)
+                if ~isempty(obj.bit)
+                    obj.resolution = (obj.maxMeasurementRange - obj.minMeasurementRange)/(2^obj.bit);
+                else
+                    error("Empty bit")
+                end
+            end
+
+            % Noise
+            if size(varargin,2) == 3
+                vect = varargin{1};
+                name = varargin{2};
+                number = varargin{3};
+
+                len = length(vect);
+
+                for ii = 1:len
+                    found = strcmp(name, vect(ii).name);
+                    if found
+                        if number>1
+                            number = number - 1;
+                        else
+                            break
+                        end
+                    end
+                end
+                
+                if found
+                    obj.noiseType = vect(ii).noise_type;
+                    
+                    if isa(obj,"Sensor1D") || isa(obj,"SensorFault")
+                        obj.noiseDataTrack1 = vect(ii).track1;
+                        obj.noiseFactor = vect(ii).factor;
+                    elseif isa(obj,"Sensor3D") || isa(obj,"SensorGPS")
+                        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
+                    if isa(obj,"Sensor1D") || isa(obj,"SensorFault")
+                        obj.noiseDataTrack1 = [];
+                    elseif isa(obj,"Sensor3D") || isa(obj,"SensorGPS")
+                        obj.noiseDataTrack1 = [];
+                        obj.noiseDataTrack2 = [];
+                        obj.noiseDataTrack3 = [];
+                    else
+                        error("Sensor not defined")
+                    end
+                end
+            end
+        end
     end
 
     methods (Access = 'protected')
@@ -91,11 +158,6 @@ classdef Sensor1D < handle
 
         function outputArg = quantization(obj,inputArg)
             % Quantization of the input
-            if isempty(obj.resolution)
-                if (~isempty(obj.maxMeasurementRange)) && (~isempty(obj.minMeasurementRange)) && (~isempty(obj.bit))
-                    obj.resolution = (obj.maxMeasurementRange - obj.minMeasurementRange)/(2^obj.bit);
-                end
-            end
             if ~isempty(obj.resolution)
                 inputArg = obj.resolution*round(inputArg/obj.resolution);
             end
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 ba35e39..3ba0538 100644
--- a/data/2024_Lyra_Portugal_October/initSensors2024_Lyra_Portugal_October.m
+++ b/data/2024_Lyra_Portugal_October/initSensors2024_Lyra_Portugal_October.m
@@ -107,7 +107,6 @@ sensorSettings.accelerometer.maxMeasurementRange   =   16000;
 sensorSettings.accelerometer.minMeasurementRange   =   -16000;                      % -2000, -4000, -8000, -16000 in mg
 sensorSettings.accelerometer.bit                   =   16; 
 
-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
@@ -116,6 +115,8 @@ sensorSettings.accelerometer.offsetZ               =   0;
 sensorSettings.accelerometer.walkDiffusionCoef     =   0;                           % guess
 sensorSettings.accelerometer.dt                    =   0.01;                        % sampling time
 
+sensorSettings.accelerometer.update(Lyra_Port_sensor_vect, "main_Boardcore_LSM6DSRXData.csv", 1);
+
 %% initial gyroscope sensor from LSM9DS1
 % NOTE: angular rate in mdps
 sensorSettings.gyroscope = Sensor3D();
@@ -123,7 +124,6 @@ sensorSettings.gyroscope.maxMeasurementRange   =   245e3;
 sensorSettings.gyroscope.minMeasurementRange   =   -245e3;                          % -245e3, -500e3, -2000e3 in mdps
 sensorSettings.gyroscope.bit                   =   16;
 
-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
@@ -133,6 +133,8 @@ sensorSettings.gyroscope.walkDiffusionCoef     =   1;
 sensorSettings.gyroscope.dt                    =   0.01;                            % sampling time
 sensorSettings.gyroscope.transMatrix           =   diag([1 1 1]);                   % axis transformation
 
+sensorSettings.gyroscope.update(Lyra_Port_sensor_vect, "main_Boardcore_LSM6DSRXData.csv", 2);
+
 %% initial magnetometer sensor from LSM9DS1
 % NOTE: magnetic field in mG (m Gauss)
 sensorSettings.magnetometer = Sensor3D();
@@ -147,6 +149,8 @@ sensorSettings.magnetometer.walkDiffusionCoef     =   0;
 sensorSettings.magnetometer.dt                    =   0.01;                         % sampling time
 sensorSettings.magnetometer.transMatrix           =   diag([1 1 1]);                % axis transformation
 
+sensorSettings.magnetometer.update();
+
 %% initial GPS sensor from NEO-M9N
 % NOTE: lon, in degree lat in degree, alt in m
 sensorSettings.GPS = SensorGPS();
@@ -162,7 +166,6 @@ sensorSettings.spheroid            =   wgs84Ellipsoid;
 %       check 2D offset for chamber pressure sensor
 sensorSettings.comb_chamber = Sensor1D();
 
-sensorSettings.comb_chamber = loadSensorNoiseData(sensorSettings.comb_chamber, Lyra_Port_sensor_vect, "motor_Motor_TopTankPressureData.csv", 1);
 % sensorSettings.comb_chamber.noiseVariance         =   60000;                        % mbar
 
 sensorSettings.comb_chamber.maxMeasurementRange   =   40000;                        % 1100, 1300 in mbar
@@ -171,6 +174,9 @@ sensorSettings.comb_chamber.minMeasurementRange   =   0;
 sensorSettings.comb_chamber.resolution            =   1;                            % random value stolen from baro
 sensorSettings.comb_chamber.offset                =   0;
 
+sensorSettings.comb_chamber.update(Lyra_Port_sensor_vect, "motor_Motor_TopTankPressureData.csv", 1);
+
+
 %% pitot  
 % static pressure
 sensorSettings.pitot_static = Sensor1D();
@@ -178,17 +184,19 @@ sensorSettings.pitot_static.maxMeasurementRange   =   1034.21;
 sensorSettings.pitot_static.minMeasurementRange   =   0;
 sensorSettings.pitot_static.bit                   =   12; 
 
-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
 
+sensorSettings.pitot_static.update(Lyra_Port_sensor_vect, "payload_Payload_StaticPressureData.csv", 1);
+
 % total pressure
 sensorSettings.pitot_total = Sensor1D();
 sensorSettings.pitot_total.maxMeasurementRange   =   2*1034.21;                     % mbar (30 psi)
 sensorSettings.pitot_total.minMeasurementRange   =   0;
 sensorSettings.pitot_total.bit                   =   12; 
-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
 
+sensorSettings.pitot_total.update(Lyra_Port_sensor_vect, "payload_Payload_StaticPressureData.csv", 1);
+
 %% total sensor initialization 
 % 
 % now is in std_setInitialParams.m
-- 
GitLab