From 89cb27ff4975d7b11451187a1c9709be9e46e831 Mon Sep 17 00:00:00 2001 From: EmaMaker Date: Wed, 24 Jul 2024 14:57:19 +0200 Subject: [PATCH] restructure code to allow execution in parallel these commits are so messy --- control_act.m | 72 +++++++++----------- sistema.m | 4 +- sistema_discr.m | 5 +- tesi-spmd.m | 0 tesiema.m | 89 ++++++++----------------- tesiema.mlx => tesiema_live.mlx | Bin tesiema_sinusoide_diff_1step_track.mlx | Bin 38188 -> 24174 bytes tests/sin/common.mat | Bin 0 -> 565 bytes tests/sin/sin1.mat | Bin 0 -> 192 bytes tests/sin/sin2.mat | Bin 0 -> 192 bytes tests/sin/sin3.mat | Bin 0 -> 192 bytes unicycle.m | 8 +-- 12 files changed, 69 insertions(+), 109 deletions(-) create mode 100644 tesi-spmd.m rename tesiema.mlx => tesiema_live.mlx (100%) create mode 100644 tests/sin/common.mat create mode 100644 tests/sin/sin1.mat create mode 100644 tests/sin/sin2.mat create mode 100644 tests/sin/sin3.mat diff --git a/control_act.m b/control_act.m index c11e943..7e72174 100644 --- a/control_act.m +++ b/control_act.m @@ -1,42 +1,40 @@ -function u = control_act(t, q) - global SATURATION - - dc = decouple_matrix(q); - ut = utrack(t,q); - uc = ucorr(t,q); +function u = control_act(t, q, sim_data) + dc = decouple_matrix(q, sim_data.b); + ut = utrack(t, q, sim_data); + uc = ucorr(t, q, sim_data); u = dc * (ut + uc); % saturation - u = min(SATURATION, max(-SATURATION, u)); + u = min(sim_data.SATURATION, max(-sim_data.SATURATION, u)); end -function u_corr = ucorr(t,q) - global SATURATION PREDICTION_SATURATION_TOLERANCE PREDICTION_HORIZON tc - - if eq(PREDICTION_HORIZON, 0) +function u_corr = ucorr(t, q, sim_data) + pred_hor = sim_data.PREDICTION_HORIZON; + SATURATION = sim_data.SATURATION; + PREDICTION_SATURATION_TOLERANCE = sim_data.PREDICTION_SATURATION_TOLERANCE; + tc = sim_data.tc; + + if eq(pred_hor, 0) u_corr = zeros(2,1); return end persistent U_corr_history; if isempty(U_corr_history) - U_corr_history = zeros(2, 1, PREDICTION_HORIZON); + U_corr_history = zeros(2, 1, pred_hor); end %disp('start of simulation') q_prec = q; - %q_pred = []; - %u_track_pred = []; - %t_inv_pred = []; - q_pred=zeros(3,1, PREDICTION_HORIZON); - u_track_pred=zeros(2,1, PREDICTION_HORIZON+1); - T_inv_pred=zeros(2,2, PREDICTION_HORIZON+1); + q_pred=zeros(3,1, pred_hor); + u_track_pred=zeros(2,1, pred_hor+1); + T_inv_pred=zeros(2,2, pred_hor+1); % for each step in the prediction horizon, integrate the system to % predict its future state % the first step takes in q_k-1 and calculates q_new = q_k % this means that u_track_pred will contain u_track_k-1 and will not % contain u_track_k+C - for k = 1:PREDICTION_HORIZON + for k = 1:pred_hor % start from the old (known) state % calculate the inputs, based on the old state @@ -45,9 +43,9 @@ function u_corr = ucorr(t,q) u_corr_ = U_corr_history(:, :, k); % u_track can be calculated from q t_ = t + tc*(k-1); - u_track_ = utrack(t_, q_prec); + u_track_ = utrack(t_, q_prec, sim_data); - T_inv = decouple_matrix(q_prec); + T_inv = decouple_matrix(q_prec, sim_data.b); u_ = T_inv * (u_corr_ + u_track_); % calc the state integrating with euler @@ -70,11 +68,11 @@ function u_corr = ucorr(t,q) %q_prec % calculate u_track_k+C - u_track_pred(:,:,PREDICTION_HORIZON+1) = utrack(t+tc*PREDICTION_HORIZON, q_prec); + u_track_pred(:,:,pred_hor+1) = utrack(t+tc*pred_hor, q_prec, sim_data); % remove u_track_k-1 u_track_pred = u_track_pred(:,:,2:end); - T_inv_pred(:,:,PREDICTION_HORIZON+1) = decouple_matrix(q_prec); + T_inv_pred(:,:,pred_hor+1) = decouple_matrix(q_prec, sim_data.b); T_inv_pred = T_inv_pred(:,:,2:end); %disp('end of patching data up') @@ -99,11 +97,11 @@ function u_corr = ucorr(t,q) % A will be at most PREDICTION_HORIZON * 2 * 2 (2: size of T_inv; 2: % accounting for T_inv and -T_inv) by PREDICTION_HORIZON*2 (number of % vectors in u_corr times the number of elements [2] in each vector) - A_max_elems = PREDICTION_HORIZON * 2 * 2; + A_max_elems = pred_hor * 2 * 2; A_deq = []; b_deq = []; - for k=1:PREDICTION_HORIZON + for k=1:pred_hor T_inv = T_inv_pred(:,:,k); u_track = u_track_pred(:,:,k); @@ -126,9 +124,9 @@ function u_corr = ucorr(t,q) % squared norm of u_corr. H must be identity, % PREDICTION_HORIZON*size(u_corr) - H = eye(PREDICTION_HORIZON*2)*2; + H = eye(pred_hor*2)*2; % no linear terms - f = zeros(PREDICTION_HORIZON*2, 1); + f = zeros(pred_hor*2, 1); % solve qp problem options = optimoptions('quadprog', 'Display', 'off'); @@ -136,30 +134,26 @@ function u_corr = ucorr(t,q) % reshape the vector of vectors to be an array, each element being % u_corr_j as a 2x1 vector - U_corr_history = reshape(U_corr, [2,1,PREDICTION_HORIZON]); + U_corr_history = reshape(U_corr, [2,1,pred_hor]); u_corr=U_corr_history(:,:, 1); end -function u_track = utrack(t, q) - global ref dref K - ref_s = double(subs(ref, t)); - dref_s = double(subs(dref, t)); +function u_track = utrack(t, q, sim_data) + ref_s = double(subs(sim_data.ref, t)); + dref_s = double(subs(sim_data.dref, t)); - f = feedback(q); + f = feedback(q, sim_data.b); err = ref_s - f; - u_track = dref_s + K*err; + u_track = dref_s + sim_data.K*err; end -function q_track = feedback(q) - global b +function q_track = feedback(q, b) q_track = [q(1) + b*cos(q(3)); q(2) + b*sin(q(3)) ]; end -function T_inv = decouple_matrix(q) - global b - +function T_inv = decouple_matrix(q, b) theta = q(3); st = sin(theta); ct = cos(theta); diff --git a/sistema.m b/sistema.m index 7f4641e..aee1e93 100644 --- a/sistema.m +++ b/sistema.m @@ -1,3 +1,3 @@ -function q = sistema(t, q) - q = unicycle(t, q, control_act(t, q)); +function q = sistema(t, q, sim_data) + q = unicycle(t, q, control_act(t, q, sim_data)); end diff --git a/sistema_discr.m b/sistema_discr.m index 4f8a366..ccde484 100644 --- a/sistema_discr.m +++ b/sistema_discr.m @@ -1,4 +1,3 @@ -function x = sistema_discr(t, q) - global u_discr - q = unicycle(t, q, u_discr); +function dq = sistema_discr(t, q, u_discr) + dq = unicycle(t, q, u_discr); end diff --git a/tesi-spmd.m b/tesi-spmd.m new file mode 100644 index 0000000..e69de29 diff --git a/tesiema.m b/tesiema.m index 431c420..d4f6b73 100644 --- a/tesiema.m +++ b/tesiema.m @@ -3,91 +3,58 @@ clear all close all %% global variables -global q0 ref dref b tc K SATURATION tc tfin USE_PREDICTION PREDICTION_HORIZON PREDICTION_SATURATION_TOLERANCE; +global K SATURATION PREDICTION_HORIZON PREDICTION_SATURATION_TOLERANCE; -%% variables -TRAJECTORY = 6 -INITIAL_CONDITIONS = 1 -USE_PREDICTION = false -PREDICTION_HORIZON = 5 -% distance from the center of the unicycle to the point being tracked -% ATTENZIONE! CI SARA' SEMPRE UN ERRORE COSTANTE DOVUTO A b. Minore b, -% minore l'errore -b = 0.2 -% proportional gain -K = eye(2)*2 +sim_data = load(['tests/sin/common.mat']); -tc = 0.1 -tfin=30 +sim_data.q0 = set_initial_conditions(sim_data.INITIAL_CONDITIONS); +[ref dref] = set_trajectory(sim_data.TRAJECTORY); +sim_data.ref = ref; +sim_data.dref = dref; -% saturation -% HYP: a diff. drive robot with motors spinning at 100rpm -> 15.7 rad/s. -% Radius of wheels 10cm. Wheels distanced 15cm from each other -% applying transformation, v -% saturation = [1.57, 20]; -SATURATION = [1; 1]; -PREDICTION_SATURATION_TOLERANCE = 0.0; - -%% launch simulation -% initial state -% In order, [x, y, theta] -q0 = set_initial_conditions(INITIAL_CONDITIONS) -% trajectory to track -[ref, dref] = set_trajectory(TRAJECTORY) - -global tu uu - -figure(1) -PREDICTION_HORIZON = 0; -[t, q, ref_t, U] = simulate_discr(tfin); -plot_results(t, q, ref_t, U); - -figure(2) -PREDICTION_HORIZON = 1; -[t1, q1, ref_t1, U1] = simulate_discr(tfin); -plot_results(t1, q1, ref_t1, U1); - -figure(3) -PREDICTION_HORIZON = 2; -[t2, q2, ref_t2, U2] = simulate_discr(tfin); -plot_results(t2, q2, ref_t2, U2); - -%figure(3) -%subplot(1, 2, 1) -%plot(tu, uu(1, :)) -%subplot(1, 2, 2) -%plot(tu, uu(2, :)) -%plot_results(t, x-x1, ref_t-ref_t1, U-U1); +spmd (3) + worker_index = spmdIndex; + data = load(['tests/sin/sin' num2str(spmdIndex) '.mat']); + + sim_data.PREDICTION_HORIZON = data.PREDICTION_HORIZON; + sim_data + [t, q, ref_t, U] = simulate_discr(sim_data); +end +s_ = size(worker_index); +for n = 1:s_(2) + figure(n) + plot_results(t{n}, q{n}, ref_t{n}, U{n}); +end %% FUNCTION DECLARATIONS % Discrete-time simulation -function [t, q, ref_t, U] = simulate_discr(tfin) - global ref q0 u_discr tc - - steps = tfin/tc +function [t, q, ref_t, U] = simulate_discr(sim_data) + tc = sim_data.tc; + steps = sim_data.tfin/tc - q = q0'; + q = sim_data.q0'; t = 0; - u_discr = control_act(t, q0); + u_discr = control_act(t, q, sim_data); U = u_discr'; for n = 1:steps tspan = [(n-1)*tc n*tc]; z0 = q(end, :); - [v, z] = ode45(@sistema, tspan, z0); + %[v, z] = ode45(@sistema_discr, tspan, z0, u_discr); + [v, z] = ode45(@(v, z) sistema_discr(v, z, u_discr), tspan, z0); q = [q; z]; t = [t; v]; - u_discr = control_act(t(end), q(end, :)); + u_discr = control_act(t(end), q(end, :), sim_data); U = [U; ones(length(v), 1)*u_discr']; end - ref_t = double(subs(ref, t'))'; + ref_t = double(subs(sim_data.ref, t'))'; end diff --git a/tesiema.mlx b/tesiema_live.mlx similarity index 100% rename from tesiema.mlx rename to tesiema_live.mlx diff --git a/tesiema_sinusoide_diff_1step_track.mlx b/tesiema_sinusoide_diff_1step_track.mlx index e5f4e12f464b6961e83b46971a4a0aa6dc3d30ab..78cbc960a5f5b651681ebf59c6514f7e99240159 100644 GIT binary patch delta 20753 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 Uj~kN@k`I#>l@JCXTmS$7001$d?EnA( delta 34856 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 diff --git a/tests/sin/common.mat b/tests/sin/common.mat new file mode 100644 index 0000000000000000000000000000000000000000..3397ae8fefa9380560425d311749c4d719bda61c GIT binary patch literal 565 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQgHY2i*PhE(NSt3>S5H z5&{DY0_GEroD#|K|e!_4|J$9G`GO!QH_4 z$o=D{CoZ19Ikk~<&7?*~2FZ1t|3T&$!ObZ^HHXnqS)`b;a6__3#)RaK<@@DbWQ7Hc zm{b{~44Ef^bn2n$gnLy_fseE3OHnD`NB*vs70FDe8on?vM671+1?kd+>)L>7-yuU~ zXQ2ttTDs29;$%{P%V?&-+62;|ja!4Tv!@X=vwBF)H6MW+nfwfP_gPEdSSWeeC$0kXn19smFU literal 0 HcmV?d00001 diff --git a/unicycle.m b/unicycle.m index e7e7a7e..32475ee 100644 --- a/unicycle.m +++ b/unicycle.m @@ -1,7 +1,7 @@ -function dx = unicycle(t, x, u) +function dq = unicycle(t, q, u) % u is (v;w) % x is (x; y; theta) - theta = x(3); - G_x = [cos(theta), 0; sin(theta), 0; 0, 1]; - dx = G_x*u; + theta = q(3); + G_q = [cos(theta), 0; sin(theta), 0; 0, 1]; + dq = G_q*u; end