From 7cad2fc4f34ba92c5367e0ad3fa0b85e7712d41a Mon Sep 17 00:00:00 2001 From: "guglielmo.gualdana" <guglielmo.gualdana@skywarder.eu> Date: Thu, 17 Apr 2025 13:46:49 +0200 Subject: [PATCH] prima simulaizone --- commonFunctions/kalman/correctorZVK.m | 17 ++++- commonFunctions/kalman/predictorZVK.m | 74 ++++++++++--------- commonFunctions/kalman/run_ZVK.m | 7 +- .../config2025_Orion_Portugal_October.m | 12 +-- .../src/std_run_parts/std_setInitialParams.m | 2 +- simulator/src/std_run_parts/std_subsystems.m | 2 +- 6 files changed, 62 insertions(+), 52 deletions(-) diff --git a/commonFunctions/kalman/correctorZVK.m b/commonFunctions/kalman/correctorZVK.m index 835f8d8..1ac6628 100644 --- a/commonFunctions/kalman/correctorZVK.m +++ b/commonFunctions/kalman/correctorZVK.m @@ -25,12 +25,14 @@ function [x_new, P_new] = correctrZVK(x_pred, P_pred) % zeros(3) zeros(3) skewOmega*A zeros(3) zeros(3) zeros(3)]; - P_xx_pred = P_pred(1:15,1:15,end); - P_xp_pred = P_pred(16:33,1:15,end); - P_pp_pred = P_pred(16:33,16:33,end); + P_xx_pred = P_pred(1:15,1:15); + P_xp_pred = P_pred(1:15,16:33); + P_pp_pred = P_pred(16:33,16:33); + R = [1e-3*diag(ones(3,1)), zeros(3); + zeros(3), 1e-3*diag(ones(3,1))]; - S = H_x * P_xx_pred * H_x'; + S = H_x * P_xx_pred * H_x' + R; K = P_xx_pred * H_x' * S; @@ -49,4 +51,11 @@ function [x_new, P_new] = correctrZVK(x_pred, P_pred) x_new(1:4) = [ (quat_pred(4)*quat_error(1:3) + quat_error(4)*quat_pred(1:3) - cross(quat_error(1:3),quat_pred(1:3)) )'; quat_error(4)*quat_pred(4) - quat_error(1:3)*quat_pred(1:3)' ]; + + P_xx_new = (1 - K * H_x) * P_xx_pred; + + P_new = [P_xx_new, P_xp_pred; + P_xp_pred', P_pp_pred]; + + end \ No newline at end of file diff --git a/commonFunctions/kalman/predictorZVK.m b/commonFunctions/kalman/predictorZVK.m index 02c1b4c..2e3bfb4 100644 --- a/commonFunctions/kalman/predictorZVK.m +++ b/commonFunctions/kalman/predictorZVK.m @@ -39,8 +39,8 @@ function [z_pred, P_pred] = predictorZVK( x_prev, P_prev, a_b_m, om_b_m, dt, zvk %%% Biases random walk - bias_a_pred = (eye(3) + zvk.acc_bias_noise) * bias_a_prev; - bias_g_pred = (eye(3) + zvk.gyro_bias_noise) * bias_g_prev; + bias_a_pred = eye(3)*bias_a_prev + zvk.acc_bias_noise; + bias_g_pred = eye(3)*bias_g_prev + zvk.gyro_bias_noise; % Assemble predicted global state @@ -51,13 +51,14 @@ function [z_pred, P_pred] = predictorZVK( x_prev, P_prev, a_b_m, om_b_m, dt, zvk %%% Covariance prediction - F11 = - omega_mat; - F15 = - eye(3); - F23 = eye(3); - F31 = - A * [ 0 -a_b(3) a_b(2); - a_b(3) 0 -a_b(1); - -a_b(2) a_b(1) 0;]; - F34 = - A; + F11 = - omega_mat; % phi/phi + F14 = - eye(3); % phi/beta_gyro + F23 = eye(3); % r/v + F31 = - A * [ 0 -a_i(3) a_i(2); % v/phi + a_i(3) 0 -a_i(1); + -a_i(2) a_i(1) 0;]; + F35 = - A; % v/beta_acc + % x = r_prev(1); % y = r_prev(2); @@ -71,39 +72,40 @@ function [z_pred, P_pred] = predictorZVK( x_prev, P_prev, a_b_m, om_b_m, dt, zvk F32 = zeros(3); % Ho tolto la dipendenza dell'acceleraizone dalla posizone (i.e. la perturbazione J2) - F = [F11, zeros(3), zeros(3), zeros(3), F15; - zeros(3), zeros(3), F23, zeros(3), zeros(3); - F31, F32, zeros(3), F34, zeros(3); - zeros(3), zeros(3), zeros(3), zeros(3), zeros(3); - zeros(3), zeros(3), zeros(3), zeros(3), zeros(3)]; + F = [F11, zeros(3), zeros(3), F14, zeros(3); + zeros(3), zeros(3), F23, zeros(3), zeros(3); + F31, F32, zeros(3), zeros(3) F35; + zeros(3), zeros(3), zeros(3), zeros(3), zeros(3); + zeros(3), zeros(3), zeros(3), zeros(3), zeros(3)]; - G_w = [-diag(ones(3,1)), zeros(3), zeros(3), zeros(3); - zeros(3), zeros(3), zeros(3), zeros(3); - zeros(3), zeros(3), -A, diag(ones(3,1)); - zeros(3), zeros(3), zeros(3), diag(ones(3,1)); - zeros(3), diag(ones(3,1)), zeros(3), zeros(3)]; + G_w = [-diag(ones(3,1)), zeros(3), zeros(3), zeros(3); + zeros(3), zeros(3), zeros(3), zeros(3); + zeros(3), zeros(3), -A, diag(ones(3,1)); + zeros(3), diag(ones(3,1)), zeros(3), zeros(3); + zeros(3), zeros(3), zeros(3), diag(ones(3,1))]; + G11 = - diag(om_b); G12 = - omega_mat; G13 = - [ 0, om_b(3), om_b(2); om_b(3), 0, om_b(2); om_b(2), om_b(1), 0]; - G34 = - A * diag(a_b); - G35 = A * diag(a_b); - G36 = - A * [ 0, a_b(3), a_b(2); - a_b(3), 0, a_b(2); - a_b(2), a_b(1), 0]; + G34 = - A * diag(a_i); + G35 = A * diag(a_i); + G36 = - A * [ 0, a_i(3), a_i(2); + a_i(3), 0, a_i(2); + a_i(2), a_i(1), 0]; - G_p = [G11, G12, G13, zeros(3), zeros(3), zeros(3); - zeros(3), zeros(3), zeros(3), zeros(3), zeros(3), zeros(3); - zeros(3), zeros(3), zeros(3), G34, G35, G36; - zeros(3), zeros(3), zeros(3), zeros(3), zeros(3), zeros(3); - zeros(3), zeros(3), zeros(3), zeros(3), zeros(3), zeros(3)]; + G_p = [G11, G12, G13, zeros(3), zeros(3), zeros(3); + zeros(3), zeros(3), zeros(3), zeros(3), zeros(3), zeros(3); + zeros(3), zeros(3), zeros(3), G34, G35, G36; + zeros(3), zeros(3), zeros(3), zeros(3), zeros(3), zeros(3); + zeros(3), zeros(3), zeros(3), zeros(3), zeros(3), zeros(3)]; - PHI = exp(F * dt); + PHI = expm(F * dt); GAMMA = (PHI*G_w); @@ -111,18 +113,18 @@ function [z_pred, P_pred] = predictorZVK( x_prev, P_prev, a_b_m, om_b_m, dt, zvk - P_xx_prev = P_prev(1:15,1:15,end); - P_xp_prev = P_prev(16:33,1:15,end); - P_pp_prev = P_prev(16:33,16:33,end); + P_xx_prev = P_prev(1:15,1:15); + P_xp_prev = P_prev(1:15,16:33); + P_pp_prev = P_prev(16:33,16:33); P_xx_pred = PHI * P_xx_prev * PHI'+ ... GAMMA * zvk.Q * dt * GAMMA' + ... - PHI * P_xp_prev' * PSI' + ... - PSI * P_xp_prev * PHI' + ... % note: P_PX_prev = P_XP_prev' + PHI * P_xp_prev * PSI' + ... + PSI * P_xp_prev' * PHI + ... % note: P_PX_prev = P_XP_prev' PSI * P_pp_prev * PSI'; - P_xp_pred = PHI * P_xp_prev' + PSI * P_pp_prev; + P_xp_pred = PHI * P_xp_prev + PSI * P_pp_prev; % P_pp does nto change diff --git a/commonFunctions/kalman/run_ZVK.m b/commonFunctions/kalman/run_ZVK.m index a73ee9d..69326c5 100644 --- a/commonFunctions/kalman/run_ZVK.m +++ b/commonFunctions/kalman/run_ZVK.m @@ -1,4 +1,4 @@ -function [sensorTot] = run_ZVK(Tf, sensorData, sensorTot, settings, environment) +function [sensorData, sensorTot] = run_ZVK(Tf, sensorData, sensorTot, settings, environment) % recall zvk time @@ -46,10 +46,9 @@ if length(t_zvk) > 1 %%% Correction - correctorZVK( x(ii,:), P_z(:,:,ii) ); + [x(ii,:), P_z(:,:,ii)] = correctorZVK( x(ii,:), P_z(:,:,ii) ); - - + end diff --git a/data/2025_Orion_Portugal_October/config2025_Orion_Portugal_October.m b/data/2025_Orion_Portugal_October/config2025_Orion_Portugal_October.m index 5a2b347..4f656d3 100644 --- a/data/2025_Orion_Portugal_October/config2025_Orion_Portugal_October.m +++ b/data/2025_Orion_Portugal_October/config2025_Orion_Portugal_October.m @@ -145,14 +145,14 @@ settings.nas.Qq = [(settings.nas.sigma_w^2*settings.nas.dt_k+(1/3 % settings.zvk settings.zvk.Q = diag( 0.1^2*ones(12,1) ); -settings.zvk.mu = 3.986004418e14; -settings.zvk.Re = 6378137; -settings.zvk.J2 = 1.082636e-3; +% settings.zvk.mu = 3.986004418e14; +% settings.zvk.Re = 6378137; +% settings.zvk.J2 = 1.082636e-3; -settings.zvk.P = 0.5*eye(33); +settings.zvk.P = 0.1*eye(33); -settings.zvk.gyro_bias_noise = 0.05; -settings.zvk.acc_bias_noise = 0.05; +settings.zvk.gyro_bias_noise = deg2rad(0.5)/sqrt(3600); +settings.zvk.acc_bias_noise = 10000*9.81e-6/sqrt(50); diff --git a/simulator/src/std_run_parts/std_setInitialParams.m b/simulator/src/std_run_parts/std_setInitialParams.m index 11560ec..175ab5c 100644 --- a/simulator/src/std_run_parts/std_setInitialParams.m +++ b/simulator/src/std_run_parts/std_setInitialParams.m @@ -194,7 +194,7 @@ settings.nas.mag_freq = settings.frequencies.NASFrequency/settings.nas.mag_decim % if settings.flagNAS || settings.electronics ?????? -sensorData.zvk.states = [Q0(2:4); Q0(1); X0; V0; zeros(6,1); zeros(18,1)]'; +sensorData.zvk.states = [Q0(2:4); Q0(1); X0; V0; zeros(3,1); zeros(3,1); zeros(18,1)]'; if settings.scenario ~="descent" sensorData.zvk.states(7) = -environment.z0; diff --git a/simulator/src/std_run_parts/std_subsystems.m b/simulator/src/std_run_parts/std_subsystems.m index 5b188c2..7f8a323 100644 --- a/simulator/src/std_run_parts/std_subsystems.m +++ b/simulator/src/std_run_parts/std_subsystems.m @@ -153,5 +153,5 @@ end %% ZVK if currentState == availableStates.on_ground - [sensorTot] = run_ZVK(t1,sensorData, sensorTot, settings, environment); + [sensorData, sensorTot] = run_ZVK(t1,sensorData, sensorTot, settings, environment); end \ No newline at end of file -- GitLab