diff --git a/Analisys_With_Features.m b/Analisys_With_Features.m index 5f201af116341d3b70e02d119ff430fb01032a37..9d3f1e9a40bd4c85935e57ab91dfaad58ab8abfc 100644 --- a/Analisys_With_Features.m +++ b/Analisys_With_Features.m @@ -10,14 +10,15 @@ clc % Mac restoredefaultpath - addpath('../useful_functions/'); - addpath('../dynamical_model/'); + addpath(genpath('../useful_functions/')); + addpath(genpath('../dynamical_model/')); addpath(genpath('../mice/')); addpath(genpath('../computer-vision/')); addpath(genpath('../paper/')); addpath(genpath('../generic_kernels/')); addpath(genpath('../paper/MMX_Fcn_CovarianceAnalyses/')); addpath(genpath('../paper/MMX_Product/MMX_BSP_Files_GravLib/')); + addpath(genpath('./Utilities/')) MMX_InitializeSPICE cspice_furnsh(which('mar097.bsp')); cspice_furnsh(which('MARPHOFRZ.txt')); diff --git a/New Model/Analisys.m b/New Model/Analisys.m index eeb1cc406fb77eaeab23d2e0196242f3335482ab..8a2429b7399e1c9a69c8d30b537cce6b1e55c5cb 100644 --- a/New Model/Analisys.m +++ b/New Model/Analisys.m @@ -16,7 +16,8 @@ clc addpath(genpath('../../generic_kernels/')); addpath(genpath('../../paper/MMX_Fcn_CovarianceAnalyses/')); addpath(genpath('../../paper/MMX_Product/MMX_BSP_Files_GravLib/')); - cspice_kclear + addpath(genpath('./Utilities_relative/')) + addpath(genpath('../Utilities/')) MMX_InitializeSPICE cspice_furnsh('MARPHOFRZ.txt'); cspice_furnsh(which('mar097.bsp')); diff --git a/New Model/Analisys_harmonics.m b/New Model/Analisys_harmonics.m index 1b14fdb3956545e11c315c34463d1978879076ea..d71847efd6145a861115a08a549433f3a431ff8a 100644 --- a/New Model/Analisys_harmonics.m +++ b/New Model/Analisys_harmonics.m @@ -5,24 +5,25 @@ clc %% Setup restoredefaultpath - addpath('../'); - addpath('./MMX_BSP_Files_Relative/'); - addpath('../../useful_functions/'); - addpath('../../useful_functions/planet_textures/'); - addpath('../../dynamical_model/'); + addpath(genpath('../')); + addpath(genpath('./MMX_BSP_Files_Relative/')); + addpath(genpath('../../useful_functions/')); + addpath(genpath('../../useful_functions/planet_textures/')); + addpath(genpath('../../dynamical_model/')); addpath(genpath('../../mice/')); addpath(genpath('../../computer-vision/')); addpath(genpath('../../paper/')); addpath(genpath('../../generic_kernels/')); addpath(genpath('../../paper/MMX_Fcn_CovarianceAnalyses/')); addpath(genpath('../../paper/MMX_Product/MMX_BSP_Files_GravLib/')); - cspice_kclear + addpath(genpath('./Utilities_relative/')) + addpath(genpath('../Utilities/')) MMX_InitializeSPICE - cspice_furnsh('MARPHOFRZ.txt'); + cspice_furnsh(which('MARPHOFRZ.txt')); cspice_furnsh(which('mar097.bsp')); - cspice_furnsh(which('MMX_QSO_027_8x8_826891269_829483269_relative_right.bsp')); - % cspice_furnsh(which('MMX_3DQSO_031_013_8x8_826891269_829483269_relative_right.bsp')); - % cspice_furnsh(which('MMX_SwingQSO_027_011_8x8_826891269_829483269_relative_right.bsp')); + % cspice_furnsh(which('MMX_QSO_031_4x4_826891269_829483269_relative_right.bsp')); + % cspice_furnsh(which('MMX_3DQSO_031_013_4x4_826891269_829483269_relative_right.bsp')); + cspice_furnsh(which('MMX_SwingQSO_031_013_4x4_826891269_829483269_relative_right.bsp')); cspice_furnsh(which('Phobos_826891269_828619269.bsp')); @@ -45,8 +46,7 @@ clc % Covariance analysis parsameters [pars, units] = CovarianceAnalysisParameters_harmonics(pars, units); - pars.sigma = 1e-10/(units.vsf*units.tsf); - + % Initial Phobos's state vector Ph0 = Ph./units.sfVec2; Iz = pars.IPhz_bar + pars.ni*Ph0(1)^2; @@ -69,7 +69,7 @@ clc %% Analysis % Features catalogues - file_features = 'Principal_Phobos_ogni2.mat'; + file_features = 'Principal_Phobos_ogni10.mat'; file_features_Mars = 'Mars_4facets.mat'; % Analysis @@ -81,7 +81,7 @@ clc pars.R,YObs,pars,units,file_features,file_features_Mars); - Results_relative(Est, pars, units) + Results_relative_harmonics(Est, [4,4], pars, units) % save('./Results/QSOLc_6days_Auto.mat', 'Est') diff --git a/New Model/CovarianceAnalysisParameters_harmonics.m b/New Model/CovarianceAnalysisParameters_harmonics.m index 62b752597b04c85bf8d67722492a8af94b4a6745..6da02f50bce99b0ba855c3d36734cac948bc7105 100644 --- a/New Model/CovarianceAnalysisParameters_harmonics.m +++ b/New Model/CovarianceAnalysisParameters_harmonics.m @@ -118,7 +118,10 @@ units.CovDim = (repmat(units.Dim, 1, length(units.Dim)).*... % A-priori covariance pars.P0 = diag(([1*ones(3,1); .1e-4*ones(3,1);... - 1e-1; 1e-5; 1e-4; 1e-7; 1e-3*ones(pars.nCoeff,1);... + 1e-1; 1e-5; 1e-4; 1e-7; 1*ones(pars.nCoeff,1);... 1; 1e-3; 1; 1e-2; 1e-2]./units.Dim).^2); +% Process noise su MMX e Phobos +pars.sigma = 1e-10/(units.vsf*units.tsf); +pars.sigmaPh = 0/(units.vsf*units.tsf); end \ No newline at end of file diff --git a/New Model/MMX_DefineNewModelParametersAndUnits_Harm.m b/New Model/MMX_DefineNewModelParametersAndUnits_Harm.m index b948a5c69c9341dde5aa5dc65c757911ead548f1..2e2a24173db34463780ec8f11557d08856aab8a0 100644 --- a/New Model/MMX_DefineNewModelParametersAndUnits_Harm.m +++ b/New Model/MMX_DefineNewModelParametersAndUnits_Harm.m @@ -84,7 +84,7 @@ function [pars, units] = MMX_DefineNewModelParametersAndUnits_Harm % Phobos gravitational harmonics WRT principal axis of inertia - pars.SH = PhobosSphericalHarmonicCoefficients(8,8); + pars.SH = PhobosSphericalHarmonicCoefficients(4,4); pars.SH.Re = pars.SH.Re/units.lsf; pars.SH.GM = pars.SH.GM/units.GMsf; diff --git a/New Model/Observations_Generation_relative.m b/New Model/Observations_Generation_relative.m index 4af71cfaadeaff17d45043749e0e2b0ce5e146fb..e352ab90dce637ff63c6e5177863facbe8fb700c 100644 --- a/New Model/Observations_Generation_relative.m +++ b/New Model/Observations_Generation_relative.m @@ -21,13 +21,14 @@ clc addpath(genpath('../../generic_kernels/')); addpath(genpath('../../paper/MMX_Fcn_CovarianceAnalyses/')); addpath(genpath('../../paper/MMX_Product/MMX_BSP_Files_GravLib/')); - cspice_kclear + addpath(genpath('./Utilities_relative/')) + addpath(genpath('../Utilities/')) MMX_InitializeSPICE - cspice_furnsh('MARPHOFRZ.txt'); + cspice_furnsh(which('MARPHOFRZ.txt')); cspice_furnsh(which('mar097.bsp')); - cspice_furnsh(which('MMX_QSO_027_8x8_826891269_829483269_relative_right.bsp')); - % cspice_furnsh(which('MMX_3DQSO_031_013_2x2_826891269_829483269_relative_right.bsp')); - % cspice_furnsh(which('MMX_SwingQSO_027_011_2x2_826891269_829483269_relative_right.bsp')); + % cspice_furnsh(which('MMX_QSO_031_4x4_826891269_829483269_relative_right.bsp')); + % cspice_furnsh(which('MMX_3DQSO_031_013_4x4_826891269_829483269_relative_right.bsp')); + cspice_furnsh(which('MMX_SwingQSO_031_013_4x4_826891269_829483269_relative_right.bsp')); cspice_furnsh(which('Phobos_826891269_828619269.bsp')); @@ -36,7 +37,7 @@ clc % Time of the analysis data = '2026-03-16 00:00:00 (UTC)'; data = cspice_str2et(data); - Ndays = 1; + Ndays = 3; t = Ndays*86400; date_end = data+t; @@ -46,7 +47,7 @@ clc % Covariance analysis parameters pars.et0 = data; [pars, units] = CovarianceAnalysisParameters_relative(pars, units); - file_features = 'Principal_Phobos_ogni2.mat'; + file_features = 'Principal_Phobos_ogni10.mat'; file_features_Mars = 'Mars_4facets.mat'; diff --git a/New Model/Utilities/BSP_generator.m b/New Model/Utilities_relative/BSP_generator.m similarity index 97% rename from New Model/Utilities/BSP_generator.m rename to New Model/Utilities_relative/BSP_generator.m index a1c1289cb49b237c5c138566a831f0a3ec1e68a5..70bce1b4b8d7f5dcb8e2b4d055b83691f348eb13 100644 --- a/New Model/Utilities/BSP_generator.m +++ b/New Model/Utilities_relative/BSP_generator.m @@ -87,7 +87,7 @@ clc Model.units = units; micePATH = '~/Documents/MATLAB/mice/'; - TargetFolder = './MMX_BSP_Files_Relative/'; + TargetFolder = '../MMX_BSP_Files_Relative/'; if (exist(TargetFolder, 'dir') ~= 7) command = sprintf('mkdir %s', TargetFolder); system(command); @@ -98,7 +98,7 @@ clc %% Test risultati - addpath(genpath('./MMX_BSP_Files_Relative/')) + addpath(genpath('../MMX_BSP_Files_Relative/')) cspice_furnsh(which('MMX_QSO_031_8x8_826891269_829483269_relative_right.bsp')); MMX_BSP = cspice_spkezr('-35', data+t', 'IAU_Phobos', 'none', '-401'); err_MMX = PB*Xmmx - PB*MMX_BSP; diff --git a/New Model/Utilities/Constraints.m b/New Model/Utilities_relative/Constraints.m similarity index 100% rename from New Model/Utilities/Constraints.m rename to New Model/Utilities_relative/Constraints.m diff --git a/New Model/Utilities/CostFunction.m b/New Model/Utilities_relative/CostFunction.m similarity index 100% rename from New Model/Utilities/CostFunction.m rename to New Model/Utilities_relative/CostFunction.m diff --git a/New Model/Utilities/Cov_Dynamics_Rel.m b/New Model/Utilities_relative/Cov_Dynamics_Rel.m similarity index 100% rename from New Model/Utilities/Cov_Dynamics_Rel.m rename to New Model/Utilities_relative/Cov_Dynamics_Rel.m diff --git a/New Model/Utilities/Cov_Dynamics_Rel_harmonics.m b/New Model/Utilities_relative/Cov_Dynamics_Rel_harmonics.m similarity index 88% rename from New Model/Utilities/Cov_Dynamics_Rel_harmonics.m rename to New Model/Utilities_relative/Cov_Dynamics_Rel_harmonics.m index 5baafbd9a1c6590c2a0cc12426ad7b1ff856a032..031191129ded8e8ab1894d85cb2dc6a18519c8fe 100644 --- a/New Model/Utilities/Cov_Dynamics_Rel_harmonics.m +++ b/New Model/Utilities_relative/Cov_Dynamics_Rel_harmonics.m @@ -97,8 +97,26 @@ function dx = Cov_Dynamics_Rel_harmonics(~,x,pars,~) % The gravitational effect of Phobos on MMX includes the Ellipsoid % harmonics - % VA TIRATA FUORI pars.SH dai sigma points!! - [gPh,~,~,~] = SHGM_Full(rsb, pars.SH); + pars.SH_sigma = pars.SH; + pars.SH_sigma.Clm = pars.SH.Clm; + pars.SH_sigma.Slm = pars.SH.Slm; + count = 0; + + for j=1:size(pars.SH.Clm,1) + for k=1:j + count = count+1; + pars.SH_sigma.Clm(j,k) = x(10+count+i*size_St); + end + end + + for j=2:size(pars.SH.Clm,1) + for k=2:j + count = count+1; + pars.SH_sigma.Slm(j,k) = x(10+count+i*size_St); + end + end + + [gPh,~,~,~] = SHGM_Full(rsb, pars.SH_sigma); % Combined effect on MMX theta_dot = (pars.K - IPhz_bar*Xsi_dot)/Iz; diff --git a/New Model/Utilities/Deimos_Pic_relative.m b/New Model/Utilities_relative/Deimos_Pic_relative.m similarity index 100% rename from New Model/Utilities/Deimos_Pic_relative.m rename to New Model/Utilities_relative/Deimos_Pic_relative.m diff --git a/New Model/Utilities/Deimos_Pic_relative_model.m b/New Model/Utilities_relative/Deimos_Pic_relative_model.m similarity index 100% rename from New Model/Utilities/Deimos_Pic_relative_model.m rename to New Model/Utilities_relative/Deimos_Pic_relative_model.m diff --git a/New Model/Utilities/Dynamics_MPHandMMX_Relative.m b/New Model/Utilities_relative/Dynamics_MPHandMMX_Relative.m similarity index 100% rename from New Model/Utilities/Dynamics_MPHandMMX_Relative.m rename to New Model/Utilities_relative/Dynamics_MPHandMMX_Relative.m diff --git a/New Model/Utilities/Dynamics_MPHandMMX_Relative_harmonics.m b/New Model/Utilities_relative/Dynamics_MPHandMMX_Relative_harmonics.m similarity index 100% rename from New Model/Utilities/Dynamics_MPHandMMX_Relative_harmonics.m rename to New Model/Utilities_relative/Dynamics_MPHandMMX_Relative_harmonics.m diff --git a/New Model/Utilities/Dynamics_MPHandMMX_Relative_ridotta.m b/New Model/Utilities_relative/Dynamics_MPHandMMX_Relative_ridotta.m similarity index 100% rename from New Model/Utilities/Dynamics_MPHandMMX_Relative_ridotta.m rename to New Model/Utilities_relative/Dynamics_MPHandMMX_Relative_ridotta.m diff --git a/New Model/Utilities/Dynamics_MPHandMMX_Relative_tests.m b/New Model/Utilities_relative/Dynamics_MPHandMMX_Relative_tests.m similarity index 100% rename from New Model/Utilities/Dynamics_MPHandMMX_Relative_tests.m rename to New Model/Utilities_relative/Dynamics_MPHandMMX_Relative_tests.m diff --git a/New Model/Utilities/MARPHOFRZ.txt b/New Model/Utilities_relative/MARPHOFRZ.txt similarity index 100% rename from New Model/Utilities/MARPHOFRZ.txt rename to New Model/Utilities_relative/MARPHOFRZ.txt diff --git a/New Model/Utilities/MMX_GenerateBSPFiles_Relative.m b/New Model/Utilities_relative/MMX_GenerateBSPFiles_Relative.m similarity index 93% rename from New Model/Utilities/MMX_GenerateBSPFiles_Relative.m rename to New Model/Utilities_relative/MMX_GenerateBSPFiles_Relative.m index 1240fd7178cc8b83b36f027a2ddddec7ea19328a..084370bd76774408e5bc7ff0bf9152b5e6d1543a 100644 --- a/New Model/Utilities/MMX_GenerateBSPFiles_Relative.m +++ b/New Model/Utilities_relative/MMX_GenerateBSPFiles_Relative.m @@ -22,7 +22,7 @@ function MMX_GenerateBSPFiles_Relative(t, Xmmx, OrbitType, Amplitudes, PropTime, if(exist(bspfilename,'file')~=2) ID = -35; MMX_MakeBSPFile_GravLib(bspfilename, ID, t, Xmmx, '-401', 'IAU_PHOBOS', Model, [micePATH, '/exe/']); - movefile(bspfilename, './MMX_BSP_Files_Relative'); + movefile(bspfilename, '../MMX_BSP_Files_Relative'); else fprintf('MMX ephemeris file already exists!\n'); end diff --git a/New Model/Utilities/MPH_Relative.m b/New Model/Utilities_relative/MPH_Relative.m similarity index 100% rename from New Model/Utilities/MPH_Relative.m rename to New Model/Utilities_relative/MPH_Relative.m diff --git a/New Model/Utilities/Mars_LimbRange_relative.m b/New Model/Utilities_relative/Mars_LimbRange_relative.m similarity index 100% rename from New Model/Utilities/Mars_LimbRange_relative.m rename to New Model/Utilities_relative/Mars_LimbRange_relative.m diff --git a/New Model/Utilities/Mars_LimbRange_relative_model.m b/New Model/Utilities_relative/Mars_LimbRange_relative_model.m similarity index 100% rename from New Model/Utilities/Mars_LimbRange_relative_model.m rename to New Model/Utilities_relative/Mars_LimbRange_relative_model.m diff --git a/New Model/Utilities/Observables_model_relative.m b/New Model/Utilities_relative/Observables_model_relative.m similarity index 99% rename from New Model/Utilities/Observables_model_relative.m rename to New Model/Utilities_relative/Observables_model_relative.m index 1dafddd9e1764e0dbb8dfb3973316cd88f1c1ebe..6964ee723bd88b529ccaea012f9d02845e7fb02e 100644 --- a/New Model/Utilities/Observables_model_relative.m +++ b/New Model/Utilities_relative/Observables_model_relative.m @@ -62,7 +62,7 @@ function [G, Rm] = Observables_model_relative(et, X, St_ID_Range, St_ID_Rate,... r_MMX = X_MMX(1:3); v_MMX = X_MMX(4:6); - bias = X(d+4+pars.nCoeff:end); + bias = X(d+4+pars.nCoeff+1:end); Xsi = X(9); % Definition of Mars position WRT Earth J2000 diff --git a/New Model/Utilities/Observables_relative.m b/New Model/Utilities_relative/Observables_relative.m similarity index 100% rename from New Model/Utilities/Observables_relative.m rename to New Model/Utilities_relative/Observables_relative.m diff --git a/New Model/Utilities/Plot_InitialCondition.m b/New Model/Utilities_relative/Plot_InitialCondition.m similarity index 100% rename from New Model/Utilities/Plot_InitialCondition.m rename to New Model/Utilities_relative/Plot_InitialCondition.m diff --git a/New Model/Utilities/QSOs_Definition.m b/New Model/Utilities_relative/QSOs_Definition.m similarity index 93% rename from New Model/Utilities/QSOs_Definition.m rename to New Model/Utilities_relative/QSOs_Definition.m index c56b67c441fa059792c70332066697b3241be833..ac4fad468705def9cecb6345ba1ad6aa602b2165 100644 --- a/New Model/Utilities/QSOs_Definition.m +++ b/New Model/Utilities_relative/QSOs_Definition.m @@ -9,15 +9,15 @@ clc set(0,'DefaultAxesFontSize', 16); % Mac - addpath('../../paper/'); - addpath('../../paper/MMX_Fcn_Miscellaneous/'); - addpath('../../paper/MMX_Product/'); - addpath('../../paper/MMX_Fcn_CovarianceAnalyses/'); - addpath('../../paper/Reference_Definition/'); - addpath(genpath('../../mice/')); - addpath(genpath('../../generic_kernels/')); - addpath(genpath('../../useful_functions/')); - addpath(genpath('../../dynamical_model/')); + addpath(genpath('../../../paper/')); + addpath(genpath('../../../paper/MMX_Fcn_Miscellaneous/')); + addpath(genpath('../../../paper/MMX_Product/')); + addpath(genpath('../../../paper/MMX_Fcn_CovarianceAnalyses/')); + addpath(genpath('../../../paper/Reference_Definition/')); + addpath(genpath('../../../mice/')); + addpath(genpath('../../../generic_kernels/')); + addpath(genpath('../../../useful_functions/')); + addpath(genpath('../../../dynamical_model/')); MMX_InitializeSPICE cspice_furnsh(which('MARPHOFRZ.txt')); cspice_furnsh(which('mar097.bsp')); @@ -303,10 +303,6 @@ clc %% Ottimizzazione -% Definition of the constraints -% There are no linear inequality constraints nor linear equality -% constraints, but only non-linear constraints that are specified in the -% function @Constraints options = optimoptions('fmincon','Display','iter','Algorithm','interior-point',... 'ConstraintTolerance',1e-9,... @@ -315,10 +311,14 @@ clc X_good = fmincon(@(x) CostFunction(x,pars,units),X0,[],[],[],[],[],[], ... @(x) Constraints(x,pars,units,X_patch),options); - save('QSO-Lc_5rev_8x8.mat','X_good') +% File da salvare + filename = 'QSO-Lc_5rev_8x8.mat'; + save(filename,'X_good') + movefile(filename, '../Initial_cond_perBSP/'); -%% Test della nuova initial condition found + +%% Plot della nuova initial condition found [~] = Plot_InitialCondition(X_good,[],[],pars,units); diff --git a/New Model/Results_relative.m b/New Model/Utilities_relative/Results_relative.m similarity index 81% rename from New Model/Results_relative.m rename to New Model/Utilities_relative/Results_relative.m index 2b637600190b959bc2b45d34159f84b977382234..3e99598a914a9cfed8f470b75dabccab0448f7da 100644 --- a/New Model/Results_relative.m +++ b/New Model/Utilities_relative/Results_relative.m @@ -44,106 +44,90 @@ function Results_relative(Est, pars, units) % Plot of the pre and post fit residuals - % figure(1) - % subplot(2,4,1) - % plot(t_obs/3600,Est.pre(1,:)*units.lsf,'x','Color','b') - % grid on; - % hold on; - % plot(t_obs/3600,Est.pre(3,:)*units.lsf,'x','Color','b') - % plot(t_obs/3600,Est.pre(5,:)*units.lsf,'x','Color','b') - % plot(t_obs/3600,3*pars.ObsNoise.range*units.lsf*ones(size(Est.pre(1,:),2)),'.-','Color','b') - % plot(t_obs/3600,-3*pars.ObsNoise.range*units.lsf*ones(size(Est.pre(1,:),2)),'.-','Color','b') - % xlabel('$[hour]$') - % ylabel('$[km]$') - % title('Range Pre-fit residual') - % subplot(2,4,2) - % plot(t_obs/3600,Est.pre(2,:)*units.vsf,'x','Color','r') - % grid on; - % hold on; - % plot(t_obs/3600,Est.pre(4,:)*units.vsf,'x','Color','r') - % plot(t_obs/3600,Est.pre(6,:)*units.vsf,'x','Color','r') - % plot(t_obs/3600,3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.pre(2,:),2)),'.-','Color','r') - % plot(t_obs/3600,-3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.pre(2,:),2)),'.-','Color','r') - % xlabel('$[hour]$') - % ylabel('$[km/s]$') - % title('RangeRate Pre-fit residual') - % subplot(2,4,3) - % plot(t_obs/3600,Est.pre(7,:)*units.lsf,'x','Color','g') - % grid on; - % hold on; - % plot(t_obs/3600,3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.pre(7,:),2)),'.-','Color','g') - % plot(t_obs/3600,-3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.pre(7,:),2)),'.-','Color','g') - % xlabel('$[hour]$') - % ylabel('$[km]$') - % title('Lidar Pre-fit residual') - % subplot(2,4,4) - % plot(t_obs/3600,Est.pre(8,:),'x','Color','m') - % grid on; - % hold on; - % plot(t_obs/3600,3*pars.ObsNoise.pixel*ones(size(Est.pre(8,:),2)),'.-','Color','m') - % plot(t_obs/3600,-3*pars.ObsNoise.pixel*ones(size(Est.pre(8,:),2)),'.-','Color','m') - % xlabel('$[hour]$') - % ylabel('$[N. pixel]$') - % title('Camera Pre-fit residual') - % - % subplot(2,4,5) - % plot(t_obs/3600,Est.err(1,:)*units.lsf,'x','Color','b') - % grid on; - % hold on; - % plot(t_obs/3600,Est.err(3,:)*units.lsf,'x','Color','b') - % plot(t_obs/3600,Est.err(5,:)*units.lsf,'x','Color','b') - % plot(t_obs/3600,3*pars.ObsNoise.range*units.lsf*ones(size(Est.err(1,:),2)),'.-','Color','b') - % plot(t_obs/3600,-3*pars.ObsNoise.range*units.lsf*ones(size(Est.err(1,:),2)),'.-','Color','b') - % xlabel('$[hour]$') - % ylabel('$[km]$') - % title('Range post-fit residual') - % subplot(2,4,6) - % plot(t_obs/3600,Est.err(2,:)*units.vsf,'x','Color','r') - % grid on; - % hold on; - % plot(t_obs/3600,Est.err(4,:)*units.vsf,'x','Color','r') - % plot(t_obs/3600,Est.err(6,:)*units.vsf,'x','Color','r') - % plot(t_obs/3600,3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.err(2,:),2)),'.-','Color','r') - % plot(t_obs/3600,-3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.err(2,:),2)),'.-','Color','r') - % xlabel('$[hour]$') - % ylabel('$[km/s]$') - % title('RangeRate post-fit residual') - % subplot(2,4,7) - % plot(t_obs/3600,Est.err(7,:)*units.lsf,'x','Color','g') - % grid on; - % hold on; - % plot(t_obs/3600,3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.err(7,:),2)),'.-','Color','g') - % plot(t_obs/3600,-3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.err(7,:),2)),'.-','Color','g') - % xlabel('$[hour]$') - % ylabel('$[km]$') - % title('Lidar post-fit residual') - % subplot(2,4,8) - % plot(t_obs/3600,Est.err(8,:),'x','Color','m') - % grid on; - % hold on; - % plot(t_obs/3600,3*pars.ObsNoise.pixel*ones(size(Est.err(8,:),2)),'.-','Color','m') - % plot(t_obs/3600,-3*pars.ObsNoise.pixel*ones(size(Est.err(8,:),2)),'.-','Color','m') - % xlabel('$[hour]$') - % ylabel('$[N. pixel]$') - % title('Camera post-fit residual') - - - % subplot(2,4,5) - % histfit([Est.pre(1,:), Est.pre(3,:), Est.pre(5,:)]) - % xlabel('$[km]$') - % title('Range Pre-fit residual') - % subplot(2,4,6) - % histfit([Est.pre(2,:), Est.pre(4,:), Est.pre(6,:)]) - % xlabel('$[km/s]$') - % title('Range Rate Pre-fit residual') - % subplot(2,4,7) - % histfit(Est.pre(7,:)) - % xlabel('$[km]$') - % title('Lidar Pre-fit residual') - % subplot(2,4,8) - % histfit(Est.pre(8,:)) - % xlabel('$[rad]$') - % title('Camera Pre-fit residual') + figure(1) + subplot(2,4,1) + plot(t_obs/3600,Est.pre(1,:)*units.lsf,'x','Color','b') + grid on; + hold on; + plot(t_obs/3600,Est.pre(3,:)*units.lsf,'x','Color','b') + plot(t_obs/3600,Est.pre(5,:)*units.lsf,'x','Color','b') + plot(t_obs/3600,3*pars.ObsNoise.range*units.lsf*ones(size(Est.pre(1,:),2)),'.-','Color','b') + plot(t_obs/3600,-3*pars.ObsNoise.range*units.lsf*ones(size(Est.pre(1,:),2)),'.-','Color','b') + xlabel('$[hour]$') + ylabel('$[km]$') + title('Range Pre-fit residual') + subplot(2,4,2) + plot(t_obs/3600,Est.pre(2,:)*units.vsf,'x','Color','r') + grid on; + hold on; + plot(t_obs/3600,Est.pre(4,:)*units.vsf,'x','Color','r') + plot(t_obs/3600,Est.pre(6,:)*units.vsf,'x','Color','r') + plot(t_obs/3600,3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.pre(2,:),2)),'.-','Color','r') + plot(t_obs/3600,-3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.pre(2,:),2)),'.-','Color','r') + xlabel('$[hour]$') + ylabel('$[km/s]$') + title('RangeRate Pre-fit residual') + subplot(2,4,3) + plot(t_obs/3600,Est.pre(7,:)*units.lsf,'x','Color','g') + grid on; + hold on; + plot(t_obs/3600,3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.pre(7,:),2)),'.-','Color','g') + plot(t_obs/3600,-3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.pre(7,:),2)),'.-','Color','g') + xlabel('$[hour]$') + ylabel('$[km]$') + title('Lidar Pre-fit residual') + subplot(2,4,4) + plot(t_obs/3600,Est.pre(8,:),'x','Color','m') + grid on; + hold on; + plot(t_obs/3600,3*pars.ObsNoise.pixel*ones(size(Est.pre(8,:),2)),'.-','Color','m') + plot(t_obs/3600,-3*pars.ObsNoise.pixel*ones(size(Est.pre(8,:),2)),'.-','Color','m') + xlabel('$[hour]$') + ylabel('$[N. pixel]$') + title('Camera Pre-fit residual') + + subplot(2,4,5) + plot(t_obs/3600,Est.err(1,:)*units.lsf,'x','Color','b') + grid on; + hold on; + plot(t_obs/3600,Est.err(3,:)*units.lsf,'x','Color','b') + plot(t_obs/3600,Est.err(5,:)*units.lsf,'x','Color','b') + plot(t_obs/3600,3*pars.ObsNoise.range*units.lsf*ones(size(Est.err(1,:),2)),'.-','Color','b') + plot(t_obs/3600,-3*pars.ObsNoise.range*units.lsf*ones(size(Est.err(1,:),2)),'.-','Color','b') + xlabel('$[hour]$') + ylabel('$[km]$') + title('Range post-fit residual') + subplot(2,4,6) + plot(t_obs/3600,Est.err(2,:)*units.vsf,'x','Color','r') + grid on; + hold on; + plot(t_obs/3600,Est.err(4,:)*units.vsf,'x','Color','r') + plot(t_obs/3600,Est.err(6,:)*units.vsf,'x','Color','r') + plot(t_obs/3600,3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.err(2,:),2)),'.-','Color','r') + plot(t_obs/3600,-3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.err(2,:),2)),'.-','Color','r') + xlabel('$[hour]$') + ylabel('$[km/s]$') + title('RangeRate post-fit residual') + subplot(2,4,7) + plot(t_obs/3600,Est.err(7,:)*units.lsf,'x','Color','g') + grid on; + hold on; + plot(t_obs/3600,3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.err(7,:),2)),'.-','Color','g') + plot(t_obs/3600,-3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.err(7,:),2)),'.-','Color','g') + xlabel('$[hour]$') + ylabel('$[km]$') + title('Lidar post-fit residual') + subplot(2,4,8) + plot(t_obs/3600,Est.err(8,:),'x','Color','m') + grid on; + hold on; + plot(t_obs/3600,3*pars.ObsNoise.pixel*ones(size(Est.err(8,:),2)),'.-','Color','m') + plot(t_obs/3600,-3*pars.ObsNoise.pixel*ones(size(Est.err(8,:),2)),'.-','Color','m') + xlabel('$[hour]$') + ylabel('$[N. pixel]$') + title('Camera post-fit residual') + + %-------------------------------------------------------------------------- diff --git a/New Model/Utilities_relative/Results_relative_harmonics.m b/New Model/Utilities_relative/Results_relative_harmonics.m new file mode 100644 index 0000000000000000000000000000000000000000..4311ab7791e2fd25794211cda682f8776cd4985d --- /dev/null +++ b/New Model/Utilities_relative/Results_relative_harmonics.m @@ -0,0 +1,541 @@ +function Results_relative_harmonics(Est, PhobosGravityField, pars, units) +%========================================================================== +% Results_relative_harmonics(Est, pars, units) +% +% This function plots the results of the covariance analysis +% +% INPUT: Description Units +% +% Est - Estimation of: +% .X, States at final t +% .x, States' deviation vector at final t +% .P, Covariance matrix at final t +% .t, Time observation vector +% .err, Post-fit residuals +% .pre, Pre-fit residuals +% .y_t, Pre-fit residuals +% .X_t, States at different t +% .x_t, States deviation vector at different t +% .Phi_t, STM at different t +% .P_t, Covariance matrix at different t +% .Pbar_t, Covariance matrix time update at different t +% +% YObs_Full Vector of observations and time of observations +% +% pars - Structure containing problem's parameters +% +% +% Coupling: +% None +% +% Author: Edoardo Ciccarelli +% Date: 09/2021 +% +%========================================================================== + + set(0,'DefaultTextInterpreter','latex'); + set(0,'DefaultAxesFontSize', 16); + + t_obs = Est.t; + + +%-------------------------------------------------------------------------- + + +% Plot of the pre and post fit residuals + + figure(1) + subplot(2,4,1) + plot(t_obs/3600,Est.pre(1,:)*units.lsf,'x','Color','b') + grid on; + hold on; + plot(t_obs/3600,Est.pre(3,:)*units.lsf,'x','Color','b') + plot(t_obs/3600,Est.pre(5,:)*units.lsf,'x','Color','b') + plot(t_obs/3600,3*pars.ObsNoise.range*units.lsf*ones(size(Est.pre(1,:),2)),'.-','Color','b') + plot(t_obs/3600,-3*pars.ObsNoise.range*units.lsf*ones(size(Est.pre(1,:),2)),'.-','Color','b') + xlabel('$[hour]$') + ylabel('$[km]$') + title('Range Pre-fit residual') + subplot(2,4,2) + plot(t_obs/3600,Est.pre(2,:)*units.vsf,'x','Color','r') + grid on; + hold on; + plot(t_obs/3600,Est.pre(4,:)*units.vsf,'x','Color','r') + plot(t_obs/3600,Est.pre(6,:)*units.vsf,'x','Color','r') + plot(t_obs/3600,3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.pre(2,:),2)),'.-','Color','r') + plot(t_obs/3600,-3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.pre(2,:),2)),'.-','Color','r') + xlabel('$[hour]$') + ylabel('$[km/s]$') + title('RangeRate Pre-fit residual') + subplot(2,4,3) + plot(t_obs/3600,Est.pre(7,:)*units.lsf,'x','Color','g') + grid on; + hold on; + plot(t_obs/3600,3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.pre(7,:),2)),'.-','Color','g') + plot(t_obs/3600,-3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.pre(7,:),2)),'.-','Color','g') + xlabel('$[hour]$') + ylabel('$[km]$') + title('Lidar Pre-fit residual') + subplot(2,4,4) + plot(t_obs/3600,Est.pre(8,:),'x','Color','m') + grid on; + hold on; + plot(t_obs/3600,3*pars.ObsNoise.pixel*ones(size(Est.pre(8,:),2)),'.-','Color','m') + plot(t_obs/3600,-3*pars.ObsNoise.pixel*ones(size(Est.pre(8,:),2)),'.-','Color','m') + xlabel('$[hour]$') + ylabel('$[N. pixel]$') + title('Camera Pre-fit residual') + + subplot(2,4,5) + plot(t_obs/3600,Est.err(1,:)*units.lsf,'x','Color','b') + grid on; + hold on; + plot(t_obs/3600,Est.err(3,:)*units.lsf,'x','Color','b') + plot(t_obs/3600,Est.err(5,:)*units.lsf,'x','Color','b') + plot(t_obs/3600,3*pars.ObsNoise.range*units.lsf*ones(size(Est.err(1,:),2)),'.-','Color','b') + plot(t_obs/3600,-3*pars.ObsNoise.range*units.lsf*ones(size(Est.err(1,:),2)),'.-','Color','b') + xlabel('$[hour]$') + ylabel('$[km]$') + title('Range post-fit residual') + subplot(2,4,6) + plot(t_obs/3600,Est.err(2,:)*units.vsf,'x','Color','r') + grid on; + hold on; + plot(t_obs/3600,Est.err(4,:)*units.vsf,'x','Color','r') + plot(t_obs/3600,Est.err(6,:)*units.vsf,'x','Color','r') + plot(t_obs/3600,3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.err(2,:),2)),'.-','Color','r') + plot(t_obs/3600,-3*pars.ObsNoise.range_rate*units.vsf*ones(size(Est.err(2,:),2)),'.-','Color','r') + xlabel('$[hour]$') + ylabel('$[km/s]$') + title('RangeRate post-fit residual') + subplot(2,4,7) + plot(t_obs/3600,Est.err(7,:)*units.lsf,'x','Color','g') + grid on; + hold on; + plot(t_obs/3600,3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.err(7,:),2)),'.-','Color','g') + plot(t_obs/3600,-3*pars.ObsNoise.lidar*units.lsf*ones(size(Est.err(7,:),2)),'.-','Color','g') + xlabel('$[hour]$') + ylabel('$[km]$') + title('Lidar post-fit residual') + subplot(2,4,8) + plot(t_obs/3600,Est.err(8,:),'x','Color','m') + grid on; + hold on; + plot(t_obs/3600,3*pars.ObsNoise.pixel*ones(size(Est.err(8,:),2)),'.-','Color','m') + plot(t_obs/3600,-3*pars.ObsNoise.pixel*ones(size(Est.err(8,:),2)),'.-','Color','m') + xlabel('$[hour]$') + ylabel('$[N. pixel]$') + title('Camera post-fit residual') + + + + +%-------------------------------------------------------------------------- + + +% Square-Root of the MMX covariance error + + sqx = squeeze(Est.P_t(1,1,1:end-1)); + sqy = squeeze(Est.P_t(2,2,1:end-1)); + sqz = squeeze(Est.P_t(3,3,1:end-1)); + SQRT_X = 3*sqrt(sqx + sqy + sqz); + sqvx = squeeze(Est.P_t(4,4,1:end-1)); + sqvy = squeeze(Est.P_t(5,5,1:end-1)); + sqvz = squeeze(Est.P_t(6,6,1:end-1)); + SQRT_V = 3*sqrt(sqvx + sqvy + sqvz); + + +% 3sigma Envelopes + figure() + subplot(1,2,1) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(1,1,1:end-1)))),'Color','b','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(Est.P_t(2,2,1:end-1)))),'Color','r','LineWidth',1) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(Est.P_t(3,3,1:end-1)))),'Color','g','LineWidth',1) + semilogy(t_obs(1:end-1)/3600,SQRT_X,'Color','k','LineWidth',2) + xlabel('time $[hour]$','FontSize',26) + ylabel('$[km]$','FontSize',26) + title('MMX position vector $3\sigma$ envelopes','Interpreter','latex','FontSize',30) + legend('$3\sigma_{x}$','$3\sigma_{y}$','$3\sigma_{z}$','$3 RMS$','Interpreter','latex','FontSize',26) + subplot(1,2,2) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(Est.P_t(4,4,1:end-1)))),'Color','b','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(Est.P_t(5,5,1:end-1)))),'Color','r','LineWidth',1) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(Est.P_t(6,6,1:end-1)))),'Color','g','LineWidth',1) + semilogy(t_obs(1:end-1)/3600,SQRT_V,'Color','k','LineWidth',2) + xlabel('time $[hour]$','FontSize',26) + ylabel('$[km/s]$','FontSize',26) + title('MMX velocity vector $3\sigma$ envelopes','Interpreter','latex','FontSize',30) + legend('$3\sigma_{\dot{x}}$','$3\sigma_{\dot{y}}$','$3\sigma_{\dot{z}}$','$3 RMS$','Interpreter','latex','FontSize',26) + + + P_rel_RAC = zeros(3,3,size(Est.X_t(9,:),2)); + V_rel_RAC = zeros(3,3,size(Est.X_t(9,:),2)); + + for i = 1:size(Est.X_t(1,:),2) + + P_rel_RAC(:,:,i) = Radial_Along_Cross_Covariance(Est.P_t(1:3,1:3,i), Est.X_t(1:6,i), pars, units); + V_rel_RAC(:,:,i) = Radial_Along_Cross_Covariance(Est.P_t(4:6,4:6,i), Est.X_t(1:6,i), pars, units); + + end + + + figure() + subplot(1,2,1) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(P_rel_RAC(1,1,1:end-1)))),'Color','b','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_rel_RAC(2,2,1:end-1)))),'Color','r','LineWidth',1) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_rel_RAC(3,3,1:end-1)))),'Color','g','LineWidth',1) + semilogy(t_obs(1:end-1)/3600,SQRT_X,'Color','k','LineWidth',2) + xlabel('time $[hour]$') + ylabel('$[km]$') + title('MMX position $3\sigma$ in RAC directions','Interpreter','latex','FontSize',30) + legend('$3\sigma_{radial}$','$3\sigma_{along}$','$3\sigma_{cross}$','$3 RMS$','Interpreter','latex','FontSize',26) + subplot(1,2,2) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(V_rel_RAC(1,1,1:end-1)))),'Color','b','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(V_rel_RAC(2,2,1:end-1)))),'Color','r','LineWidth',1) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(V_rel_RAC(3,3,1:end-1)))),'Color','g','LineWidth',1) + semilogy(t_obs(1:end-1)/3600,SQRT_V,'Color','k','LineWidth',2) + xlabel('time $[hour]$') + ylabel('$[km/s]$') + title('MMX position $3\sigma$ in RAC directions','Interpreter','latex','FontSize',30) + legend('$3\sigma_{radial}$','$3\sigma_{along}$','$3\sigma_{cross}$','$3 RMS$','Interpreter','latex','FontSize',26) + + +%-------------------------------------------------------------------------- + + +% Phobos's states uncertainties evolution +% Phobos cartesian covaraiance + + + + + if pars.flag_FILTERING == 1 + + Phobos_real = cspice_spkezr('-401', pars.et0+t_obs, 'MARSIAU', 'none', 'MARS'); + err = abs(Phobos_real - X_Phobos); + + + [Ph, pars] = Phobos_States_NewModel(pars.et0,pars); + Ph = Ph./units.sfVec2; + St0 = [MMX_real(:,1)./units.sfVec; Ph; pars.I2]; + tspan = t_obs*units.tsf; + RelTol = 1e-13; + AbsTol = 1e-16; + opt = odeset('RelTol',RelTol,'AbsTol',AbsTol,'event',@(t,X) landing_Phobos(t,X,pars,units)); + [~,X] = ode113(@(t,X) Dynamics_MPHandMMX_Inertia(t,X,pars,units),tspan,St0,opt); + + + if size(Est.X_t,1) == 20 + + Phi_t = X(:,13:14)'.*[1; units.tsf]; + err_Phi = abs(Phi_t - Est.X_t(11:12,:)); + + % 3sigma Envelopes and error + figure() + subplot(2,4,1) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(P_PhXYZ(1,1,1:end-1)))),'Color','b','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(1,1:end-1),'*','Color','b','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km]$') + title('$x_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,2) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_PhXYZ(2,2,1:end-1)))),'Color','r','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(2,1:end-1),'*','Color','r','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km]$') + title('$y_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,3) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_PhXYZ(3,3,1:end-1)))),'Color','g','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(3,1:end-1),'*','Color','g','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km]$') + title('$z_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,4) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(11,11,1:end-1)))),'Color','m','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err_Phi(1,1:end-1),'*','Color','m','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[rad]$') + title('$\Phi_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,5) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(P_PhVXYZ(1,1,1:end-1)))),'Color','b','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(4,1:end-1),'*','Color','b','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km/s]$') + title('$Vx_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,6) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_PhVXYZ(2,2,1:end-1)))),'Color','r','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(5,1:end-1),'*','Color','r','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km/s]$') + title('$Vy_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,7) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_PhVXYZ(3,3,1:end-1)))),'Color','g','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(6,1:end-1),'*','Color','g','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km/s]$') + title('$Vz_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,8) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(12,12,1:end-1)))),'Color','m','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err_Phi(2,1:end-1),'*','Color','m','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[rad/s]$') + title('$\dot{\Phi}_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + + else + + Phi_t = X(:,13:14)'.*[1; units.tsf]; + err_Phi = abs(Phi_t - Est.X_t(13:14,:)); + + % 3sigma Envelopes and error + figure() + subplot(2,4,1) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(P_PhXYZ(1,1,1:end-1)))),'Color','b','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(1,1:end-1),'*','Color','b','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km]$') + title('$x_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,2) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_PhXYZ(2,2,1:end-1)))),'Color','r','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(2,1:end-1),'*','Color','r','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km]$') + title('$y_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,3) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_PhXYZ(3,3,1:end-1)))),'Color','g','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(3,1:end-1),'*','Color','g','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km]$') + title('$z_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,4) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(13,13,1:end-1)))),'Color','m','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err_Phi(1,1:end-1),'*','Color','m','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[rad]$') + title('$\Phi_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,5) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(P_PhVXYZ(1,1,1:end-1)))),'Color','b','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(4,1:end-1),'*','Color','b','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km/s]$') + title('$Vx_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,6) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_PhVXYZ(2,2,1:end-1)))),'Color','r','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(5,1:end-1),'*','Color','r','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km/s]$') + title('$Vy_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,7) + semilogy(t_obs(1:end-1)/3600,3*squeeze(real(sqrt(P_PhVXYZ(3,3,1:end-1)))),'Color','g','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err(6,1:end-1),'*','Color','g','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[km/s]$') + title('$Vz_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + subplot(2,4,8) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(14,14,1:end-1)))),'Color','m','LineWidth',1) + hold on; + grid on; + semilogy(t_obs(1:end-1)/3600,err_Phi(2,1:end-1),'*','Color','m','LineWidth',1) + xlabel('time $[hour]$') + ylabel('$[rad/s]$') + title('$\dot{\Phi}_{Ph}$ $3\sigma$ envelope and error','FontSize',30) + + end + + else + + + + % 3sigma Envelopes + figure() + subplot(2,2,1) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(7,7,1:end-1)))),'Color','b','LineWidth',1) + grid on + xlabel('time [hour]') + ylabel('$R_{Ph}$ [km]') + subplot(2,2,2) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(9,9,1:end-1)))),'Color','m','LineWidth',1) + grid on + xlabel('time [hour]') + ylabel('$\Phi_{Ph}$ [rad]') + + subplot(2,2,3) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(8,8,1:end-1)))),'Color','b','LineWidth',1) + grid on + xlabel('time [hour]') + ylabel('$\dot{R}_{Ph}$ [km/s]') + subplot(2,2,4) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(10,10,1:end-1)))),'Color','m','LineWidth',1) + grid on + xlabel('time [hour]') + ylabel('$\dot{\Phi}_{Ph}$ [rad/s]') + + + + end + + + %-------------------------------------------------------------------------- + + + +% Harmonics 3sigma Envelopes + +% place0 = size(Est.X,1)-pars.nCoeff-pars.nBias; + + + corr_label = {'$x$','$y$','$z$','$\dot{x}$','$\dot{y}$','$\dot{z}$',... + '$R_{Ph}$','$\dot{R}_{Ph}$', '$\Phi_{Ph}$','$\dot{\Phi}_{Ph}$'}; + + + +%-------------------------------------------------------------------------- + + +% Biases + + place0 = size(Est.X,1)-pars.nBias; + corr_label(end+1) = {'$\rho$'}; + corr_label(end+1) = {'$\dot{\rho}$'}; + corr_label(end+1) = {'$LIDAR_b$'}; + + figure() + subplot(1,pars.nBias,1) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(place0+1,place0+1,1:end-1)))),'LineWidth',1,... + 'DisplayName',('$\rho$'),'Color','b'); + grid on; + hold on; + xlabel('time $[hour]$') + ylabel('$[km]$') + subplot(1,pars.nBias,2) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(place0+2,place0+2,1:end-1)))),'LineWidth',1,... + 'DisplayName',('$\dot{\rho}$'),'Color','r'); + grid on; + hold on; + xlabel('time $[hour]$') + ylabel('$[km/s]$') + subplot(1,pars.nBias,3) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(place0+3,place0+3,1:end-1)))),'LineWidth',1,... + 'DisplayName',('$LIDAR_b$'),'Color','g'); + grid on; + hold on; + xlabel('time $[hour]$') + ylabel('$[km]$') + + subplot(1,pars.nBias,4) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(place0+4,place0+4,1:end-1)))),'LineWidth',1,... + 'DisplayName',('$Features_x$'),'Color','m'); + grid on; + hold on; + xlabel('time $[hour]$') + ylabel('$[pix]$') + + subplot(1,pars.nBias,5) + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(place0+5,place0+5,1:end-1)))),'LineWidth',1,... + 'DisplayName',('$Features_y$'),'Color','k'); + grid on; + hold on; + xlabel('time $[hour]$') + ylabel('$[pix]$') + + + +%-------------------------------------------------------------------------- + + + +% Harmonics Coefficients + + + place0 = 10; + figure() + for i = 0:PhobosGravityField(1) + subplot(1,PhobosGravityField(1)+1,i+1) + for j = 0:i + place0 = place0+1; + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(place0,place0,1:end-1)))),'LineWidth',1,... + 'DisplayName',['$C_{',num2str(i),num2str(j),'}$']); + grid on; + hold on; + corr_label{end+1} = ['$C_{',num2str(i),num2str(j),'}$']; + end + xlabel('time $[hour]$') + legend('Interpreter','latex','FontSize',14) + end + +% Slm coefficients + figure() + for i = 1:PhobosGravityField(1) + subplot(1,PhobosGravityField(1),i) + for j = 1:i + place0 = place0+1; + semilogy(t_obs(1:end-1)/3600,3.*squeeze(real(sqrt(Est.P_t(place0,place0,1:end-1)))),'LineWidth',1,... + 'DisplayName',['$S_{',num2str(i),num2str(j),'}$']) + grid on; + hold on; + corr_label{end+1} = ['$S_{',num2str(i),num2str(j),'}$']; + end + xlabel('time $[hour]$') + legend('Interpreter','latex','FontSize',14) + end + + + +%-------------------------------------------------------------------------- + + +% Correlations coefficients + + % [~,corr] = readCovMatrix(real(Est.P)); + % + % figure(); + % imagesc(real(corr)) + % title('Correlation Coefficients','FontSize',16); + % set(gca,'FontSize',16); + % colormap(hot); + % colorbar; + % set(gca,'TickLabelInterpreter','latex'); + % set(gca,'XTick',(1:size(Est.X,1))); + % set(gca,'XTickLabel',corr_label); + % set(gca,'YTick',(1:size(Est.X,1))); + % set(gca,'YTickLabel',corr_label); + % axis square; + % freezeColors; + + diff --git a/New Model/Utilities/landing_Phobos_relative.m b/New Model/Utilities_relative/landing_Phobos_relative.m similarity index 100% rename from New Model/Utilities/landing_Phobos_relative.m rename to New Model/Utilities_relative/landing_Phobos_relative.m diff --git a/New Model/Utilities/landing_Phobos_relative_UKF.m b/New Model/Utilities_relative/landing_Phobos_relative_UKF.m similarity index 100% rename from New Model/Utilities/landing_Phobos_relative_UKF.m rename to New Model/Utilities_relative/landing_Phobos_relative_UKF.m diff --git a/New Model/Utilities/landing_Phobos_relative_ridotto.m b/New Model/Utilities_relative/landing_Phobos_relative_ridotto.m similarity index 100% rename from New Model/Utilities/landing_Phobos_relative_ridotto.m rename to New Model/Utilities_relative/landing_Phobos_relative_ridotto.m diff --git a/New Model/Utilities/visible_features_Mars_relative.m b/New Model/Utilities_relative/visible_features_Mars_relative.m similarity index 100% rename from New Model/Utilities/visible_features_Mars_relative.m rename to New Model/Utilities_relative/visible_features_Mars_relative.m diff --git a/New Model/Utilities/visible_features_model_relative.m b/New Model/Utilities_relative/visible_features_model_relative.m similarity index 100% rename from New Model/Utilities/visible_features_model_relative.m rename to New Model/Utilities_relative/visible_features_model_relative.m diff --git a/New Model/Utilities/visible_features_relative.m b/New Model/Utilities_relative/visible_features_relative.m similarity index 100% rename from New Model/Utilities/visible_features_relative.m rename to New Model/Utilities_relative/visible_features_relative.m diff --git a/New Model/YObs_rel.mat b/New Model/YObs_rel.mat index ad91c2825099b7059cce4c12966f30b993e14902..459e0b747d22c7e3ecfff87bd96cf5c56b8a1f81 100644 Binary files a/New Model/YObs_rel.mat and b/New Model/YObs_rel.mat differ diff --git a/Observations_Generation.m b/Observations_Generation.m index df30ad7593b43ac230ffb8e5643bcdc60c9469ce..267b6452f6a08bfdd260f13a23197273c41dd048 100644 --- a/Observations_Generation.m +++ b/Observations_Generation.m @@ -17,6 +17,7 @@ clc addpath(genpath('../generic_kernels/')); addpath(genpath('../paper/MMX_Fcn_CovarianceAnalyses/')); addpath(genpath('../paper/MMX_Product/MMX_BSP_Files_GravLib/')); + addpath(genpath('./Utilities/')) MMX_InitializeSPICE cspice_furnsh(which('mar097.bsp')); cspice_furnsh(which('MARPHOFRZ.txt')); diff --git a/UKF_Tool.m b/UKF_Tool.m index 031e16f0e5e4fd7fbe7104e778ef01b8f136e516..8fe4593ac9a85b2763c514c16d02893af128983f 100644 --- a/UKF_Tool.m +++ b/UKF_Tool.m @@ -104,9 +104,9 @@ function [Est] = UKF_Tool(Est0, f, fsigma, G, O, Measures, pars, units,... St0 = Xold(1:17); event = @landing_Phobos; event_UKF = @landing_Phobos_UKF; - case 96 - St0 = Xold(1:10); - event = @landing_Phobos_relative_ridotto; + case {40,96} + St0 = Xold(1:10); + event = @landing_Phobos_relative_ridotto; event_UKF = @landing_Phobos_relative_UKF; end @@ -123,31 +123,19 @@ function [Est] = UKF_Tool(Est0, f, fsigma, G, O, Measures, pars, units,... % Look for the observation to process if Measures(i).t == told - idx = idx_old; - switch n - case 18 - Xmean_bar = [X(idx,:)'; 0; 0; 0; 0; 0]; - case 20 - Xmean_bar = [X(idx,1:10)'; X(idx,13:end)'; 0; 0; 0; 0; 0]; - pars.PhiM = X(idx,11); - case 22 - Xmean_bar = [X(idx,:)'; 0; 0; 0; 0; 0]; - case 96 - Xmean_bar = [X(idx,:)'; pars.Clm; pars.Slm; 0; 0; 0; 0; 0]; - end + idx = idx_old; elseif Measures(i).t > told idx = find(round(t/units.tsf)==Measures(i).t); - switch n - case 18 - Xmean_bar = [X(idx,:)'; 0; 0; 0; 0; 0]; - case 20 - Xmean_bar = [X(idx,1:10)'; X(idx,13:end)'; 0; 0; 0; 0; 0]; - pars.PhiM = X(idx,11); - case 22 - Xmean_bar = [X(idx,:)'; 0; 0; 0; 0; 0]; - case 96 - Xmean_bar = [X(idx,:)'; pars.Clm; pars.Slm; 0; 0; 0; 0; 0]; - end + end + + switch n + case {18,22} + Xmean_bar = [X(idx,:)'; 0; 0; 0; 0; 0]; + case 20 + Xmean_bar = [X(idx,1:10)'; X(idx,13:end)'; 0; 0; 0; 0; 0]; + pars.PhiM = X(idx,11); + case {40,96} + Xmean_bar = [X(idx,:)'; pars.Clm; pars.Slm; 0; 0; 0; 0; 0]; end % Useful quantities's initialization @@ -181,7 +169,7 @@ function [Est] = UKF_Tool(Est0, f, fsigma, G, O, Measures, pars, units,... end - fprintf('\nProcesso osservazione n. : %d', i); + fprintf('\nOsservazione n.%d di %d', i, m); % Process noise if needed deltaT = (Measures(i).t-told)*units.tsf; @@ -199,9 +187,9 @@ function [Est] = UKF_Tool(Est0, f, fsigma, G, O, Measures, pars, units,... Gamma = [eye(q)*deltaT^2/2; eye(q)*deltaT; zeros(n-6,q)]; Q = Gamma*Q*Gamma' + [zeros(6,n); zeros(n-6,6), pars.sigmaPh^2*... diag([deltaT^2/2, deltaT, deltaT^2/2, deltaT, deltaT^2/2, deltaT, deltaT^2/2, deltaT, zeros(1,n-14)])]; - case 96 + case {40,96} Gamma = [eye(q)*deltaT^2/2; eye(q)*deltaT; zeros(n-6,q)]; - Q = Gamma*Q*Gamma' + [zeros(6,n); zeros(n-6,6), 0*... + Q = Gamma*Q*Gamma' + [zeros(6,n); zeros(n-6,6), pars.sigmaPh^2*... diag([deltaT^2/2, deltaT, deltaT^2/2, deltaT, zeros(1,n-10)])]; end @@ -269,6 +257,7 @@ function [Est] = UKF_Tool(Est0, f, fsigma, G, O, Measures, pars, units,... elseif isempty(features)&&(~isempty(Y_obs.cam)) fprintf('\nTracking delle features su Phobos perso!!'); end + if ~isempty(features_Mars)&&(~isempty(Y_obs.cam_Mars)) features_Mars = features_list(Y_obs.cam_Mars, Features_Mars_ID); elseif isempty(features_Mars)&&(~isempty(Y_obs.cam_Mars)) diff --git a/Utilities/ProjMatrix.m b/Utilities/ProjMatrix.m index bee4dffb3d1a0e318634957e50ebeb01c6ebdb44..3d956a02261bc612ab36c331445da6ed6f7d4cc8 100644 --- a/Utilities/ProjMatrix.m +++ b/Utilities/ProjMatrix.m @@ -1,10 +1,7 @@ -function [M_int, M_ext, PM] = ProjMatrix(t, pars, units) +function [M_int, M_ext, PM] = ProjMatrix(t, pars, ~) % Camera intrinsic matrix K = pars.camera_intrinsic; - - - % Camera's fixed reference frame has the Z versor along the radial % direction, and the X and Y on the camera plane.