From 99f9e46046114f018a5851bac03071030488f6a4 Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Wed, 22 Jan 2020 16:31:44 +0100 Subject: [PATCH] Add few html pages --- active-damping.html | 371 ++++++++++++++++++++++ control-study.html | 430 +++++++++++++++++++++++++ dynamics-study.html | 748 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1549 insertions(+) create mode 100644 active-damping.html create mode 100644 control-study.html create mode 100644 dynamics-study.html diff --git a/active-damping.html b/active-damping.html new file mode 100644 index 0000000..7ca6387 --- /dev/null +++ b/active-damping.html @@ -0,0 +1,371 @@ + + + + + + + + + +Stewart Platform - Active Damping + + + + + + + + + + + + +
+ UP + | + HOME +
+

Stewart Platform - Active Damping

+ + +
+

1 Inertial Control

+
+
+
+

1.1 Simscape Model

+
+
+
open('simulink/stewart_active_damping.slx')
+
+
+
+
+ +
+

1.2 Initialize the Stewart model

+
+
+
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3);
+stewart = generateCubicConfiguration(stewart, 'Hc', 40e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3);
+stewart = computeJointsPose(stewart);
+stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1));
+stewart = computeJacobian(stewart);
+
+
+
+
+ +
+

1.3 Identification of the Dynamics

+
+
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'stewart_active_damping';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/F'],   1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/WVB'], 1, 'openoutput'); io_i = io_i + 1;
+io(io_i) = linio([mdl, '/Dm'],  1, 'openoutput'); io_i = io_i + 1;
+
+%% Run the linearization
+G = linearize(mdl, io, options);
+G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
+G.OutputName = {'Vx', 'Vy', 'Vz', 'Wx', 'Wy', 'Wz', ...
+                'D1', 'D2', 'D3', 'D4', 'D5', 'D6'};
+
+
+
+
+ +
+

1.4 Analysis

+
+
+
freqs = 2*pi*logspace(1, 4, 1000);
+
+figure;
+bode(G({'D1', 'D2', 'D3', 'D4', 'D5', 'D6'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}), freqs)
+
+figure;
+bode(stewart.J*G({'Vx', 'Vy', 'Vz', 'Wx', 'Wy', 'Wz'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}), freqs)
+
+
+ +
+
figure;
+bode(G({'D1', 'D2', 'D3', 'D4', 'D5', 'D6'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}), stewart.J*G({'Vx', 'Vy', 'Vz', 'Wx', 'Wy', 'Wz'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}), freqs)
+
+
+
+
+ +
+

1.5 Conclusion

+
+

+It is similar to use: +

+
    +
  • one 6dof inertial sensor and the Jacobian the have the velocity of each lim
  • +
  • 6 1dof inertial sensor in each top part of the limbs
  • +
+
+
+
+
+
+

Author: Dehaeze Thomas

+

Created: 2020-01-22 mer. 16:31

+
+ + diff --git a/control-study.html b/control-study.html new file mode 100644 index 0000000..621e851 --- /dev/null +++ b/control-study.html @@ -0,0 +1,430 @@ + + + + + + + + + +Stewart Platform - Control Study + + + + + + + + + + + + + + +
+ UP + | + HOME +
+

Stewart Platform - Control Study

+ + +
+

1 First Control Architecture

+
+
+
+

1.1 Control Schematic

+
+
+
\begin{tikzpicture}
+  % Blocs
+  \node[block] (J) at (0, 0) {$J$};
+  \node[addb={+}{}{}{}{-}, right=1 of J] (subr) {};
+  \node[block, right=0.8 of subr] (K) {$K_{L}$};
+  \node[block, right=1 of K] (G) {$G_{L}$};
+
+  % Connections and labels
+  \draw[<-] (J.west)node[above left]{$\bm{r}_{n}$} -- ++(-1, 0);
+  \draw[->] (J.east) -- (subr.west) node[above left]{$\bm{r}_{L}$};
+  \draw[->] (subr.east) -- (K.west) node[above left]{$\bm{\epsilon}_{L}$};
+  \draw[->] (K.east) -- (G.west) node[above left]{$\bm{\tau}$};
+  \draw[->] (G.east) node[above right]{$\bm{L}$} -| ($(G.east)+(1, -1)$) -| (subr.south);
+\end{tikzpicture}
+
+
+ + +
+

