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