From ba81e3675828e98e16107a6d7d75ab330b48bedb Mon Sep 17 00:00:00 2001
From: "Ciccarelli, Edoardo (PG/R - Comp Sci & Elec Eng)"
 <e.ciccarelli@surrey.ac.uk>
Date: Mon, 20 Mar 2023 13:15:43 +0000
Subject: [PATCH] Last update

---
 .../New_MMX_CovarianceAnalysisParameters.m    |  4 +-
 .../RealPhobos_States_NewModel.m              | 60 +++++++++++++++++++
 Model_Check/TestIntegrWithMMXInertia.m        |  8 +--
 Model_Check/TestIntegratorNew.m               |  1 -
 Reference_Definition/BSP_generator.m          |  2 +-
 Reference_Definition/BSP_generator_3D.m       |  2 +-
 Reference_Definition/BSP_generator_Swing.m    | 12 ++--
 Reference_Definition/Constraints.m            |  2 +-
 Reference_Definition/Constraints_3DQSO.m      |  2 +-
 Reference_Definition/Constraints_Swing.m      |  2 +-
 Reference_Definition/CostFunction.m           |  2 +-
 Reference_Definition/PlotInCond.m             |  2 +-
 .../QSO3D_ContPoints_Definition.m             |  2 +-
 .../QSO_ContiPoints_Definition.m              |  2 +-
 .../SwingQSO_ContiPoints_Definition.m         |  2 +-
 15 files changed, 82 insertions(+), 23 deletions(-)
 create mode 100644 MMX_Fcn_CovarianceAnalyses/RealPhobos_States_NewModel.m

diff --git a/MMX_Fcn_CovarianceAnalyses/New_MMX_CovarianceAnalysisParameters.m b/MMX_Fcn_CovarianceAnalyses/New_MMX_CovarianceAnalysisParameters.m
index 33884d8..7115731 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 0000000..f750110
--- /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 d055970..eda2d5d 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 593553e..18b99f5 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 ad23f81..ce74f4a 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 033cc3b..acffbf4 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 fb8c7e0..fa78339 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 e8c5303..1ee35f9 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 0709f4f..6928d29 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 61bb799..bea1629 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 ff51359..e52ec2f 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 006c740..a694054 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 f891f0c..8300835 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 e381e5a..c57a35c 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 5d18156..16fd8b0 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;
 
-- 
GitLab