control_measure_rotating_2dof.png +

+
+
+
+ +
+

1.2 Initialize the Stewart platform

+
+
+
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3);
+% stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3);
+stewart = generateGeneralConfiguration(stewart);
+stewart = computeJointsPose(stewart);
+stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1));
+stewart = computeJacobian(stewart);
+
+
+
+
+ +
+

1.3 Initialize the Simulation

+
+
+
load('mat/conf_simscape.mat');
+
+
+
+
+ +
+

1.4 Identification of the plant

+
+

+Let’s identify the transfer function from \(\bm{\tau}}\) to \(\bm{L}\). +

+
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'stewart_platform_control';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/tau'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/L'], 1, 'openoutput'); io_i = io_i + 1;
+
+%% Run the linearization
+G = linearize(mdl, io, options);
+G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
+G.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'};
+
+
+
+
+ +
+

1.5 Plant Analysis

+
+

+Diagonal terms +Compare to off-diagonal terms +

+
+
+
+

1.6 Controller Design

+
+

+One integrator should be present in the controller. +

+ +

+A lead is added around the crossover frequency which is set to be around 500Hz. +

+ +
+
% wint = 2*pi*100; % Integrate until [rad]
+% wlead = 2*pi*500; % Location of the lead [rad]
+% hlead = 2; % Lead strengh
+
+% Kl = 1e6 * ... % Gain
+%      (s + wint)/(s) * ... % Integrator until 100Hz
+%      (1 + s/(wlead/hlead)/(1 + s/(wlead*hlead))); % Lead
+
+wc = 2*pi*100;
+Kl = 1/abs(freqresp(G(1,1), wc)) * wc/s * 1/(1 + s/(3*wc));
+Kl = Kl * eye(6);
+
+
+
+
+
+
+
+

Author: Dehaeze Thomas

+

Created: 2020-01-22 mer. 16:31

+
+ + diff --git a/dynamics-study.html b/dynamics-study.html new file mode 100644 index 0000000..ff700eb --- /dev/null +++ b/dynamics-study.html @@ -0,0 +1,748 @@ + + + + + + + + + +Stewart Platform - Dynamics Study + + + + + + + + + + + + + + +
+ UP + | + HOME +
+

Stewart Platform - Dynamics Study

+ + +
+

1 Some tests

+
+
+
+

1.1 Simscape Model

+
+
+
open('stewart_platform_dynamics.slx')
+
+
+
+
+ +
+

1.2 test

+
+
+
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3);
+stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3);
+stewart = computeJointsPose(stewart);
+stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1));
+stewart = computeJacobian(stewart);
+
+
+ +

+Estimation of the transfer function from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\): +

+
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'stewart_platform_dynamics';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/X'], 1, 'openoutput'); io_i = io_i + 1;
+
+%% Run the linearization
+G = linearize(mdl, io, options);
+G.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
+G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
+
+
+ + +
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'stewart_platform_dynamics';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/J-T'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/X'],   1, 'openoutput'); io_i = io_i + 1;
+
+%% Run the linearization
+G = linearize(mdl, io, options);
+G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
+G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
+
+
+ +
+
G_cart = minreal(G*inv(stewart.J'));
+G_cart.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
+
+
+ +
+
figure; bode(G, G_cart)
+
+
+ +
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'stewart_platform_dynamics';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/Fext'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/X'],    1, 'openoutput'); io_i = io_i + 1;
+
+%% Run the linearization
+Gd = linearize(mdl, io, options);
+Gd.InputName  = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
+Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
+
+
+ +
+
freqs = logspace(0, 3, 1000);
+
+figure;
+bode(Gd, G)
+
+
+
+
+ +
+

1.3 Compare external forces and forces applied by the actuators

+
+

+Initialization of the Stewart platform. +

+
+
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3);
+stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3);
+stewart = computeJointsPose(stewart);
+stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1));
+stewart = computeJacobian(stewart);
+
+
+ +

+Estimation of the transfer function from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\): +

