2019-03-22 12:03:59 +01:00
<?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" lang = "en" xml:lang = "en" >
< head >
2020-08-05 13:28:14 +02:00
<!-- 2020 - 08 - 05 mer. 13:27 -->
2019-03-22 12:03:59 +01:00
< meta http-equiv = "Content-Type" content = "text/html;charset=utf-8" / >
< title > Identification of the Stewart Platform using Simscape< / title >
< meta name = "generator" content = "Org mode" / >
2020-01-29 17:52:04 +01:00
< meta name = "author" content = "Dehaeze Thomas" / >
2019-08-26 11:58:44 +02:00
< link rel = "stylesheet" type = "text/css" href = "./css/htmlize.css" / >
< link rel = "stylesheet" type = "text/css" href = "./css/readtheorg.css" / >
< script src = "./js/jquery.min.js" > < / script >
< script src = "./js/bootstrap.min.js" > < / script >
< script src = "./js/jquery.stickytableheaders.min.js" > < / script >
< script src = "./js/readtheorg.js" > < / script >
2020-08-05 13:28:14 +02:00
< script > M a t h J a x = {
tex: {
tags: 'ams',
macros: {bm: ["\\boldsymbol{#1}",1],}
}
2020-02-11 15:27:39 +01:00
};
< / script >
2020-08-05 13:28:14 +02:00
< script type = "text/javascript" src = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" > < / script >
2019-03-22 12:03:59 +01:00
< / head >
< body >
2019-08-26 11:58:44 +02:00
< div id = "org-div-home-and-up" >
< a accesskey = "h" href = "./index.html" > UP < / a >
|
< a accesskey = "H" href = "./index.html" > HOME < / a >
< / div > < div id = "content" >
2019-03-22 12:03:59 +01:00
< h1 class = "title" > Identification of the Stewart Platform using Simscape< / h1 >
< div id = "table-of-contents" >
< h2 > Table of Contents< / h2 >
< div id = "text-table-of-contents" >
< ul >
2020-02-13 15:44:48 +01:00
< li > < a href = "#orgcb2f4c2" > 1. Modal Analysis of the Stewart Platform< / a >
2020-01-29 17:52:04 +01:00
< ul >
2020-02-13 15:44:48 +01:00
< li > < a href = "#org66d09e9" > 1.1. Initialize the Stewart Platform< / a > < / li >
< li > < a href = "#org8b1c587" > 1.2. Identification< / a > < / li >
< li > < a href = "#orge68adea" > 1.3. Coordinate transformation< / a > < / li >
< li > < a href = "#org4973ae1" > 1.4. Analysis< / a > < / li >
< li > < a href = "#orge7b97c8" > 1.5. Visualizing the modes< / a > < / li >
2020-01-29 17:52:04 +01:00
< / ul >
< / li >
2020-02-27 14:23:09 +01:00
< li > < a href = "#org2891722" > 2. Transmissibility Analysis< / a >
< ul >
2020-08-05 13:28:14 +02:00
< li > < a href = "#orgc00b850" > 2.1. Initialize the Stewart platform< / a > < / li >
2020-02-27 14:23:09 +01:00
< li > < a href = "#org5338f20" > 2.2. Transmissibility< / a > < / li >
< / ul >
< / li >
< li > < a href = "#orgc94edbd" > 3. Compliance Analysis< / a >
< ul >
2020-08-05 13:28:14 +02:00
< li > < a href = "#orge13761a" > 3.1. Initialize the Stewart platform< / a > < / li >
2020-02-27 14:23:09 +01:00
< li > < a href = "#org1177029" > 3.2. Compliance< / a > < / li >
< / ul >
< / li >
< li > < a href = "#org68ca336" > 4. Functions< / a >
< ul >
< li > < a href = "#org487c4d4" > 4.1. Compute the Transmissibility< / a >
< ul >
2020-08-05 13:28:14 +02:00
< li > < a href = "#orgd5cf0cf" > Function description< / a > < / li >
< li > < a href = "#orgdce5d62" > Optional Parameters< / a > < / li >
2020-02-27 14:23:09 +01:00
< li > < a href = "#org4629501" > Identification of the Transmissibility Matrix< / a > < / li >
2020-08-05 13:28:14 +02:00
< li > < a href = "#orge202ae7" > Computation of the Frobenius norm< / a > < / li >
2020-02-27 14:23:09 +01:00
< / ul >
< / li >
< li > < a href = "#org50e35a6" > 4.2. Compute the Compliance< / a >
< ul >
2020-08-05 13:28:14 +02:00
< li > < a href = "#org4630aae" > Function description< / a > < / li >
< li > < a href = "#orgc2d7cfd" > Optional Parameters< / a > < / li >
2020-02-27 14:23:09 +01:00
< li > < a href = "#orgef06b63" > Identification of the Compliance Matrix< / a > < / li >
2020-08-05 13:28:14 +02:00
< li > < a href = "#org45205c2" > Computation of the Frobenius norm< / a > < / li >
2020-02-27 14:23:09 +01:00
< / ul >
< / li >
< / ul >
< / li >
2019-03-22 12:03:59 +01:00
< / ul >
< / div >
< / div >
2020-02-27 14:23:09 +01:00
< p >
In this document, we discuss the various methods to identify the behavior of the Stewart platform.
< / p >
< ul class = "org-ul" >
< li > < a href = "#org7981e88" > 1< / a > < / li >
< li > < a href = "#orga989615" > 2< / a > < / li >
< li > < a href = "#org4579374" > 3< / a > < / li >
< / ul >
2020-02-13 15:44:48 +01:00
< div id = "outline-container-orgcb2f4c2" class = "outline-2" >
< h2 id = "orgcb2f4c2" > < span class = "section-number-2" > 1< / span > Modal Analysis of the Stewart Platform< / h2 >
2020-02-11 15:50:52 +01:00
< div class = "outline-text-2" id = "text-1" >
2020-02-27 14:23:09 +01:00
< p >
< a id = "org7981e88" > < / a >
< / p >
2020-01-29 17:52:04 +01:00
< / div >
2020-02-13 15:44:48 +01:00
< div id = "outline-container-org66d09e9" class = "outline-3" >
< h3 id = "org66d09e9" > < span class = "section-number-3" > 1.1< / span > Initialize the Stewart Platform< / h3 >
< div class = "outline-text-3" id = "text-1-1" >
2019-08-26 11:58:44 +02:00
< div class = "org-src-container" >
2020-02-11 15:27:39 +01:00
< pre class = "src src-matlab" > stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart);
2020-01-29 17:52:04 +01:00
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
2020-08-05 13:28:14 +02:00
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
2020-01-29 17:52:04 +01:00
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
2020-02-13 15:44:48 +01:00
stewart = initializeInertialSensor(stewart);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none');
controller = initializeController('type', 'open-loop');
2020-01-29 17:52:04 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-02-13 15:44:48 +01:00
< div id = "outline-container-org8b1c587" class = "outline-3" >
< h3 id = "org8b1c587" > < span class = "section-number-3" > 1.2< / span > Identification< / h3 >
< div class = "outline-text-3" id = "text-1-2" >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > %% Options for Linearized
2020-01-29 17:52:04 +01:00
options = linearizeOptions;
options.SampleTime = 0;
2020-08-05 13:28:14 +02:00
%% Name of the Simulink File
mdl = 'stewart_platform_model';
2020-01-29 17:52:04 +01:00
2020-08-05 13:28:14 +02:00
%% Input/Output definition
2020-01-29 17:52:04 +01:00
clear io; io_i = 1;
2020-08-05 13:28:14 +02:00
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
io(io_i) = linio([mdl, '/Relative Motion Sensor'], 2, 'openoutput'); io_i = io_i + 1; % Velocity of {B} w.r.t. {A}
2020-01-29 17:52:04 +01:00
2020-08-05 13:28:14 +02:00
%% Run the linearization
2020-01-29 17:52:04 +01:00
G = linearize(mdl, io);
2020-08-05 13:28:14 +02:00
% G.InputName = {'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'};
% G.OutputName = {'Xdx', 'Xdy', 'Xdz', 'Xrx', 'Xry', 'Xrz', 'Vdx', 'Vdy', 'Vdz', 'Vrx', 'Vry', 'Vrz'};
2020-01-29 17:52:04 +01:00
< / pre >
< / div >
2019-03-22 12:03:59 +01:00
< p >
2020-01-29 17:52:04 +01:00
Let’ s check the size of < code > G< / code > :
2019-03-22 12:03:59 +01:00
< / p >
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > size(G)
2019-08-26 11:58:44 +02:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< pre class = "example" >
size(G)
State-space model with 12 outputs, 6 inputs, and 18 states.
'org_babel_eoe'
ans =
'org_babel_eoe'
< / pre >
< p >
We expect to have only 12 states (corresponding to the 6dof of the mobile platform).
< / p >
2019-08-26 11:58:44 +02:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > Gm = minreal(G);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< pre class = "example" >
Gm = minreal(G);
6 states removed.
< / pre >
< p >
And indeed, we obtain 12 states.
< / p >
2019-03-22 12:03:59 +01:00
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-orge68adea" class = "outline-3" >
2020-02-13 15:44:48 +01:00
< h3 id = "orge68adea" > < span class = "section-number-3" > 1.3< / span > Coordinate transformation< / h3 >
< div class = "outline-text-3" id = "text-1-3" >
2020-01-29 17:52:04 +01:00
< p >
We can perform the following transformation using the < code > ss2ss< / code > command.
< / p >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > Gt = ss2ss(Gm, Gm.C);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< p >
Then, the < code > C< / code > matrix of < code > Gt< / code > is the unity matrix which means that the states of the state space model are equal to the measurements \(\bm{Y}\).
< / p >
< p >
The measurements are the 6 displacement and 6 velocities of mobile platform with respect to \(\{B\}\).
< / p >
< p >
We could perform the transformation by hand:
< / p >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > At = Gm.C*Gm.A*pinv(Gm.C);
2020-01-29 17:52:04 +01:00
2020-08-05 13:28:14 +02:00
Bt = Gm.C*Gm.B;
2020-01-29 17:52:04 +01:00
Ct = eye(12);
Dt = zeros(12, 6);
Gt = ss(At, Bt, Ct, Dt);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-org4973ae1" class = "outline-3" >
2020-02-13 15:44:48 +01:00
< h3 id = "org4973ae1" > < span class = "section-number-3" > 1.4< / span > Analysis< / h3 >
< div class = "outline-text-3" id = "text-1-4" >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > [V,D] = eig(Gt.A);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< table border = "2" cellspacing = "0" cellpadding = "6" rules = "groups" frame = "hsides" >
< colgroup >
< col class = "org-right" / >
< col class = "org-right" / >
< col class = "org-right" / >
< / colgroup >
< thead >
< tr >
< th scope = "col" class = "org-right" > Mode Number< / th >
< th scope = "col" class = "org-right" > Resonance Frequency [Hz]< / th >
< th scope = "col" class = "org-right" > Damping Ratio [%]< / th >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "org-right" > 1.0< / td >
2020-02-13 15:44:48 +01:00
< td class = "org-right" > 780.6< / td >
< td class = "org-right" > 0.4< / td >
2020-01-29 17:52:04 +01:00
< / tr >
< tr >
< td class = "org-right" > 2.0< / td >
2020-02-13 15:44:48 +01:00
< td class = "org-right" > 780.6< / td >
< td class = "org-right" > 0.3< / td >
2020-01-29 17:52:04 +01:00
< / tr >
< tr >
< td class = "org-right" > 3.0< / td >
2020-02-13 15:44:48 +01:00
< td class = "org-right" > 903.9< / td >
< td class = "org-right" > 0.3< / td >
2020-01-29 17:52:04 +01:00
< / tr >
< tr >
< td class = "org-right" > 4.0< / td >
2020-02-13 15:44:48 +01:00
< td class = "org-right" > 1061.4< / td >
< td class = "org-right" > 0.3< / td >
2020-01-29 17:52:04 +01:00
< / tr >
< tr >
< td class = "org-right" > 5.0< / td >
2020-02-13 15:44:48 +01:00
< td class = "org-right" > 1061.4< / td >
< td class = "org-right" > 0.2< / td >
2020-01-29 17:52:04 +01:00
< / tr >
< tr >
< td class = "org-right" > 6.0< / td >
2020-02-13 15:44:48 +01:00
< td class = "org-right" > 1269.6< / td >
< td class = "org-right" > 0.2< / td >
2020-01-29 17:52:04 +01:00
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2020-02-11 15:27:39 +01:00
< div id = "outline-container-orge7b97c8" class = "outline-3" >
2020-02-13 15:44:48 +01:00
< h3 id = "orge7b97c8" > < span class = "section-number-3" > 1.5< / span > Visualizing the modes< / h3 >
< div class = "outline-text-3" id = "text-1-5" >
2020-01-29 17:52:04 +01:00
< p >
To visualize the i’ th mode, we may excite the system using the inputs \(U_i\) such that \(B U_i\) is co-linear to \(\xi_i\) (the mode we want to excite).
< / p >
< p >
\[ U(t) = e^{\alpha t} ( ) \]
< / p >
< p >
Let’ s first sort the modes and just take the modes corresponding to a eigenvalue with a positive imaginary part.
< / p >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > ws = imag(diag(D));
[ws,I] = sort(ws)
2020-08-05 13:28:14 +02:00
ws = ws(7:end); I = I(7:end);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > for i = 1:length(ws)
2020-01-29 17:52:04 +01:00
< / pre >
2019-03-22 12:03:59 +01:00
< / div >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > i_mode = I(i); % the argument is the i'th mode
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-01-29 17:52:04 +01:00
< pre class = "src src-matlab" > lambda_i = D(i_mode, i_mode);
2020-08-05 13:28:14 +02:00
xi_i = V(:,i_mode);
2020-01-29 17:52:04 +01:00
a_i = real(lambda_i);
b_i = imag(lambda_i);
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< p >
Let do 10 periods of the mode.
< / p >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > t = linspace(0, 10/(imag(lambda_i)/2/pi), 1000);
U_i = pinv(Gt.B) * real(xi_i * lambda_i * (cos(b_i * t) + 1i*sin(b_i * t)));
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > U = timeseries(U_i, t);
< / pre >
2019-03-22 12:03:59 +01:00
< / div >
2020-01-29 17:52:04 +01:00
< p >
Simulation:
< / p >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > load('mat/conf_simscape.mat');
set_param(conf_simscape, 'StopTime', num2str(t(end)));
sim(mdl);
2020-01-29 17:52:04 +01:00
< / pre >
2019-03-22 12:03:59 +01:00
< / div >
< p >
2020-01-29 17:52:04 +01:00
Save the movie of the mode shape.
2019-03-22 12:03:59 +01:00
< / p >
2020-01-29 17:52:04 +01:00
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > smwritevideo(mdl, sprintf('figs/mode%i', i), ...
'PlaybackSpeedRatio', 1/(b_i/2/pi), ...
'FrameRate', 30, ...
'FrameSize', [800, 400]);
2020-01-29 17:52:04 +01:00
< / pre >
< / div >
2019-03-22 12:03:59 +01:00
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > end
2019-03-22 12:03:59 +01:00
< / pre >
< / div >
2020-01-29 17:52:04 +01:00
2020-02-11 15:27:39 +01:00
< div id = "orgb15855a" class = "figure" >
2020-01-29 17:52:04 +01:00
< p > < img src = "figs/mode1.gif" alt = "mode1.gif" / >
< / p >
< p > < span class = "figure-number" > Figure 1: < / span > Identified mode - 1< / p >
2019-03-22 12:03:59 +01:00
< / div >
2020-01-29 17:52:04 +01:00
2020-02-11 15:27:39 +01:00
< div id = "org1816e59" class = "figure" >
2020-01-29 17:52:04 +01:00
< p > < img src = "figs/mode3.gif" alt = "mode3.gif" / >
< / p >
< p > < span class = "figure-number" > Figure 2: < / span > Identified mode - 3< / p >
2019-03-22 12:03:59 +01:00
< / div >
2020-01-29 17:52:04 +01:00
2020-02-11 15:27:39 +01:00
< div id = "org01c8dca" class = "figure" >
2020-01-29 17:52:04 +01:00
< p > < img src = "figs/mode5.gif" alt = "mode5.gif" / >
2019-03-22 12:03:59 +01:00
< / p >
2020-01-29 17:52:04 +01:00
< p > < span class = "figure-number" > Figure 3: < / span > Identified mode - 5< / p >
< / div >
< / div >
< / div >
2019-03-22 12:03:59 +01:00
< / div >
2020-02-27 14:23:09 +01:00
< div id = "outline-container-org2891722" class = "outline-2" >
< h2 id = "org2891722" > < span class = "section-number-2" > 2< / span > Transmissibility Analysis< / h2 >
< div class = "outline-text-2" id = "text-2" >
< p >
< a id = "orga989615" > < / a >
< / p >
< / div >
2020-08-05 13:28:14 +02:00
< div id = "outline-container-orgc00b850" class = "outline-3" >
< h3 id = "orgc00b850" > < span class = "section-number-3" > 2.1< / span > Initialize the Stewart platform< / h3 >
2020-02-27 14:23:09 +01:00
< div class = "outline-text-3" id = "text-2-1" >
< div class = "org-src-container" >
< pre class = "src src-matlab" > stewart = initializeStewartPlatform();
2020-08-05 13:28:14 +02:00
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
2020-02-27 14:23:09 +01:00
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
2020-08-05 13:28:14 +02:00
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
2020-02-27 14:23:09 +01:00
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
2020-08-05 13:28:14 +02:00
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< p >
We set the rotation point of the ground to be at the same point at frames \(\{A\}\) and \(\{B\}\).
< / p >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'rigid');
controller = initializeController('type', 'open-loop');
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< / div >
< / div >
< div id = "outline-container-org5338f20" class = "outline-3" >
< h3 id = "org5338f20" > < span class = "section-number-3" > 2.2< / span > Transmissibility< / h3 >
< div class = "outline-text-3" id = "text-2-2" >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > %% Options for Linearized
2020-02-27 14:23:09 +01:00
options = linearizeOptions;
options.SampleTime = 0;
2020-08-05 13:28:14 +02:00
%% Name of the Simulink File
mdl = 'stewart_platform_model';
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
%% Input/Output definition
2020-02-27 14:23:09 +01:00
clear io; io_i = 1;
2020-08-05 13:28:14 +02:00
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]
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
%% Run the linearization
2020-02-27 14:23:09 +01:00
T = linearize(mdl, io, options);
2020-08-05 13:28:14 +02:00
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > freqs = logspace(1, 4, 1000);
2020-08-05 13:28:14 +02:00
figure;
for ix = 1:6
for iy = 1:6
subplot(6, 6, (ix-1)*6 + iy);
2020-02-27 14:23:09 +01:00
hold on;
2020-08-05 13:28:14 +02:00
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-5, 10]);
2020-02-27 14:23:09 +01:00
xlim([freqs(1), freqs(end)]);
2020-08-05 13:28:14 +02:00
if ix < 6
2020-02-27 14:23:09 +01:00
xticklabels({});
2020-08-05 13:28:14 +02:00
end
if iy > 1
2020-02-27 14:23:09 +01:00
yticklabels({});
2020-08-05 13:28:14 +02:00
end
end
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< p >
2020-08-05 13:28:14 +02:00
From (< a href = "#citeproc_bib_item_1" > Preumont et al. 2007< / a > ), one can use the Frobenius norm of the transmissibility matrix to obtain a scalar indicator of the transmissibility performance of the system:
2020-02-27 14:23:09 +01:00
< / p >
\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*}
< div class = "org-src-container" >
< pre class = "src src-matlab" > freqs = logspace(1, 4, 1000);
T_norm = zeros(length(freqs), 1);
2020-08-05 13:28:14 +02:00
for i = 1:length(freqs)
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< p >
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} \]
< / p >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > Gamma = T_norm/sqrt(6);
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > figure;
2020-02-27 14:23:09 +01:00
plot(freqs, Gamma)
2020-08-05 13:28:14 +02:00
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< / div >
< / div >
< / div >
< div id = "outline-container-orgc94edbd" class = "outline-2" >
< h2 id = "orgc94edbd" > < span class = "section-number-2" > 3< / span > Compliance Analysis< / h2 >
< div class = "outline-text-2" id = "text-3" >
< p >
< a id = "org4579374" > < / a >
< / p >
< / div >
2020-08-05 13:28:14 +02:00
< div id = "outline-container-orge13761a" class = "outline-3" >
< h3 id = "orge13761a" > < span class = "section-number-3" > 3.1< / span > Initialize the Stewart platform< / h3 >
2020-02-27 14:23:09 +01:00
< div class = "outline-text-3" id = "text-3-1" >
< div class = "org-src-container" >
< pre class = "src src-matlab" > stewart = initializeStewartPlatform();
2020-08-05 13:28:14 +02:00
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
2020-02-27 14:23:09 +01:00
stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart);
2020-08-05 13:28:14 +02:00
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
2020-02-27 14:23:09 +01:00
stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
2020-08-05 13:28:14 +02:00
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< p >
We set the rotation point of the ground to be at the same point at frames \(\{A\}\) and \(\{B\}\).
< / p >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > ground = initializeGround('type', 'none');
payload = initializePayload('type', 'rigid');
controller = initializeController('type', 'open-loop');
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< / div >
< / div >
< div id = "outline-container-org1177029" class = "outline-3" >
< h3 id = "org1177029" > < span class = "section-number-3" > 3.2< / span > Compliance< / h3 >
< div class = "outline-text-3" id = "text-3-2" >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > %% Options for Linearized
2020-02-27 14:23:09 +01:00
options = linearizeOptions;
options.SampleTime = 0;
2020-08-05 13:28:14 +02:00
%% Name of the Simulink File
mdl = 'stewart_platform_model';
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
%% Input/Output definition
2020-02-27 14:23:09 +01:00
clear io; io_i = 1;
2020-08-05 13:28:14 +02:00
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]
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
%% Run the linearization
2020-02-27 14:23:09 +01:00
C = linearize(mdl, io, options);
2020-08-05 13:28:14 +02:00
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > freqs = logspace(1, 4, 1000);
2020-08-05 13:28:14 +02:00
figure;
for ix = 1:6
for iy = 1:6
subplot(6, 6, (ix-1)*6 + iy);
2020-02-27 14:23:09 +01:00
hold on;
2020-08-05 13:28:14 +02:00
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-10, 1e-3]);
2020-02-27 14:23:09 +01:00
xlim([freqs(1), freqs(end)]);
2020-08-05 13:28:14 +02:00
if ix < 6
2020-02-27 14:23:09 +01:00
xticklabels({});
2020-08-05 13:28:14 +02:00
end
if iy > 1
2020-02-27 14:23:09 +01:00
yticklabels({});
2020-08-05 13:28:14 +02:00
end
end
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< p >
We can try to use the Frobenius norm to obtain a scalar value representing the 6-dof compliance of the Stewart platform.
< / p >
< div class = "org-src-container" >
< pre class = "src src-matlab" > freqs = logspace(1, 4, 1000);
C_norm = zeros(length(freqs), 1);
2020-08-05 13:28:14 +02:00
for i = 1:length(freqs)
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > figure;
2020-02-27 14:23:09 +01:00
plot(freqs, C_norm)
2020-08-05 13:28:14 +02:00
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< / div >
< / div >
< / div >
< div id = "outline-container-org68ca336" class = "outline-2" >
< h2 id = "org68ca336" > < span class = "section-number-2" > 4< / span > Functions< / h2 >
< div class = "outline-text-2" id = "text-4" >
< / div >
< div id = "outline-container-org487c4d4" class = "outline-3" >
< h3 id = "org487c4d4" > < span class = "section-number-3" > 4.1< / span > Compute the Transmissibility< / h3 >
< div class = "outline-text-3" id = "text-4-1" >
< p >
< a id = "orgbca579c" > < / a >
< / p >
< / div >
2020-08-05 13:28:14 +02:00
< div id = "outline-container-orgd5cf0cf" class = "outline-4" >
< h4 id = "orgd5cf0cf" > Function description< / h4 >
< div class = "outline-text-4" id = "text-orgd5cf0cf" >
2020-02-27 14:23:09 +01:00
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src 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]
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-08-05 13:28:14 +02:00
< div id = "outline-container-orgdce5d62" class = "outline-4" >
< h4 id = "orgdce5d62" > Optional Parameters< / h4 >
< div class = "outline-text-4" id = "text-orgdce5d62" >
2020-02-27 14:23:09 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > arguments
2020-08-05 13:28:14 +02:00
args.plots logical {mustBeNumericOrLogical} = false
2020-02-27 14:23:09 +01:00
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
2020-08-05 13:28:14 +02:00
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > freqs = args.freqs;
< / pre >
< / div >
< / div >
< / div >
< div id = "outline-container-org4629501" class = "outline-4" >
< h4 id = "org4629501" > Identification of the Transmissibility Matrix< / h4 >
< div class = "outline-text-4" id = "text-org4629501" >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > %% Options for Linearized
2020-02-27 14:23:09 +01:00
options = linearizeOptions;
options.SampleTime = 0;
2020-08-05 13:28:14 +02:00
%% Name of the Simulink File
mdl = 'stewart_platform_model';
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
%% Input/Output definition
2020-02-27 14:23:09 +01:00
clear io; io_i = 1;
2020-08-05 13:28:14 +02:00
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, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
%% Run the linearization
2020-02-27 14:23:09 +01:00
T = linearize(mdl, io, options);
2020-08-05 13:28:14 +02:00
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< p >
If wanted, the 6x6 transmissibility matrix is plotted.
< / p >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > p_handle = zeros(6*6,1);
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
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);
2020-02-27 14:23:09 +01:00
hold on;
2020-08-05 13:28:14 +02:00
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6
2020-02-27 14:23:09 +01:00
xticklabels({});
2020-08-05 13:28:14 +02:00
end
if iy > 1
2020-02-27 14:23:09 +01:00
yticklabels({});
2020-08-05 13:28:14 +02:00
end
end
end
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
linkaxes(p_handle, 'xy')
2020-02-27 14:23:09 +01:00
xlim([freqs(1), freqs(end)]);
2020-08-05 13:28:14 +02:00
ylim([1e-5, 1e2]);
han = axes(fig, 'visible', 'off');
han.XLabel.Visible = 'on';
han.YLabel.Visible = 'on';
xlabel(han, 'Frequency [Hz]');
ylabel(han, 'Transmissibility [m/m]');
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-08-05 13:28:14 +02:00
< div id = "outline-container-orge202ae7" class = "outline-4" >
< h4 id = "orge202ae7" > Computation of the Frobenius norm< / h4 >
< div class = "outline-text-4" id = "text-orge202ae7" >
2020-02-27 14:23:09 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > T_norm = zeros(length(freqs), 1);
2020-08-05 13:28:14 +02:00
for i = 1:length(freqs)
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > T_norm = T_norm/sqrt(6);
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > if args.plots
figure;
2020-02-27 14:23:09 +01:00
plot(freqs, T_norm)
2020-08-05 13:28:14 +02:00
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
ylabel('Transmissibility - Frobenius Norm');
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< / div >
< / div >
< / div >
< div id = "outline-container-org50e35a6" class = "outline-3" >
< h3 id = "org50e35a6" > < span class = "section-number-3" > 4.2< / span > Compute the Compliance< / h3 >
< div class = "outline-text-3" id = "text-4-2" >
< p >
< a id = "org0a73574" > < / a >
< / p >
< / div >
2020-08-05 13:28:14 +02:00
< div id = "outline-container-org4630aae" class = "outline-4" >
< h4 id = "org4630aae" > Function description< / h4 >
< div class = "outline-text-4" id = "text-org4630aae" >
2020-02-27 14:23:09 +01:00
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src 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]
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-08-05 13:28:14 +02:00
< div id = "outline-container-orgc2d7cfd" class = "outline-4" >
< h4 id = "orgc2d7cfd" > Optional Parameters< / h4 >
< div class = "outline-text-4" id = "text-orgc2d7cfd" >
2020-02-27 14:23:09 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > arguments
2020-08-05 13:28:14 +02:00
args.plots logical {mustBeNumericOrLogical} = false
2020-02-27 14:23:09 +01:00
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
2020-08-05 13:28:14 +02:00
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
< pre class = "src src-matlab" > freqs = args.freqs;
< / pre >
< / div >
< / div >
< / div >
< div id = "outline-container-orgef06b63" class = "outline-4" >
< h4 id = "orgef06b63" > Identification of the Compliance Matrix< / h4 >
< div class = "outline-text-4" id = "text-orgef06b63" >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > %% Options for Linearized
2020-02-27 14:23:09 +01:00
options = linearizeOptions;
options.SampleTime = 0;
2020-08-05 13:28:14 +02:00
%% Name of the Simulink File
mdl = 'stewart_platform_model';
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
%% Input/Output definition
2020-02-27 14:23:09 +01:00
clear io; io_i = 1;
2020-08-05 13:28:14 +02:00
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, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
%% Run the linearization
2020-02-27 14:23:09 +01:00
C = linearize(mdl, io, options);
2020-08-05 13:28:14 +02:00
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< p >
If wanted, the 6x6 transmissibility matrix is plotted.
< / p >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > p_handle = zeros(6*6,1);
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
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);
2020-02-27 14:23:09 +01:00
hold on;
2020-08-05 13:28:14 +02:00
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6
2020-02-27 14:23:09 +01:00
xticklabels({});
2020-08-05 13:28:14 +02:00
end
if iy > 1
2020-02-27 14:23:09 +01:00
yticklabels({});
2020-08-05 13:28:14 +02:00
end
end
end
2020-02-27 14:23:09 +01:00
2020-08-05 13:28:14 +02:00
linkaxes(p_handle, 'xy')
2020-02-27 14:23:09 +01:00
xlim([freqs(1), freqs(end)]);
2020-08-05 13:28:14 +02:00
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
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< / div >
< / div >
2020-08-05 13:28:14 +02:00
< div id = "outline-container-org45205c2" class = "outline-4" >
< h4 id = "org45205c2" > Computation of the Frobenius norm< / h4 >
< div class = "outline-text-4" id = "text-org45205c2" >
2020-02-27 14:23:09 +01:00
< div class = "org-src-container" >
< pre class = "src src-matlab" > freqs = args.freqs;
C_norm = zeros(length(freqs), 1);
2020-08-05 13:28:14 +02:00
for i = 1:length(freqs)
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
< div class = "org-src-container" >
2020-08-05 13:28:14 +02:00
< pre class = "src src-matlab" > if args.plots
figure;
2020-02-27 14:23:09 +01:00
plot(freqs, C_norm)
2020-08-05 13:28:14 +02:00
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]');
ylabel('Compliance - Frobenius Norm');
end
2020-02-27 14:23:09 +01:00
< / pre >
< / div >
2020-08-05 13:28:14 +02:00
< style > . csl-entry { text-indent : -1.5 em ; margin-left : 1.5 em ; } < / style > < h2 class = 'citeproc-org-bib-h2' > Bibliography< / h2 >
< div class = "csl-bib-body" >
< div class = "csl-entry" > < a name = "citeproc_bib_item_1" > < / a > Preumont, A., M. Horodinca, I. Romanescu, B. de Marneffe, M. Avraam, A. Deraemaeker, F. Bossens, and A. Abu Hanieh. 2007. “A Six-Axis Single-Stage Active Vibration Isolator Based on Stewart Platform.” < i > Journal of Sound and Vibration< / i > 300 (3-5):644– 61. < a href = "https://doi.org/10.1016/j.jsv.2006.07.050" > https://doi.org/10.1016/j.jsv.2006.07.050< / a > .< / div >
< / div >
2020-02-27 14:23:09 +01:00
< / div >
< / div >
< / div >
< / div >
2019-03-22 12:03:59 +01:00
< / div >
< div id = "postamble" class = "status" >
2020-01-29 17:52:04 +01:00
< p class = "author" > Author: Dehaeze Thomas< / p >
2020-08-05 13:28:14 +02:00
< p class = "date" > Created: 2020-08-05 mer. 13:27< / p >
2019-03-22 12:03:59 +01:00
< / div >
< / body >
< / html >