From 1321d12e4df70ed720dd0a9699ac73ea5f5a1dbe Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Thu, 27 Feb 2020 11:45:54 +0100 Subject: [PATCH] Add Compliance and Transmissibility computation Change solid to rigid --- matlab/stewart_platform_model.slx | Bin 50273 -> 51646 bytes org/control-study.org | 455 ++++++++++++++++++++++++++++++ org/simscape-model.org | 31 +- src/computeCompliance.m | 83 ++++++ src/computeTransmissibility.m | 84 ++++++ src/initializeGround.m | 10 +- src/initializePayload.m | 8 +- 7 files changed, 653 insertions(+), 18 deletions(-) create mode 100644 src/computeCompliance.m create mode 100644 src/computeTransmissibility.m diff --git a/matlab/stewart_platform_model.slx b/matlab/stewart_platform_model.slx index 660b1ce3a225006de0e606d649bf6b84e3f15b19..88f2566efb223987621adb5e24500731ba4f7837 100644 GIT binary patch delta 32339 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 sU{wj=gY7?5R{bN)Tt)iVwKw5^=Zhd9@c%OV delta 30963 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 +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes + <> +#+end_src + +#+begin_src matlab + simulinkproject('../'); +#+end_src + +#+begin_src matlab + open('stewart_platform_model.slx') +#+end_src + +** Initialize the Stewart platform +#+begin_src matlab + stewart = initializeStewartPlatform(); + stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); + stewart = generateGeneralConfiguration(stewart); + stewart = computeJointsPose(stewart); + stewart = initializeStrutDynamics(stewart); + stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); + stewart = initializeCylindricalPlatforms(stewart); + stewart = initializeCylindricalStruts(stewart); + stewart = computeJacobian(stewart); + stewart = initializeStewartPose(stewart); + stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3); +#+end_src + +We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$. +#+begin_src matlab + ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A); + payload = initializePayload('type', 'rigid'); +#+end_src + +** Transmissibility +#+begin_src matlab + %% Options for Linearized + options = linearizeOptions; + options.SampleTime = 0; + + %% Name of the Simulink File + mdl = 'stewart_platform_model'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad] + io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad] + + %% Run the linearization + T = linearize(mdl, io, options); + T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'}; + T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; +#+end_src + +#+begin_src matlab + freqs = logspace(1, 4, 1000); + + figure; + for ix = 1:6 + for iy = 1:6 + subplot(6, 6, (ix-1)*6 + iy); + hold on; + plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylim([1e-5, 10]); + xlim([freqs(1), freqs(end)]); + if ix < 6 + xticklabels({}); + end + if iy > 1 + yticklabels({}); + end + end + end +#+end_src + +From cite:preumont07_six_axis_singl_stage_activ, one can use the Frobenius norm of the transmissibility matrix to obtain a scalar indicator of the transmissibility performance of the system: +\begin{align*} + \| \bm{T}(\omega) \| &= \sqrt{\text{Trace}[\bm{T}(\omega) \bm{T}(\omega)^H]}\\ + &= \sqrt{\Sigma_{i=1}^6 \Sigma_{j=1}^6 |T_{ij}|^2} +\end{align*} + +#+begin_src matlab + freqs = logspace(1, 4, 1000); + + T_norm = zeros(length(freqs), 1); + + for i = 1:length(freqs) + T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')')); + end +#+end_src + +And we normalize by a factor $\sqrt{6}$ to obtain a performance metric comparable to the transmissibility of a one-axis isolator: +\[ \Gamma(\omega) = \|\bm{T}(\omega)\| / \sqrt{6} \] + +#+begin_src matlab + Gamma = T_norm/sqrt(6); +#+end_src + +#+begin_src matlab + figure; + plot(freqs, Gamma) + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +#+end_src + +* Compliance Analysis +** Matlab Init :noexport: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes + <> +#+end_src + +#+begin_src matlab + simulinkproject('../'); +#+end_src + +#+begin_src matlab + open('stewart_platform_model.slx') +#+end_src + +** Initialize the Stewart platform +#+begin_src matlab + stewart = initializeStewartPlatform(); + stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); + stewart = generateGeneralConfiguration(stewart); + stewart = computeJointsPose(stewart); + stewart = initializeStrutDynamics(stewart); + stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); + stewart = initializeCylindricalPlatforms(stewart); + stewart = initializeCylindricalStruts(stewart); + stewart = computeJacobian(stewart); + stewart = initializeStewartPose(stewart); + stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3); +#+end_src + +We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$. +#+begin_src matlab + ground = initializeGround('type', 'none'); + payload = initializePayload('type', 'rigid'); +#+end_src + +** Compliance +#+begin_src matlab + %% Options for Linearized + options = linearizeOptions; + options.SampleTime = 0; + + %% Name of the Simulink File + mdl = 'stewart_platform_model'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad] + io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad] + + %% Run the linearization + C = linearize(mdl, io, options); + C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'}; + C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; +#+end_src + +#+begin_src matlab + freqs = logspace(1, 4, 1000); + + figure; + for ix = 1:6 + for iy = 1:6 + subplot(6, 6, (ix-1)*6 + iy); + hold on; + plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylim([1e-10, 1e-3]); + xlim([freqs(1), freqs(end)]); + if ix < 6 + xticklabels({}); + end + if iy > 1 + yticklabels({}); + end + end + end +#+end_src + +We can try to use the Frobenius norm to obtain a scalar value representing the 6-dof compliance of the Stewart platform. + +#+begin_src matlab + freqs = logspace(1, 4, 1000); + + C_norm = zeros(length(freqs), 1); + + for i = 1:length(freqs) + C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')')); + end +#+end_src + +#+begin_src matlab + figure; + plot(freqs, C_norm) + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +#+end_src +* Functions +** Compute the Transmissibility +:PROPERTIES: +:header-args:matlab+: :tangle ../src/computeTransmissibility.m +:header-args:matlab+: :comments none :mkdirp yes :eval no +:END: +<> + +*** Function description +:PROPERTIES: +:UNNUMBERED: t +:END: +#+begin_src matlab + function [T, T_norm, freqs] = computeTransmissibility(args) + % computeTransmissibility - + % + % Syntax: [T, T_norm, freqs] = computeTransmissibility(args) + % + % Inputs: + % - args - Structure with the following fields: + % - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm + % - freqs [] - Frequency vector to estimate the Frobenius norm + % + % Outputs: + % - T [6x6 ss] - Transmissibility matrix + % - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix + % - freqs [length(freqs)x1] - Frequency vector in [Hz] +#+end_src + +*** Optional Parameters +:PROPERTIES: +:UNNUMBERED: t +:END: +#+begin_src matlab + arguments + args.plots logical {mustBeNumericOrLogical} = false + args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000) + end +#+end_src + +#+begin_src matlab + freqs = args.freqs; +#+end_src + +*** Identification of the Transmissibility Matrix +:PROPERTIES: +:UNNUMBERED: t +:END: +#+begin_src matlab + %% Options for Linearized + options = linearizeOptions; + options.SampleTime = 0; + + %% Name of the Simulink File + mdl = 'stewart_platform_model'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad] + io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad] + + %% Run the linearization + T = linearize(mdl, io, options); + T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'}; + T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; +#+end_src + +If wanted, the 6x6 transmissibility matrix is plotted. +#+begin_src matlab + p_handle = zeros(6*6,1); + + if args.plots + fig = figure; + for ix = 1:6 + for iy = 1:6 + p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy); + hold on; + plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + if ix < 6 + xticklabels({}); + end + if iy > 1 + yticklabels({}); + end + end + end + + linkaxes(p_handle, 'xy') + xlim([freqs(1), freqs(end)]); + ylim([1e-5, 1e2]); + + han = axes(fig, 'visible', 'off'); + han.XLabel.Visible = 'on'; + han.YLabel.Visible = 'on'; + ylabel(han, 'Frequency [Hz]'); + xlabel(han, 'Transmissibility [m/m]'); + end +#+end_src + +*** Computation of the Frobenius norm +:PROPERTIES: +:UNNUMBERED: t +:END: +#+begin_src matlab + T_norm = zeros(length(freqs), 1); + + for i = 1:length(freqs) + T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')')); + end +#+end_src + +#+begin_src matlab + T_norm = T_norm/sqrt(6); +#+end_src + +#+begin_src matlab + if args.plots + figure; + plot(freqs, T_norm) + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); + ylabel('Transmissibility - Frobenius Norm'); + end +#+end_src + +** Compute the Compliance +:PROPERTIES: +:header-args:matlab+: :tangle ../src/computeCompliance.m +:header-args:matlab+: :comments none :mkdirp yes :eval no +:END: +<> + +*** Function description +:PROPERTIES: +:UNNUMBERED: t +:END: +#+begin_src matlab + function [C, C_norm, freqs] = computeCompliance(args) + % computeCompliance - + % + % Syntax: [C, C_norm, freqs] = computeCompliance(args) + % + % Inputs: + % - args - Structure with the following fields: + % - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm + % - freqs [] - Frequency vector to estimate the Frobenius norm + % + % Outputs: + % - C [6x6 ss] - Compliance matrix + % - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix + % - freqs [length(freqs)x1] - Frequency vector in [Hz] +#+end_src + +*** Optional Parameters +:PROPERTIES: +:UNNUMBERED: t +:END: +#+begin_src matlab + arguments + args.plots logical {mustBeNumericOrLogical} = false + args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000) + end +#+end_src + +#+begin_src matlab + freqs = args.freqs; +#+end_src + +*** Identification of the Compliance Matrix +:PROPERTIES: +:UNNUMBERED: t +:END: +#+begin_src matlab + %% Options for Linearized + options = linearizeOptions; + options.SampleTime = 0; + + %% Name of the Simulink File + mdl = 'stewart_platform_model'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % External forces [N, N*m] + io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad] + + %% Run the linearization + C = linearize(mdl, io, options); + C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'}; + C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; +#+end_src + +If wanted, the 6x6 transmissibility matrix is plotted. +#+begin_src matlab + p_handle = zeros(6*6,1); + + if args.plots + fig = figure; + for ix = 1:6 + for iy = 1:6 + p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy); + hold on; + plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + if ix < 6 + xticklabels({}); + end + if iy > 1 + yticklabels({}); + end + end + end + + linkaxes(p_handle, 'xy') + xlim([freqs(1), freqs(end)]); + + han = axes(fig, 'visible', 'off'); + han.XLabel.Visible = 'on'; + han.YLabel.Visible = 'on'; + xlabel(han, 'Frequency [Hz]'); + ylabel(han, 'Compliance [m/N, rad/(N*m)]'); + end +#+end_src + +*** Computation of the Frobenius norm +:PROPERTIES: +:UNNUMBERED: t +:END: +#+begin_src matlab + freqs = args.freqs; + + C_norm = zeros(length(freqs), 1); + + for i = 1:length(freqs) + C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')')); + end +#+end_src + +#+begin_src matlab + if args.plots + figure; + plot(freqs, C_norm) + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); + ylabel('Compliance - Frobenius Norm'); + end +#+end_src diff --git a/org/simscape-model.org b/org/simscape-model.org index caef737..5f2268a 100644 --- a/org/simscape-model.org +++ b/org/simscape-model.org @@ -170,7 +170,7 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]]. % % Inputs: % - args - Structure with the following fields: - % - type - 'none', 'solid', 'flexible', 'cartesian' + % - type - 'none', 'rigid', 'flexible', 'cartesian' % - h [1x1] - Height of the CoM of the payload w.r.t {M} [m] % This also the position where K and C are defined % - K [6x1] - Stiffness of the Payload [N/m, N/rad] @@ -180,7 +180,7 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]]. % % Outputs: % - payload - Struture with the following properties: - % - type - 1 (none), 2 (solid), 3 (flexible) + % - type - 1 (none), 2 (rigid), 3 (flexible) % - h [1x1] - Height of the CoM of the payload w.r.t {M} [m] % - K [6x1] - Stiffness of the Payload [N/m, N/rad] % - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)] @@ -194,7 +194,7 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]]. :END: #+begin_src matlab arguments - args.type char {mustBeMember(args.type,{'none', 'solid', 'flexible', 'cartesian'})} = 'none' + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'cartesian'})} = 'none' args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(6,1) args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1) args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3 @@ -211,7 +211,7 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]]. switch args.type case 'none' payload.type = 1; - case 'solid' + case 'rigid' payload.type = 2; case 'flexible' payload.type = 3; @@ -255,12 +255,13 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]]. % Inputs: % - args - Structure with the following fields: % - type - 'none', 'solid', 'flexible' + % - rot_point [3x1] - Rotation point for the ground motion [m] % - K [3x1] - Translation Stiffness of the Ground [N/m] % - C [3x1] - Translation Damping of the Ground [N/(m/s)] % % Outputs: % - ground - Struture with the following properties: - % - type - 1 (none), 2 (solid), 3 (flexible) + % - type - 1 (none), 2 (rigid), 3 (flexible) % - K [3x1] - Translation Stiffness of the Ground [N/m] % - C [3x1] - Translation Damping of the Ground [N/(m/s)] #+end_src @@ -270,11 +271,12 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]]. :UNNUMBERED: t :END: #+begin_src matlab - arguments - args.type char {mustBeMember(args.type,{'none', 'solid', 'flexible'})} = 'none' - args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1) - args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1) - end + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none' + args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) + args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1) + args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1) + end #+end_src *** Add Ground Type @@ -285,7 +287,7 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]]. switch args.type case 'none' ground.type = 1; - case 'solid' + case 'rigid' ground.type = 2; case 'flexible' ground.type = 3; @@ -301,3 +303,10 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]]. ground.C = args.C; #+end_src +*** Rotation Point +:PROPERTIES: +:UNNUMBERED: t +:END: +#+begin_src matlab + ground.rot_point = args.rot_point; +#+end_src diff --git a/src/computeCompliance.m b/src/computeCompliance.m new file mode 100644 index 0000000..191cfdd --- /dev/null +++ b/src/computeCompliance.m @@ -0,0 +1,83 @@ +function [C, C_norm, freqs] = computeCompliance(args) +% computeCompliance - +% +% Syntax: [C, C_norm, freqs] = computeCompliance(args) +% +% Inputs: +% - args - Structure with the following fields: +% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm +% - freqs [] - Frequency vector to estimate the Frobenius norm +% +% Outputs: +% - C [6x6 ss] - Compliance matrix +% - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix +% - freqs [length(freqs)x1] - Frequency vector in [Hz] + +arguments + args.plots logical {mustBeNumericOrLogical} = false + args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000) +end + +freqs = args.freqs; + +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'stewart_platform_model'; + +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/Disturbances/F_ext'], 1, 'openinput'); io_i = io_i + 1; % External forces [N, N*m] +io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad] + +%% Run the linearization +C = linearize(mdl, io, options); +C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'}; +C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; + +p_handle = zeros(6*6,1); + +if args.plots + fig = figure; + for ix = 1:6 + for iy = 1:6 + p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy); + hold on; + plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + if ix < 6 + xticklabels({}); + end + if iy > 1 + yticklabels({}); + end + end + end + + linkaxes(p_handle, 'xy') + xlim([freqs(1), freqs(end)]); + + han = axes(fig, 'visible', 'off'); + han.XLabel.Visible = 'on'; + han.YLabel.Visible = 'on'; + xlabel(han, 'Frequency [Hz]'); + ylabel(han, 'Compliance [m/N, rad/(N*m)]'); +end + +freqs = args.freqs; + +C_norm = zeros(length(freqs), 1); + +for i = 1:length(freqs) + C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')')); +end + +if args.plots + figure; + plot(freqs, C_norm) + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); + ylabel('Compliance - Frobenius Norm'); +end diff --git a/src/computeTransmissibility.m b/src/computeTransmissibility.m new file mode 100644 index 0000000..263e806 --- /dev/null +++ b/src/computeTransmissibility.m @@ -0,0 +1,84 @@ +function [T, T_norm, freqs] = computeTransmissibility(args) +% computeTransmissibility - +% +% Syntax: [T, T_norm, freqs] = computeTransmissibility(args) +% +% Inputs: +% - args - Structure with the following fields: +% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm +% - freqs [] - Frequency vector to estimate the Frobenius norm +% +% Outputs: +% - T [6x6 ss] - Transmissibility matrix +% - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix +% - freqs [length(freqs)x1] - Frequency vector in [Hz] + +arguments + args.plots logical {mustBeNumericOrLogical} = false + args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000) +end + +freqs = args.freqs; + +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'stewart_platform_model'; + +%% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/Disturbances/D_w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m, rad] +io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad] + +%% Run the linearization +T = linearize(mdl, io, options); +T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'}; +T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; + +p_handle = zeros(6*6,1); + +if args.plots + fig = figure; + for ix = 1:6 + for iy = 1:6 + p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy); + hold on; + plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + if ix < 6 + xticklabels({}); + end + if iy > 1 + yticklabels({}); + end + end + end + + linkaxes(p_handle, 'xy') + xlim([freqs(1), freqs(end)]); + ylim([1e-5, 1e2]); + + han = axes(fig, 'visible', 'off'); + han.XLabel.Visible = 'on'; + han.YLabel.Visible = 'on'; + ylabel(han, 'Frequency [Hz]'); + xlabel(han, 'Transmissibility [m/m]'); +end + +T_norm = zeros(length(freqs), 1); + +for i = 1:length(freqs) + T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')')); +end + +T_norm = T_norm/sqrt(6); + +if args.plots + figure; + plot(freqs, T_norm) + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); + ylabel('Transmissibility - Frobenius Norm'); +end diff --git a/src/initializeGround.m b/src/initializeGround.m index decf394..ec0024b 100644 --- a/src/initializeGround.m +++ b/src/initializeGround.m @@ -6,17 +6,19 @@ function [ground] = initializeGround(args) % Inputs: % - args - Structure with the following fields: % - type - 'none', 'solid', 'flexible' +% - rot_point [3x1] - Rotation point for the ground motion [m] % - K [3x1] - Translation Stiffness of the Ground [N/m] % - C [3x1] - Translation Damping of the Ground [N/(m/s)] % % Outputs: % - ground - Struture with the following properties: -% - type - 1 (none), 2 (solid), 3 (flexible) +% - type - 1 (none), 2 (rigid), 3 (flexible) % - K [3x1] - Translation Stiffness of the Ground [N/m] % - C [3x1] - Translation Damping of the Ground [N/(m/s)] arguments - args.type char {mustBeMember(args.type,{'none', 'solid', 'flexible'})} = 'none' + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none' + args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1) args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1) end @@ -24,7 +26,7 @@ end switch args.type case 'none' ground.type = 1; - case 'solid' + case 'rigid' ground.type = 2; case 'flexible' ground.type = 3; @@ -32,3 +34,5 @@ end ground.K = args.K; ground.C = args.C; + +ground.rot_point = args.rot_point; diff --git a/src/initializePayload.m b/src/initializePayload.m index 171766c..a8d5f76 100644 --- a/src/initializePayload.m +++ b/src/initializePayload.m @@ -5,7 +5,7 @@ function [payload] = initializePayload(args) % % Inputs: % - args - Structure with the following fields: -% - type - 'none', 'solid', 'flexible', 'cartesian' +% - type - 'none', 'rigid', 'flexible', 'cartesian' % - h [1x1] - Height of the CoM of the payload w.r.t {M} [m] % This also the position where K and C are defined % - K [6x1] - Stiffness of the Payload [N/m, N/rad] @@ -15,7 +15,7 @@ function [payload] = initializePayload(args) % % Outputs: % - payload - Struture with the following properties: -% - type - 1 (none), 2 (solid), 3 (flexible) +% - type - 1 (none), 2 (rigid), 3 (flexible) % - h [1x1] - Height of the CoM of the payload w.r.t {M} [m] % - K [6x1] - Stiffness of the Payload [N/m, N/rad] % - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)] @@ -23,7 +23,7 @@ function [payload] = initializePayload(args) % - I [3x3] - Inertia matrix for the Payload [kg*m2] arguments - args.type char {mustBeMember(args.type,{'none', 'solid', 'flexible', 'cartesian'})} = 'none' + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'cartesian'})} = 'none' args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(6,1) args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1) args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3 @@ -34,7 +34,7 @@ end switch args.type case 'none' payload.type = 1; - case 'solid' + case 'rigid' payload.type = 2; case 'flexible' payload.type = 3;