diff --git a/MMX_Fcn_CovarianceAnalyses/New_MMX_CovarianceAnalysisParameters.m b/MMX_Fcn_CovarianceAnalyses/New_MMX_CovarianceAnalysisParameters.m index 33884d83e4475722ae1acca2984bbcab8623d857..711573167df0486fe8f2e481d69454d1fb05b7ec 100644 --- a/MMX_Fcn_CovarianceAnalyses/New_MMX_CovarianceAnalysisParameters.m +++ b/MMX_Fcn_CovarianceAnalyses/New_MMX_CovarianceAnalysisParameters.m @@ -38,9 +38,9 @@ pars.ObsNoise.range = 5e-3/units.lsf; % [km] pars.ObsNoise.range_rate= 5e-7/units.vsf; % [km/s] pars.ObsNoise.lidar = 1e-2/units.lsf; % [km] -FOV = 45*pi/180; +pars.FOV = deg2rad(45); pixels = 2048; -pars.ObsNoise.camera = FOV/pixels; % [rad/pixel] +pars.ObsNoise.camera = pars.FOV/pixels; % [rad/pixel] % Useful to adimensionalize the observables units.Observations = [units.lsf; units.vsf; units.lsf; units.vsf; units.lsf; units.vsf; units.lsf; 1; 1]; diff --git a/MMX_Fcn_CovarianceAnalyses/RealPhobos_States_NewModel.m b/MMX_Fcn_CovarianceAnalyses/RealPhobos_States_NewModel.m new file mode 100644 index 0000000000000000000000000000000000000000..f7501103c35b98b0857af6404a7f018556c3f854 --- /dev/null +++ b/MMX_Fcn_CovarianceAnalyses/RealPhobos_States_NewModel.m @@ -0,0 +1,60 @@ +function [Ph, par] = RealPhobos_States_NewModel(data,par) + + Phobos_0 = cspice_spkezr('401', data, 'MARSIAU', 'none', '499'); + + r = Phobos_0(1:3); + v = Phobos_0(4:6); + h = cross(r,v); + theta_dot = norm(h)/norm(r)^2; + vr = dot(r,v)/norm(r); + +% For the true anomaly I need to move to the orbit's plane + eh = h/norm(h); + ey = cross(v,h)/par.mu - r/norm(r); + ey = ey/norm(ey); + Y = cross(eh,ey)/norm(cross(eh,ey)); + par.MARSIAU2perifocal = [ey,Y,eh]'; + par.perifocal2MARSIAU = par.MARSIAU2perifocal'; + + Ph_0 = par.MARSIAU2perifocal*Phobos_0(1:3); + theta = atan2(Ph_0(2),Ph_0(1)); + + Ph_0_ORB = cspice_spkezr('401', data, 'MARPHOFRZ', 'none', '499'); + er = -Ph_0_ORB(1:3)/norm(Ph_0_ORB(1:3)); + eh = cross(Ph_0_ORB(1:3),Ph_0_ORB(4:6))/... + norm(cross(Ph_0_ORB(1:3),Ph_0_ORB(4:6))); + ey = cross(eh,er); + NO = [er,ey,eh]; + no = [-er,cross(eh,-er),eh]; + par.no = no; + +% Mars's libration angle + BN = cspice_sxform('MARPHOFRZ','IAU_MARS',data); + BO = BN(1:3,1:3)*no; + [Phi1,ea2,ea3] = cspice_m2eul(BO,3,2,1); + + Wtilde = -BN(4:6, 1:3)*BN(1:3, 1:3)'; + w_BN = [-Wtilde(2,3); Wtilde(1,3); -Wtilde(1,2)]; + w_BO = w_BN - BO*[0; 0; theta_dot]; + Phi1_dot = (sin(ea3)*w_BO(2) + cos(ea3)*w_BO(3))/cos(ea2); + + +% Phobos's libration angle + par.PB = [0.999240107370417 0.0378550984643587 0.00928436010779999 + -0.0379006415569816 0.99927008291848 0.00477940934253335 + -0.00909665828350325 -0.00512766070913186 0.999945477465509]; + + BN = cspice_sxform('MARPHOFRZ','IAU_PHOBOS',data); + R_In2PhPA = par.PB*BN(1:3,1:3); + BO = R_In2PhPA*NO; + [Phi2,ea2,ea3] = cspice_m2eul(BO,3,2,1); + + Wtilde = -BN(4:6, 1:3)*BN(1:3, 1:3)'; + w_BN = [-Wtilde(2,3); Wtilde(1,3); -Wtilde(1,2)]; + w_BO = w_BN - BO*[0; 0; theta_dot]; + Phi2_dot = (sin(ea3)*w_BO(2) + cos(ea3)*w_BO(3))/cos(ea2); + +% New state model + Ph = [norm(r); vr; theta; theta_dot; Phi1; Phi1_dot; Phi2; Phi2_dot]; + +end \ No newline at end of file diff --git a/Model_Check/TestIntegrWithMMXInertia.m b/Model_Check/TestIntegrWithMMXInertia.m index d055970a63640be4fc6963be515482c2ab047127..eda2d5d7e5c447115fc744976a2c7e2b1d8c4e2c 100644 --- a/Model_Check/TestIntegrWithMMXInertia.m +++ b/Model_Check/TestIntegrWithMMXInertia.m @@ -19,9 +19,9 @@ clc MMX_InitializeSPICE cspice_furnsh('MARPHOFRZ.txt'); cspice_furnsh(which('mar097.bsp')); -% cspice_furnsh(which('MMX_QSO_094_2x2_826891269_831211269.bsp')); -% cspice_furnsh(which('MMX_3DQSO_094_009_2x2_826891269_828619269.bsp')); - cspice_furnsh(which('MMX_SwingQSO_049_000_2x2_826891269_828619269.bsp')); +% cspice_furnsh(which('MMX_QSO_027_2x2_826891269_831211269.bsp')); +% cspice_furnsh(which('MMX_3DQSO_027_009_2x2_826891269_828619269.bsp')); + cspice_furnsh(which('MMX_SwingQSO_027_007_2x2_826891269_831211269.bsp')); cspice_furnsh(which('Phobos_826891269_828619269.bsp')); % Model parameters @@ -55,7 +55,7 @@ clc % Integration day = 24*3600; - tspan = (0:100:.5*day)*units.tsf; + tspan = (0:100:5*day)*units.tsf; RelTol = 1e-13; AbsTol = 1e-16; opt = odeset('RelTol',RelTol,'AbsTol',AbsTol,'event', @(t,X) landing_Phobos(t,X,par,units)); diff --git a/Model_Check/TestIntegratorNew.m b/Model_Check/TestIntegratorNew.m index 593553e791be724d0425e90213595f774eb3ba16..18b99f5b3af1dc4e5b64bac20785bd3b32478a82 100644 --- a/Model_Check/TestIntegratorNew.m +++ b/Model_Check/TestIntegratorNew.m @@ -17,7 +17,6 @@ clc addpath(genpath('../MMX_Product/MMX_FullEphemeris_BSP_Files/')); MMX_InitializeSPICE cspice_furnsh(which('mar097.bsp')); - cspice_furnsh(which('QSO_22000m_2026_03_15.bsp')); cspice_furnsh('MARPHOFRZ.txt'); % Windows diff --git a/Reference_Definition/BSP_generator.m b/Reference_Definition/BSP_generator.m index ad23f8105a0779fe573ad59f3925d033911c5591..ce74f4a86794d501481872ac1efcad26fe9b7f2d 100644 --- a/Reference_Definition/BSP_generator.m +++ b/Reference_Definition/BSP_generator.m @@ -32,7 +32,7 @@ clc startdate = '2026-03-16 00:00:00 (UTC)'; data = cspice_str2et(startdate); par.et0 = data; - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); % QSO-H % load("QSO-H_20rev.mat") diff --git a/Reference_Definition/BSP_generator_3D.m b/Reference_Definition/BSP_generator_3D.m index 033cc3b280f2017e354f3a58ad25789d17083346..acffbf41771a548cabd3fc7a6d2c33dfaf7864cc 100644 --- a/Reference_Definition/BSP_generator_3D.m +++ b/Reference_Definition/BSP_generator_3D.m @@ -31,7 +31,7 @@ clc startdate = '2026-03-16 00:00:00 (UTC)'; data = cspice_str2et(startdate); par.et0 = data; - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); % % 3DQSO-Lb % load("3dQSO-Lb.mat") diff --git a/Reference_Definition/BSP_generator_Swing.m b/Reference_Definition/BSP_generator_Swing.m index fb8c7e09993f4cc7e5d3f08859478654f0303059..fa783392c39e53b5be42b606fffac5cb47522a96 100644 --- a/Reference_Definition/BSP_generator_Swing.m +++ b/Reference_Definition/BSP_generator_Swing.m @@ -32,17 +32,17 @@ clc startdate = '2026-03-16 00:00:00 (UTC)'; data = cspice_str2et(startdate); par.et0 = data; - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); % % SwingQSO-Lb -% load("SwingQSO-Lb.mat") + load("SwingQSO-Lb.mat") % % If MMX comes from the optimization -% X_MMX = X_good(1:6,1); + X_MMX = X_good(1:6,1); % If MMX comes from a .bsp file - cspice_furnsh(which('MMX_SwingQSO_031_011_2x2_826891269_828619269.bsp')); - X_MMX = cspice_spkezr('-34', data, 'MARSIAU', 'none', '499')./units.sfVec; +% cspice_furnsh(which('MMX_SwingQSO_031_011_2x2_826891269_828619269.bsp')); +% X_MMX = cspice_spkezr('-34', data, 'MARSIAU', 'none', '499')./units.sfVec; % Initial Phobos's state vector Ph0 = Ph./units.sfVec2; @@ -95,7 +95,7 @@ clc system(command); end - MMX_GenerateBSPFiles_GravLib(t, Xmmx, XPh, 'SwingQSO', [31, 11], period_Def, Model, micePATH) + MMX_GenerateBSPFiles_GravLib(t, Xmmx, XPh, 'SwingQSO', [27, 7], period_Def, Model, micePATH) %% Test risultati diff --git a/Reference_Definition/Constraints.m b/Reference_Definition/Constraints.m index e8c53032884d740c60c15ef945b94609a4821337..1ee35f91ea78cae9ad12b55efa504ace7ee3c38b 100644 --- a/Reference_Definition/Constraints.m +++ b/Reference_Definition/Constraints.m @@ -3,7 +3,7 @@ function [c, ceq] = Constraints(X,Geom,data,X_patch) [par, units] = MMX_DefineNewModelParametersAndUnits; - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); Ph = Ph./units.sfVec2; par.Geom = Geom; diff --git a/Reference_Definition/Constraints_3DQSO.m b/Reference_Definition/Constraints_3DQSO.m index 0709f4f55333e8c21ff2cb46a8a20abae246f76d..6928d297727cf9b10b617373ae6ac239f539d9d1 100644 --- a/Reference_Definition/Constraints_3DQSO.m +++ b/Reference_Definition/Constraints_3DQSO.m @@ -2,7 +2,7 @@ function [c, ceq] = Constraints_3DQSO(X,Geom,data,X_patch_PhRot,X_patch_MAIAU) [par, units] = MMX_DefineNewModelParametersAndUnits; - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); Ph = Ph./units.sfVec2; par.Geom = Geom; diff --git a/Reference_Definition/Constraints_Swing.m b/Reference_Definition/Constraints_Swing.m index 61bb799b117138cca5a4af154a70950ebf9bb80c..bea162926631d457f0ea3a653dc3991935811d08 100644 --- a/Reference_Definition/Constraints_Swing.m +++ b/Reference_Definition/Constraints_Swing.m @@ -1,7 +1,7 @@ function [c, ceq] = Constraints_Swing(X,Geom,data,X_patch) [par, units] = MMX_DefineNewModelParametersAndUnits; - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); Ph = Ph./units.sfVec2; par.Geom = Geom; diff --git a/Reference_Definition/CostFunction.m b/Reference_Definition/CostFunction.m index ff51359f7916861f3e876d580b97ea31812609fd..e52ec2f50043d5f11df0a3e67b897f2eace4b08c 100644 --- a/Reference_Definition/CostFunction.m +++ b/Reference_Definition/CostFunction.m @@ -2,7 +2,7 @@ function DeltaV = CostFunction(X,Geom,data) [par, units] = MMX_DefineNewModelParametersAndUnits; - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); Ph = Ph./units.sfVec2; par.Geom = Geom; diff --git a/Reference_Definition/PlotInCond.m b/Reference_Definition/PlotInCond.m index 006c740cdd5bfda7a0590279fac50b2936994053..a694054108551128c3d906b2c759eed0a030847c 100644 --- a/Reference_Definition/PlotInCond.m +++ b/Reference_Definition/PlotInCond.m @@ -3,7 +3,7 @@ function stop = PlotInCond(x,~,~,Geom,data) stop = false; [par, units] = MMX_DefineNewModelParametersAndUnits; - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); Ph = Ph./units.sfVec2; par.Geom = Geom; diff --git a/Reference_Definition/QSO3D_ContPoints_Definition.m b/Reference_Definition/QSO3D_ContPoints_Definition.m index f891f0c1c5248d0fcde7f538954af914b2b2acc3..8300835cd3380400efa1252f0d55131008a429ed 100644 --- a/Reference_Definition/QSO3D_ContPoints_Definition.m +++ b/Reference_Definition/QSO3D_ContPoints_Definition.m @@ -105,7 +105,7 @@ clc % Initial state data = cspice_str2et('2026-03-16, 00:00:00 (UTC)'); - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); Ph = Ph./units.sfVec2; day = 24*3600; diff --git a/Reference_Definition/QSO_ContiPoints_Definition.m b/Reference_Definition/QSO_ContiPoints_Definition.m index e381e5af608df3c6b20f48d1efede356b78a3631..c57a35c54764e94b7576db14f18e069a2b3067bf 100644 --- a/Reference_Definition/QSO_ContiPoints_Definition.m +++ b/Reference_Definition/QSO_ContiPoints_Definition.m @@ -138,7 +138,7 @@ clc % Initial state data = cspice_str2et('2026-03-16, 00:00:00 (UTC)'); - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); Ph = Ph./units.sfVec2; day = 24*3600; diff --git a/Reference_Definition/SwingQSO_ContiPoints_Definition.m b/Reference_Definition/SwingQSO_ContiPoints_Definition.m index 5d181561e1fef5287c73c32b3ed40757fc9d533e..16fd8b095e800b3814e039914c4151df8c222485 100644 --- a/Reference_Definition/SwingQSO_ContiPoints_Definition.m +++ b/Reference_Definition/SwingQSO_ContiPoints_Definition.m @@ -103,7 +103,7 @@ clc % Initial state data = cspice_str2et('2026-03-16, 00:00:00 (UTC)'); - [Ph, par] = Phobos_States_NewModel(data,par); + [Ph, par] = RealPhobos_States_NewModel(data,par); Ph = Ph./units.sfVec2; day = 24*3600;