+
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'stewart_platform_dynamics';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/X'], 1, 'openoutput'); io_i = io_i + 1;
+
+%% Run the linearization
+G = linearize(mdl, io, options);
+G.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
+G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
+
+
+ +

+Estimation of the transfer function from \(\mathcal{\bm{F}}_{d}\) to \(\mathcal{\bm{X}}\): +

+
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'stewart_platform_dynamics';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/Fext'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/X'],    1, 'openoutput'); io_i = io_i + 1;
+
+%% Run the linearization
+Gd = linearize(mdl, io, options);
+Gd.InputName  = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
+Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
+
+
+ +

+Comparison of the two transfer function matrices. +

+
+
freqs = logspace(0, 4, 1000);
+
+figure;
+bode(Gd, G, freqs)
+
+
+ +
+

+Seems quite similar. +

+ +
+
+
+ +
+

1.4 Comparison of the static transfer function and the Compliance matrix

+
+

+Initialization of the Stewart platform. +

+
+
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3);
+stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3);
+stewart = computeJointsPose(stewart);
+stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1));
+stewart = computeJacobian(stewart);
+
+
+ +

+Estimation of the transfer function from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\): +

+
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'stewart_platform_dynamics';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/X'], 1, 'openoutput'); io_i = io_i + 1;
+
+%% Run the linearization
+G = linearize(mdl, io, options);
+G.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
+G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
+
+
+ +

+Let’s first look at the low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\). +

+ + + +++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2.0e-06-9.1e-19-5.3e-127.3e-181.7e-051.3e-18
-1.7e-182.0e-068.6e-19-1.7e-05-1.5e-176.7e-12
3.6e-133.2e-195.0e-07-2.5e-188.1e-12-1.5e-19
1.0e-17-1.7e-05-5.0e-181.9e-049.1e-17-3.5e-11
1.7e-05-6.9e-19-5.3e-116.9e-181.9e-044.8e-18
-3.5e-18-4.5e-121.5e-187.1e-11-3.4e-174.6e-05
+ +

+And now at the Compliance matrix. +

+ + + +++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2.0e-062.9e-222.8e-22-3.2e-211.7e-051.5e-37
-2.1e-222.0e-06-1.8e-23-1.7e-05-2.3e-211.1e-22
3.1e-22-1.6e-235.0e-071.7e-222.2e-21-8.1e-39
2.1e-21-1.7e-052.0e-221.9e-042.3e-20-8.7e-21
1.7e-052.5e-212.0e-21-2.8e-201.9e-041.3e-36
3.7e-233.1e-22-6.0e-39-1.0e-203.1e-224.6e-05
+ +
+

+The low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\) corresponds to the compliance matrix of the Stewart platform. +

+ +
+
+
+ +
+

1.5 Transfer function from forces applied in the legs to the displacement of the legs

+
+

+Initialization of the Stewart platform. +

+
+
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3);
+stewart = generateCubicConfiguration(stewart, 'Hc', 60e-3, 'FOc', 45e-3, 'FHa', 5e-3, 'MHb', 5e-3);
+stewart = computeJointsPose(stewart);
+stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1));
+stewart = computeJacobian(stewart);
+
+
+ +

+Estimation of the transfer function from \(\bm{\tau}\) to \(\bm{L}\): +

+
+
%% Options for Linearized
+options = linearizeOptions;
+options.SampleTime = 0;
+
+%% Name of the Simulink File
+mdl = 'stewart_platform_dynamics';
+
+%% Input/Output definition
+clear io; io_i = 1;
+io(io_i) = linio([mdl, '/J-T'], 1, 'openinput');  io_i = io_i + 1;
+io(io_i) = linio([mdl, '/L'], 1, 'openoutput'); io_i = io_i + 1;
+
+%% Run the linearization
+G = linearize(mdl, io, options);
+G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
+G.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'};
+
+
+ +
+
freqs = logspace(1, 3, 1000);
+figure; bode(G, 2*pi*freqs)
+
+
+ +
+
bodeFig({G(1,1), G(1,2)}, freqs, struct('phase', true));
+
+
+
+
+
+
+
+

Author: Dehaeze Thomas

+

Created: 2020-01-22 mer. 16:31

+
+ +