From dc85374afae0fc7c4de84662bd06070b61d7ee5a Mon Sep 17 00:00:00 2001 From: Stefano Belletti <stefano.belletti@skywarder.eu> Date: Sat, 22 Feb 2025 12:34:00 +0100 Subject: [PATCH] New Orion data for noise analysis --- .../{ => 2024_Lyra}/mat_creator.m | 10 - .../NoiseAnalysis/2025_Orion/mat_creator.m | 128 ++++++++++ .../NoiseAnalysis/main_noiseAnalysis.m | 38 ++- .../Lyra_Port_sensor_vect_res.mat | Bin 4397 -> 4397 bytes .../initSensors2025_Orion_Portugal_October.m | 239 +++++++++--------- ...nitSensors2025_Orion_Roccaraso_September.m | 233 ++++++++--------- simulator/configs/configMission.m | 66 ----- simulator/configs/configPath.m | 8 +- simulator/src/sensor_plots.m | 2 +- 9 files changed, 394 insertions(+), 330 deletions(-) rename commonFunctions/sensors/NoiseAnalysis/{ => 2024_Lyra}/mat_creator.m (96%) create mode 100644 commonFunctions/sensors/NoiseAnalysis/2025_Orion/mat_creator.m delete mode 100644 simulator/configs/configMission.m diff --git a/commonFunctions/sensors/NoiseAnalysis/mat_creator.m b/commonFunctions/sensors/NoiseAnalysis/2024_Lyra/mat_creator.m similarity index 96% rename from commonFunctions/sensors/NoiseAnalysis/mat_creator.m rename to commonFunctions/sensors/NoiseAnalysis/2024_Lyra/mat_creator.m index bd319e46..611e07b7 100644 --- a/commonFunctions/sensors/NoiseAnalysis/mat_creator.m +++ b/commonFunctions/sensors/NoiseAnalysis/2024_Lyra/mat_creator.m @@ -5,7 +5,6 @@ close all ii = 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "main_Boardcore_LIS2MDLData.csv"; Lyra_Port_sensor_vect(ii).info = "Mag"; Lyra_Port_sensor_vect(ii).fs = 100; @@ -19,7 +18,6 @@ Lyra_Port_sensor_vect(ii).factor = 1000; ii = ii + 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "main_Main_StaticPressureData1.csv"; Lyra_Port_sensor_vect(ii).info = "barometer1"; Lyra_Port_sensor_vect(ii).fs = 100; @@ -33,7 +31,6 @@ Lyra_Port_sensor_vect(ii).factor = 0.01; ii = ii + 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "main_Main_StaticPressureData2.csv"; Lyra_Port_sensor_vect(ii).info = "barometer2"; Lyra_Port_sensor_vect(ii).fs = 100; @@ -47,7 +44,6 @@ Lyra_Port_sensor_vect(ii).factor = 0.01; ii = ii + 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "payload_Payload_StaticPressureData.csv"; Lyra_Port_sensor_vect(ii).info = "StaticPressure"; Lyra_Port_sensor_vect(ii).fs = 100; @@ -61,7 +57,6 @@ Lyra_Port_sensor_vect(ii).factor = 0.01; ii = ii + 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "payload_Payload_DynamicPressureData.csv"; Lyra_Port_sensor_vect(ii).info = "DynamicPressure"; Lyra_Port_sensor_vect(ii).fs = 100; @@ -75,7 +70,6 @@ Lyra_Port_sensor_vect(ii).factor = 0.01; ii = ii + 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "main_Boardcore_LPS28DFWData.csv"; Lyra_Port_sensor_vect(ii).info = "barometer3"; Lyra_Port_sensor_vect(ii).fs = 50; @@ -86,7 +80,6 @@ Lyra_Port_sensor_vect(ii).factor = 0.01; ii = ii + 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "main_Boardcore_LSM6DSRXData.csv"; Lyra_Port_sensor_vect(ii).info = "accelerometer"; Lyra_Port_sensor_vect(ii).fs = 440; @@ -97,7 +90,6 @@ Lyra_Port_sensor_vect(ii).factor = 1000/9.81; ii = ii + 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "main_Boardcore_LSM6DSRXData.csv"; Lyra_Port_sensor_vect(ii).info = "initial gyroscope"; Lyra_Port_sensor_vect(ii).fs = 440; @@ -108,7 +100,6 @@ Lyra_Port_sensor_vect(ii).factor = 180/pi*1000; ii = ii + 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "motor_Motor_CCPressureData.csv"; Lyra_Port_sensor_vect(ii).info = "initial chamber pressure"; Lyra_Port_sensor_vect(ii).fs = 100; @@ -122,7 +113,6 @@ Lyra_Port_sensor_vect(ii).factor = 0.01; ii = ii + 1; -% Ok, check factor Lyra_Port_sensor_vect(ii).name = "payload_Payload_StaticPressureData.csv"; Lyra_Port_sensor_vect(ii).info = "pitot (static + total)"; Lyra_Port_sensor_vect(ii).fs = 100; diff --git a/commonFunctions/sensors/NoiseAnalysis/2025_Orion/mat_creator.m b/commonFunctions/sensors/NoiseAnalysis/2025_Orion/mat_creator.m new file mode 100644 index 00000000..7cc074d6 --- /dev/null +++ b/commonFunctions/sensors/NoiseAnalysis/2025_Orion/mat_creator.m @@ -0,0 +1,128 @@ +%% new .mat for init Temp 2025 - Orion + +clear, clc +close all + +ii = 1; + +Orion_Temp_sensor_vect(ii).name = "main_Boardcore_LIS2MDLData.csv"; +Orion_Temp_sensor_vect(ii).info = "Mag"; +Orion_Temp_sensor_vect(ii).fs = 100; +Orion_Temp_sensor_vect(ii).noise_type = "pink"; +Orion_Temp_sensor_vect(ii).colored_data.white_variance = 0.00003; +Orion_Temp_sensor_vect(ii).colored_data.fcut = 0.3; +Orion_Temp_sensor_vect(ii).colored_data.butterOrder = 1; +Orion_Temp_sensor_vect(ii).bounds = [0.5 0.7]; +Orion_Temp_sensor_vect(ii).tracks = [2 3 4]; +Orion_Temp_sensor_vect(ii).factor = 1000; + +ii = ii + 1; + +Orion_Temp_sensor_vect(ii).name = "main_Main_StaticPressureData1.csv"; +Orion_Temp_sensor_vect(ii).info = "barometer1"; +Orion_Temp_sensor_vect(ii).fs = 100; +Orion_Temp_sensor_vect(ii).noise_type = "pink"; +Orion_Temp_sensor_vect(ii).colored_data.white_variance = 10; +Orion_Temp_sensor_vect(ii).colored_data.fcut = 0.3; +Orion_Temp_sensor_vect(ii).colored_data.butterOrder = 1; +Orion_Temp_sensor_vect(ii).bounds = [0.6 0.7]; +Orion_Temp_sensor_vect(ii).tracks = 2; +Orion_Temp_sensor_vect(ii).factor = 0.01; + +ii = ii + 1; + +Orion_Temp_sensor_vect(ii).name = "main_Main_StaticPressureData2.csv"; +Orion_Temp_sensor_vect(ii).info = "barometer2"; +Orion_Temp_sensor_vect(ii).fs = 100; +Orion_Temp_sensor_vect(ii).noise_type = "pink"; +Orion_Temp_sensor_vect(ii).colored_data.white_variance = 15; +Orion_Temp_sensor_vect(ii).colored_data.fcut = 0.3; +Orion_Temp_sensor_vect(ii).colored_data.butterOrder = 1; +Orion_Temp_sensor_vect(ii).bounds = [0.6 0.7]; +Orion_Temp_sensor_vect(ii).tracks = 2; +Orion_Temp_sensor_vect(ii).factor = 0.01; + +ii = ii + 1; + +Orion_Temp_sensor_vect(ii).name = "payload_Payload_StaticPressureData.csv"; +Orion_Temp_sensor_vect(ii).info = "StaticPressure"; +Orion_Temp_sensor_vect(ii).fs = 100; +Orion_Temp_sensor_vect(ii).noise_type = "pink"; +Orion_Temp_sensor_vect(ii).colored_data.white_variance = 30; +Orion_Temp_sensor_vect(ii).colored_data.fcut = 0.3; +Orion_Temp_sensor_vect(ii).colored_data.butterOrder = 1; +Orion_Temp_sensor_vect(ii).bounds = [0.3 0.4]; +Orion_Temp_sensor_vect(ii).tracks = 2; +Orion_Temp_sensor_vect(ii).factor = 0.01; + +ii = ii + 1; + +Orion_Temp_sensor_vect(ii).name = "payload_Payload_DynamicPressureData.csv"; +Orion_Temp_sensor_vect(ii).info = "DynamicPressure"; +Orion_Temp_sensor_vect(ii).fs = 100; +Orion_Temp_sensor_vect(ii).noise_type = "colored"; +Orion_Temp_sensor_vect(ii).colored_data.white_variance = 12; +Orion_Temp_sensor_vect(ii).colored_data.fcut = 0.05; +Orion_Temp_sensor_vect(ii).colored_data.butterOrder = 1; +Orion_Temp_sensor_vect(ii).bounds = [0.06 0.14]; +Orion_Temp_sensor_vect(ii).tracks = 2; +Orion_Temp_sensor_vect(ii).factor = 0.01; + +ii = ii + 1; + +Orion_Temp_sensor_vect(ii).name = "main_Boardcore_LPS28DFWData.csv"; +Orion_Temp_sensor_vect(ii).info = "barometer3"; +Orion_Temp_sensor_vect(ii).fs = 50; +Orion_Temp_sensor_vect(ii).noise_type = "white"; +Orion_Temp_sensor_vect(ii).bounds = [0.13 0.23]; +Orion_Temp_sensor_vect(ii).tracks = 2; +Orion_Temp_sensor_vect(ii).factor = 0.01; + +ii = ii + 1; + +Orion_Temp_sensor_vect(ii).name = "main_Boardcore_LSM6DSRXData.csv"; +Orion_Temp_sensor_vect(ii).info = "accelerometer"; +Orion_Temp_sensor_vect(ii).fs = 440; +Orion_Temp_sensor_vect(ii).noise_type = "white"; +Orion_Temp_sensor_vect(ii).bounds = [0.35 0.5]; +Orion_Temp_sensor_vect(ii).tracks = [2 3 4]; +Orion_Temp_sensor_vect(ii).factor = 1000/9.81; + +ii = ii + 1; + +Orion_Temp_sensor_vect(ii).name = "main_Boardcore_LSM6DSRXData.csv"; +Orion_Temp_sensor_vect(ii).info = "initial gyroscope"; +Orion_Temp_sensor_vect(ii).fs = 440; +Orion_Temp_sensor_vect(ii).noise_type = "white"; +Orion_Temp_sensor_vect(ii).bounds = [0.35 0.5]; +Orion_Temp_sensor_vect(ii).tracks = [6 7 8]; +Orion_Temp_sensor_vect(ii).factor = 180/pi*1000; + +ii = ii + 1; + +Orion_Temp_sensor_vect(ii).name = "motor_Motor_CCPressureData.csv"; +Orion_Temp_sensor_vect(ii).info = "initial chamber pressure"; +Orion_Temp_sensor_vect(ii).fs = 100; +Orion_Temp_sensor_vect(ii).noise_type = "colored"; +Orion_Temp_sensor_vect(ii).colored_data.white_variance = 0.000025; +Orion_Temp_sensor_vect(ii).colored_data.fcut = 0.15; +Orion_Temp_sensor_vect(ii).colored_data.butterOrder = 1; +Orion_Temp_sensor_vect(ii).bounds = [0.35 0.5]; +Orion_Temp_sensor_vect(ii).tracks = 2; +Orion_Temp_sensor_vect(ii).factor = 0.01; + +ii = ii + 1; + +Orion_Temp_sensor_vect(ii).name = "payload_Payload_StaticPressureData.csv"; +Orion_Temp_sensor_vect(ii).info = "pitot (static + total)"; +Orion_Temp_sensor_vect(ii).fs = 100; +Orion_Temp_sensor_vect(ii).noise_type = "pink"; +Orion_Temp_sensor_vect(ii).colored_data.white_variance = 10; +Orion_Temp_sensor_vect(ii).colored_data.fcut = 0.3; +Orion_Temp_sensor_vect(ii).colored_data.butterOrder = 1; +Orion_Temp_sensor_vect(ii).bounds = [0.2 0.25]; +Orion_Temp_sensor_vect(ii).tracks = 2; +Orion_Temp_sensor_vect(ii).factor = 0.01; + +save("Orion_Temp_sensor_vect") + diff --git a/commonFunctions/sensors/NoiseAnalysis/main_noiseAnalysis.m b/commonFunctions/sensors/NoiseAnalysis/main_noiseAnalysis.m index ce214ad9..b1b5a719 100644 --- a/commonFunctions/sensors/NoiseAnalysis/main_noiseAnalysis.m +++ b/commonFunctions/sensors/NoiseAnalysis/main_noiseAnalysis.m @@ -6,7 +6,7 @@ restoredefaultpath %% Path matFolder = "..\New data"; -addpath(genpath("./Functions")) +addpath(genpath(".\Functions")) addpath(genpath(matFolder)) @@ -56,30 +56,42 @@ end clear, clc close all -name = "Lyra_Port_sensor_vect"; +% rocketName = "2025_Orion"; +% missionName = 'Orion_Temp_sensor_vect'; +% save_name = "Orion_Temp_sensor_vect_res"; +rocketName = "2024_Lyra"; +missionName = 'Lyra_Port_sensor_vect'; save_name = "Lyra_Port_sensor_vect_res"; try - load(name) + load(rocketName + "\" + missionName) catch - error("Use mat_creator first") + error("Use mat_creator first (inside the chosen mission)") end -for sensor_num = 1:length(Lyra_Port_sensor_vect) - for track = Lyra_Port_sensor_vect(sensor_num).tracks - if Lyra_Port_sensor_vect(sensor_num).noise_type == "white" - Lyra_Port_sensor_vect = NoiseAnalysis_white(Lyra_Port_sensor_vect, sensor_num, track, 0); - elseif Lyra_Port_sensor_vect(sensor_num).noise_type == "pink" - Lyra_Port_sensor_vect = NoiseAnalysis_pink(Lyra_Port_sensor_vect, sensor_num, track, 0); - elseif Lyra_Port_sensor_vect(sensor_num).noise_type == "colored" - Lyra_Port_sensor_vect = NoiseAnalysis_colored(Lyra_Port_sensor_vect, sensor_num, track, 0); +% missionMat = Orion_Temp_sensor_vect; +missionMat = Lyra_Port_sensor_vect; + +for sensor_num = 1:length(missionMat) + for track = missionMat(sensor_num).tracks + if missionMat(sensor_num).noise_type == "white" + missionMat = NoiseAnalysis_white(missionMat, sensor_num, track, 0); + elseif missionMat(sensor_num).noise_type == "pink" + missionMat = NoiseAnalysis_pink(missionMat, sensor_num, track, 0); + elseif missionMat(sensor_num).noise_type == "colored" + missionMat = NoiseAnalysis_colored(missionMat, sensor_num, track, 0); else error("Noise type is not 'white', 'pink' or 'colored'") end end end -save(save_name, name) +% Orion_Temp_sensor_vect = missionMat; +Lyra_Port_sensor_vect = missionMat; + +% save(rocketName + "\" + save_name, 'Orion_Temp_sensor_vect') +save(rocketName + "\" + save_name, 'Lyra_Port_sensor_vect') +fprintf("Copy paste the generated .mat in %s\n", ".\matlab-simulator\data\"+rocketName) %% 3 - fs diff --git a/data/2024_Lyra_Portugal_October/Lyra_Port_sensor_vect_res.mat b/data/2024_Lyra_Portugal_October/Lyra_Port_sensor_vect_res.mat index b2bb62cb4d87b848836a45fce2176e94e1971de3..d244a21cf270acec308679a866f77f109793737d 100644 GIT binary patch delta 41 xcmZ3hv{q??i9~Q>iGo{dl7f+uf}xR>p}Ccjk%Ezdk?F)h<%tQb8%uTy008;33+Vs= delta 41 xcmZ3hv{q??iG*){o`PFyl7gXuf}y#UiLsTDxq^{_k?F)h<%tQb8%uTy008<|3-JH| diff --git a/data/2025_Orion_Portugal_October/initSensors2025_Orion_Portugal_October.m b/data/2025_Orion_Portugal_October/initSensors2025_Orion_Portugal_October.m index 2a8dce4d..e3b79ac9 100644 --- a/data/2025_Orion_Portugal_October/initSensors2025_Orion_Portugal_October.m +++ b/data/2025_Orion_Portugal_October/initSensors2025_Orion_Portugal_October.m @@ -1,22 +1,21 @@ -% initialise sensors +%% Sensor Initialization -% author: Pier Francesco Bachini - ipt GNC 2025 -% pierfrancesco.bachini@skywarder.eu -% release 29/11/2024 +% author: Stefano Belletti - ipt GNC 2025 +% stefano.belletti@skywarder.eu +% release 22/02/2025 +% latest update: Stefano Belletti (22/02/2025) +load("Orion_Temp_sensor_vect_res.mat") - -%% barometer1 - static measure (HSCMAND001BAAA5) -sensorSettings.barometer1 = Sensor_with_fault_sim(); % presure in mbar, temp should be in C° -sensorSettings.barometer1.maxMeasurementRange = 1000; % 1100, 1300 in mbar -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.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 -sensorSettings.barometer1.min_fault_time = 6; %min seconds to wait before possible fault +%% barometer1 - static measure +% NOTE: pressure in mbar, temp should be in C° +sensorSettings.barometer1 = SensorFault(); +sensorSettings.barometer1.maxMeasurementRange = 1000; % 1100, 1300 in mbar +sensorSettings.barometer1.minMeasurementRange = 0; % 300, 10 in mbar +sensorSettings.barometer1.bit = 24; % adc on rocket is 24 bits +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 +sensorSettings.barometer1.min_fault_time = 6; % min seconds to wait before possible fault % fault generation switch settings.fault_sim.fault_type(1) @@ -34,28 +33,27 @@ switch settings.fault_sim.fault_type(1) otherwise end -%% barometer2 - static measure (HSCMAND001BAAA5) -sensorSettings.barometer2 = Sensor_with_fault_sim(); % presure in mbar, temp should be in C° -sensorSettings.barometer2.maxMeasurementRange = 1000; % 1100, 1300 in mbar -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.barometer1.update(Orion_Temp_sensor_vect, "main_Main_StaticPressureData1.csv", 1); -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 -sensorSettings.barometer2.min_fault_time = 6; %min seconds to wait before possible fault +%% barometer2 - static measure +% NOTE: pressure in mbar, temp should be in C° +sensorSettings.barometer2 = SensorFault(); +sensorSettings.barometer2.maxMeasurementRange = 1000; % 1100, 1300 in mbar +sensorSettings.barometer2.minMeasurementRange = 0; % 300, 10 in mbar +sensorSettings.barometer2.bit = 24; % adc on rocket is 24 bits +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 +sensorSettings.barometer2.min_fault_time = 6; % min seconds to wait before possible fault % fault generation - switch settings.fault_sim.fault_type(2) case "offset" offset_value_2 = round((settings.fault_sim.max_offset-settings.fault_sim.min_offset)*rand() + settings.fault_sim.min_offset); - sensorSettings.barometer2 = sensorSettings.barometer2.setOffset(offset_value_2); % i don't know the unit of measurment as of now + sensorSettings.barometer2 = sensorSettings.barometer2.setOffset(offset_value_2); % i don't know the unit of measurement as of now [sensorSettings.barometer2, fault_time_2] = sensorSettings.barometer2.setErrorTime(); % in seconds case "degradation" degradation_value_2 = round((settings.fault_sim.max_degradation-settings.fault_sim.min_degradation)*rand() + settings.fault_sim.min_degradation); - sensorSettings.barometer2 = sensorSettings.barometer2.setDegradation(degradation_value_2); % i don't know the unit of measurment as of now + sensorSettings.barometer2 = sensorSettings.barometer2.setDegradation(degradation_value_2); % i don't know the unit of measurement as of now [sensorSettings.barometer2, fault_time_2] = sensorSettings.barometer2.setErrorTime(); % in seconds case "freezing" sensorSettings.barometer2.setFreezing; @@ -63,28 +61,27 @@ switch settings.fault_sim.fault_type(2) otherwise end -%% barometer3 - digital measure (LPS28DFWTR) -sensorSettings.barometer3 = Sensor_with_fault_sim(); % presure in mbar, temp should be in C° -sensorSettings.barometer3.maxMeasurementRange = 4060; % 1100, 1300 in mbar -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.barometer2.update(Orion_Temp_sensor_vect, "main_Main_StaticPressureData2.csv", 1); -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 -sensorSettings.barometer3.min_fault_time = 6; %min seconds to wait before possible fault +%% barometer3 - digital measure (LPS28DFW) +% NOTE: pressure in mbar, temp should be in C° +sensorSettings.barometer3 = SensorFault(); +sensorSettings.barometer3.maxMeasurementRange = 4060; % 1100, 1300 in mbar +sensorSettings.barometer3.minMeasurementRange = 260; % 300, 10 in mbar +sensorSettings.barometer3.bit = 24; +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 +sensorSettings.barometer3.min_fault_time = 6; % min seconds to wait before possible fault % fault generation - switch settings.fault_sim.fault_type(3) case "offset" offset_value_3 = round((settings.fault_sim.max_offset-settings.fault_sim.min_offset)*rand() + settings.fault_sim.min_offset); - sensorSettings.barometer3 = sensorSettings.barometer3.setOffset(offset_value_3); % i don't know the unit of measurment as of now + sensorSettings.barometer3 = sensorSettings.barometer3.setOffset(offset_value_3); % i don't know the unit of measurement as of now [sensorSettings.barometer3, fault_time_3] = sensorSettings.barometer3.setErrorTime(); % in seconds case "degradation" degradation_value_3 = round((settings.fault_sim.max_degradation-settings.fault_sim.min_degradation)*rand() + settings.fault_sim.min_degradation); - sensorSettings.barometer3 = sensorSettings.barometer3.setDegradation(degradation_value_3); % i don't know the unit of measurment as of now + sensorSettings.barometer3 = sensorSettings.barometer3.setDegradation(degradation_value_3); % I don't know the unit of measurement as of now [sensorSettings.barometer3, fault_time_3] = sensorSettings.barometer3.setErrorTime(); % in seconds case "freezing" sensorSettings.barometer3.setFreezing; @@ -92,84 +89,86 @@ switch settings.fault_sim.fault_type(3) otherwise end -%% accelerometer (6 dof imu - LSM6DSRXTR) -sensorSettings.accelerometer = Sensor3D(); % acceleration in mg -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.resolution = (sensorSettings.accelerometer.maxMeasurementRange -sensorSettings.accelerometer.minMeasurementRange)/(2^sensorSettings.accelerometer.bit); -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 -sensorSettings.accelerometer.walkDiffusionCoef = 0; % guess -sensorSettings.accelerometer.dt = 0.01; % sampling time - -%% initial gyroscope sensor from LSM9DS1 -sensorSettings.gyroscope = Sensor3D(); % angular rate in mdps -sensorSettings.gyroscope.maxMeasurementRange = 245e3; % 245e3, 500e3, 2000e3 in mdps -sensorSettings.gyroscope.minMeasurementRange = -245e3; % -245e3, -500e3, -2000e3 in mdps -sensorSettings.gyroscope.bit = 16; -sensorSettings.gyroscope.resolution = (sensorSettings.gyroscope.maxMeasurementRange -sensorSettings.gyroscope.minMeasurementRange)/(2^sensorSettings.gyroscope.bit); % 8.75, 17.5, 70 in mdps -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 -sensorSettings.gyroscope.walkDiffusionCoef = 1; % guess -sensorSettings.gyroscope.dt = 0.01; % sampling time -sensorSettings.gyroscope.transMatrix = diag([1 1 1]); % axis transformation - -%% initial megnetometer sensor from LSM9DS1 -sensorSettings.magnetometer=Sensor3D(); % magnetic field in mgauss -sensorSettings.magnetometer.maxMeasurementRange = 16000; % 4000, 8000, 12000, 16000 in mgauss -sensorSettings.magnetometer.minMeasurementRange = -16000; % -4000, -8000, -12000, -16000 in mgauss -sensorSettings.magnetometer.resolution = 0.58; % 0.14, 0.29, 0.43, 0.58 in mgauss -sensorSettings.magnetometer.noiseVariance = 4; % guess in mgauss original guess 2 -sensorSettings.magnetometer.offsetX = 0; % +-1000 in mgauss -sensorSettings.magnetometer.offsetY = 0; % +-1000 in mgauss -sensorSettings.magnetometer.offsetZ = 0; % +-1000 in mgauss -sensorSettings.magnetometer.walkDiffusionCoef = 0; % guess -sensorSettings.magnetometer.dt = 0.01; % sampling time -sensorSettings.magnetometer.transMatrix = diag([1 1 1]); % axis transformation - -%% initial GPS sensor from NEO-M9N -sensorSettings.GPS = GPS(); % lon, in degree lat in deree, alt in m -sensorSettings.GPS.noiseVariance = [2e-9*ones(2,1);5;0.0011*ones(3,1)]; % [deg; deg; m; m/s; m/s; m/s]^2 -sensorSettings.GPS.transMatrix = diag([1 1 1]); % axis transformation -sensorSettings.lat0 = environment.lat0; -sensorSettings.lon0 = environment.lon0; -sensorSettings.z0 = environment.z0; -sensorSettings.spheroid = wgs84Ellipsoid; - -%% initial chamber pressure sensor NAT825281 -sensorSettings.comb_chamber = Sensor(); % presure in mbar, temp should be in C° -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.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; -% check 2d offset for chamber pressure sensor - -%% pitot +sensorSettings.barometer3.update(Orion_Temp_sensor_vect, "main_Boardcore_LPS28DFWData.csv", 1); + +%% accelerometer (6 dof imu - LSM6DSRX) +% NOTE: acceleration in mg +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.offsetX = 0; % +-90 in mg +sensorSettings.accelerometer.offsetY = 0; % +-90 in mg +sensorSettings.accelerometer.offsetZ = 0; % +-90 in mg +sensorSettings.accelerometer.walkDiffusionCoef = 0; % guess +sensorSettings.accelerometer.dt = 0.01; % sampling time + +sensorSettings.accelerometer.update(Orion_Temp_sensor_vect, "main_Boardcore_LSM6DSRXData.csv", 1); + +%% initial gyroscope sensor from LSM6DSRX +% NOTE: angular rate in mdps +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.offsetX = 0; % +-30e3 in mdps +sensorSettings.gyroscope.offsetY = 0; % +-30e3 in mdps +sensorSettings.gyroscope.offsetZ = 0; % +-30e3 in mdps +sensorSettings.gyroscope.walkDiffusionCoef = 1; % guess +sensorSettings.gyroscope.dt = 0.01; % sampling time +sensorSettings.gyroscope.transMatrix = diag([1 1 1]); % axis transformation + +sensorSettings.gyroscope.update(Orion_Temp_sensor_vect, "main_Boardcore_LSM6DSRXData.csv", 2); + +%% initial magnetometer sensor from LIS2MDL +% NOTE: magnetic field in mG (m Gauss) +sensorSettings.magnetometer = Sensor3D(); +sensorSettings.magnetometer.maxMeasurementRange = 16000; % 4000, 8000, 12000, 16000 in mG +sensorSettings.magnetometer.minMeasurementRange = -16000; % -4000, -8000, -12000, -16000 in mG +sensorSettings.magnetometer.resolution = 0.58; % 0.14, 0.29, 0.43, 0.58 in mG +% sensorSettings.magnetometer.noiseVariance = 4; % guess in mG (original guess 2) +sensorSettings.magnetometer.offsetX = 0; % +-1000 in mG +sensorSettings.magnetometer.offsetY = 0; % +-1000 in mG +sensorSettings.magnetometer.offsetZ = 0; % +-1000 in mG +sensorSettings.magnetometer.walkDiffusionCoef = 0; % guess +sensorSettings.magnetometer.dt = 0.01; % sampling time +sensorSettings.magnetometer.transMatrix = diag([1 1 1]); % axis transformation + +sensorSettings.magnetometer.update(Orion_Temp_sensor_vect, "main_Boardcore_LIS2MDLData.csv", 1); + +%% initial GPS sensor from NEO-M9N +% NOTE: lon, in degree lat in degree, alt in m +sensorSettings.GPS = SensorGPS(); +sensorSettings.GPS.noiseVariance = [2e-9*ones(2,1);5;0.0011*ones(3,1)]; % [deg; deg; m; m/s; m/s; m/s]^2 +sensorSettings.GPS.transMatrix = diag([1 1 1]); % axis transformation +sensorSettings.lat0 = environment.lat0; +sensorSettings.lon0 = environment.lon0; +sensorSettings.z0 = environment.z0; +sensorSettings.spheroid = wgs84Ellipsoid; + +%% initial chamber pressure sensor +% NOTE: pressure in mbar, temp should be in C°; +% check 2D offset for chamber pressure sensor +sensorSettings.comb_chamber = Sensor1D(); +sensorSettings.comb_chamber.maxMeasurementRange = 40000; % 1100, 1300 in mbar +sensorSettings.comb_chamber.minMeasurementRange = 0; % 300, 10 in mbar +sensorSettings.comb_chamber.resolution = 1; % random value stolen from baro +sensorSettings.comb_chamber.offset = 0; + +sensorSettings.comb_chamber.update(Orion_Temp_sensor_vect, "motor_Motor_CCPressureData.csv", 1); + +%% Pitot % static pressure -sensorSettings.pitot_static = Sensor(); -sensorSettings.pitot_static.maxMeasurementRange = 1034.21; % mbar ( 15psi) -sensorSettings.pitot_static.minMeasurementRange = 0; -sensorSettings.pitot_static.bit = 12; -sensorSettings.pitot_static.resolution = (sensorSettings.pitot_static.maxMeasurementRange -sensorSettings.pitot_static.minMeasurementRange)/(2^sensorSettings.pitot_static.bit); -sensorSettings.pitot_static.noiseVariance = 0.043043; % from flight logs +sensorSettings.pitot_static = Sensor1D(); +sensorSettings.pitot_static.maxMeasurementRange = 1034.21; % mbar (15 psi) +sensorSettings.pitot_static.minMeasurementRange = 0; +sensorSettings.pitot_static.bit = 12; +sensorSettings.pitot_static.update(Orion_Temp_sensor_vect, "payload_Payload_StaticPressureData.csv", 1); % total pressure -sensorSettings.pitot_total = Sensor(); -sensorSettings.pitot_total.maxMeasurementRange = 2*1034.21; % mbar ( 30psi) -sensorSettings.pitot_total.minMeasurementRange = 0; -sensorSettings.pitot_total.bit = 12; -sensorSettings.pitot_total.resolution = (sensorSettings.pitot_total.maxMeasurementRange -sensorSettings.pitot_total.minMeasurementRange)/(2^sensorSettings.pitot_total.bit); -sensorSettings.pitot_total.noiseVariance = 2*0.043043; % from flight logs - -%% total sensor initialization -% -% now is in std_setInitialParams.m -% -% \ No newline at end of file +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.update(Orion_Temp_sensor_vect, "payload_Payload_DynamicPressureData.csv", 1); + diff --git a/data/2025_Orion_Roccaraso_September/initSensors2025_Orion_Roccaraso_September.m b/data/2025_Orion_Roccaraso_September/initSensors2025_Orion_Roccaraso_September.m index 1c66d0d6..e3b79ac9 100644 --- a/data/2025_Orion_Roccaraso_September/initSensors2025_Orion_Roccaraso_September.m +++ b/data/2025_Orion_Roccaraso_September/initSensors2025_Orion_Roccaraso_September.m @@ -1,20 +1,21 @@ -% initialise sensors +%% Sensor Initialization -% author: Pier Francesco Bachini - ipt GNC 2025 -% pierfrancesco.bachini@skywarder.eu -% release 29/11/2024 +% author: Stefano Belletti - ipt GNC 2025 +% stefano.belletti@skywarder.eu +% release 22/02/2025 +% latest update: Stefano Belletti (22/02/2025) -%% barometer1 - static measure (HSCMAND001BAAA5) -sensorSettings.barometer1 = Sensor_with_fault_sim(); % presure in mbar, temp should be in C° -sensorSettings.barometer1.maxMeasurementRange = 1000; % 1100, 1300 in mbar -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 +load("Orion_Temp_sensor_vect_res.mat") -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 -sensorSettings.barometer1.min_fault_time = 6; %min seconds to wait before possible fault +%% barometer1 - static measure +% NOTE: pressure in mbar, temp should be in C° +sensorSettings.barometer1 = SensorFault(); +sensorSettings.barometer1.maxMeasurementRange = 1000; % 1100, 1300 in mbar +sensorSettings.barometer1.minMeasurementRange = 0; % 300, 10 in mbar +sensorSettings.barometer1.bit = 24; % adc on rocket is 24 bits +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 +sensorSettings.barometer1.min_fault_time = 6; % min seconds to wait before possible fault % fault generation switch settings.fault_sim.fault_type(1) @@ -32,28 +33,27 @@ switch settings.fault_sim.fault_type(1) otherwise end -%% barometer2 - static measure (HSCMAND001BAAA5) -sensorSettings.barometer2 = Sensor_with_fault_sim(); % presure in mbar, temp should be in C° -sensorSettings.barometer2.maxMeasurementRange = 1000; % 1100, 1300 in mbar -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.barometer1.update(Orion_Temp_sensor_vect, "main_Main_StaticPressureData1.csv", 1); -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 -sensorSettings.barometer2.min_fault_time = 6; %min seconds to wait before possible fault +%% barometer2 - static measure +% NOTE: pressure in mbar, temp should be in C° +sensorSettings.barometer2 = SensorFault(); +sensorSettings.barometer2.maxMeasurementRange = 1000; % 1100, 1300 in mbar +sensorSettings.barometer2.minMeasurementRange = 0; % 300, 10 in mbar +sensorSettings.barometer2.bit = 24; % adc on rocket is 24 bits +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 +sensorSettings.barometer2.min_fault_time = 6; % min seconds to wait before possible fault % fault generation - switch settings.fault_sim.fault_type(2) case "offset" offset_value_2 = round((settings.fault_sim.max_offset-settings.fault_sim.min_offset)*rand() + settings.fault_sim.min_offset); - sensorSettings.barometer2 = sensorSettings.barometer2.setOffset(offset_value_2); % i don't know the unit of measurment as of now + sensorSettings.barometer2 = sensorSettings.barometer2.setOffset(offset_value_2); % i don't know the unit of measurement as of now [sensorSettings.barometer2, fault_time_2] = sensorSettings.barometer2.setErrorTime(); % in seconds case "degradation" degradation_value_2 = round((settings.fault_sim.max_degradation-settings.fault_sim.min_degradation)*rand() + settings.fault_sim.min_degradation); - sensorSettings.barometer2 = sensorSettings.barometer2.setDegradation(degradation_value_2); % i don't know the unit of measurment as of now + sensorSettings.barometer2 = sensorSettings.barometer2.setDegradation(degradation_value_2); % i don't know the unit of measurement as of now [sensorSettings.barometer2, fault_time_2] = sensorSettings.barometer2.setErrorTime(); % in seconds case "freezing" sensorSettings.barometer2.setFreezing; @@ -61,28 +61,27 @@ switch settings.fault_sim.fault_type(2) otherwise end -%% barometer3 - digital measure (LPS28DFWTR) -sensorSettings.barometer3 = Sensor_with_fault_sim(); % presure in mbar, temp should be in C° -sensorSettings.barometer3.maxMeasurementRange = 4060; % 1100, 1300 in mbar -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.barometer2.update(Orion_Temp_sensor_vect, "main_Main_StaticPressureData2.csv", 1); -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 -sensorSettings.barometer3.min_fault_time = 6; %min seconds to wait before possible fault +%% barometer3 - digital measure (LPS28DFW) +% NOTE: pressure in mbar, temp should be in C° +sensorSettings.barometer3 = SensorFault(); +sensorSettings.barometer3.maxMeasurementRange = 4060; % 1100, 1300 in mbar +sensorSettings.barometer3.minMeasurementRange = 260; % 300, 10 in mbar +sensorSettings.barometer3.bit = 24; +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 +sensorSettings.barometer3.min_fault_time = 6; % min seconds to wait before possible fault % fault generation - switch settings.fault_sim.fault_type(3) case "offset" offset_value_3 = round((settings.fault_sim.max_offset-settings.fault_sim.min_offset)*rand() + settings.fault_sim.min_offset); - sensorSettings.barometer3 = sensorSettings.barometer3.setOffset(offset_value_3); % i don't know the unit of measurment as of now + sensorSettings.barometer3 = sensorSettings.barometer3.setOffset(offset_value_3); % i don't know the unit of measurement as of now [sensorSettings.barometer3, fault_time_3] = sensorSettings.barometer3.setErrorTime(); % in seconds case "degradation" degradation_value_3 = round((settings.fault_sim.max_degradation-settings.fault_sim.min_degradation)*rand() + settings.fault_sim.min_degradation); - sensorSettings.barometer3 = sensorSettings.barometer3.setDegradation(degradation_value_3); % i don't know the unit of measurment as of now + sensorSettings.barometer3 = sensorSettings.barometer3.setDegradation(degradation_value_3); % I don't know the unit of measurement as of now [sensorSettings.barometer3, fault_time_3] = sensorSettings.barometer3.setErrorTime(); % in seconds case "freezing" sensorSettings.barometer3.setFreezing; @@ -90,84 +89,86 @@ switch settings.fault_sim.fault_type(3) otherwise end -%% accelerometer (6 dof imu - LSM6DSRXTR) -sensorSettings.accelerometer = Sensor3D(); % acceleration in mg -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.resolution = (sensorSettings.accelerometer.maxMeasurementRange -sensorSettings.accelerometer.minMeasurementRange)/(2^sensorSettings.accelerometer.bit); -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 -sensorSettings.accelerometer.walkDiffusionCoef = 0; % guess -sensorSettings.accelerometer.dt = 0.01; % sampling time - -%% initial gyroscope sensor from LSM9DS1 -sensorSettings.gyroscope = Sensor3D(); % angular rate in mdps -sensorSettings.gyroscope.maxMeasurementRange = 245e3; % 245e3, 500e3, 2000e3 in mdps -sensorSettings.gyroscope.minMeasurementRange = -245e3; % -245e3, -500e3, -2000e3 in mdps -sensorSettings.gyroscope.bit = 16; -sensorSettings.gyroscope.resolution = (sensorSettings.gyroscope.maxMeasurementRange -sensorSettings.gyroscope.minMeasurementRange)/(2^sensorSettings.gyroscope.bit); % 8.75, 17.5, 70 in mdps -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 -sensorSettings.gyroscope.walkDiffusionCoef = 1; % guess -sensorSettings.gyroscope.dt = 0.01; % sampling time -sensorSettings.gyroscope.transMatrix = diag([1 1 1]); % axis transformation - -%% initial megnetometer sensor from LSM9DS1 -sensorSettings.magnetometer=Sensor3D(); % magnetic field in mgauss -sensorSettings.magnetometer.maxMeasurementRange = 16000; % 4000, 8000, 12000, 16000 in mgauss -sensorSettings.magnetometer.minMeasurementRange = -16000; % -4000, -8000, -12000, -16000 in mgauss -sensorSettings.magnetometer.resolution = 0.58; % 0.14, 0.29, 0.43, 0.58 in mgauss -sensorSettings.magnetometer.noiseVariance = 4; % guess in mgauss original guess 2 -sensorSettings.magnetometer.offsetX = 0; % +-1000 in mgauss -sensorSettings.magnetometer.offsetY = 0; % +-1000 in mgauss -sensorSettings.magnetometer.offsetZ = 0; % +-1000 in mgauss -sensorSettings.magnetometer.walkDiffusionCoef = 0; % guess -sensorSettings.magnetometer.dt = 0.01; % sampling time -sensorSettings.magnetometer.transMatrix = diag([1 1 1]); % axis transformation +sensorSettings.barometer3.update(Orion_Temp_sensor_vect, "main_Boardcore_LPS28DFWData.csv", 1); + +%% accelerometer (6 dof imu - LSM6DSRX) +% NOTE: acceleration in mg +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.offsetX = 0; % +-90 in mg +sensorSettings.accelerometer.offsetY = 0; % +-90 in mg +sensorSettings.accelerometer.offsetZ = 0; % +-90 in mg +sensorSettings.accelerometer.walkDiffusionCoef = 0; % guess +sensorSettings.accelerometer.dt = 0.01; % sampling time + +sensorSettings.accelerometer.update(Orion_Temp_sensor_vect, "main_Boardcore_LSM6DSRXData.csv", 1); + +%% initial gyroscope sensor from LSM6DSRX +% NOTE: angular rate in mdps +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.offsetX = 0; % +-30e3 in mdps +sensorSettings.gyroscope.offsetY = 0; % +-30e3 in mdps +sensorSettings.gyroscope.offsetZ = 0; % +-30e3 in mdps +sensorSettings.gyroscope.walkDiffusionCoef = 1; % guess +sensorSettings.gyroscope.dt = 0.01; % sampling time +sensorSettings.gyroscope.transMatrix = diag([1 1 1]); % axis transformation + +sensorSettings.gyroscope.update(Orion_Temp_sensor_vect, "main_Boardcore_LSM6DSRXData.csv", 2); + +%% initial magnetometer sensor from LIS2MDL +% NOTE: magnetic field in mG (m Gauss) +sensorSettings.magnetometer = Sensor3D(); +sensorSettings.magnetometer.maxMeasurementRange = 16000; % 4000, 8000, 12000, 16000 in mG +sensorSettings.magnetometer.minMeasurementRange = -16000; % -4000, -8000, -12000, -16000 in mG +sensorSettings.magnetometer.resolution = 0.58; % 0.14, 0.29, 0.43, 0.58 in mG +% sensorSettings.magnetometer.noiseVariance = 4; % guess in mG (original guess 2) +sensorSettings.magnetometer.offsetX = 0; % +-1000 in mG +sensorSettings.magnetometer.offsetY = 0; % +-1000 in mG +sensorSettings.magnetometer.offsetZ = 0; % +-1000 in mG +sensorSettings.magnetometer.walkDiffusionCoef = 0; % guess +sensorSettings.magnetometer.dt = 0.01; % sampling time +sensorSettings.magnetometer.transMatrix = diag([1 1 1]); % axis transformation + +sensorSettings.magnetometer.update(Orion_Temp_sensor_vect, "main_Boardcore_LIS2MDLData.csv", 1); %% initial GPS sensor from NEO-M9N -sensorSettings.GPS = GPS(); % lon, in degree lat in deree, alt in m -sensorSettings.GPS.noiseVariance = [2e-9*ones(2,1);5;0.0011*ones(3,1)]; % [deg; deg; m; m/s; m/s; m/s]^2 -sensorSettings.GPS.transMatrix = diag([1 1 1]); % axis transformation -sensorSettings.lat0 = environment.lat0; -sensorSettings.lon0 = environment.lon0; -sensorSettings.z0 = environment.z0; -sensorSettings.spheroid = wgs84Ellipsoid; - -%% initial chamber pressure sensor NAT825281 -sensorSettings.comb_chamber = Sensor(); % presure in mbar, temp should be in C° -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.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; -% check 2d offset for chamber pressure sensor - -%% pitot +% NOTE: lon, in degree lat in degree, alt in m +sensorSettings.GPS = SensorGPS(); +sensorSettings.GPS.noiseVariance = [2e-9*ones(2,1);5;0.0011*ones(3,1)]; % [deg; deg; m; m/s; m/s; m/s]^2 +sensorSettings.GPS.transMatrix = diag([1 1 1]); % axis transformation +sensorSettings.lat0 = environment.lat0; +sensorSettings.lon0 = environment.lon0; +sensorSettings.z0 = environment.z0; +sensorSettings.spheroid = wgs84Ellipsoid; + +%% initial chamber pressure sensor +% NOTE: pressure in mbar, temp should be in C°; +% check 2D offset for chamber pressure sensor +sensorSettings.comb_chamber = Sensor1D(); +sensorSettings.comb_chamber.maxMeasurementRange = 40000; % 1100, 1300 in mbar +sensorSettings.comb_chamber.minMeasurementRange = 0; % 300, 10 in mbar +sensorSettings.comb_chamber.resolution = 1; % random value stolen from baro +sensorSettings.comb_chamber.offset = 0; + +sensorSettings.comb_chamber.update(Orion_Temp_sensor_vect, "motor_Motor_CCPressureData.csv", 1); + +%% Pitot % static pressure -sensorSettings.pitot_static = Sensor(); -sensorSettings.pitot_static.maxMeasurementRange = 1034.21; % mbar ( 15psi) -sensorSettings.pitot_static.minMeasurementRange = 0; -sensorSettings.pitot_static.bit = 12; -sensorSettings.pitot_static.resolution = (sensorSettings.pitot_static.maxMeasurementRange -sensorSettings.pitot_static.minMeasurementRange)/(2^sensorSettings.pitot_static.bit); -sensorSettings.pitot_static.noiseVariance = 0.043043; % from flight logs +sensorSettings.pitot_static = Sensor1D(); +sensorSettings.pitot_static.maxMeasurementRange = 1034.21; % mbar (15 psi) +sensorSettings.pitot_static.minMeasurementRange = 0; +sensorSettings.pitot_static.bit = 12; +sensorSettings.pitot_static.update(Orion_Temp_sensor_vect, "payload_Payload_StaticPressureData.csv", 1); % total pressure -sensorSettings.pitot_total = Sensor(); -sensorSettings.pitot_total.maxMeasurementRange = 2*1034.21; % mbar ( 30psi) -sensorSettings.pitot_total.minMeasurementRange = 0; -sensorSettings.pitot_total.bit = 12; -sensorSettings.pitot_total.resolution = (sensorSettings.pitot_total.maxMeasurementRange -sensorSettings.pitot_total.minMeasurementRange)/(2^sensorSettings.pitot_total.bit); -sensorSettings.pitot_total.noiseVariance = 2*0.043043; % from flight logs - -%% total sensor initialization -% -% now is in std_setInitialParams.m -% -% \ No newline at end of file +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.update(Orion_Temp_sensor_vect, "payload_Payload_DynamicPressureData.csv", 1); + diff --git a/simulator/configs/configMission.m b/simulator/configs/configMission.m deleted file mode 100644 index d4ae76b5..00000000 --- a/simulator/configs/configMission.m +++ /dev/null @@ -1,66 +0,0 @@ -%{ - -mission configuration script - -%} - -conf.year = 2024; % choose between: 2021, 2022, 2023, 2024 -conf.flight = "pds"; % choose between: "roccaraso", "pds" ( ponte de sor ) , " " - -switch conf.year - - case 2021 - - switch conf.flight - - case "roccaraso" - mission.name = 'Lynx_Roccaraso_September_2021'; - mission.nameMSA = '2021_Lynx_Roccaraso_September'; - - case "pds" - mission.name = 'Lynx_Portugal_October_2021'; - mission.nameMSA = '2021_Lynx_Portugal_October'; - end - - case 2022 - - switch conf.flight - - case "roccaraso" - mission.name = 'Pyxis_Roccaraso_September_2022'; - mission.nameMSA = '2022_Pyxis_Roccaraso_September'; - - case "pds" - mission.name = 'Pyxis_Portugal_October_2022'; - mission.nameMSA = '2022_Pyxis_Portugal_October'; - - end - - case 2023 - - switch conf.flight - - case "roccaraso" - mission.name = 'Gemini_Roccaraso_September_2023'; - mission.nameMSA = '2023_Gemini_Roccaraso_September'; - - case "pds" - mission.name = 'Gemini_Portugal_October_2023'; - mission.nameMSA = '2023_Gemini_Portugal_October'; - - end - - case 2024 - - switch conf.flight - - case "roccaraso" - mission.name = 'Lyra_Roccaraso_September_2024'; - mission.nameMSA = '2024_Lyra_Roccaraso_September'; - - case "pds" - mission.name = 'Lyra_Portugal_October_2024'; - mission.nameMSA = '2024_Lyra_Portugal_October'; - - end -end diff --git a/simulator/configs/configPath.m b/simulator/configs/configPath.m index a2d8ce3f..73b91ede 100644 --- a/simulator/configs/configPath.m +++ b/simulator/configs/configPath.m @@ -14,10 +14,10 @@ addpath(ConDataPath); commonFunctionsPath = '../commonFunctions'; addpath(genpath(commonFunctionsPath)); -% Remove unwanted paths -missionPath = strcat('../common/missions/', mission.name); -rmpath(genpath('../common/missions/')); -addpath(genpath(missionPath)); +% % Remove unwanted paths +% missionPath = strcat('../common/missions/', mission.name); +% rmpath(genpath('../common/missions/')); +% addpath(genpath(missionPath)); % only for hardware in the loop - path configuration if conf.HIL diff --git a/simulator/src/sensor_plots.m b/simulator/src/sensor_plots.m index 5168e004..c6a93f32 100644 --- a/simulator/src/sensor_plots.m +++ b/simulator/src/sensor_plots.m @@ -175,7 +175,7 @@ if length(simOutput.sensors.mea.time) > 1 plot(simOutput.sensors.comb_chamber.time(1:cut_idx),simOutput.sensors.comb_chamber.measures(1:cut_idx),'DisplayName','Sensor') plot(simOutput.t, P_cc_real, 'DisplayName', 'Real cc pressure'); legend - xlabel("Time [s]"), ylabel("Pressure [Pa]") + xlabel("Time [s]"), ylabel("Pressure [Bar]") end drawnow -- GitLab