Compare commits

..

7 Commits

Author SHA1 Message Date
13c6750b15 upgrade bibliography 2024-09-25 15:18:35 +02:00
ed0c18829b Change all indentation 2021-01-08 15:54:58 +01:00
f5922ca970 Delete local CS/JSS 2021-01-08 15:36:11 +01:00
240d113062 Change CSS/JS location + publish all 2021-01-08 15:34:53 +01:00
32330b92f0 Add functions to add platforms at .STEP files 2020-11-03 08:55:08 +01:00
58cd2026dc Add link to repository 2020-09-07 23:17:07 +02:00
7fad722181 Add NASS webpage 2020-09-07 23:00:14 +02:00
93 changed files with 104131 additions and 11826 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -3,25 +3,30 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-08-05 mer. 13:27 --> <!-- 2021-01-08 ven. 15:53 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Stewart Platform - Decentralized Active Damping</title> <title>Stewart Platform - Decentralized Active Damping</title>
<meta name="generator" content="Org mode" /> <meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" /> <meta name="author" content="Dehaeze Thomas" />
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
<script src="./js/jquery.min.js"></script> <script>
<script src="./js/bootstrap.min.js"></script> MathJax = {
<script src="./js/jquery.stickytableheaders.min.js"></script> svg: {
<script src="./js/readtheorg.js"></script> scale: 1,
<script>MathJax = { fontCache: "global"
tex: { },
tags: 'ams', tex: {
macros: {bm: ["\\boldsymbol{#1}",1],} tags: "ams",
} multlineWidth: "%MULTLINEWIDTH",
}; tagSide: "right",
</script> macros: {bm: ["\\boldsymbol{#1}",1],},
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> tagIndent: ".8em"
}
};
</script>
<script id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
</head> </head>
<body> <body>
<div id="org-div-home-and-up"> <div id="org-div-home-and-up">
@@ -34,35 +39,35 @@
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents"> <div id="text-table-of-contents">
<ul> <ul>
<li><a href="#orgc22d5d6">1. Inertial Control</a> <li><a href="#orgddaf52f">1. Inertial Control</a>
<ul> <ul>
<li><a href="#org1671c0b">1.1. Identification of the Dynamics</a></li> <li><a href="#org933440d">1.1. Identification of the Dynamics</a></li>
<li><a href="#orgdae44ba">1.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li> <li><a href="#org2875dd1">1.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
<li><a href="#org89e2002">1.3. Obtained Damping</a></li> <li><a href="#org0cea759">1.3. Obtained Damping</a></li>
<li><a href="#org3904320">1.4. Conclusion</a></li> <li><a href="#orga866100">1.4. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org89e426a">2. Integral Force Feedback</a> <li><a href="#orgf8ed544">2. Integral Force Feedback</a>
<ul> <ul>
<li><a href="#orgcb85703">2.1. Identification of the Dynamics with perfect Joints</a></li> <li><a href="#orga2d019b">2.1. Identification of the Dynamics with perfect Joints</a></li>
<li><a href="#org4ca24f7">2.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li> <li><a href="#org6ac04ee">2.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
<li><a href="#org11e5ee2">2.3. Obtained Damping</a></li> <li><a href="#org06e1086">2.3. Obtained Damping</a></li>
<li><a href="#orgca67baa">2.4. Conclusion</a></li> <li><a href="#orgfa832d6">2.4. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org47a29be">3. Direct Velocity Feedback</a> <li><a href="#orgabec4e1">3. Direct Velocity Feedback</a>
<ul> <ul>
<li><a href="#orgc82a6a7">3.1. Identification of the Dynamics with perfect Joints</a></li> <li><a href="#org19cbcee">3.1. Identification of the Dynamics with perfect Joints</a></li>
<li><a href="#org92d6cb1">3.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li> <li><a href="#org0fabf01">3.2. Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</a></li>
<li><a href="#org7497409">3.3. Obtained Damping</a></li> <li><a href="#org6c74c9a">3.3. Obtained Damping</a></li>
<li><a href="#org61c422b">3.4. Conclusion</a></li> <li><a href="#org81b2156">3.4. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgc84bb75">4. Compliance and Transmissibility Comparison</a> <li><a href="#orgc7e2089">4. Compliance and Transmissibility Comparison</a>
<ul> <ul>
<li><a href="#orgebeb03b">4.1. Initialization</a></li> <li><a href="#org6ec3b9e">4.1. Initialization</a></li>
<li><a href="#orgdde930c">4.2. Identification</a></li> <li><a href="#orge87554a">4.2. Identification</a></li>
<li><a href="#orgcfd0381">4.3. Results</a></li> <li><a href="#org1d70ccd">4.3. Results</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@@ -73,19 +78,19 @@
The following decentralized active damping techniques are briefly studied: The following decentralized active damping techniques are briefly studied:
</p> </p>
<ul class="org-ul"> <ul class="org-ul">
<li>Inertial Control (proportional feedback of the absolute velocity): Section <a href="#orgb2aa4b3">1</a></li> <li>Inertial Control (proportional feedback of the absolute velocity): Section <a href="#org709d56c">1</a></li>
<li>Integral Force Feedback: Section <a href="#org44cadc6">2</a></li> <li>Integral Force Feedback: Section <a href="#org1f0d316">2</a></li>
<li>Direct feedback of the relative velocity of each strut: Section <a href="#orgbdd1eba">3</a></li> <li>Direct feedback of the relative velocity of each strut: Section <a href="#org63027d0">3</a></li>
</ul> </ul>
<div id="outline-container-orgc22d5d6" class="outline-2"> <div id="outline-container-orgddaf52f" class="outline-2">
<h2 id="orgc22d5d6"><span class="section-number-2">1</span> Inertial Control</h2> <h2 id="orgddaf52f"><span class="section-number-2">1</span> Inertial Control</h2>
<div class="outline-text-2" id="text-1"> <div class="outline-text-2" id="text-1">
<p> <p>
<a id="orgb2aa4b3"></a> <a id="org709d56c"></a>
</p> </p>
<div class="note"> <div class="note" id="org1ae7526">
<p> <p>
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_inertial.m">here</a>. The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_inertial.m">here</a>.
</p> </p>
@@ -97,56 +102,56 @@ To run the script, open the Simulink Project, and type <code>run active_damping_
</div> </div>
</div> </div>
<div id="outline-container-org1671c0b" class="outline-3"> <div id="outline-container-org933440d" class="outline-3">
<h3 id="org1671c0b"><span class="section-number-3">1.1</span> Identification of the Dynamics</h3> <h3 id="org933440d"><span class="section-number-3">1.1</span> Identification of the Dynamics</h3>
<div class="outline-text-3" id="text-1-1"> <div class="outline-text-3" id="text-1-1">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform(); <pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3); stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'accelerometer'</span>, <span class="org-string">'freq'</span>, 5e3);
</pre> </pre>
</div> </div>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController('type', 'open-loop'); controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre> </pre>
</div> </div>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">%% Options for Linearized <pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File <span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = 'stewart_platform_model'; mdl = <span class="org-string">'stewart_platform_model'</span>;
%% Input/Output definition <span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Vm'); io_i = io_i + 1; % Absolute velocity of each leg [m/s] io(io_i) = linio([mdl, <span class="org-string">'/Stewart Platform'</span>], 1, <span class="org-string">'openoutput'</span>, [], <span class="org-string">'Vm'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Absolute velocity of each leg [m/s]</span>
%% Run the linearization <span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'}; G.OutputName = {<span class="org-string">'Vm1'</span>, <span class="org-string">'Vm2'</span>, <span class="org-string">'Vm3'</span>, <span class="org-string">'Vm4'</span>, <span class="org-string">'Vm5'</span>, <span class="org-string">'Vm6'</span>};
</pre> </pre>
</div> </div>
<p> <p>
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org116ea42">1</a>. The transfer function from actuator forces to force sensors is shown in Figure <a href="#org5cd47c9">1</a>.
</p> </p>
<div id="org116ea42" class="figure"> <div id="org5cd47c9" class="figure">
<p><img src="figs/inertial_plant_coupling.png" alt="inertial_plant_coupling.png" /> <p><img src="figs/inertial_plant_coupling.png" alt="inertial_plant_coupling.png" />
</p> </p>
<p><span class="figure-number">Figure 1: </span>Transfer function from the Actuator force \(F_{i}\) to the absolute velocity of the same leg \(v_{m,i}\) and to the absolute velocity of the other legs \(v_{m,j}\) with \(i \neq j\) in grey (<a href="./figs/inertial_plant_coupling.png">png</a>, <a href="./figs/inertial_plant_coupling.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 1: </span>Transfer function from the Actuator force \(F_{i}\) to the absolute velocity of the same leg \(v_{m,i}\) and to the absolute velocity of the other legs \(v_{m,j}\) with \(i \neq j\) in grey (<a href="./figs/inertial_plant_coupling.png">png</a>, <a href="./figs/inertial_plant_coupling.pdf">pdf</a>)</p>
@@ -154,17 +159,17 @@ The transfer function from actuator forces to force sensors is shown in Figure <
</div> </div>
</div> </div>
<div id="outline-container-orgdae44ba" class="outline-3"> <div id="outline-container-org2875dd1" class="outline-3">
<h3 id="orgdae44ba"><span class="section-number-3">1.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3> <h3 id="org2875dd1"><span class="section-number-3">1.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
<div class="outline-text-3" id="text-1-2"> <div class="outline-text-3" id="text-1-2">
<p> <p>
We add some stiffness and damping in the flexible joints and we re-identify the dynamics. We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical'); <pre class="src src-matlab">stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
Gf = linearize(mdl, io, options); Gf = linearize(mdl, io, options);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Gf.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
Gf.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'}; Gf.OutputName = {<span class="org-string">'Vm1'</span>, <span class="org-string">'Vm2'</span>, <span class="org-string">'Vm3'</span>, <span class="org-string">'Vm4'</span>, <span class="org-string">'Vm5'</span>, <span class="org-string">'Vm6'</span>};
</pre> </pre>
</div> </div>
@@ -174,16 +179,16 @@ We now use the amplified actuators and re-identify the dynamics
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart); <pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options); Ga = linearize(mdl, io, options);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Ga.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
Ga.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'}; Ga.OutputName = {<span class="org-string">'Vm1'</span>, <span class="org-string">'Vm2'</span>, <span class="org-string">'Vm3'</span>, <span class="org-string">'Vm4'</span>, <span class="org-string">'Vm5'</span>, <span class="org-string">'Vm6'</span>};
</pre> </pre>
</div> </div>
<p> <p>
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org620efcd">2</a>. The new dynamics from force actuator to force sensor is shown in Figure <a href="#org8fcc87b">2</a>.
</p> </p>
<div id="org620efcd" class="figure"> <div id="org8fcc87b" class="figure">
<p><img src="figs/inertial_plant_flexible_joint_decentralized.png" alt="inertial_plant_flexible_joint_decentralized.png" /> <p><img src="figs/inertial_plant_flexible_joint_decentralized.png" alt="inertial_plant_flexible_joint_decentralized.png" />
</p> </p>
<p><span class="figure-number">Figure 2: </span>Transfer function from the Actuator force \(F_{i}\) to the absolute velocity sensor \(v_{m,i}\) (<a href="./figs/inertial_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/inertial_plant_flexible_joint_decentralized.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 2: </span>Transfer function from the Actuator force \(F_{i}\) to the absolute velocity sensor \(v_{m,i}\) (<a href="./figs/inertial_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/inertial_plant_flexible_joint_decentralized.pdf">pdf</a>)</p>
@@ -191,8 +196,8 @@ The new dynamics from force actuator to force sensor is shown in Figure <a href=
</div> </div>
</div> </div>
<div id="outline-container-org89e2002" class="outline-3"> <div id="outline-container-org0cea759" class="outline-3">
<h3 id="org89e2002"><span class="section-number-3">1.3</span> Obtained Damping</h3> <h3 id="org0cea759"><span class="section-number-3">1.3</span> Obtained Damping</h3>
<div class="outline-text-3" id="text-1-3"> <div class="outline-text-3" id="text-1-3">
<p> <p>
The control is a performed in a decentralized manner. The control is a performed in a decentralized manner.
@@ -206,10 +211,10 @@ The \(6 \times 6\) control is a diagonal matrix with pure proportional action on
</p> </p>
<p> <p>
The root locus is shown in figure <a href="#org9cabaee">3</a>. The root locus is shown in figure <a href="#orgaea8656">3</a>.
</p> </p>
<div id="org9cabaee" class="figure"> <div id="orgaea8656" class="figure">
<p><img src="figs/root_locus_inertial_rot_stiffness.png" alt="root_locus_inertial_rot_stiffness.png" /> <p><img src="figs/root_locus_inertial_rot_stiffness.png" alt="root_locus_inertial_rot_stiffness.png" />
</p> </p>
<p><span class="figure-number">Figure 3: </span>Root Locus plot with Decentralized Inertial Control when considering the stiffness of flexible joints (<a href="./figs/root_locus_inertial_rot_stiffness.png">png</a>, <a href="./figs/root_locus_inertial_rot_stiffness.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 3: </span>Root Locus plot with Decentralized Inertial Control when considering the stiffness of flexible joints (<a href="./figs/root_locus_inertial_rot_stiffness.png">png</a>, <a href="./figs/root_locus_inertial_rot_stiffness.pdf">pdf</a>)</p>
@@ -217,10 +222,10 @@ The root locus is shown in figure <a href="#org9cabaee">3</a>.
</div> </div>
</div> </div>
<div id="outline-container-org3904320" class="outline-3"> <div id="outline-container-orga866100" class="outline-3">
<h3 id="org3904320"><span class="section-number-3">1.4</span> Conclusion</h3> <h3 id="orga866100"><span class="section-number-3">1.4</span> Conclusion</h3>
<div class="outline-text-3" id="text-1-4"> <div class="outline-text-3" id="text-1-4">
<div class="important"> <div class="important" id="org91c21ee">
<p> <p>
We do not have guaranteed stability with Inertial control. This is because of the flexibility inside the internal sensor. We do not have guaranteed stability with Inertial control. This is because of the flexibility inside the internal sensor.
</p> </p>
@@ -230,14 +235,14 @@ We do not have guaranteed stability with Inertial control. This is because of th
</div> </div>
</div> </div>
<div id="outline-container-org89e426a" class="outline-2"> <div id="outline-container-orgf8ed544" class="outline-2">
<h2 id="org89e426a"><span class="section-number-2">2</span> Integral Force Feedback</h2> <h2 id="orgf8ed544"><span class="section-number-2">2</span> Integral Force Feedback</h2>
<div class="outline-text-2" id="text-2"> <div class="outline-text-2" id="text-2">
<p> <p>
<a id="org44cadc6"></a> <a id="org1f0d316"></a>
</p> </p>
<div class="note"> <div class="note" id="org30f755d">
<p> <p>
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_iff.m">here</a>. The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_iff.m">here</a>.
</p> </p>
@@ -249,31 +254,31 @@ To run the script, open the Simulink Project, and type <code>run active_damping_
</div> </div>
</div> </div>
<div id="outline-container-orgcb85703" class="outline-3"> <div id="outline-container-orga2d019b" class="outline-3">
<h3 id="orgcb85703"><span class="section-number-3">2.1</span> Identification of the Dynamics with perfect Joints</h3> <h3 id="orga2d019b"><span class="section-number-3">2.1</span> Identification of the Dynamics with perfect Joints</h3>
<div class="outline-text-3" id="text-2-1"> <div class="outline-text-3" id="text-2-1">
<p> <p>
We first initialize the Stewart platform without joint stiffness. We first initialize the Stewart platform without joint stiffness.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform(); <pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none'); stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre> </pre>
</div> </div>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController('type', 'open-loop'); controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre> </pre>
</div> </div>
@@ -281,26 +286,26 @@ controller = initializeController('type', 'open-loop');
And we identify the dynamics from force actuators to force sensors. And we identify the dynamics from force actuators to force sensors.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">%% Name of the Simulink File <pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = 'stewart_platform_model'; mdl = <span class="org-string">'stewart_platform_model'</span>;
%% Input/Output definition <span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N] io(io_i) = linio([mdl, <span class="org-string">'/Stewart Platform'</span>], 1, <span class="org-string">'openoutput'</span>, [], <span class="org-string">'Taum'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Force Sensor Outputs [N]</span>
%% Run the linearization <span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io); G = linearize(mdl, io);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}; G.OutputName = {<span class="org-string">'Fm1'</span>, <span class="org-string">'Fm2'</span>, <span class="org-string">'Fm3'</span>, <span class="org-string">'Fm4'</span>, <span class="org-string">'Fm5'</span>, <span class="org-string">'Fm6'</span>};
</pre> </pre>
</div> </div>
<p> <p>
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org8f016dc">4</a>. The transfer function from actuator forces to force sensors is shown in Figure <a href="#org3b3de64">4</a>.
</p> </p>
<div id="org8f016dc" class="figure"> <div id="org3b3de64" class="figure">
<p><img src="figs/iff_plant_coupling.png" alt="iff_plant_coupling.png" /> <p><img src="figs/iff_plant_coupling.png" alt="iff_plant_coupling.png" />
</p> </p>
<p><span class="figure-number">Figure 4: </span>Transfer function from the Actuator force \(F_{i}\) to the Force sensor of the same leg \(F_{m,i}\) and to the force sensor of the other legs \(F_{m,j}\) with \(i \neq j\) in grey (<a href="./figs/iff_plant_coupling.png">png</a>, <a href="./figs/iff_plant_coupling.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 4: </span>Transfer function from the Actuator force \(F_{i}\) to the Force sensor of the same leg \(F_{m,i}\) and to the force sensor of the other legs \(F_{m,j}\) with \(i \neq j\) in grey (<a href="./figs/iff_plant_coupling.png">png</a>, <a href="./figs/iff_plant_coupling.pdf">pdf</a>)</p>
@@ -308,17 +313,17 @@ The transfer function from actuator forces to force sensors is shown in Figure <
</div> </div>
</div> </div>
<div id="outline-container-org4ca24f7" class="outline-3"> <div id="outline-container-org6ac04ee" class="outline-3">
<h3 id="org4ca24f7"><span class="section-number-3">2.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3> <h3 id="org6ac04ee"><span class="section-number-3">2.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
<div class="outline-text-3" id="text-2-2"> <div class="outline-text-3" id="text-2-2">
<p> <p>
We add some stiffness and damping in the flexible joints and we re-identify the dynamics. We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical'); <pre class="src src-matlab">stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
Gf = linearize(mdl, io); Gf = linearize(mdl, io);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Gf.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}; Gf.OutputName = {<span class="org-string">'Fm1'</span>, <span class="org-string">'Fm2'</span>, <span class="org-string">'Fm3'</span>, <span class="org-string">'Fm4'</span>, <span class="org-string">'Fm5'</span>, <span class="org-string">'Fm6'</span>};
</pre> </pre>
</div> </div>
@@ -328,16 +333,16 @@ We now use the amplified actuators and re-identify the dynamics
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart); <pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io); Ga = linearize(mdl, io);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Ga.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}; Ga.OutputName = {<span class="org-string">'Fm1'</span>, <span class="org-string">'Fm2'</span>, <span class="org-string">'Fm3'</span>, <span class="org-string">'Fm4'</span>, <span class="org-string">'Fm5'</span>, <span class="org-string">'Fm6'</span>};
</pre> </pre>
</div> </div>
<p> <p>
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org4a92e1b">5</a>. The new dynamics from force actuator to force sensor is shown in Figure <a href="#org1902b8f">5</a>.
</p> </p>
<div id="org4a92e1b" class="figure"> <div id="org1902b8f" class="figure">
<p><img src="figs/iff_plant_flexible_joint_decentralized.png" alt="iff_plant_flexible_joint_decentralized.png" /> <p><img src="figs/iff_plant_flexible_joint_decentralized.png" alt="iff_plant_flexible_joint_decentralized.png" />
</p> </p>
<p><span class="figure-number">Figure 5: </span>Transfer function from the Actuator force \(F_{i}\) to the force sensor \(F_{m,i}\) (<a href="./figs/iff_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/iff_plant_flexible_joint_decentralized.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 5: </span>Transfer function from the Actuator force \(F_{i}\) to the force sensor \(F_{m,i}\) (<a href="./figs/iff_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/iff_plant_flexible_joint_decentralized.pdf">pdf</a>)</p>
@@ -345,8 +350,8 @@ The new dynamics from force actuator to force sensor is shown in Figure <a href=
</div> </div>
</div> </div>
<div id="outline-container-org11e5ee2" class="outline-3"> <div id="outline-container-org06e1086" class="outline-3">
<h3 id="org11e5ee2"><span class="section-number-3">2.3</span> Obtained Damping</h3> <h3 id="org06e1086"><span class="section-number-3">2.3</span> Obtained Damping</h3>
<div class="outline-text-3" id="text-2-3"> <div class="outline-text-3" id="text-2-3">
<p> <p>
The control is a performed in a decentralized manner. The control is a performed in a decentralized manner.
@@ -360,17 +365,17 @@ The \(6 \times 6\) control is a diagonal matrix with pure integration action on
</p> </p>
<p> <p>
The root locus is shown in figure <a href="#orgc8981ba">6</a> and the obtained pole damping function of the control gain is shown in figure <a href="#orgd7fefc7">7</a>. The root locus is shown in figure <a href="#orgce5d8d8">6</a> and the obtained pole damping function of the control gain is shown in figure <a href="#org67419cd">7</a>.
</p> </p>
<div id="orgc8981ba" class="figure"> <div id="orgce5d8d8" class="figure">
<p><img src="figs/root_locus_iff_rot_stiffness.png" alt="root_locus_iff_rot_stiffness.png" /> <p><img src="figs/root_locus_iff_rot_stiffness.png" alt="root_locus_iff_rot_stiffness.png" />
</p> </p>
<p><span class="figure-number">Figure 6: </span>Root Locus plot with Decentralized Integral Force Feedback when considering the stiffness of flexible joints (<a href="./figs/root_locus_iff_rot_stiffness.png">png</a>, <a href="./figs/root_locus_iff_rot_stiffness.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 6: </span>Root Locus plot with Decentralized Integral Force Feedback when considering the stiffness of flexible joints (<a href="./figs/root_locus_iff_rot_stiffness.png">png</a>, <a href="./figs/root_locus_iff_rot_stiffness.pdf">pdf</a>)</p>
</div> </div>
<div id="orgd7fefc7" class="figure"> <div id="org67419cd" class="figure">
<p><img src="figs/pole_damping_gain_iff_rot_stiffness.png" alt="pole_damping_gain_iff_rot_stiffness.png" /> <p><img src="figs/pole_damping_gain_iff_rot_stiffness.png" alt="pole_damping_gain_iff_rot_stiffness.png" />
</p> </p>
<p><span class="figure-number">Figure 7: </span>Damping of the poles with respect to the gain of the Decentralized Integral Force Feedback when considering the stiffness of flexible joints (<a href="./figs/pole_damping_gain_iff_rot_stiffness.png">png</a>, <a href="./figs/pole_damping_gain_iff_rot_stiffness.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 7: </span>Damping of the poles with respect to the gain of the Decentralized Integral Force Feedback when considering the stiffness of flexible joints (<a href="./figs/pole_damping_gain_iff_rot_stiffness.png">png</a>, <a href="./figs/pole_damping_gain_iff_rot_stiffness.pdf">pdf</a>)</p>
@@ -378,10 +383,10 @@ The root locus is shown in figure <a href="#orgc8981ba">6</a> and the obtained p
</div> </div>
</div> </div>
<div id="outline-container-orgca67baa" class="outline-3"> <div id="outline-container-orgfa832d6" class="outline-3">
<h3 id="orgca67baa"><span class="section-number-3">2.4</span> Conclusion</h3> <h3 id="orgfa832d6"><span class="section-number-3">2.4</span> Conclusion</h3>
<div class="outline-text-3" id="text-2-4"> <div class="outline-text-3" id="text-2-4">
<div class="important"> <div class="important" id="orgad0c17b">
<p> <p>
The joint stiffness has a huge impact on the attainable active damping performance when using force sensors. The joint stiffness has a huge impact on the attainable active damping performance when using force sensors.
Thus, if Integral Force Feedback is to be used in a Stewart platform with flexible joints, the rotational stiffness of the joints should be minimized. Thus, if Integral Force Feedback is to be used in a Stewart platform with flexible joints, the rotational stiffness of the joints should be minimized.
@@ -392,14 +397,14 @@ Thus, if Integral Force Feedback is to be used in a Stewart platform with flexib
</div> </div>
</div> </div>
<div id="outline-container-org47a29be" class="outline-2"> <div id="outline-container-orgabec4e1" class="outline-2">
<h2 id="org47a29be"><span class="section-number-2">3</span> Direct Velocity Feedback</h2> <h2 id="orgabec4e1"><span class="section-number-2">3</span> Direct Velocity Feedback</h2>
<div class="outline-text-2" id="text-3"> <div class="outline-text-2" id="text-3">
<p> <p>
<a id="orgbdd1eba"></a> <a id="org63027d0"></a>
</p> </p>
<div class="note"> <div class="note" id="orgadea9d6">
<p> <p>
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_dvf.m">here</a>. The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_dvf.m">here</a>.
</p> </p>
@@ -411,31 +416,31 @@ To run the script, open the Simulink Project, and type <code>run active_damping_
</div> </div>
</div> </div>
<div id="outline-container-orgc82a6a7" class="outline-3"> <div id="outline-container-org19cbcee" class="outline-3">
<h3 id="orgc82a6a7"><span class="section-number-3">3.1</span> Identification of the Dynamics with perfect Joints</h3> <h3 id="org19cbcee"><span class="section-number-3">3.1</span> Identification of the Dynamics with perfect Joints</h3>
<div class="outline-text-3" id="text-3-1"> <div class="outline-text-3" id="text-3-1">
<p> <p>
We first initialize the Stewart platform without joint stiffness. We first initialize the Stewart platform without joint stiffness.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform(); <pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none'); stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre> </pre>
</div> </div>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController('type', 'open-loop'); controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre> </pre>
</div> </div>
@@ -443,30 +448,30 @@ controller = initializeController('type', 'open-loop');
And we identify the dynamics from force actuators to force sensors. And we identify the dynamics from force actuators to force sensors.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">%% Options for Linearized <pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File <span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = 'stewart_platform_model'; mdl = <span class="org-string">'stewart_platform_model'</span>;
%% Input/Output definition <span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m] io(io_i) = linio([mdl, <span class="org-string">'/Stewart Platform'</span>], 1, <span class="org-string">'openoutput'</span>, [], <span class="org-string">'dLm'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Relative Displacement Outputs [m]</span>
%% Run the linearization <span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'}; G.OutputName = {<span class="org-string">'Dm1'</span>, <span class="org-string">'Dm2'</span>, <span class="org-string">'Dm3'</span>, <span class="org-string">'Dm4'</span>, <span class="org-string">'Dm5'</span>, <span class="org-string">'Dm6'</span>};
</pre> </pre>
</div> </div>
<p> <p>
The transfer function from actuator forces to relative motion sensors is shown in Figure <a href="#org6de423c">8</a>. The transfer function from actuator forces to relative motion sensors is shown in Figure <a href="#org34c24ba">8</a>.
</p> </p>
<div id="org6de423c" class="figure"> <div id="org34c24ba" class="figure">
<p><img src="figs/dvf_plant_coupling.png" alt="dvf_plant_coupling.png" /> <p><img src="figs/dvf_plant_coupling.png" alt="dvf_plant_coupling.png" />
</p> </p>
<p><span class="figure-number">Figure 8: </span>Transfer function from the Actuator force \(F_{i}\) to the Relative Motion Sensor \(D_{m,j}\) with \(i \neq j\) (<a href="./figs/dvf_plant_coupling.png">png</a>, <a href="./figs/dvf_plant_coupling.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 8: </span>Transfer function from the Actuator force \(F_{i}\) to the Relative Motion Sensor \(D_{m,j}\) with \(i \neq j\) (<a href="./figs/dvf_plant_coupling.png">png</a>, <a href="./figs/dvf_plant_coupling.pdf">pdf</a>)</p>
@@ -475,17 +480,17 @@ The transfer function from actuator forces to relative motion sensors is shown i
</div> </div>
<div id="outline-container-org92d6cb1" class="outline-3"> <div id="outline-container-org0fabf01" class="outline-3">
<h3 id="org92d6cb1"><span class="section-number-3">3.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3> <h3 id="org0fabf01"><span class="section-number-3">3.2</span> Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics</h3>
<div class="outline-text-3" id="text-3-2"> <div class="outline-text-3" id="text-3-2">
<p> <p>
We add some stiffness and damping in the flexible joints and we re-identify the dynamics. We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical'); <pre class="src src-matlab">stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical'</span>);
Gf = linearize(mdl, io, options); Gf = linearize(mdl, io, options);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Gf.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
Gf.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'}; Gf.OutputName = {<span class="org-string">'Dm1'</span>, <span class="org-string">'Dm2'</span>, <span class="org-string">'Dm3'</span>, <span class="org-string">'Dm4'</span>, <span class="org-string">'Dm5'</span>, <span class="org-string">'Dm6'</span>};
</pre> </pre>
</div> </div>
@@ -495,16 +500,16 @@ We now use the amplified actuators and re-identify the dynamics
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart); <pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options); Ga = linearize(mdl, io, options);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Ga.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
Ga.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'}; Ga.OutputName = {<span class="org-string">'Dm1'</span>, <span class="org-string">'Dm2'</span>, <span class="org-string">'Dm3'</span>, <span class="org-string">'Dm4'</span>, <span class="org-string">'Dm5'</span>, <span class="org-string">'Dm6'</span>};
</pre> </pre>
</div> </div>
<p> <p>
The new dynamics from force actuator to relative motion sensor is shown in Figure <a href="#org5f559a9">9</a>. The new dynamics from force actuator to relative motion sensor is shown in Figure <a href="#orgba524e3">9</a>.
</p> </p>
<div id="org5f559a9" class="figure"> <div id="orgba524e3" class="figure">
<p><img src="figs/dvf_plant_flexible_joint_decentralized.png" alt="dvf_plant_flexible_joint_decentralized.png" /> <p><img src="figs/dvf_plant_flexible_joint_decentralized.png" alt="dvf_plant_flexible_joint_decentralized.png" />
</p> </p>
<p><span class="figure-number">Figure 9: </span>Transfer function from the Actuator force \(F_{i}\) to the relative displacement sensor \(D_{m,i}\) (<a href="./figs/dvf_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/dvf_plant_flexible_joint_decentralized.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 9: </span>Transfer function from the Actuator force \(F_{i}\) to the relative displacement sensor \(D_{m,i}\) (<a href="./figs/dvf_plant_flexible_joint_decentralized.png">png</a>, <a href="./figs/dvf_plant_flexible_joint_decentralized.pdf">pdf</a>)</p>
@@ -512,8 +517,8 @@ The new dynamics from force actuator to relative motion sensor is shown in Figur
</div> </div>
</div> </div>
<div id="outline-container-org7497409" class="outline-3"> <div id="outline-container-org6c74c9a" class="outline-3">
<h3 id="org7497409"><span class="section-number-3">3.3</span> Obtained Damping</h3> <h3 id="org6c74c9a"><span class="section-number-3">3.3</span> Obtained Damping</h3>
<div class="outline-text-3" id="text-3-3"> <div class="outline-text-3" id="text-3-3">
<p> <p>
The control is a performed in a decentralized manner. The control is a performed in a decentralized manner.
@@ -527,10 +532,10 @@ The \(6 \times 6\) control is a diagonal matrix with pure derivative action on t
</p> </p>
<p> <p>
The root locus is shown in figure <a href="#org5e168d0">10</a>. The root locus is shown in figure <a href="#org0436b4d">10</a>.
</p> </p>
<div id="org5e168d0" class="figure"> <div id="org0436b4d" class="figure">
<p><img src="figs/root_locus_dvf_rot_stiffness.png" alt="root_locus_dvf_rot_stiffness.png" /> <p><img src="figs/root_locus_dvf_rot_stiffness.png" alt="root_locus_dvf_rot_stiffness.png" />
</p> </p>
<p><span class="figure-number">Figure 10: </span>Root Locus plot with Direct Velocity Feedback when considering the Stiffness of flexible joints (<a href="./figs/root_locus_dvf_rot_stiffness.png">png</a>, <a href="./figs/root_locus_dvf_rot_stiffness.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 10: </span>Root Locus plot with Direct Velocity Feedback when considering the Stiffness of flexible joints (<a href="./figs/root_locus_dvf_rot_stiffness.png">png</a>, <a href="./figs/root_locus_dvf_rot_stiffness.pdf">pdf</a>)</p>
@@ -538,10 +543,10 @@ The root locus is shown in figure <a href="#org5e168d0">10</a>.
</div> </div>
</div> </div>
<div id="outline-container-org61c422b" class="outline-3"> <div id="outline-container-org81b2156" class="outline-3">
<h3 id="org61c422b"><span class="section-number-3">3.4</span> Conclusion</h3> <h3 id="org81b2156"><span class="section-number-3">3.4</span> Conclusion</h3>
<div class="outline-text-3" id="text-3-4"> <div class="outline-text-3" id="text-3-4">
<div class="important"> <div class="important" id="orgb486ca9">
<p> <p>
Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors. Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors.
</p> </p>
@@ -551,28 +556,28 @@ Joint stiffness does increase the resonance frequencies of the system but does n
</div> </div>
</div> </div>
<div id="outline-container-orgc84bb75" class="outline-2"> <div id="outline-container-orgc7e2089" class="outline-2">
<h2 id="orgc84bb75"><span class="section-number-2">4</span> Compliance and Transmissibility Comparison</h2> <h2 id="orgc7e2089"><span class="section-number-2">4</span> Compliance and Transmissibility Comparison</h2>
<div class="outline-text-2" id="text-4"> <div class="outline-text-2" id="text-4">
</div> </div>
<div id="outline-container-orgebeb03b" class="outline-3"> <div id="outline-container-org6ec3b9e" class="outline-3">
<h3 id="orgebeb03b"><span class="section-number-3">4.1</span> Initialization</h3> <h3 id="org6ec3b9e"><span class="section-number-3">4.1</span> Initialization</h3>
<div class="outline-text-3" id="text-4-1"> <div class="outline-text-3" id="text-4-1">
<p> <p>
We first initialize the Stewart platform without joint stiffness. We first initialize the Stewart platform without joint stiffness.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform(); <pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none'); stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre> </pre>
</div> </div>
@@ -580,22 +585,22 @@ stewart = initializeInertialSensor(stewart, 'type', 'none');
The rotation point of the ground is located at the origin of frame \(\{A\}\). The rotation point of the ground is located at the origin of frame \(\{A\}\).
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'rot_point'</span>, stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController('type', 'open-loop'); controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-orgdde930c" class="outline-3"> <div id="outline-container-orge87554a" class="outline-3">
<h3 id="orgdde930c"><span class="section-number-3">4.2</span> Identification</h3> <h3 id="orge87554a"><span class="section-number-3">4.2</span> Identification</h3>
<div class="outline-text-3" id="text-4-2"> <div class="outline-text-3" id="text-4-2">
<p> <p>
Let&rsquo;s first identify the transmissibility and compliance in the open-loop case. Let&rsquo;s first identify the transmissibility and compliance in the open-loop case.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">controller = initializeController('type', 'open-loop'); <pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
[T_ol, T_norm_ol, freqs] = computeTransmissibility(); [T_ol, T_norm_ol, freqs] = computeTransmissibility();
[C_ol, C_norm_ol, freqs] = computeCompliance(); [C_ol, C_norm_ol, freqs] = computeCompliance();
</pre> </pre>
@@ -605,11 +610,11 @@ Let&rsquo;s first identify the transmissibility and compliance in the open-loop
Now, let&rsquo;s identify the transmissibility and compliance for the Integral Force Feedback architecture. Now, let&rsquo;s identify the transmissibility and compliance for the Integral Force Feedback architecture.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">controller = initializeController('type', 'iff'); <pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'iff'</span>);
K_iff = (1e4/s)*eye(6); K_iff = (1e4<span class="org-type">/</span>s)<span class="org-type">*</span>eye(6);
[T_iff, T_norm_iff, ~] = computeTransmissibility(); [T_iff, T_norm_iff, <span class="org-type">~</span>] = computeTransmissibility();
[C_iff, C_norm_iff, ~] = computeCompliance(); [C_iff, C_norm_iff, <span class="org-type">~</span>] = computeCompliance();
</pre> </pre>
</div> </div>
@@ -617,35 +622,35 @@ K_iff = (1e4/s)*eye(6);
And for the Direct Velocity Feedback. And for the Direct Velocity Feedback.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">controller = initializeController('type', 'dvf'); <pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'dvf'</span>);
K_dvf = 1e4*s/(1+s/2/pi/5000)*eye(6); K_dvf = 1e4<span class="org-type">*</span>s<span class="org-type">/</span>(1<span class="org-type">+</span>s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>5000)<span class="org-type">*</span>eye(6);
[T_dvf, T_norm_dvf, ~] = computeTransmissibility(); [T_dvf, T_norm_dvf, <span class="org-type">~</span>] = computeTransmissibility();
[C_dvf, C_norm_dvf, ~] = computeCompliance(); [C_dvf, C_norm_dvf, <span class="org-type">~</span>] = computeCompliance();
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-orgcfd0381" class="outline-3"> <div id="outline-container-org1d70ccd" class="outline-3">
<h3 id="orgcfd0381"><span class="section-number-3">4.3</span> Results</h3> <h3 id="org1d70ccd"><span class="section-number-3">4.3</span> Results</h3>
<div class="outline-text-3" id="text-4-3"> <div class="outline-text-3" id="text-4-3">
<div id="orgc1f4c92" class="figure"> <div id="org908e692" class="figure">
<p><img src="figs/transmissibility_iff_dvf.png" alt="transmissibility_iff_dvf.png" /> <p><img src="figs/transmissibility_iff_dvf.png" alt="transmissibility_iff_dvf.png" />
</p> </p>
<p><span class="figure-number">Figure 11: </span>Obtained transmissibility for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/transmissibility_iff_dvf.png">png</a>, <a href="./figs/transmissibility_iff_dvf.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 11: </span>Obtained transmissibility for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/transmissibility_iff_dvf.png">png</a>, <a href="./figs/transmissibility_iff_dvf.pdf">pdf</a>)</p>
</div> </div>
<div id="org2d1b516" class="figure"> <div id="orgc10c609" class="figure">
<p><img src="figs/compliance_iff_dvf.png" alt="compliance_iff_dvf.png" /> <p><img src="figs/compliance_iff_dvf.png" alt="compliance_iff_dvf.png" />
</p> </p>
<p><span class="figure-number">Figure 12: </span>Obtained compliance for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/compliance_iff_dvf.png">png</a>, <a href="./figs/compliance_iff_dvf.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 12: </span>Obtained compliance for Open-Loop Control (Blue), Integral Force Feedback (Red) and Direct Velocity Feedback (Yellow) (<a href="./figs/compliance_iff_dvf.png">png</a>, <a href="./figs/compliance_iff_dvf.pdf">pdf</a>)</p>
</div> </div>
<div id="orgf9b6a2b" class="figure"> <div id="orgd54f179" class="figure">
<p><img src="figs/frobenius_norm_T_C_iff_dvf.png" alt="frobenius_norm_T_C_iff_dvf.png" /> <p><img src="figs/frobenius_norm_T_C_iff_dvf.png" alt="frobenius_norm_T_C_iff_dvf.png" />
</p> </p>
<p><span class="figure-number">Figure 13: </span>Frobenius norm of the Transmissibility and Compliance Matrices (<a href="./figs/frobenius_norm_T_C_iff_dvf.png">png</a>, <a href="./figs/frobenius_norm_T_C_iff_dvf.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 13: </span>Frobenius norm of the Transmissibility and Compliance Matrices (<a href="./figs/frobenius_norm_T_C_iff_dvf.png">png</a>, <a href="./figs/frobenius_norm_T_C_iff_dvf.pdf">pdf</a>)</p>
@@ -656,7 +661,7 @@ K_dvf = 1e4*s/(1+s/2/pi/5000)*eye(6);
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-08-05 mer. 13:27</p> <p class="date">Created: 2021-01-08 ven. 15:53</p>
</div> </div>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,145 +0,0 @@
.org-bold { /* bold */ font-weight: bold; }
.org-bold-italic { /* bold-italic */ font-weight: bold; font-style: italic; }
.org-buffer-menu-buffer { /* buffer-menu-buffer */ font-weight: bold; }
.org-builtin { /* font-lock-builtin-face */ color: #7a378b; }
.org-button { /* button */ text-decoration: underline; }
.org-calendar-today { /* calendar-today */ text-decoration: underline; }
.org-change-log-acknowledgement { /* change-log-acknowledgement */ color: #b22222; }
.org-change-log-conditionals { /* change-log-conditionals */ color: #a0522d; }
.org-change-log-date { /* change-log-date */ color: #8b2252; }
.org-change-log-email { /* change-log-email */ color: #a0522d; }
.org-change-log-file { /* change-log-file */ color: #0000ff; }
.org-change-log-function { /* change-log-function */ color: #a0522d; }
.org-change-log-list { /* change-log-list */ color: #a020f0; }
.org-change-log-name { /* change-log-name */ color: #008b8b; }
.org-comint-highlight-input { /* comint-highlight-input */ font-weight: bold; }
.org-comint-highlight-prompt { /* comint-highlight-prompt */ color: #00008b; }
.org-comment { /* font-lock-comment-face */ color: #999988; font-style: italic; }
.org-comment-delimiter { /* font-lock-comment-delimiter-face */ color: #999988; font-style: italic; }
.org-completions-annotations { /* completions-annotations */ font-style: italic; }
.org-completions-common-part { /* completions-common-part */ color: #000000; background-color: #ffffff; }
.org-completions-first-difference { /* completions-first-difference */ font-weight: bold; }
.org-constant { /* font-lock-constant-face */ color: #008b8b; }
.org-diary { /* diary */ color: #ff0000; }
.org-diff-context { /* diff-context */ color: #7f7f7f; }
.org-diff-file-header { /* diff-file-header */ background-color: #b3b3b3; font-weight: bold; }
.org-diff-function { /* diff-function */ background-color: #cccccc; }
.org-diff-header { /* diff-header */ background-color: #cccccc; }
.org-diff-hunk-header { /* diff-hunk-header */ background-color: #cccccc; }
.org-diff-index { /* diff-index */ background-color: #b3b3b3; font-weight: bold; }
.org-diff-nonexistent { /* diff-nonexistent */ background-color: #b3b3b3; font-weight: bold; }
.org-diff-refine-change { /* diff-refine-change */ background-color: #d9d9d9; }
.org-dired-directory { /* dired-directory */ color: #0000ff; }
.org-dired-flagged { /* dired-flagged */ color: #ff0000; font-weight: bold; }
.org-dired-header { /* dired-header */ color: #228b22; }
.org-dired-ignored { /* dired-ignored */ color: #7f7f7f; }
.org-dired-mark { /* dired-mark */ color: #008b8b; }
.org-dired-marked { /* dired-marked */ color: #ff0000; font-weight: bold; }
.org-dired-perm-write { /* dired-perm-write */ color: #b22222; }
.org-dired-symlink { /* dired-symlink */ color: #a020f0; }
.org-dired-warning { /* dired-warning */ color: #ff0000; font-weight: bold; }
.org-doc { /* font-lock-doc-face */ color: #8b2252; }
.org-escape-glyph { /* escape-glyph */ color: #a52a2a; }
.org-file-name-shadow { /* file-name-shadow */ color: #7f7f7f; }
.org-flyspell-duplicate { /* flyspell-duplicate */ color: #cdad00; font-weight: bold; text-decoration: underline; }
.org-flyspell-incorrect { /* flyspell-incorrect */ color: #ff4500; font-weight: bold; text-decoration: underline; }
.org-fringe { /* fringe */ background-color: #f2f2f2; }
.org-function-name { /* font-lock-function-name-face */ color: teal; }
.org-header-line { /* header-line */ color: #333333; background-color: #e5e5e5; }
.org-help-argument-name { /* help-argument-name */ font-style: italic; }
.org-highlight { /* highlight */ background-color: #b4eeb4; }
.org-holiday { /* holiday */ background-color: #ffc0cb; }
.org-isearch { /* isearch */ color: #b0e2ff; background-color: #cd00cd; }
.org-isearch-fail { /* isearch-fail */ background-color: #ffc1c1; }
.org-italic { /* italic */ font-style: italic; }
.org-keyword { /* font-lock-keyword-face */ color: #0086b3; }
.org-lazy-highlight { /* lazy-highlight */ background-color: #afeeee; }
.org-link { /* link */ color: #0000ff; text-decoration: underline; }
.org-link-visited { /* link-visited */ color: #8b008b; text-decoration: underline; }
.org-log-edit-header { /* log-edit-header */ color: #a020f0; }
.org-log-edit-summary { /* log-edit-summary */ color: #0000ff; }
.org-log-edit-unknown-header { /* log-edit-unknown-header */ color: #b22222; }
.org-match { /* match */ background-color: #ffff00; }
.org-next-error { /* next-error */ background-color: #eedc82; }
.org-nobreak-space { /* nobreak-space */ color: #a52a2a; text-decoration: underline; }
.org-org-archived { /* org-archived */ color: #7f7f7f; }
.org-org-block { /* org-block */ color: #7f7f7f; }
.org-org-block-begin-line { /* org-block-begin-line */ color: #b22222; }
.org-org-block-end-line { /* org-block-end-line */ color: #b22222; }
.org-org-checkbox { /* org-checkbox */ font-weight: bold; }
.org-org-checkbox-statistics-done { /* org-checkbox-statistics-done */ color: #228b22; font-weight: bold; }
.org-org-checkbox-statistics-todo { /* org-checkbox-statistics-todo */ color: #ff0000; font-weight: bold; }
.org-org-clock-overlay { /* org-clock-overlay */ background-color: #ffff00; }
.org-org-code { /* org-code */ color: #7f7f7f; }
.org-org-column { /* org-column */ background-color: #e5e5e5; }
.org-org-column-title { /* org-column-title */ background-color: #e5e5e5; font-weight: bold; text-decoration: underline; }
.org-org-date { /* org-date */ color: #a020f0; text-decoration: underline; }
.org-org-document-info { /* org-document-info */ color: #191970; }
.org-org-document-info-keyword { /* org-document-info-keyword */ color: #7f7f7f; }
.org-org-document-title { /* org-document-title */ color: #191970; font-size: 144%; font-weight: bold; }
.org-org-done { /* org-done */ color: #228b22; font-weight: bold; }
.org-org-drawer { /* org-drawer */ color: #0000ff; }
.org-org-ellipsis { /* org-ellipsis */ color: #b8860b; text-decoration: underline; }
.org-org-footnote { /* org-footnote */ color: #a020f0; text-decoration: underline; }
.org-org-formula { /* org-formula */ color: #b22222; }
.org-org-headline-done { /* org-headline-done */ color: #bc8f8f; }
.org-org-hide { /* org-hide */ color: #ffffff; }
.org-org-latex-and-export-specials { /* org-latex-and-export-specials */ color: #8b4513; }
.org-org-level-1 { /* org-level-1 */ color: #0000ff; }
.org-org-level-2 { /* org-level-2 */ color: #a0522d; }
.org-org-level-3 { /* org-level-3 */ color: #a020f0; }
.org-org-level-4 { /* org-level-4 */ color: #b22222; }
.org-org-level-5 { /* org-level-5 */ color: #228b22; }
.org-org-level-6 { /* org-level-6 */ color: #008b8b; }
.org-org-level-7 { /* org-level-7 */ color: #7a378b; }
.org-org-level-8 { /* org-level-8 */ color: #8b2252; }
.org-org-link { /* org-link */ color: #0000ff; text-decoration: underline; }
.org-org-meta-line { /* org-meta-line */ color: #b22222; }
.org-org-mode-line-clock { /* org-mode-line-clock */ color: #000000; background-color: #bfbfbf; }
.org-org-mode-line-clock-overrun { /* org-mode-line-clock-overrun */ color: #000000; background-color: #ff0000; }
.org-org-quote { /* org-quote */ color: #7f7f7f; }
.org-org-scheduled { /* org-scheduled */ color: #006400; }
.org-org-scheduled-previously { /* org-scheduled-previously */ color: #b22222; }
.org-org-scheduled-today { /* org-scheduled-today */ color: #006400; }
.org-org-sexp-date { /* org-sexp-date */ color: #a020f0; }
.org-org-special-keyword { /* org-special-keyword */ color: #a020f0; }
.org-org-table { /* org-table */ color: #0000ff; }
.org-org-tag { /* org-tag */ font-weight: bold; }
.org-org-target { /* org-target */ text-decoration: underline; }
.org-org-time-grid { /* org-time-grid */ color: #b8860b; }
.org-org-todo { /* org-todo */ color: #ff0000; font-weight: bold; }
.org-org-upcoming-deadline { /* org-upcoming-deadline */ color: #b22222; }
.org-org-verbatim { /* org-verbatim */ color: #7f7f7f; }
.org-org-verse { /* org-verse */ color: #7f7f7f; }
.org-org-warning { /* org-warning */ color: #ff0000; font-weight: bold; }
.org-outline-1 { /* outline-1 */ color: #0000ff; }
.org-outline-2 { /* outline-2 */ color: #a0522d; }
.org-outline-3 { /* outline-3 */ color: #a020f0; }
.org-outline-4 { /* outline-4 */ color: #b22222; }
.org-outline-5 { /* outline-5 */ color: #228b22; }
.org-outline-6 { /* outline-6 */ color: #008b8b; }
.org-outline-7 { /* outline-7 */ color: #7a378b; }
.org-outline-8 { /* outline-8 */ color: #8b2252; }
.org-preprocessor { /* font-lock-preprocessor-face */ color: #7a378b; }
.org-query-replace { /* query-replace */ color: #b0e2ff; background-color: #cd00cd; }
.org-regexp-grouping-backslash { /* font-lock-regexp-grouping-backslash */ font-weight: bold; }
.org-regexp-grouping-construct { /* font-lock-regexp-grouping-construct */ font-weight: bold; }
.org-region { /* region */ background-color: #eedc82; }
.org-secondary-selection { /* secondary-selection */ background-color: #ffff00; }
.org-shadow { /* shadow */ color: #7f7f7f; }
.org-show-paren-match { /* show-paren-match */ background-color: #40e0d0; }
.org-show-paren-mismatch { /* show-paren-mismatch */ color: #ffffff; background-color: #a020f0; }
.org-string { /* font-lock-string-face */ color: #dd1144; }
.org-tool-bar { /* tool-bar */ color: #000000; background-color: #bfbfbf; }
.org-tooltip { /* tooltip */ color: #000000; background-color: #ffffe0; }
.org-trailing-whitespace { /* trailing-whitespace */ background-color: #ff0000; }
.org-type { /* font-lock-type-face */ color: #228b22; }
.org-underline { /* underline */ text-decoration: underline; }
.org-variable-name { /* font-lock-variable-name-face */ color: teal; }
.org-warning { /* font-lock-warning-face */ color: #ff0000; font-weight: bold; }
.org-widget-button { /* widget-button */ font-weight: bold; }
.org-widget-button-pressed { /* widget-button-pressed */ color: #ff0000; }
.org-widget-documentation { /* widget-documentation */ color: #006400; }
.org-widget-field { /* widget-field */ background-color: #d9d9d9; }
.org-widget-inactive { /* widget-inactive */ color: #7f7f7f; }
.org-widget-single-line-field { /* widget-single-line-field */ background-color: #d9d9d9; }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,25 +3,30 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-08-05 mer. 13:27 --> <!-- 2021-01-08 ven. 15:52 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Stewart Platform - Dynamics Study</title> <title>Stewart Platform - Dynamics Study</title>
<meta name="generator" content="Org mode" /> <meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" /> <meta name="author" content="Dehaeze Thomas" />
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
<script src="./js/jquery.min.js"></script> <script>
<script src="./js/bootstrap.min.js"></script> MathJax = {
<script src="./js/jquery.stickytableheaders.min.js"></script> svg: {
<script src="./js/readtheorg.js"></script> scale: 1,
<script>MathJax = { fontCache: "global"
tex: { },
tags: 'ams', tex: {
macros: {bm: ["\\boldsymbol{#1}",1],} tags: "ams",
} multlineWidth: "%MULTLINEWIDTH",
}; tagSide: "right",
</script> macros: {bm: ["\\boldsymbol{#1}",1],},
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> tagIndent: ".8em"
}
};
</script>
<script id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
</head> </head>
<body> <body>
<div id="org-div-home-and-up"> <div id="org-div-home-and-up">
@@ -34,49 +39,49 @@
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents"> <div id="text-table-of-contents">
<ul> <ul>
<li><a href="#orgc59e712">1. Compare external forces and forces applied by the actuators</a> <li><a href="#org7743c04">1. Compare external forces and forces applied by the actuators</a>
<ul> <ul>
<li><a href="#org4509b7d">1.1. Comparison with fixed support</a></li> <li><a href="#orgc730bef">1.1. Comparison with fixed support</a></li>
<li><a href="#org8662186">1.2. Comparison with a flexible support</a></li> <li><a href="#orgefde538">1.2. Comparison with a flexible support</a></li>
<li><a href="#org55e0dad">1.3. Conclusion</a></li> <li><a href="#orga9eb2fd">1.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org81ab204">2. Comparison of the static transfer function and the Compliance matrix</a> <li><a href="#orgb6a1ef7">2. Comparison of the static transfer function and the Compliance matrix</a>
<ul> <ul>
<li><a href="#orge7e7242">2.1. Analysis</a></li> <li><a href="#org3f1c253">2.1. Analysis</a></li>
<li><a href="#org9ee3939">2.2. Conclusion</a></li> <li><a href="#orge261263">2.2. Conclusion</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
<div id="outline-container-orgc59e712" class="outline-2"> <div id="outline-container-org7743c04" class="outline-2">
<h2 id="orgc59e712"><span class="section-number-2">1</span> Compare external forces and forces applied by the actuators</h2> <h2 id="org7743c04"><span class="section-number-2">1</span> Compare external forces and forces applied by the actuators</h2>
<div class="outline-text-2" id="text-1"> <div class="outline-text-2" id="text-1">
<p> <p>
In this section, we wish to compare the effect of forces/torques applied by the actuators with the effect of external forces/torques on the displacement of the mobile platform. In this section, we wish to compare the effect of forces/torques applied by the actuators with the effect of external forces/torques on the displacement of the mobile platform.
</p> </p>
</div> </div>
<div id="outline-container-org4509b7d" class="outline-3"> <div id="outline-container-orgc730bef" class="outline-3">
<h3 id="org4509b7d"><span class="section-number-3">1.1</span> Comparison with fixed support</h3> <h3 id="orgc730bef"><span class="section-number-3">1.1</span> Comparison with fixed support</h3>
<div class="outline-text-3" id="text-1-1"> <div class="outline-text-3" id="text-1-1">
<p> <p>
Let&rsquo;s generate a Stewart platform. Let&rsquo;s generate a Stewart platform.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform(); <pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none'); stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre> </pre>
</div> </div>
@@ -85,9 +90,9 @@ We don&rsquo;t put any flexibility below the Stewart platform such that <b>its b
We also don&rsquo;t put any payload on top of the Stewart platform. We also don&rsquo;t put any payload on top of the Stewart platform.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround('type', 'none'); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
payload = initializePayload('type', 'none'); payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController('type', 'open-loop'); controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre> </pre>
</div> </div>
@@ -95,22 +100,22 @@ controller = initializeController('type', 'open-loop');
The transfer function from actuator forces \(\bm{\tau}\) to the relative displacement of the mobile platform \(\mathcal{\bm{X}}\) is extracted. The transfer function from actuator forces \(\bm{\tau}\) to the relative displacement of the mobile platform \(\mathcal{\bm{X}}\) is extracted.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">%% Options for Linearized <pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File <span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = 'stewart_platform_model'; mdl = <span class="org-string">'stewart_platform_model'</span>;
%% Input/Output definition <span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
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, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
%% Run the linearization <span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; G.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
</pre> </pre>
</div> </div>
@@ -118,8 +123,8 @@ G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
Using the Jacobian matrix, we compute the transfer function from force/torques applied by the actuators on the frame \(\{B\}\) fixed to the mobile platform: Using the Jacobian matrix, we compute the transfer function from force/torques applied by the actuators on the frame \(\{B\}\) fixed to the mobile platform:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">Gc = minreal(G*inv(stewart.kinematics.J')); <pre class="src src-matlab">Gc = minreal(G<span class="org-type">*</span>inv(stewart.kinematics.J<span class="org-type">'</span>));
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'}; Gc.InputName = {<span class="org-string">'Fnx'</span>, <span class="org-string">'Fny'</span>, <span class="org-string">'Fnz'</span>, <span class="org-string">'Mnx'</span>, <span class="org-string">'Mny'</span>, <span class="org-string">'Mnz'</span>};
</pre> </pre>
</div> </div>
@@ -127,35 +132,35 @@ Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
We also extract the transfer function from external forces \(\bm{\mathcal{F}}_{\text{ext}}\) on the frame \(\{B\}\) fixed to the mobile platform to the relative displacement \(\mathcal{\bm{X}}\) of \(\{B\}\) with respect to frame \(\{A\}\): We also extract the transfer function from external forces \(\bm{\mathcal{F}}_{\text{ext}}\) on the frame \(\{B\}\) fixed to the mobile platform to the relative displacement \(\mathcal{\bm{X}}\) of \(\{B\}\) with respect to frame \(\{A\}\):
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">%% Input/Output definition <pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B} io(io_i) = linio([mdl, <span class="org-string">'/Disturbances'</span>], 1, <span class="org-string">'openinput'</span>, [], <span class="org-string">'F_ext'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% External forces/torques applied on {B}</span>
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, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
%% Run the linearization <span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
Gd = linearize(mdl, io, options); Gd = linearize(mdl, io, options);
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'}; Gd.InputName = {<span class="org-string">'Fex'</span>, <span class="org-string">'Fey'</span>, <span class="org-string">'Fez'</span>, <span class="org-string">'Mex'</span>, <span class="org-string">'Mey'</span>, <span class="org-string">'Mez'</span>};
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; Gd.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
</pre> </pre>
</div> </div>
<p> <p>
The comparison of the two transfer functions is shown in Figure <a href="#orgbf9a54a">1</a>. The comparison of the two transfer functions is shown in Figure <a href="#org2de43b3">1</a>.
</p> </p>
<div id="orgbf9a54a" class="figure"> <div id="org2de43b3" class="figure">
<p><img src="figs/comparison_Fext_F_fixed_base.png" alt="comparison_Fext_F_fixed_base.png" /> <p><img src="figs/comparison_Fext_F_fixed_base.png" alt="comparison_Fext_F_fixed_base.png" />
</p> </p>
<p><span class="figure-number">Figure 1: </span>Comparison of the transfer functions from \(\bm{\mathcal{F}}\) to \(\mathcal{\bm{X}}\) and from \(\bm{\mathcal{F}}_{\text{ext}}\) to \(\mathcal{\bm{X}}\) (<a href="./figs/comparison_Fext_F_fixed_base.png">png</a>, <a href="./figs/comparison_Fext_F_fixed_base.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 1: </span>Comparison of the transfer functions from \(\bm{\mathcal{F}}\) to \(\mathcal{\bm{X}}\) and from \(\bm{\mathcal{F}}_{\text{ext}}\) to \(\mathcal{\bm{X}}\) (<a href="./figs/comparison_Fext_F_fixed_base.png">png</a>, <a href="./figs/comparison_Fext_F_fixed_base.pdf">pdf</a>)</p>
</div> </div>
<p> <p>
This can be understood from figure <a href="#org8bd3e63">2</a> where \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly the same effect on \(\mathcal{X}_{x}\). This can be understood from figure <a href="#orgd6db375">2</a> where \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly the same effect on \(\mathcal{X}_{x}\).
</p> </p>
<div id="org8bd3e63" class="figure"> <div id="orgd6db375" class="figure">
<p><img src="figs/1dof_actuator_external_forces.png" alt="1dof_actuator_external_forces.png" /> <p><img src="figs/1dof_actuator_external_forces.png" alt="1dof_actuator_external_forces.png" />
</p> </p>
<p><span class="figure-number">Figure 2: </span>Schematic representation of the stewart platform on a rigid support</p> <p><span class="figure-number">Figure 2: </span>Schematic representation of the stewart platform on a rigid support</p>
@@ -163,14 +168,14 @@ This can be understood from figure <a href="#org8bd3e63">2</a> where \(\mathcal{
</div> </div>
</div> </div>
<div id="outline-container-org8662186" class="outline-3"> <div id="outline-container-orgefde538" class="outline-3">
<h3 id="org8662186"><span class="section-number-3">1.2</span> Comparison with a flexible support</h3> <h3 id="orgefde538"><span class="section-number-3">1.2</span> Comparison with a flexible support</h3>
<div class="outline-text-3" id="text-1-2"> <div class="outline-text-3" id="text-1-2">
<p> <p>
We now add a flexible support under the Stewart platform. We now add a flexible support under the Stewart platform.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround('type', 'flexible'); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'flexible'</span>);
</pre> </pre>
</div> </div>
@@ -178,50 +183,50 @@ We now add a flexible support under the Stewart platform.
And we perform again the identification. And we perform again the identification.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">%% Input/Output definition <pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
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, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
%% Run the linearization <span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; G.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
Gc = minreal(G*inv(stewart.kinematics.J')); Gc = minreal(G<span class="org-type">*</span>inv(stewart.kinematics.J<span class="org-type">'</span>));
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'}; Gc.InputName = {<span class="org-string">'Fnx'</span>, <span class="org-string">'Fny'</span>, <span class="org-string">'Fnz'</span>, <span class="org-string">'Mnx'</span>, <span class="org-string">'Mny'</span>, <span class="org-string">'Mnz'</span>};
%% Input/Output definition <span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B} io(io_i) = linio([mdl, <span class="org-string">'/Disturbances'</span>], 1, <span class="org-string">'openinput'</span>, [], <span class="org-string">'F_ext'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% External forces/torques applied on {B}</span>
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, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
%% Run the linearization <span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
Gd = linearize(mdl, io, options); Gd = linearize(mdl, io, options);
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'}; Gd.InputName = {<span class="org-string">'Fex'</span>, <span class="org-string">'Fey'</span>, <span class="org-string">'Fez'</span>, <span class="org-string">'Mex'</span>, <span class="org-string">'Mey'</span>, <span class="org-string">'Mez'</span>};
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; Gd.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
</pre> </pre>
</div> </div>
<p> <p>
The comparison between the obtained transfer functions is shown in Figure <a href="#orga2f2bd5">3</a>. The comparison between the obtained transfer functions is shown in Figure <a href="#org593368e">3</a>.
</p> </p>
<div id="orga2f2bd5" class="figure"> <div id="org593368e" class="figure">
<p><img src="figs/comparison_Fext_F_flexible_base.png" alt="comparison_Fext_F_flexible_base.png" /> <p><img src="figs/comparison_Fext_F_flexible_base.png" alt="comparison_Fext_F_flexible_base.png" />
</p> </p>
<p><span class="figure-number">Figure 3: </span>Comparison of the transfer functions from \(\bm{\mathcal{F}}\) to \(\mathcal{\bm{X}}\) and from \(\bm{\mathcal{F}}_{\text{ext}}\) to \(\mathcal{\bm{X}}\) (<a href="./figs/comparison_Fext_F_flexible_base.png">png</a>, <a href="./figs/comparison_Fext_F_flexible_base.pdf">pdf</a>)</p> <p><span class="figure-number">Figure 3: </span>Comparison of the transfer functions from \(\bm{\mathcal{F}}\) to \(\mathcal{\bm{X}}\) and from \(\bm{\mathcal{F}}_{\text{ext}}\) to \(\mathcal{\bm{X}}\) (<a href="./figs/comparison_Fext_F_flexible_base.png">png</a>, <a href="./figs/comparison_Fext_F_flexible_base.pdf">pdf</a>)</p>
</div> </div>
<p> <p>
The addition of a flexible support can be schematically represented in Figure <a href="#orgee3ecbe">4</a>. The addition of a flexible support can be schematically represented in Figure <a href="#orga537ded">4</a>.
We see that \(\mathcal{F}_{x}\) applies a force both on \(m\) and \(m^{\prime}\) whereas \(\mathcal{F}_{x,\text{ext}}\) only applies a force on \(m\). We see that \(\mathcal{F}_{x}\) applies a force both on \(m\) and \(m^{\prime}\) whereas \(\mathcal{F}_{x,\text{ext}}\) only applies a force on \(m\).
And thus \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly <b>not</b> the same effect on \(\mathcal{X}_{x}\). And thus \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly <b>not</b> the same effect on \(\mathcal{X}_{x}\).
</p> </p>
<div id="orgee3ecbe" class="figure"> <div id="orga537ded" class="figure">
<p><img src="figs/2dof_actuator_external_forces.png" alt="2dof_actuator_external_forces.png" /> <p><img src="figs/2dof_actuator_external_forces.png" alt="2dof_actuator_external_forces.png" />
</p> </p>
<p><span class="figure-number">Figure 4: </span>Schematic representation of the stewart platform on top of a flexible support</p> <p><span class="figure-number">Figure 4: </span>Schematic representation of the stewart platform on top of a flexible support</p>
@@ -230,10 +235,10 @@ And thus \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly <b>
</div> </div>
<div id="outline-container-org55e0dad" class="outline-3"> <div id="outline-container-orga9eb2fd" class="outline-3">
<h3 id="org55e0dad"><span class="section-number-3">1.3</span> Conclusion</h3> <h3 id="orga9eb2fd"><span class="section-number-3">1.3</span> Conclusion</h3>
<div class="outline-text-3" id="text-1-3"> <div class="outline-text-3" id="text-1-3">
<div class="important"> <div class="important" id="org4878fef">
<p> <p>
The transfer function from forces/torques applied by the actuators on the payload \(\bm{\mathcal{F}} = \bm{J}^T \bm{\tau}\) to the pose of the mobile platform \(\bm{\mathcal{X}}\) is the same as the transfer function from external forces/torques to \(\bm{\mathcal{X}}\) as long as the Stewart platform&rsquo;s base is fixed. The transfer function from forces/torques applied by the actuators on the payload \(\bm{\mathcal{F}} = \bm{J}^T \bm{\tau}\) to the pose of the mobile platform \(\bm{\mathcal{X}}\) is the same as the transfer function from external forces/torques to \(\bm{\mathcal{X}}\) as long as the Stewart platform&rsquo;s base is fixed.
</p> </p>
@@ -243,32 +248,32 @@ The transfer function from forces/torques applied by the actuators on the payloa
</div> </div>
</div> </div>
<div id="outline-container-org81ab204" class="outline-2"> <div id="outline-container-orgb6a1ef7" class="outline-2">
<h2 id="org81ab204"><span class="section-number-2">2</span> Comparison of the static transfer function and the Compliance matrix</h2> <h2 id="orgb6a1ef7"><span class="section-number-2">2</span> Comparison of the static transfer function and the Compliance matrix</h2>
<div class="outline-text-2" id="text-2"> <div class="outline-text-2" id="text-2">
<p> <p>
In this section, we see how the Compliance matrix of the Stewart platform is linked to the static relation between \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\). In this section, we see how the Compliance matrix of the Stewart platform is linked to the static relation between \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\).
</p> </p>
</div> </div>
<div id="outline-container-orge7e7242" class="outline-3"> <div id="outline-container-org3f1c253" class="outline-3">
<h3 id="orge7e7242"><span class="section-number-3">2.1</span> Analysis</h3> <h3 id="org3f1c253"><span class="section-number-3">2.1</span> Analysis</h3>
<div class="outline-text-3" id="text-2-1"> <div class="outline-text-3" id="text-2-1">
<p> <p>
Initialization of the Stewart platform. Initialization of the Stewart platform.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform(); <pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 45e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'universal_p'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'spherical_p'</span>);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none'); stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
</pre> </pre>
</div> </div>
@@ -276,9 +281,9 @@ stewart = initializeInertialSensor(stewart, 'type', 'none');
No flexibility below the Stewart platform and no payload. No flexibility below the Stewart platform and no payload.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround('type', 'none'); <pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
payload = initializePayload('type', 'none'); payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
controller = initializeController('type', 'open-loop'); controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre> </pre>
</div> </div>
@@ -286,28 +291,28 @@ controller = initializeController('type', 'open-loop');
Estimation of the transfer function from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\): Estimation of the transfer function from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\):
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">%% Options for Linearized <pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File <span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
mdl = 'stewart_platform_model'; mdl = <span class="org-string">'stewart_platform_model'</span>;
%% Input/Output definition <span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, <span class="org-string">'/Controller'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Force Inputs [N]</span>
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, <span class="org-string">'/Relative Motion Sensor'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Position/Orientation of {B} w.r.t. {A}</span>
%% Run the linearization <span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>};
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; G.OutputName = {<span class="org-string">'Edx'</span>, <span class="org-string">'Edy'</span>, <span class="org-string">'Edz'</span>, <span class="org-string">'Erx'</span>, <span class="org-string">'Ery'</span>, <span class="org-string">'Erz'</span>};
</pre> </pre>
</div> </div>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">Gc = minreal(G*inv(stewart.kinematics.J')); <pre class="src src-matlab">Gc = minreal(G<span class="org-type">*</span>inv(stewart.kinematics.J<span class="org-type">'</span>));
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'}; Gc.InputName = {<span class="org-string">'Fnx'</span>, <span class="org-string">'Fny'</span>, <span class="org-string">'Fnz'</span>, <span class="org-string">'Mnx'</span>, <span class="org-string">'Mny'</span>, <span class="org-string">'Mnz'</span>};
</pre> </pre>
</div> </div>
@@ -465,10 +470,10 @@ And now at the Compliance matrix.
</div> </div>
</div> </div>
<div id="outline-container-org9ee3939" class="outline-3"> <div id="outline-container-orge261263" class="outline-3">
<h3 id="org9ee3939"><span class="section-number-3">2.2</span> Conclusion</h3> <h3 id="orge261263"><span class="section-number-3">2.2</span> Conclusion</h3>
<div class="outline-text-3" id="text-2-2"> <div class="outline-text-3" id="text-2-2">
<div class="important"> <div class="important" id="org2428297">
<p> <p>
The low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\) corresponds to the compliance matrix of the Stewart platform. The low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathcal{\bm{X}}\) corresponds to the compliance matrix of the Stewart platform.
</p> </p>
@@ -480,7 +485,7 @@ The low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathc
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-08-05 mer. 13:27</p> <p class="date">Created: 2021-01-08 ven. 15:52</p>
</div> </div>
</body> </body>
</html> </html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,51 +3,45 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-08-05 mer. 13:27 --> <!-- 2021-01-08 ven. 15:30 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Stewart Platforms</title> <title>Stewart Platforms</title>
<meta name="generator" content="Org mode" /> <meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" /> <meta name="author" content="Dehaeze Thomas" />
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
<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>
</head> </head>
<body> <body>
<div id="org-div-home-and-up"> <div id="org-div-home-and-up">
<a accesskey="h" href="index.html"> UP </a> <a accesskey="h" href="https://research.tdehaeze.xyz/"> UP </a>
| |
<a accesskey="H" href="index.html"> HOME </a> <a accesskey="H" href="https://research.tdehaeze.xyz/"> HOME </a>
</div><div id="content"> </div><div id="content">
<h1 class="title">Stewart Platforms</h1> <h1 class="title">Stewart Platforms</h1>
<div id="table-of-contents"> <div id="table-of-contents">
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents"> <div id="text-table-of-contents">
<ul> <ul>
<li><a href="#orgff0bfd7">1. Simulink Project (link)</a></li> <li><a href="#orgad01eeb">1. Simulink Project (link)</a></li>
<li><a href="#org38b9089">2. Stewart Platform Architecture Definition (link)</a></li> <li><a href="#orgf0936f9">2. Stewart Platform Architecture Definition (link)</a></li>
<li><a href="#orgf1c7b3b">3. Simscape Model of the Stewart Platform (link)</a></li> <li><a href="#org4bef8ba">3. Simscape Model of the Stewart Platform (link)</a></li>
<li><a href="#org369c8bb">4. Kinematic Analysis (link)</a></li> <li><a href="#orgfd134cc">4. Kinematic Analysis (link)</a></li>
<li><a href="#org2e3169e">5. Identification of the Stewart Dynamics (link)</a></li> <li><a href="#org2e5eede">5. Identification of the Stewart Dynamics (link)</a></li>
<li><a href="#org0fdb910">6. Control</a></li> <li><a href="#orgb272d52">6. Control</a></li>
<li><a href="#org1f468b1">7. Cubic Configuration (link)</a></li> <li><a href="#org7c7008e">7. Cubic Configuration (link)</a></li>
<li><a href="#orga2bd0e9">8. Bibliography (link)</a></li> <li><a href="#org1f2f2c6">8. Bibliography (link)</a></li>
</ul> </ul>
</div> </div>
</div> </div>
<p> <p>
The goal of this project is to provide a Matlab/Simscape Toolbox to study Stewart platforms. The goal of this project is to provide a Matlab/Simscape Toolbox to study Stewart platforms.
</p>
<p>
The project is divided into several section listed below. The project is divided into several section listed below.
The git repository of the project is accessible <a href="https://git.tdehaeze.xyz/tdehaeze/stewart-simscape">here</a>.
</p> </p>
<div id="outline-container-orgff0bfd7" class="outline-2"> <div id="outline-container-orgad01eeb" class="outline-2">
<h2 id="orgff0bfd7"><span class="section-number-2">1</span> Simulink Project (<a href="simulink-project.html">link</a>)</h2> <h2 id="orgad01eeb"><span class="section-number-2">1</span> Simulink Project (<a href="simulink-project.html">link</a>)</h2>
<div class="outline-text-2" id="text-1"> <div class="outline-text-2" id="text-1">
<p> <p>
The project is managed with a <b>Simulink Project</b>. The project is managed with a <b>Simulink Project</b>.
@@ -56,8 +50,8 @@ Such project is briefly presented <a href="simulink-project.html">here</a>.
</div> </div>
</div> </div>
<div id="outline-container-org38b9089" class="outline-2"> <div id="outline-container-orgf0936f9" class="outline-2">
<h2 id="org38b9089"><span class="section-number-2">2</span> Stewart Platform Architecture Definition (<a href="stewart-architecture.html">link</a>)</h2> <h2 id="orgf0936f9"><span class="section-number-2">2</span> Stewart Platform Architecture Definition (<a href="stewart-architecture.html">link</a>)</h2>
<div class="outline-text-2" id="text-2"> <div class="outline-text-2" id="text-2">
<p> <p>
The way the Stewart Platform is defined is explained <a href="stewart-architecture.html">here</a>. The way the Stewart Platform is defined is explained <a href="stewart-architecture.html">here</a>.
@@ -82,8 +76,8 @@ Other parameters are also defined such as:
</div> </div>
</div> </div>
<div id="outline-container-orgf1c7b3b" class="outline-2"> <div id="outline-container-org4bef8ba" class="outline-2">
<h2 id="orgf1c7b3b"><span class="section-number-2">3</span> Simscape Model of the Stewart Platform (<a href="simscape-model.html">link</a>)</h2> <h2 id="org4bef8ba"><span class="section-number-2">3</span> Simscape Model of the Stewart Platform (<a href="simscape-model.html">link</a>)</h2>
<div class="outline-text-2" id="text-3"> <div class="outline-text-2" id="text-3">
<p> <p>
The Stewart Platform is then modeled using <a href="https://www.mathworks.com/products/simscape.html">Simscape</a>. The Stewart Platform is then modeled using <a href="https://www.mathworks.com/products/simscape.html">Simscape</a>.
@@ -95,8 +89,8 @@ The way to model is build and works is explained <a href="simscape-model.html">h
</div> </div>
</div> </div>
<div id="outline-container-org369c8bb" class="outline-2"> <div id="outline-container-orgfd134cc" class="outline-2">
<h2 id="org369c8bb"><span class="section-number-2">4</span> Kinematic Analysis (<a href="kinematic-study.html">link</a>)</h2> <h2 id="orgfd134cc"><span class="section-number-2">4</span> Kinematic Analysis (<a href="kinematic-study.html">link</a>)</h2>
<div class="outline-text-2" id="text-4"> <div class="outline-text-2" id="text-4">
<p> <p>
From the defined geometry of the Stewart platform, we can perform static analysis such as: From the defined geometry of the Stewart platform, we can perform static analysis such as:
@@ -116,8 +110,8 @@ All these analysis are described <a href="kinematic-study.html">here</a>.
</div> </div>
</div> </div>
<div id="outline-container-org2e3169e" class="outline-2"> <div id="outline-container-org2e5eede" class="outline-2">
<h2 id="org2e3169e"><span class="section-number-2">5</span> Identification of the Stewart Dynamics (<a href="identification.html">link</a>)</h2> <h2 id="org2e5eede"><span class="section-number-2">5</span> Identification of the Stewart Dynamics (<a href="identification.html">link</a>)</h2>
<div class="outline-text-2" id="text-5"> <div class="outline-text-2" id="text-5">
<p> <p>
The Dynamics of the Stewart platform can be identified using the Simscape model. The Dynamics of the Stewart platform can be identified using the Simscape model.
@@ -138,8 +132,8 @@ The code that is used for identification is explained <a href="identification.ht
</div> </div>
</div> </div>
<div id="outline-container-org0fdb910" class="outline-2"> <div id="outline-container-orgb272d52" class="outline-2">
<h2 id="org0fdb910"><span class="section-number-2">6</span> Control</h2> <h2 id="orgb272d52"><span class="section-number-2">6</span> Control</h2>
<div class="outline-text-2" id="text-6"> <div class="outline-text-2" id="text-6">
<p> <p>
The use of active control for Stewart platforms is a wide subject. The use of active control for Stewart platforms is a wide subject.
@@ -182,8 +176,8 @@ Different control architectures (centralized and decentralized) are compared for
</div> </div>
</div> </div>
<div id="outline-container-org1f468b1" class="outline-2"> <div id="outline-container-org7c7008e" class="outline-2">
<h2 id="org1f468b1"><span class="section-number-2">7</span> Cubic Configuration (<a href="cubic-configuration.html">link</a>)</h2> <h2 id="org7c7008e"><span class="section-number-2">7</span> Cubic Configuration (<a href="cubic-configuration.html">link</a>)</h2>
<div class="outline-text-2" id="text-7"> <div class="outline-text-2" id="text-7">
<p> <p>
The cubic configuration is a special class of Stewart platform that has interesting properties. The cubic configuration is a special class of Stewart platform that has interesting properties.
@@ -195,8 +189,8 @@ These properties are studied in <a href="cubic-configuration.html">this</a> docu
</div> </div>
</div> </div>
<div id="outline-container-orga2bd0e9" class="outline-2"> <div id="outline-container-org1f2f2c6" class="outline-2">
<h2 id="orga2bd0e9"><span class="section-number-2">8</span> Bibliography (<a href="bibliography.html">link</a>)</h2> <h2 id="org1f2f2c6"><span class="section-number-2">8</span> Bibliography (<a href="bibliography.html">link</a>)</h2>
<div class="outline-text-2" id="text-8"> <div class="outline-text-2" id="text-8">
<p> <p>
Many text books, PhD thesis and articles related to parallel robots and Stewart platforms are gathered in <a href="bibliography.html">this</a> document. Many text books, PhD thesis and articles related to parallel robots and Stewart platforms are gathered in <a href="bibliography.html">this</a> document.
@@ -206,7 +200,7 @@ Many text books, PhD thesis and articles related to parallel robots and Stewart
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-08-05 mer. 13:27</p> <p class="date">Created: 2021-01-08 ven. 15:30</p>
</div> </div>
</body> </body>
</html> </html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
!function(a,b){"use strict";function c(c,g){var h=this;h.$el=a(c),h.el=c,h.id=e++,h.$window=a(b),h.$document=a(document),h.$el.bind("destroyed",a.proxy(h.teardown,h)),h.$clonedHeader=null,h.$originalHeader=null,h.isSticky=!1,h.hasBeenSticky=!1,h.leftOffset=null,h.topOffset=null,h.init=function(){h.$el.each(function(){var b=a(this);b.css("padding",0),h.$originalHeader=a("thead:first",this),h.$clonedHeader=h.$originalHeader.clone(),b.trigger("clonedHeader."+d,[h.$clonedHeader]),h.$clonedHeader.addClass("tableFloatingHeader"),h.$clonedHeader.css("display","none"),h.$originalHeader.addClass("tableFloatingHeaderOriginal"),h.$originalHeader.after(h.$clonedHeader),h.$printStyle=a('<style type="text/css" media="print">.tableFloatingHeader{display:none !important;}.tableFloatingHeaderOriginal{position:static !important;}</style>'),a("head").append(h.$printStyle)}),h.setOptions(g),h.updateWidth(),h.toggleHeaders(),h.bind()},h.destroy=function(){h.$el.unbind("destroyed",h.teardown),h.teardown()},h.teardown=function(){h.isSticky&&h.$originalHeader.css("position","static"),a.removeData(h.el,"plugin_"+d),h.unbind(),h.$clonedHeader.remove(),h.$originalHeader.removeClass("tableFloatingHeaderOriginal"),h.$originalHeader.css("visibility","visible"),h.$printStyle.remove(),h.el=null,h.$el=null},h.bind=function(){h.$scrollableArea.on("scroll."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.on("scroll."+d+h.id,h.setPositionValues),h.$window.on("resize."+d+h.id,h.toggleHeaders)),h.$scrollableArea.on("resize."+d,h.toggleHeaders),h.$scrollableArea.on("resize."+d,h.updateWidth)},h.unbind=function(){h.$scrollableArea.off("."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.off("."+d+h.id,h.setPositionValues),h.$window.off("."+d+h.id,h.toggleHeaders)),h.$scrollableArea.off("."+d,h.updateWidth)},h.toggleHeaders=function(){h.$el&&h.$el.each(function(){var b,c=a(this),d=h.isWindowScrolling?isNaN(h.options.fixedOffset)?h.options.fixedOffset.outerHeight():h.options.fixedOffset:h.$scrollableArea.offset().top+(isNaN(h.options.fixedOffset)?0:h.options.fixedOffset),e=c.offset(),f=h.$scrollableArea.scrollTop()+d,g=h.$scrollableArea.scrollLeft(),i=h.isWindowScrolling?f>e.top:d>e.top,j=(h.isWindowScrolling?f:0)<e.top+c.height()-h.$clonedHeader.height()-(h.isWindowScrolling?0:d);i&&j?(b=e.left-g+h.options.leftOffset,h.$originalHeader.css({position:"fixed","margin-top":h.options.marginTop,left:b,"z-index":3}),h.leftOffset=b,h.topOffset=d,h.$clonedHeader.css("display",""),h.isSticky||(h.isSticky=!0,h.updateWidth()),h.setPositionValues()):h.isSticky&&(h.$originalHeader.css("position","static"),h.$clonedHeader.css("display","none"),h.isSticky=!1,h.resetWidth(a("td,th",h.$clonedHeader),a("td,th",h.$originalHeader)))})},h.setPositionValues=function(){var a=h.$window.scrollTop(),b=h.$window.scrollLeft();!h.isSticky||0>a||a+h.$window.height()>h.$document.height()||0>b||b+h.$window.width()>h.$document.width()||h.$originalHeader.css({top:h.topOffset-(h.isWindowScrolling?0:a),left:h.leftOffset-(h.isWindowScrolling?0:b)})},h.updateWidth=function(){if(h.isSticky){h.$originalHeaderCells||(h.$originalHeaderCells=a("th,td",h.$originalHeader)),h.$clonedHeaderCells||(h.$clonedHeaderCells=a("th,td",h.$clonedHeader));var b=h.getWidth(h.$clonedHeaderCells);h.setWidth(b,h.$clonedHeaderCells,h.$originalHeaderCells),h.$originalHeader.css("width",h.$clonedHeader.width())}},h.getWidth=function(c){var d=[];return c.each(function(c){var e,f=a(this);if("border-box"===f.css("box-sizing"))e=f[0].getBoundingClientRect().width;else{var g=a("th",h.$originalHeader);if("collapse"===g.css("border-collapse"))if(b.getComputedStyle)e=parseFloat(b.getComputedStyle(this,null).width);else{var i=parseFloat(f.css("padding-left")),j=parseFloat(f.css("padding-right")),k=parseFloat(f.css("border-width"));e=f.outerWidth()-i-j-k}else e=f.width()}d[c]=e}),d},h.setWidth=function(a,b,c){b.each(function(b){var d=a[b];c.eq(b).css({"min-width":d,"max-width":d})})},h.resetWidth=function(b,c){b.each(function(b){var d=a(this);c.eq(b).css({"min-width":d.css("min-width"),"max-width":d.css("max-width")})})},h.setOptions=function(c){h.options=a.extend({},f,c),h.$scrollableArea=a(h.options.scrollableArea),h.isWindowScrolling=h.$scrollableArea[0]===b},h.updateOptions=function(a){h.setOptions(a),h.unbind(),h.bind(),h.updateWidth(),h.toggleHeaders()},h.init()}var d="stickyTableHeaders",e=0,f={fixedOffset:0,leftOffset:0,marginTop:0,scrollableArea:b};a.fn[d]=function(b){return this.each(function(){var e=a.data(this,"plugin_"+d);e?"string"==typeof b?e[b].apply(e):e.updateOptions(b):"destroy"!==b&&a.data(this,"plugin_"+d,new c(this,b))})}}(jQuery,window);

View File

@@ -1,85 +0,0 @@
$(function() {
$('.note').before("<p class='admonition-title note'>Note</p>");
$('.seealso').before("<p class='admonition-title seealso'>See also</p>");
$('.warning').before("<p class='admonition-title warning'>Warning</p>");
$('.caution').before("<p class='admonition-title caution'>Caution</p>");
$('.attention').before("<p class='admonition-title attention'>Attention</p>");
$('.tip').before("<p class='admonition-title tip'>Tip</p>");
$('.important').before("<p class='admonition-title important'>Important</p>");
$('.hint').before("<p class='admonition-title hint'>Hint</p>");
$('.error').before("<p class='admonition-title error'>Error</p>");
$('.danger').before("<p class='admonition-title danger'>Danger</p>");
});
$( document ).ready(function() {
// Shift nav in mobile when clicking the menu.
$(document).on('click', "[data-toggle='wy-nav-top']", function() {
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
});
// Close menu when you click a link.
$(document).on('click', ".wy-menu-vertical .current ul li a", function() {
$("[data-toggle='wy-nav-shift']").removeClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
});
$(document).on('click', "[data-toggle='rst-current-version']", function() {
$("[data-toggle='rst-versions']").toggleClass("shift-up");
});
// Make tables responsive
$("table.docutils:not(.field-list)").wrap("<div class='wy-table-responsive'></div>");
});
$( document ).ready(function() {
$('#text-table-of-contents ul').first().addClass('nav');
// ScrollSpy also requires that we use
// a Bootstrap nav component.
$('body').scrollspy({target: '#text-table-of-contents'});
// add sticky table headers
$('table').stickyTableHeaders();
// set the height of tableOfContents
var $postamble = $('#postamble');
var $tableOfContents = $('#table-of-contents');
$tableOfContents.css({paddingBottom: $postamble.outerHeight()});
// add TOC button
var toggleSidebar = $('<div id="toggle-sidebar"><a href="#table-of-contents"><h2>Table of Contents</h2></a></div>');
$('#content').prepend(toggleSidebar);
// add close button when sidebar showed in mobile screen
var closeBtn = $('<a class="close-sidebar" href="#">Close</a>');
var tocTitle = $('#table-of-contents').find('h2');
tocTitle.append(closeBtn);
});
window.SphinxRtdTheme = (function (jquery) {
var stickyNav = (function () {
var navBar,
win,
stickyNavCssClass = 'stickynav',
applyStickNav = function () {
if (navBar.height() <= win.height()) {
navBar.addClass(stickyNavCssClass);
} else {
navBar.removeClass(stickyNavCssClass);
}
},
enable = function () {
applyStickNav();
win.on('resize', applyStickNav);
},
init = function () {
navBar = jquery('nav.wy-nav-side:first');
win = jquery(window);
};
jquery(init);
return {
enable : enable
};
}());
return {
StickyNav : stickyNav
};
}($));

File diff suppressed because it is too large Load Diff

83
docs/nass.html Normal file
View File

@@ -0,0 +1,83 @@
<?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>
<!-- 2021-01-08 ven. 15:53 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Stewart Platform - NASS</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" />
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
</head>
<body>
<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">
<h1 class="title">Stewart Platform - NASS</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org07676ec">1. NASS</a>
<ul>
<li><a href="#org0167386">1.1. Identification of the Dynamics</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-org07676ec" class="outline-2">
<h2 id="org07676ec"><span class="section-number-2">1</span> NASS</h2>
<div class="outline-text-2" id="text-1">
</div>
<div id="outline-container-org0167386" class="outline-3">
<h3 id="org0167386"><span class="section-number-3">1.1</span> Identification of the Dynamics</h3>
<div class="outline-text-3" id="text-1-1">
<div class="org-src-container">
<pre class="src src-matlab">apa = load(<span class="org-string">'./mat/APA300ML.mat'</span>, <span class="org-string">'int_xyz'</span>, <span class="org-string">'int_i'</span>, <span class="org-string">'n_xyz'</span>, <span class="org-string">'n_i'</span>, <span class="org-string">'nodes'</span>, <span class="org-string">'M'</span>, <span class="org-string">'K'</span>);
flex_joint = load(<span class="org-string">'./mat/flexor_ID16.mat'</span>, <span class="org-string">'int_xyz'</span>, <span class="org-string">'int_i'</span>, <span class="org-string">'n_xyz'</span>, <span class="org-string">'n_i'</span>, <span class="org-string">'nodes'</span>, <span class="org-string">'M'</span>, <span class="org-string">'K'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 90e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 175e<span class="org-type">-</span>3);
stewart = generateGeneralConfiguration(stewart, <span class="org-string">'FH'</span>, 20e<span class="org-type">-</span>3, <span class="org-string">'MH'</span>, 20e<span class="org-type">-</span>3, <span class="org-string">'FR'</span>, 228e<span class="org-type">-</span>3<span class="org-type">/</span>2, <span class="org-string">'MR'</span>, 220e<span class="org-type">-</span>3<span class="org-type">/</span>2, <span class="org-string">'FTh'</span>, [<span class="org-type">-</span>9, 9, 120<span class="org-type">-</span>9, 120<span class="org-type">+</span>9, 240<span class="org-type">-</span>9, 240<span class="org-type">+</span>9]<span class="org-type">*</span>(<span class="org-constant">pi</span><span class="org-type">/</span>180), <span class="org-string">'MTh'</span>, [<span class="org-type">-</span>60<span class="org-type">+</span>15, 60<span class="org-type">-</span>15, 60<span class="org-type">+</span>15, 180<span class="org-type">-</span>15, 180<span class="org-type">+</span>15, <span class="org-type">-</span>60<span class="org-type">-</span>15]<span class="org-type">*</span>(<span class="org-constant">pi</span><span class="org-type">/</span>180));
stewart = computeJointsPose(stewart);
stewart = initializeFlexibleStrutDynamics(stewart, <span class="org-string">'H'</span>, 0.03, <span class="org-string">'K'</span>, apa.K, <span class="org-string">'M'</span>, apa.M, <span class="org-string">'n_xyz'</span>, apa.n_xyz, <span class="org-string">'xi'</span>, 0.1, <span class="org-string">'step_file'</span>, <span class="org-string">'mat/APA300ML.STEP'</span>);
stewart = initializeJointDynamics(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'K_F'</span>, flex_joint.K, <span class="org-string">'M_F'</span>, flex_joint.M, <span class="org-string">'n_xyz_F'</span>, flex_joint.n_xyz, <span class="org-string">'xi_F'</span>, 0.1, <span class="org-string">'step_file_F'</span>, <span class="org-string">'mat/flexor_ID16.STEP'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'K_M'</span>, flex_joint.K, <span class="org-string">'M_M'</span>, flex_joint.M, <span class="org-string">'n_xyz_M'</span>, flex_joint.n_xyz, <span class="org-string">'xi_M'</span>, 0.1, <span class="org-string">'step_file_M'</span>, <span class="org-string">'mat/flexor_ID16.STEP'</span>);
stewart = initializeCylindricalPlatforms(stewart, <span class="org-string">'Fpr'</span>, 150e<span class="org-type">-</span>3, <span class="org-string">'Mpr'</span>, 125e<span class="org-type">-</span>3);
stewart = initializeCylindricalStruts(stewart, <span class="org-string">'type_F'</span>, <span class="org-string">'none'</span>, <span class="org-string">'type_M'</span>, <span class="org-string">'none'</span>);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">ground = initializeGround(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
payload = initializePayload(<span class="org-string">'type'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'m'</span>, 50);
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">disturbances = initializeDisturbances();
references = initializeReferences(stewart);
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2021-01-08 ven. 15:53</p>
</div>
</body>
</html>

View File

@@ -3,25 +3,30 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-08-05 mer. 13:27 --> <!-- 2021-01-08 ven. 15:52 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Stewart Platform - Simscape Model</title> <title>Stewart Platform - Simscape Model</title>
<meta name="generator" content="Org mode" /> <meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" /> <meta name="author" content="Dehaeze Thomas" />
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
<script src="./js/jquery.min.js"></script> <script>
<script src="./js/bootstrap.min.js"></script> MathJax = {
<script src="./js/jquery.stickytableheaders.min.js"></script> svg: {
<script src="./js/readtheorg.js"></script> scale: 1,
<script>MathJax = { fontCache: "global"
tex: { },
tags: 'ams', tex: {
macros: {bm: ["\\boldsymbol{#1}",1],} tags: "ams",
} multlineWidth: "%MULTLINEWIDTH",
}; tagSide: "right",
</script> macros: {bm: ["\\boldsymbol{#1}",1],},
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> tagIndent: ".8em"
}
};
</script>
<script id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
</head> </head>
<body> <body>
<div id="org-div-home-and-up"> <div id="org-div-home-and-up">
@@ -34,47 +39,47 @@
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents"> <div id="text-table-of-contents">
<ul> <ul>
<li><a href="#orgc6e0b93">1. Parameters used for the Simscape Model</a></li> <li><a href="#org79eeba1">1. Parameters used for the Simscape Model</a></li>
<li><a href="#org66977e8">2. Simulation Configuration - Configuration reference</a></li> <li><a href="#org677dd01">2. Simulation Configuration - Configuration reference</a></li>
<li><a href="#orgb2362eb">3. Subsystem Reference</a></li> <li><a href="#orge89e3e7">3. Subsystem Reference</a></li>
<li><a href="#orgdfad86d">4. Subsystem - Fixed base and Mobile Platform</a></li> <li><a href="#org5f42d80">4. Subsystem - Fixed base and Mobile Platform</a></li>
<li><a href="#org9d4af75">5. Subsystem - Struts</a></li> <li><a href="#orgbec2976">5. Subsystem - Struts</a></li>
<li><a href="#org7e2c432">6. Other Elements</a> <li><a href="#org806ecc3">6. Other Elements</a>
<ul> <ul>
<li><a href="#org3535b6d">6.1. Payload</a> <li><a href="#orgf4bef70">6.1. Payload</a>
<ul> <ul>
<li><a href="#orgd38089d">Function description</a></li> <li><a href="#org920bdd0">Function description</a></li>
<li><a href="#org5518a84">Optional Parameters</a></li> <li><a href="#orgbc7950f">Optional Parameters</a></li>
<li><a href="#orgeeb8d35">Add Payload Type</a></li> <li><a href="#org4ef4a9f">Add Payload Type</a></li>
<li><a href="#org6d52ffc">Add Stiffness, Damping and Mass properties of the Payload</a></li> <li><a href="#org3243d76">Add Stiffness, Damping and Mass properties of the Payload</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgaaed406">6.2. Ground</a> <li><a href="#orgd9e12ef">6.2. Ground</a>
<ul> <ul>
<li><a href="#org7732939">Function description</a></li> <li><a href="#orgc300ecf">Function description</a></li>
<li><a href="#org480f36e">Optional Parameters</a></li> <li><a href="#org1ee272a">Optional Parameters</a></li>
<li><a href="#orgef7035d">Add Ground Type</a></li> <li><a href="#org2d22970">Add Ground Type</a></li>
<li><a href="#org95633e8">Add Stiffness and Damping properties of the Ground</a></li> <li><a href="#orgf76def4">Add Stiffness and Damping properties of the Ground</a></li>
<li><a href="#org14ff2fc">Rotation Point</a></li> <li><a href="#orgdb67a68">Rotation Point</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</li> </li>
<li><a href="#orgae6907a">7. Initialize Disturbances</a> <li><a href="#org6d3b61e">7. Initialize Disturbances</a>
<ul> <ul>
<li><a href="#orge2fa859">Function Declaration and Documentation</a></li> <li><a href="#orgf124972">Function Declaration and Documentation</a></li>
<li><a href="#org6adb628">Optional Parameters</a></li> <li><a href="#org668f4bb">Optional Parameters</a></li>
<li><a href="#org30dc07c">Structure initialization</a></li> <li><a href="#org0f7e4dd">Structure initialization</a></li>
<li><a href="#org0755155">Ground Motion</a></li> <li><a href="#org1a28fcd">Ground Motion</a></li>
<li><a href="#org7617a55">Direct Forces</a></li> <li><a href="#org90b72d6">Direct Forces</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgd45a07f">8. Initialize References</a> <li><a href="#org93f2d30">8. Initialize References</a>
<ul> <ul>
<li><a href="#orge5deaa1">Function Declaration and Documentation</a></li> <li><a href="#org81500bb">Function Declaration and Documentation</a></li>
<li><a href="#orgeebb364">Optional Parameters</a></li> <li><a href="#org05322ee">Optional Parameters</a></li>
<li><a href="#orgc274320">8.1. Compute the corresponding strut length</a></li> <li><a href="#org6f05adc">8.1. Compute the corresponding strut length</a></li>
<li><a href="#org36ac3fa">References</a></li> <li><a href="#orgda73a50">References</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@@ -89,18 +94,18 @@ In this document is explained how the Simscape model of the Stewart Platform is
It is divided in the following sections: It is divided in the following sections:
</p> </p>
<ul class="org-ul"> <ul class="org-ul">
<li>section <a href="#org8d965c3">1</a>: is explained how the parameters of the Stewart platform are set for the Simscape model</li> <li>section <a href="#orge8daba9">1</a>: is explained how the parameters of the Stewart platform are set for the Simscape model</li>
<li>section <a href="#org354bfdb">2</a>: the Simulink configuration (solver, simulation time, &#x2026;) is shared among all the Simulink files. It is explain how this is done.</li> <li>section <a href="#org11ed7ef">2</a>: the Simulink configuration (solver, simulation time, &#x2026;) is shared among all the Simulink files. It is explain how this is done.</li>
<li>section <a href="#org66bbae2">3</a>: All the elements (platforms, struts, sensors, &#x2026;) are saved in separate files and imported in Simulink files using &ldquo;subsystem referenced&rdquo;.</li> <li>section <a href="#org1a0307c">3</a>: All the elements (platforms, struts, sensors, &#x2026;) are saved in separate files and imported in Simulink files using &ldquo;subsystem referenced&rdquo;.</li>
<li>section <a href="#orga4915c4">4</a>: The simscape model for the fixed base and mobile platform are described in this section.</li> <li>section <a href="#org5fac181">4</a>: The simscape model for the fixed base and mobile platform are described in this section.</li>
<li>section <a href="#orgdb5206f">5</a>: The simscape model for the Stewart platform struts is described in this section.</li> <li>section <a href="#org793a5c7">5</a>: The simscape model for the Stewart platform struts is described in this section.</li>
</ul> </ul>
<div id="outline-container-orgc6e0b93" class="outline-2"> <div id="outline-container-org79eeba1" class="outline-2">
<h2 id="orgc6e0b93"><span class="section-number-2">1</span> Parameters used for the Simscape Model</h2> <h2 id="org79eeba1"><span class="section-number-2">1</span> Parameters used for the Simscape Model</h2>
<div class="outline-text-2" id="text-1"> <div class="outline-text-2" id="text-1">
<p> <p>
<a id="org8d965c3"></a> <a id="orge8daba9"></a>
The Simscape Model of the Stewart Platform is working with the <code>stewart</code> structure generated using the functions described <a href="stewart-architecture.html">here</a>. The Simscape Model of the Stewart Platform is working with the <code>stewart</code> structure generated using the functions described <a href="stewart-architecture.html">here</a>.
</p> </p>
@@ -122,11 +127,11 @@ The main advantage to have all the parameters defined in one structure (and not
</div> </div>
</div> </div>
<div id="outline-container-org66977e8" class="outline-2"> <div id="outline-container-org677dd01" class="outline-2">
<h2 id="org66977e8"><span class="section-number-2">2</span> Simulation Configuration - Configuration reference</h2> <h2 id="org677dd01"><span class="section-number-2">2</span> Simulation Configuration - Configuration reference</h2>
<div class="outline-text-2" id="text-2"> <div class="outline-text-2" id="text-2">
<p> <p>
<a id="org354bfdb"></a> <a id="org11ed7ef"></a>
As multiple simulink files will be used for simulation and tests, it is very useful to determine good simulation configuration that will be <b>shared</b> among all the simulink files. As multiple simulink files will be used for simulation and tests, it is very useful to determine good simulation configuration that will be <b>shared</b> among all the simulink files.
</p> </p>
@@ -139,7 +144,7 @@ Basically, the configuration is stored in a mat file <code>conf_simscape.mat</co
It is automatically loaded when the Simulink project is open. It can be loaded manually with the command: It is automatically loaded when the Simulink project is open. It can be loaded manually with the command:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">load('mat/conf_simscape.mat'); <pre class="src src-matlab">load(<span class="org-string">'mat/conf_simscape.mat'</span>);
</pre> </pre>
</div> </div>
@@ -147,17 +152,17 @@ It is automatically loaded when the Simulink project is open. It can be loaded m
It is however possible to modify specific parameters just for one simulation using the <code>set_param</code> command: It is however possible to modify specific parameters just for one simulation using the <code>set_param</code> command:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">set_param(conf_simscape, 'StopTime', 1); <pre class="src src-matlab"><span class="org-matlab-simulink-keyword">set_param</span>(<span class="org-variable-name">conf_simscape</span>, <span class="org-string">'StopTime'</span>, 1);
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-orgb2362eb" class="outline-2"> <div id="outline-container-orge89e3e7" class="outline-2">
<h2 id="orgb2362eb"><span class="section-number-2">3</span> Subsystem Reference</h2> <h2 id="orge89e3e7"><span class="section-number-2">3</span> Subsystem Reference</h2>
<div class="outline-text-2" id="text-3"> <div class="outline-text-2" id="text-3">
<p> <p>
<a id="org66bbae2"></a> <a id="org1a0307c"></a>
Several Stewart platform models are used, for instance one is use to study the dynamics while the other is used to apply active damping techniques. Several Stewart platform models are used, for instance one is use to study the dynamics while the other is used to apply active damping techniques.
</p> </p>
@@ -175,12 +180,12 @@ These shared subsystems are:
</ul> </ul>
<p> <p>
These subsystems are referenced from another subsystem called <code>Stewart_Platform.slx</code> shown in figure <a href="#orgf687c71">1</a>, that basically connect them correctly. These subsystems are referenced from another subsystem called <code>Stewart_Platform.slx</code> shown in figure <a href="#org18dcfb1">1</a>, that basically connect them correctly.
This subsystem is then referenced in other simulink models for various purposes (control, analysis, simulation, &#x2026;). This subsystem is then referenced in other simulink models for various purposes (control, analysis, simulation, &#x2026;).
</p> </p>
<div id="orgf687c71" class="figure"> <div id="org18dcfb1" class="figure">
<p><img src="figs/simscape_stewart_platform.png" alt="simscape_stewart_platform.png" /> <p><img src="figs/simscape_stewart_platform.png" alt="simscape_stewart_platform.png" />
</p> </p>
<p><span class="figure-number">Figure 1: </span>Simscape Subsystem of the Stewart platform. Encapsulate the Subsystems corresponding to the fixed base, mobile platform and all the struts.</p> <p><span class="figure-number">Figure 1: </span>Simscape Subsystem of the Stewart platform. Encapsulate the Subsystems corresponding to the fixed base, mobile platform and all the struts.</p>
@@ -188,11 +193,11 @@ This subsystem is then referenced in other simulink models for various purposes
</div> </div>
</div> </div>
<div id="outline-container-orgdfad86d" class="outline-2"> <div id="outline-container-org5f42d80" class="outline-2">
<h2 id="orgdfad86d"><span class="section-number-2">4</span> Subsystem - Fixed base and Mobile Platform</h2> <h2 id="org5f42d80"><span class="section-number-2">4</span> Subsystem - Fixed base and Mobile Platform</h2>
<div class="outline-text-2" id="text-4"> <div class="outline-text-2" id="text-4">
<p> <p>
<a id="orga4915c4"></a> <a id="org5fac181"></a>
Both the fixed base and the mobile platform simscape models share many similarities. Both the fixed base and the mobile platform simscape models share many similarities.
</p> </p>
@@ -210,14 +215,14 @@ As always, the parameters that define the geometry are taken from the <code>stew
</p> </p>
<div id="org858f0b4" class="figure"> <div id="org7b43415" class="figure">
<p><img src="figs/simscape_fixed_base.png" alt="simscape_fixed_base.png" width="1000px" /> <p><img src="figs/simscape_fixed_base.png" alt="simscape_fixed_base.png" width="1000px" />
</p> </p>
<p><span class="figure-number">Figure 2: </span>Simscape Model of the Fixed base</p> <p><span class="figure-number">Figure 2: </span>Simscape Model of the Fixed base</p>
</div> </div>
<div id="org4b31aa3" class="figure"> <div id="org7ed0d98" class="figure">
<p><img src="figs/simscape_mobile_platform.png" alt="simscape_mobile_platform.png" width="800px" /> <p><img src="figs/simscape_mobile_platform.png" alt="simscape_mobile_platform.png" width="800px" />
</p> </p>
<p><span class="figure-number">Figure 3: </span>Simscape Model of the Mobile platform</p> <p><span class="figure-number">Figure 3: </span>Simscape Model of the Mobile platform</p>
@@ -225,13 +230,13 @@ As always, the parameters that define the geometry are taken from the <code>stew
</div> </div>
</div> </div>
<div id="outline-container-org9d4af75" class="outline-2"> <div id="outline-container-orgbec2976" class="outline-2">
<h2 id="org9d4af75"><span class="section-number-2">5</span> Subsystem - Struts</h2> <h2 id="orgbec2976"><span class="section-number-2">5</span> Subsystem - Struts</h2>
<div class="outline-text-2" id="text-5"> <div class="outline-text-2" id="text-5">
<p> <p>
<a id="orgdb5206f"></a> <a id="org793a5c7"></a>
For the Stewart platform, the 6 struts are identical. For the Stewart platform, the 6 struts are identical.
Thus, all the struts used in the Stewart platform are referring to the same subsystem called <code>stewart_strut.slx</code> and shown in Figure <a href="#org1dc8fce">4</a>. Thus, all the struts used in the Stewart platform are referring to the same subsystem called <code>stewart_strut.slx</code> and shown in Figure <a href="#org96a73eb">4</a>.
</p> </p>
<p> <p>
@@ -253,7 +258,7 @@ This is why the <b>UPS</b> configuration is used, but other configuration can be
</p> </p>
<div id="org1dc8fce" class="figure"> <div id="org96a73eb" class="figure">
<p><img src="figs/simscape_strut.png" alt="simscape_strut.png" width="800px" /> <p><img src="figs/simscape_strut.png" alt="simscape_strut.png" width="800px" />
</p> </p>
<p><span class="figure-number">Figure 4: </span>Simscape model of the Stewart platform&rsquo;s strut</p> <p><span class="figure-number">Figure 4: </span>Simscape model of the Stewart platform&rsquo;s strut</p>
@@ -282,15 +287,15 @@ Both inertial sensors are described bellow.
</div> </div>
</div> </div>
<div id="outline-container-org7e2c432" class="outline-2"> <div id="outline-container-org806ecc3" class="outline-2">
<h2 id="org7e2c432"><span class="section-number-2">6</span> Other Elements</h2> <h2 id="org806ecc3"><span class="section-number-2">6</span> Other Elements</h2>
<div class="outline-text-2" id="text-6"> <div class="outline-text-2" id="text-6">
</div> </div>
<div id="outline-container-org3535b6d" class="outline-3"> <div id="outline-container-orgf4bef70" class="outline-3">
<h3 id="org3535b6d"><span class="section-number-3">6.1</span> Payload</h3> <h3 id="orgf4bef70"><span class="section-number-3">6.1</span> Payload</h3>
<div class="outline-text-3" id="text-6-1"> <div class="outline-text-3" id="text-6-1">
<p> <p>
<a id="org3a56808"></a> <a id="orgdd9802d"></a>
</p> </p>
<p> <p>
@@ -298,77 +303,77 @@ This Matlab function is accessible <a href="../src/initializePayload.m">here</a>
</p> </p>
</div> </div>
<div id="outline-container-orgd38089d" class="outline-4"> <div id="outline-container-org920bdd0" class="outline-4">
<h4 id="orgd38089d">Function description</h4> <h4 id="org920bdd0">Function description</h4>
<div class="outline-text-4" id="text-orgd38089d"> <div class="outline-text-4" id="text-org920bdd0">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">function [payload] = initializePayload(args) <pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[payload]</span> = <span class="org-function-name">initializePayload</span>(<span class="org-variable-name">args</span>)
% initializePayload - Initialize the Payload that can then be used for simulations and analysis <span class="org-comment">% initializePayload - Initialize the Payload that can then be used for simulations and analysis</span>
% <span class="org-comment">%</span>
% Syntax: [payload] = initializePayload(args) <span class="org-comment">% Syntax: [payload] = initializePayload(args)</span>
% <span class="org-comment">%</span>
% Inputs: <span class="org-comment">% Inputs:</span>
% - args - Structure with the following fields: <span class="org-comment">% - args - Structure with the following fields:</span>
% - type - 'none', 'rigid', 'flexible', 'cartesian' <span class="org-comment">% - type - 'none', 'rigid', 'flexible', 'cartesian'</span>
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m] <span class="org-comment">% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]</span>
% This also the position where K and C are defined <span class="org-comment">% This also the position where K and C are defined</span>
% - K [6x1] - Stiffness of the Payload [N/m, N/rad] <span class="org-comment">% - K [6x1] - Stiffness of the Payload [N/m, N/rad]</span>
% - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)] <span class="org-comment">% - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)]</span>
% - m [1x1] - Mass of the Payload [kg] <span class="org-comment">% - m [1x1] - Mass of the Payload [kg]</span>
% - I [3x3] - Inertia matrix for the Payload [kg*m2] <span class="org-comment">% - I [3x3] - Inertia matrix for the Payload [kg*m2]</span>
% <span class="org-comment">%</span>
% Outputs: <span class="org-comment">% Outputs:</span>
% - payload - Struture with the following properties: <span class="org-comment">% - payload - Struture with the following properties:</span>
% - type - 1 (none), 2 (rigid), 3 (flexible) <span class="org-comment">% - type - 1 (none), 2 (rigid), 3 (flexible)</span>
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m] <span class="org-comment">% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]</span>
% - K [6x1] - Stiffness of the Payload [N/m, N/rad] <span class="org-comment">% - K [6x1] - Stiffness of the Payload [N/m, N/rad]</span>
% - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)] <span class="org-comment">% - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]</span>
% - m [1x1] - Mass of the Payload [kg] <span class="org-comment">% - m [1x1] - Mass of the Payload [kg]</span>
% - I [3x3] - Inertia matrix for the Payload [kg*m2] <span class="org-comment">% - I [3x3] - Inertia matrix for the Payload [kg*m2]</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org5518a84" class="outline-4"> <div id="outline-container-orgbc7950f" class="outline-4">
<h4 id="org5518a84">Optional Parameters</h4> <h4 id="orgbc7950f">Optional Parameters</h4>
<div class="outline-text-4" id="text-org5518a84"> <div class="outline-text-4" id="text-orgbc7950f">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">arguments <pre class="src src-matlab"><span class="org-keyword">arguments</span>
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'cartesian'})} = 'none' <span class="org-variable-name">args</span>.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>, <span class="org-string">'cartesian'</span>})} = <span class="org-string">'none'</span>
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(6,1) <span class="org-variable-name">args</span>.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8<span class="org-type">*</span>ones(6,1)
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1) <span class="org-variable-name">args</span>.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1<span class="org-type">*</span>ones(6,1)
args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3 <span class="org-variable-name">args</span>.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e<span class="org-type">-</span>3
args.m (1,1) double {mustBeNumeric, mustBeNonnegative} = 10 <span class="org-variable-name">args</span>.m (1,1) double {mustBeNumeric, mustBeNonnegative} = 10
args.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1*eye(3) <span class="org-variable-name">args</span>.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1<span class="org-type">*</span>eye(3)
end <span class="org-keyword">end</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-orgeeb8d35" class="outline-4"> <div id="outline-container-org4ef4a9f" class="outline-4">
<h4 id="orgeeb8d35">Add Payload Type</h4> <h4 id="org4ef4a9f">Add Payload Type</h4>
<div class="outline-text-4" id="text-orgeeb8d35"> <div class="outline-text-4" id="text-org4ef4a9f">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">switch args.type <pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
case 'none' <span class="org-keyword">case</span> <span class="org-string">'none'</span>
payload.type = 1; payload.type = 1;
case 'rigid' <span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
payload.type = 2; payload.type = 2;
case 'flexible' <span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
payload.type = 3; payload.type = 3;
case 'cartesian' <span class="org-keyword">case</span> <span class="org-string">'cartesian'</span>
payload.type = 4; payload.type = 4;
end <span class="org-keyword">end</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org6d52ffc" class="outline-4"> <div id="outline-container-org3243d76" class="outline-4">
<h4 id="org6d52ffc">Add Stiffness, Damping and Mass properties of the Payload</h4> <h4 id="org3243d76">Add Stiffness, Damping and Mass properties of the Payload</h4>
<div class="outline-text-4" id="text-org6d52ffc"> <div class="outline-text-4" id="text-org3243d76">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">payload.K = args.K; <pre class="src src-matlab">payload.K = args.K;
payload.C = args.C; payload.C = args.C;
@@ -382,11 +387,11 @@ payload.h = args.h;
</div> </div>
</div> </div>
<div id="outline-container-orgaaed406" class="outline-3"> <div id="outline-container-orgd9e12ef" class="outline-3">
<h3 id="orgaaed406"><span class="section-number-3">6.2</span> Ground</h3> <h3 id="orgd9e12ef"><span class="section-number-3">6.2</span> Ground</h3>
<div class="outline-text-3" id="text-6-2"> <div class="outline-text-3" id="text-6-2">
<p> <p>
<a id="orge64ba82"></a> <a id="org140423a"></a>
</p> </p>
<p> <p>
@@ -394,67 +399,67 @@ This Matlab function is accessible <a href="../src/initializeGround.m">here</a>.
</p> </p>
</div> </div>
<div id="outline-container-org7732939" class="outline-4"> <div id="outline-container-orgc300ecf" class="outline-4">
<h4 id="org7732939">Function description</h4> <h4 id="orgc300ecf">Function description</h4>
<div class="outline-text-4" id="text-org7732939"> <div class="outline-text-4" id="text-orgc300ecf">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">function [ground] = initializeGround(args) <pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[ground]</span> = <span class="org-function-name">initializeGround</span>(<span class="org-variable-name">args</span>)
% initializeGround - Initialize the Ground that can then be used for simulations and analysis <span class="org-comment">% initializeGround - Initialize the Ground that can then be used for simulations and analysis</span>
% <span class="org-comment">%</span>
% Syntax: [ground] = initializeGround(args) <span class="org-comment">% Syntax: [ground] = initializeGround(args)</span>
% <span class="org-comment">%</span>
% Inputs: <span class="org-comment">% Inputs:</span>
% - args - Structure with the following fields: <span class="org-comment">% - args - Structure with the following fields:</span>
% - type - 'none', 'solid', 'flexible' <span class="org-comment">% - type - 'none', 'solid', 'flexible'</span>
% - rot_point [3x1] - Rotation point for the ground motion [m] <span class="org-comment">% - rot_point [3x1] - Rotation point for the ground motion [m]</span>
% - K [3x1] - Translation Stiffness of the Ground [N/m] <span class="org-comment">% - K [3x1] - Translation Stiffness of the Ground [N/m]</span>
% - C [3x1] - Translation Damping of the Ground [N/(m/s)] <span class="org-comment">% - C [3x1] - Translation Damping of the Ground [N/(m/s)]</span>
% <span class="org-comment">%</span>
% Outputs: <span class="org-comment">% Outputs:</span>
% - ground - Struture with the following properties: <span class="org-comment">% - ground - Struture with the following properties:</span>
% - type - 1 (none), 2 (rigid), 3 (flexible) <span class="org-comment">% - type - 1 (none), 2 (rigid), 3 (flexible)</span>
% - K [3x1] - Translation Stiffness of the Ground [N/m] <span class="org-comment">% - K [3x1] - Translation Stiffness of the Ground [N/m]</span>
% - C [3x1] - Translation Damping of the Ground [N/(m/s)] <span class="org-comment">% - C [3x1] - Translation Damping of the Ground [N/(m/s)]</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org480f36e" class="outline-4"> <div id="outline-container-org1ee272a" class="outline-4">
<h4 id="org480f36e">Optional Parameters</h4> <h4 id="org1ee272a">Optional Parameters</h4>
<div class="outline-text-4" id="text-org480f36e"> <div class="outline-text-4" id="text-org1ee272a">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">arguments <pre class="src src-matlab"><span class="org-keyword">arguments</span>
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none' <span class="org-variable-name">args</span>.type char {mustBeMember(args.type,{<span class="org-string">'none'</span>, <span class="org-string">'rigid'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'none'</span>
args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) <span class="org-variable-name">args</span>.rot_point (3,1) double {mustBeNumeric} = zeros(3,1)
args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1) <span class="org-variable-name">args</span>.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8<span class="org-type">*</span>ones(3,1)
args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1) <span class="org-variable-name">args</span>.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1<span class="org-type">*</span>ones(3,1)
end <span class="org-keyword">end</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-orgef7035d" class="outline-4"> <div id="outline-container-org2d22970" class="outline-4">
<h4 id="orgef7035d">Add Ground Type</h4> <h4 id="org2d22970">Add Ground Type</h4>
<div class="outline-text-4" id="text-orgef7035d"> <div class="outline-text-4" id="text-org2d22970">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">switch args.type <pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.type</span>
case 'none' <span class="org-keyword">case</span> <span class="org-string">'none'</span>
ground.type = 1; ground.type = 1;
case 'rigid' <span class="org-keyword">case</span> <span class="org-string">'rigid'</span>
ground.type = 2; ground.type = 2;
case 'flexible' <span class="org-keyword">case</span> <span class="org-string">'flexible'</span>
ground.type = 3; ground.type = 3;
end <span class="org-keyword">end</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org95633e8" class="outline-4"> <div id="outline-container-orgf76def4" class="outline-4">
<h4 id="org95633e8">Add Stiffness and Damping properties of the Ground</h4> <h4 id="orgf76def4">Add Stiffness and Damping properties of the Ground</h4>
<div class="outline-text-4" id="text-org95633e8"> <div class="outline-text-4" id="text-orgf76def4">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground.K = args.K; <pre class="src src-matlab">ground.K = args.K;
ground.C = args.C; ground.C = args.C;
@@ -463,9 +468,9 @@ ground.C = args.C;
</div> </div>
</div> </div>
<div id="outline-container-org14ff2fc" class="outline-4"> <div id="outline-container-orgdb67a68" class="outline-4">
<h4 id="org14ff2fc">Rotation Point</h4> <h4 id="orgdb67a68">Rotation Point</h4>
<div class="outline-text-4" id="text-org14ff2fc"> <div class="outline-text-4" id="text-orgdb67a68">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">ground.rot_point = args.rot_point; <pre class="src src-matlab">ground.rot_point = args.rot_point;
</pre> </pre>
@@ -474,50 +479,50 @@ ground.C = args.C;
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-orgae6907a" class="outline-2"> <div id="outline-container-org6d3b61e" class="outline-2">
<h2 id="orgae6907a"><span class="section-number-2">7</span> Initialize Disturbances</h2> <h2 id="org6d3b61e"><span class="section-number-2">7</span> Initialize Disturbances</h2>
<div class="outline-text-2" id="text-7"> <div class="outline-text-2" id="text-7">
<p> <p>
<a id="org96254bf"></a> <a id="org5c942ea"></a>
</p> </p>
</div> </div>
<div id="outline-container-orge2fa859" class="outline-3"> <div id="outline-container-orgf124972" class="outline-3">
<h3 id="orge2fa859">Function Declaration and Documentation</h3> <h3 id="orgf124972">Function Declaration and Documentation</h3>
<div class="outline-text-3" id="text-orge2fa859"> <div class="outline-text-3" id="text-orgf124972">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">function [disturbances] = initializeDisturbances(args) <pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[disturbances]</span> = <span class="org-function-name">initializeDisturbances</span>(<span class="org-variable-name">args</span>)
% initializeDisturbances - Initialize the disturbances <span class="org-comment">% initializeDisturbances - Initialize the disturbances</span>
% <span class="org-comment">%</span>
% Syntax: [disturbances] = initializeDisturbances(args) <span class="org-comment">% Syntax: [disturbances] = initializeDisturbances(args)</span>
% <span class="org-comment">%</span>
% Inputs: <span class="org-comment">% Inputs:</span>
% - args - <span class="org-comment">% - args -</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org6adb628" class="outline-3"> <div id="outline-container-org668f4bb" class="outline-3">
<h3 id="org6adb628">Optional Parameters</h3> <h3 id="org668f4bb">Optional Parameters</h3>
<div class="outline-text-3" id="text-org6adb628"> <div class="outline-text-3" id="text-org668f4bb">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">arguments <pre class="src src-matlab"><span class="org-keyword">arguments</span>
args.Fd double {mustBeNumeric, mustBeReal} = zeros(6,1) <span class="org-variable-name">args</span>.Fd double {mustBeNumeric, mustBeReal} = zeros(6,1)
args.Fd_t double {mustBeNumeric, mustBeReal} = 0 <span class="org-variable-name">args</span>.Fd_t double {mustBeNumeric, mustBeReal} = 0
args.Dw double {mustBeNumeric, mustBeReal} = zeros(6,1) <span class="org-variable-name">args</span>.Dw double {mustBeNumeric, mustBeReal} = zeros(6,1)
args.Dw_t double {mustBeNumeric, mustBeReal} = 0 <span class="org-variable-name">args</span>.Dw_t double {mustBeNumeric, mustBeReal} = 0
end <span class="org-keyword">end</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org30dc07c" class="outline-3"> <div id="outline-container-org0f7e4dd" class="outline-3">
<h3 id="org30dc07c">Structure initialization</h3> <h3 id="org0f7e4dd">Structure initialization</h3>
<div class="outline-text-3" id="text-org30dc07c"> <div class="outline-text-3" id="text-org0f7e4dd">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">disturbances = struct(); <pre class="src src-matlab">disturbances = struct();
</pre> </pre>
@@ -525,9 +530,9 @@ end
</div> </div>
</div> </div>
<div id="outline-container-org0755155" class="outline-3"> <div id="outline-container-org1a28fcd" class="outline-3">
<h3 id="org0755155">Ground Motion</h3> <h3 id="org1a28fcd">Ground Motion</h3>
<div class="outline-text-3" id="text-org0755155"> <div class="outline-text-3" id="text-org1a28fcd">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">disturbances.Dw = timeseries([args.Dw], args.Dw_t); <pre class="src src-matlab">disturbances.Dw = timeseries([args.Dw], args.Dw_t);
</pre> </pre>
@@ -535,9 +540,9 @@ end
</div> </div>
</div> </div>
<div id="outline-container-org7617a55" class="outline-3"> <div id="outline-container-org90b72d6" class="outline-3">
<h3 id="org7617a55">Direct Forces</h3> <h3 id="org90b72d6">Direct Forces</h3>
<div class="outline-text-3" id="text-org7617a55"> <div class="outline-text-3" id="text-org90b72d6">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">disturbances.Fd = timeseries([args.Fd], args.Fd_t); <pre class="src src-matlab">disturbances.Fd = timeseries([args.Fd], args.Fd_t);
</pre> </pre>
@@ -546,73 +551,73 @@ end
</div> </div>
</div> </div>
<div id="outline-container-orgd45a07f" class="outline-2"> <div id="outline-container-org93f2d30" class="outline-2">
<h2 id="orgd45a07f"><span class="section-number-2">8</span> Initialize References</h2> <h2 id="org93f2d30"><span class="section-number-2">8</span> Initialize References</h2>
<div class="outline-text-2" id="text-8"> <div class="outline-text-2" id="text-8">
<p> <p>
<a id="org7e762f4"></a> <a id="orge24eeb5"></a>
</p> </p>
</div> </div>
<div id="outline-container-orge5deaa1" class="outline-3"> <div id="outline-container-org81500bb" class="outline-3">
<h3 id="orge5deaa1">Function Declaration and Documentation</h3> <h3 id="org81500bb">Function Declaration and Documentation</h3>
<div class="outline-text-3" id="text-orge5deaa1"> <div class="outline-text-3" id="text-org81500bb">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">function [references] = initializeReferences(stewart, args) <pre class="src src-matlab"><span class="org-keyword">function</span> <span class="org-variable-name">[references]</span> = <span class="org-function-name">initializeReferences</span>(<span class="org-variable-name">stewart</span>, <span class="org-variable-name">args</span>)
% initializeReferences - Initialize the references <span class="org-comment">% initializeReferences - Initialize the references</span>
% <span class="org-comment">%</span>
% Syntax: [references] = initializeReferences(args) <span class="org-comment">% Syntax: [references] = initializeReferences(args)</span>
% <span class="org-comment">%</span>
% Inputs: <span class="org-comment">% Inputs:</span>
% - args - <span class="org-comment">% - args -</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-orgeebb364" class="outline-3"> <div id="outline-container-org05322ee" class="outline-3">
<h3 id="orgeebb364">Optional Parameters</h3> <h3 id="org05322ee">Optional Parameters</h3>
<div class="outline-text-3" id="text-orgeebb364"> <div class="outline-text-3" id="text-org05322ee">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">arguments <pre class="src src-matlab"><span class="org-keyword">arguments</span>
stewart <span class="org-variable-name">stewart</span>
args.t double {mustBeNumeric, mustBeReal} = 0 <span class="org-variable-name">args</span>.t double {mustBeNumeric, mustBeReal} = 0
args.r double {mustBeNumeric, mustBeReal} = zeros(6, 1) <span class="org-variable-name">args</span>.r double {mustBeNumeric, mustBeReal} = zeros(6, 1)
end <span class="org-keyword">end</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-orgc274320" class="outline-3"> <div id="outline-container-org6f05adc" class="outline-3">
<h3 id="orgc274320"><span class="section-number-3">8.1</span> Compute the corresponding strut length</h3> <h3 id="org6f05adc"><span class="section-number-3">8.1</span> Compute the corresponding strut length</h3>
<div class="outline-text-3" id="text-8-1"> <div class="outline-text-3" id="text-8-1">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">rL = zeros(6, length(args.t)); <pre class="src src-matlab">rL = zeros(6, length(args.t));
for i = 1:length(args.t) <span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(args.t)</span>
R = [cos(args.r(6,i)) -sin(args.r(6,i)) 0; R = [cos(args.r(6,<span class="org-constant">i</span>)) <span class="org-type">-</span>sin(args.r(6,<span class="org-constant">i</span>)) 0;
sin(args.r(6,i)) cos(args.r(6,i)) 0; sin(args.r(6,<span class="org-constant">i</span>)) cos(args.r(6,<span class="org-constant">i</span>)) 0;
0 0 1] * ... 0 0 1] <span class="org-type">*</span> ...
[cos(args.r(5,i)) 0 sin(args.r(5,i)); [cos(args.r(5,<span class="org-constant">i</span>)) 0 sin(args.r(5,<span class="org-constant">i</span>));
0 1 0; 0 1 0;
-sin(args.r(5,i)) 0 cos(args.r(5,i))] * ... <span class="org-type">-</span>sin(args.r(5,<span class="org-constant">i</span>)) 0 cos(args.r(5,<span class="org-constant">i</span>))] <span class="org-type">*</span> ...
[1 0 0; [1 0 0;
0 cos(args.r(4,i)) -sin(args.r(4,i)); 0 cos(args.r(4,<span class="org-constant">i</span>)) <span class="org-type">-</span>sin(args.r(4,<span class="org-constant">i</span>));
0 sin(args.r(4,i)) cos(args.r(4,i))]; 0 sin(args.r(4,<span class="org-constant">i</span>)) cos(args.r(4,<span class="org-constant">i</span>))];
[Li, dLi] = inverseKinematics(stewart, 'AP', [args.r(1,i); args.r(2,i); args.r(3,i)], 'ARB', R); [Li, dLi] = inverseKinematics(stewart, <span class="org-string">'AP'</span>, [args.r(1,<span class="org-constant">i</span>); args.r(2,<span class="org-constant">i</span>); args.r(3,<span class="org-constant">i</span>)], <span class="org-string">'ARB'</span>, R);
rL(:, i) = dLi; rL(<span class="org-type">:</span>, <span class="org-constant">i</span>) = dLi;
end <span class="org-keyword">end</span>
</pre> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org36ac3fa" class="outline-3"> <div id="outline-container-orgda73a50" class="outline-3">
<h3 id="org36ac3fa">References</h3> <h3 id="orgda73a50">References</h3>
<div class="outline-text-3" id="text-org36ac3fa"> <div class="outline-text-3" id="text-orgda73a50">
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">references.r = timeseries(args.r, args.t); <pre class="src src-matlab">references.r = timeseries(args.r, args.t);
references.rL = timeseries(rL, args.t); references.rL = timeseries(rL, args.t);
@@ -624,7 +629,7 @@ references.rL = timeseries(rL, args.t);
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-08-05 mer. 13:27</p> <p class="date">Created: 2021-01-08 ven. 15:52</p>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -3,17 +3,13 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-08-05 mer. 13:27 --> <!-- 2021-01-08 ven. 15:52 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Simulink Project for the Stewart Simscape folder</title> <title>Simulink Project for the Stewart Simscape folder</title>
<meta name="generator" content="Org mode" /> <meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" /> <meta name="author" content="Dehaeze Thomas" />
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
<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>
</head> </head>
<body> <body>
<div id="org-div-home-and-up"> <div id="org-div-home-and-up">
@@ -49,7 +45,7 @@ The project can be opened using the <code>simulinkproject</code> function:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">simulinkproject('../'); <pre class="src src-matlab">simulinkproject(<span class="org-string">'../'</span>);
</pre> </pre>
</div> </div>
@@ -61,16 +57,16 @@ The startup script is defined below and is exported to the <code>project_startup
<pre class="src src-matlab">project = simulinkproject; <pre class="src src-matlab">project = simulinkproject;
projectRoot = project.RootFolder; projectRoot = project.RootFolder;
myCacheFolder = fullfile(projectRoot, '.SimulinkCache'); myCacheFolder = fullfile(projectRoot, <span class="org-string">'.SimulinkCache'</span>);
myCodeFolder = fullfile(projectRoot, '.SimulinkCode'); myCodeFolder = fullfile(projectRoot, <span class="org-string">'.SimulinkCode'</span>);
Simulink.fileGenControl('set',... Simulink.fileGenControl(<span class="org-string">'set'</span>,...
'CacheFolder', myCacheFolder,... <span class="org-string">'CacheFolder'</span>, myCacheFolder,...
'CodeGenFolder', myCodeFolder,... <span class="org-string">'CodeGenFolder'</span>, myCodeFolder,...
'createDir', true); <span class="org-string">'createDir'</span>, <span class="org-constant">true</span>);
%% Load the Simscape Configuration <span class="org-matlab-cellbreak"><span class="org-comment">%% Load the Simscape Configuration</span></span>
load('mat/conf_simscape.mat'); load(<span class="org-string">'mat/conf_simscape.mat'</span>);
</pre> </pre>
</div> </div>
@@ -78,7 +74,7 @@ load('mat/conf_simscape.mat');
When the project closes, it runs the <code>project_shutdown.m</code> script defined below. When the project closes, it runs the <code>project_shutdown.m</code> script defined below.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">Simulink.fileGenControl('reset'); <pre class="src src-matlab">Simulink.fileGenControl(<span class="org-string">'reset'</span>);
</pre> </pre>
</div> </div>
@@ -88,7 +84,7 @@ The project also permits to automatically add defined folder to the path when th
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-08-05 mer. 13:27</p> <p class="date">Created: 2021-01-08 ven. 15:52</p>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -3,25 +3,30 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-08-05 mer. 13:27 --> <!-- 2021-01-08 ven. 15:53 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Stewart Platform - Static Analysis</title> <title>Stewart Platform - Static Analysis</title>
<meta name="generator" content="Org mode" /> <meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" /> <meta name="author" content="Dehaeze Thomas" />
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
<script src="./js/jquery.min.js"></script> <script>
<script src="./js/bootstrap.min.js"></script> MathJax = {
<script src="./js/jquery.stickytableheaders.min.js"></script> svg: {
<script src="./js/readtheorg.js"></script> scale: 1,
<script>MathJax = { fontCache: "global"
tex: { },
tags: 'ams', tex: {
macros: {bm: ["\\boldsymbol{#1}",1],} tags: "ams",
} multlineWidth: "%MULTLINEWIDTH",
}; tagSide: "right",
</script> macros: {bm: ["\\boldsymbol{#1}",1],},
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> tagIndent: ".8em"
}
};
</script>
<script id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
</head> </head>
<body> <body>
<div id="org-div-home-and-up"> <div id="org-div-home-and-up">
@@ -34,20 +39,20 @@
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents"> <div id="text-table-of-contents">
<ul> <ul>
<li><a href="#orgc502e97">1. Coupling</a></li> <li><a href="#org5d87fd3">1. Coupling</a></li>
</ul> </ul>
</div> </div>
</div> </div>
<div id="outline-container-orgc502e97" class="outline-2"> <div id="outline-container-org5d87fd3" class="outline-2">
<h2 id="orgc502e97"><span class="section-number-2">1</span> Coupling</h2> <h2 id="org5d87fd3"><span class="section-number-2">1</span> Coupling</h2>
<div class="outline-text-2" id="text-1"> <div class="outline-text-2" id="text-1">
<p> <p>
What causes the coupling from \(F_i\) to \(X_i\) ? What causes the coupling from \(F_i\) to \(X_i\) ?
</p> </p>
<div id="org41430df" class="figure"> <div id="orgd94ead3" class="figure">
<p><img src="figs/coupling.png" alt="coupling.png" /> <p><img src="figs/coupling.png" alt="coupling.png" />
</p> </p>
<p><span class="figure-number">Figure 1: </span>Block diagram to control an hexapod</p> <p><span class="figure-number">Figure 1: </span>Block diagram to control an hexapod</p>
@@ -69,7 +74,7 @@ Thus, the system is uncoupled if \(G\) and \(K\) are diagonal.
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-08-05 mer. 13:27</p> <p class="date">Created: 2021-01-08 ven. 15:53</p>
</div> </div>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

Binary file not shown.

12918
mat/base_plate.STEP Normal file

File diff suppressed because it is too large Load Diff

BIN
mat/flexor_025.mat Normal file

Binary file not shown.

4118
mat/flexor_025.step Executable file

File diff suppressed because it is too large Load Diff

BIN
mat/motion_error_ol.mat Normal file

Binary file not shown.

BIN
mat/strut_encoder.mat Normal file

Binary file not shown.

63197
mat/strut_encoder.step Normal file

File diff suppressed because it is too large Load Diff

11895
mat/top_plate.STEP Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -23,8 +23,9 @@ stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none'); stewart = initializeInertialSensor(stewart, 'type', 'none');
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
controller = initializeController('type', 'open-loop');
@@ -58,8 +59,8 @@ figure;
ax1 = subplot(2, 1, 1); ax1 = subplot(2, 1, 1);
hold on; hold on;
for i = 2:6 for i = 2:6
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
plot(freqs, abs(squeeze(freqresp(G(['Dm', num2str(i)], 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(G(['Dm', num2str(i)], 'F1'), freqs, 'Hz'))));
end end
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(G('Dm1', 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(G('Dm1', 'F1'), freqs, 'Hz'))));
@@ -70,8 +71,8 @@ ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2); ax2 = subplot(2, 1, 2);
hold on; hold on;
for i = 2:6 for i = 2:6
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Dm', num2str(i)], 'F1'), freqs, 'Hz')))); p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Dm', num2str(i)], 'F1'), freqs, 'Hz'))));
end end
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Dm1', 'F1'), freqs, 'Hz')))); p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Dm1', 'F1'), freqs, 'Hz'))));
@@ -156,17 +157,17 @@ plot(real(tzero(G)), imag(tzero(G)), 'o');
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o'); plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
plot(real(tzero(Ga)), imag(tzero(Gf)), 'o'); plot(real(tzero(Ga)), imag(tzero(Gf)), 'o');
for i = 1:length(gains) for i = 1:length(gains)
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G, (gains(i)*s)*eye(6))); cl_poles = pole(feedback(G, (gains(i)*s)*eye(6)));
p1 = plot(real(cl_poles), imag(cl_poles), '.'); p1 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6))); cl_poles = pole(feedback(Gf, (gains(i)*s)*eye(6)));
p2 = plot(real(cl_poles), imag(cl_poles), '.'); p2 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',3); set(gca,'ColorOrderIndex',3);
cl_poles = pole(feedback(Ga, (gains(i)*s)*eye(6))); cl_poles = pole(feedback(Ga, (gains(i)*s)*eye(6)));
p3 = plot(real(cl_poles), imag(cl_poles), '.'); p3 = plot(real(cl_poles), imag(cl_poles), '.');
end end
ylim([0, 1.1*max(imag(pole(G)))]); ylim([0, 1.1*max(imag(pole(G)))]);
xlim([-1.1*max(imag(pole(G))),0]); xlim([-1.1*max(imag(pole(G))),0]);

View File

@@ -23,17 +23,14 @@ stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none'); stewart = initializeInertialSensor(stewart, 'type', 'none');
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
controller = initializeController('type', 'open-loop');
% And we identify the dynamics from force actuators to force sensors. % And we identify the dynamics from force actuators to force sensors.
%% Options for Linearized
options = linearizeOptions;
options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
@@ -43,7 +40,7 @@ io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1;
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N] io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N]
%% Run the linearization %% Run the linearization
G = linearize(mdl, io, options); G = linearize(mdl, io);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}; G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
@@ -58,8 +55,8 @@ figure;
ax1 = subplot(2, 1, 1); ax1 = subplot(2, 1, 1);
hold on; hold on;
for i = 2:6 for i = 2:6
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
plot(freqs, abs(squeeze(freqresp(G(['Fm', num2str(i)], 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(G(['Fm', num2str(i)], 'F1'), freqs, 'Hz'))));
end end
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(G('Fm1', 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(G('Fm1', 'F1'), freqs, 'Hz'))));
@@ -70,8 +67,8 @@ ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2); ax2 = subplot(2, 1, 2);
hold on; hold on;
for i = 2:6 for i = 2:6
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Fm', num2str(i)], 'F1'), freqs, 'Hz')))); p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Fm', num2str(i)], 'F1'), freqs, 'Hz'))));
end end
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Fm1', 'F1'), freqs, 'Hz')))); p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Fm1', 'F1'), freqs, 'Hz'))));
@@ -88,7 +85,7 @@ linkaxes([ax1,ax2],'x');
% We add some stiffness and damping in the flexible joints and we re-identify the dynamics. % We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical'); stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
Gf = linearize(mdl, io, options); Gf = linearize(mdl, io);
Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Gf.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}; Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
@@ -97,7 +94,7 @@ Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
% We now use the amplified actuators and re-identify the dynamics % We now use the amplified actuators and re-identify the dynamics
stewart = initializeAmplifiedStrutDynamics(stewart); stewart = initializeAmplifiedStrutDynamics(stewart);
Ga = linearize(mdl, io, options); Ga = linearize(mdl, io);
Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; Ga.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}; Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
@@ -156,17 +153,17 @@ plot(real(tzero(G)), imag(tzero(G)), 'o');
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o'); plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o'); plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
for i = 1:length(gains) for i = 1:length(gains)
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
p1 = plot(real(cl_poles), imag(cl_poles), '.'); p1 = plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
p2 = plot(real(cl_poles), imag(cl_poles), '.'); p2 = plot(real(cl_poles), imag(cl_poles), '.');
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
set(gca,'ColorOrderIndex',3); set(gca,'ColorOrderIndex',3);
p3 = plot(real(cl_poles), imag(cl_poles), '.'); p3 = plot(real(cl_poles), imag(cl_poles), '.');
end end
ylim([0, 1.1*max(imag(pole(G)))]); ylim([0, 1.1*max(imag(pole(G)))]);
xlim([-1.1*max(imag(pole(G))),0]); xlim([-1.1*max(imag(pole(G))),0]);
@@ -187,20 +184,20 @@ gains = logspace(0, 5, 1000);
figure; figure;
hold on; hold on;
for i = 1:length(gains) for i = 1:length(gains)
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(G, (gains(i)/s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2; poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
p1 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.'); p1 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(Gf, (gains(i)/s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2; poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
p2 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.'); p2 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
set(gca,'ColorOrderIndex',3); set(gca,'ColorOrderIndex',3);
cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6))); cl_poles = pole(feedback(Ga, (gains(i)/s)*eye(6)));
poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2; poles_damp = phase(cl_poles(imag(cl_poles)>0)) - pi/2;
p3 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.'); p3 = plot(gains(i)*ones(size(poles_damp)), poles_damp, '.');
end end
xlabel('Control Gain'); xlabel('Control Gain');
ylabel('Damping of the Poles'); ylabel('Damping of the Poles');

View File

@@ -22,8 +22,9 @@ stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3); stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
controller = initializeController('type', 'open-loop');
%% Options for Linearized %% Options for Linearized
options = linearizeOptions; options = linearizeOptions;
@@ -53,8 +54,8 @@ figure;
ax1 = subplot(2, 1, 1); ax1 = subplot(2, 1, 1);
hold on; hold on;
for i = 2:6 for i = 2:6
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
plot(freqs, abs(squeeze(freqresp(G(['Vm', num2str(i)], 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(G(['Vm', num2str(i)], 'F1'), freqs, 'Hz'))));
end end
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(G('Vm1', 'F1'), freqs, 'Hz')))); plot(freqs, abs(squeeze(freqresp(G('Vm1', 'F1'), freqs, 'Hz'))));
@@ -65,8 +66,8 @@ ylabel('Amplitude [$\frac{m/s}{N}$]'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2); ax2 = subplot(2, 1, 2);
hold on; hold on;
for i = 2:6 for i = 2:6
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Vm', num2str(i)], 'F1'), freqs, 'Hz')))); p2 = plot(freqs, 180/pi*angle(squeeze(freqresp(G(['Vm', num2str(i)], 'F1'), freqs, 'Hz'))));
end end
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Vm1', 'F1'), freqs, 'Hz')))); p1 = plot(freqs, 180/pi*angle(squeeze(freqresp(G('Vm1', 'F1'), freqs, 'Hz'))));
@@ -151,17 +152,17 @@ plot(real(tzero(G)), imag(tzero(G)), 'o');
plot(real(tzero(Gf)), imag(tzero(Gf)), 'o'); plot(real(tzero(Gf)), imag(tzero(Gf)), 'o');
plot(real(tzero(Ga)), imag(tzero(Ga)), 'o'); plot(real(tzero(Ga)), imag(tzero(Ga)), 'o');
for i = 1:length(gains) for i = 1:length(gains)
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G, gains(i)*eye(6))); cl_poles = pole(feedback(G, gains(i)*eye(6)));
p1 = plot(real(cl_poles), imag(cl_poles), '.'); p1 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',2); set(gca,'ColorOrderIndex',2);
cl_poles = pole(feedback(Gf, gains(i)*eye(6))); cl_poles = pole(feedback(Gf, gains(i)*eye(6)));
p2 = plot(real(cl_poles), imag(cl_poles), '.'); p2 = plot(real(cl_poles), imag(cl_poles), '.');
set(gca,'ColorOrderIndex',3); set(gca,'ColorOrderIndex',3);
cl_poles = pole(feedback(Ga, gains(i)*eye(6))); cl_poles = pole(feedback(Ga, gains(i)*eye(6)));
p3 = plot(real(cl_poles), imag(cl_poles), '.'); p3 = plot(real(cl_poles), imag(cl_poles), '.');
end end
ylim([0, 3*max(imag(pole(G)))]); ylim([0, 3*max(imag(pole(G)))]);
xlim([-3*max(imag(pole(G))),0]); xlim([-3*max(imag(pole(G))),0]);

Binary file not shown.

View File

@@ -9,12 +9,8 @@
#+HTML_LINK_HOME: ./index.html #+HTML_LINK_HOME: ./index.html
#+HTML_LINK_UP: ./index.html #+HTML_LINK_UP: ./index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> #+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
#+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :comments org

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -9,12 +9,8 @@
#+HTML_LINK_HOME: ./index.html #+HTML_LINK_HOME: ./index.html
#+HTML_LINK_UP: ./index.html #+HTML_LINK_UP: ./index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> #+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
#+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :comments org
@@ -44,111 +40,111 @@ In this section, we wish to compare the effect of forces/torques applied by the
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
#+begin_src matlab :exports none :results silent :noweb yes #+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
open('stewart_platform_model.slx') open('stewart_platform_model.slx')
#+end_src #+end_src
** Comparison with fixed support ** Comparison with fixed support
Let's generate a Stewart platform. Let's generate a Stewart platform.
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none'); stewart = initializeInertialSensor(stewart, 'type', 'none');
#+end_src #+end_src
We don't put any flexibility below the Stewart platform such that *its base is fixed to an inertial frame*. We don't put any flexibility below the Stewart platform such that *its base is fixed to an inertial frame*.
We also don't put any payload on top of the Stewart platform. We also don't put any payload on top of the Stewart platform.
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
controller = initializeController('type', 'open-loop'); controller = initializeController('type', 'open-loop');
#+end_src #+end_src
The transfer function from actuator forces $\bm{\tau}$ to the relative displacement of the mobile platform $\mathcal{\bm{X}}$ is extracted. The transfer function from actuator forces $\bm{\tau}$ to the relative displacement of the mobile platform $\mathcal{\bm{X}}$ is extracted.
#+begin_src matlab #+begin_src matlab
%% Options for Linearized %% Options for Linearized
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] 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'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
%% Run the linearization %% Run the linearization
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src #+end_src
Using the Jacobian matrix, we compute the transfer function from force/torques applied by the actuators on the frame $\{B\}$ fixed to the mobile platform: Using the Jacobian matrix, we compute the transfer function from force/torques applied by the actuators on the frame $\{B\}$ fixed to the mobile platform:
#+begin_src matlab #+begin_src matlab
Gc = minreal(G*inv(stewart.kinematics.J')); Gc = minreal(G*inv(stewart.kinematics.J'));
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'}; Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
#+end_src #+end_src
We also extract the transfer function from external forces $\bm{\mathcal{F}}_{\text{ext}}$ on the frame $\{B\}$ fixed to the mobile platform to the relative displacement $\mathcal{\bm{X}}$ of $\{B\}$ with respect to frame $\{A\}$: We also extract the transfer function from external forces $\bm{\mathcal{F}}_{\text{ext}}$ on the frame $\{B\}$ fixed to the mobile platform to the relative displacement $\mathcal{\bm{X}}$ of $\{B\}$ with respect to frame $\{A\}$:
#+begin_src matlab #+begin_src matlab
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B} io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B}
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'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
%% Run the linearization %% Run the linearization
Gd = linearize(mdl, io, options); Gd = linearize(mdl, io, options);
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'}; Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src #+end_src
The comparison of the two transfer functions is shown in Figure [[fig:comparison_Fext_F_fixed_base]]. The comparison of the two transfer functions is shown in Figure [[fig:comparison_Fext_F_fixed_base]].
#+begin_src matlab :exports none #+begin_src matlab :exports none
freqs = logspace(1, 4, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
ax1 = subplot(2, 1, 1); ax1 = subplot(2, 1, 1);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-'); plot(freqs, abs(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
plot(freqs, abs(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--'); plot(freqs, abs(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2); ax2 = subplot(2, 1, 2);
hold on; hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-'); plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
plot(freqs, 180/pi*angle(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--'); plot(freqs, 180/pi*angle(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]); ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]); yticks([-180, -90, 0, 90, 180]);
legend({'$\mathcal{X}_{x}/\mathcal{F}_{x}$', '$\mathcal{X}_{x}/\mathcal{F}_{x,ext}$'}); legend({'$\mathcal{X}_{x}/\mathcal{F}_{x}$', '$\mathcal{X}_{x}/\mathcal{F}_{x,ext}$'});
linkaxes([ax1,ax2],'x'); linkaxes([ax1,ax2],'x');
#+end_src #+end_src
#+header: :tangle no :exports results :results none :noweb yes #+header: :tangle no :exports results :results none :noweb yes
@@ -163,19 +159,19 @@ The comparison of the two transfer functions is shown in Figure [[fig:comparison
This can be understood from figure [[fig:1dof_actuator_external_forces]] where $\mathcal{F}_{x}$ and $\mathcal{F}_{x,\text{ext}}$ have clearly the same effect on $\mathcal{X}_{x}$. This can be understood from figure [[fig:1dof_actuator_external_forces]] where $\mathcal{F}_{x}$ and $\mathcal{F}_{x,\text{ext}}$ have clearly the same effect on $\mathcal{X}_{x}$.
#+begin_src latex :file 1dof_actuator_external_forces.pdf #+begin_src latex :file 1dof_actuator_external_forces.pdf
\begin{tikzpicture} \begin{tikzpicture}
\draw[ground] (-1, 0) -- (1, 0); \draw[ground] (-1, 0) -- (1, 0);
\draw[spring] (-0.6, 0) -- (-0.6, 1.5) node[midway, left=0.1]{$k$}; \draw[spring] (-0.6, 0) -- (-0.6, 1.5) node[midway, left=0.1]{$k$};
\draw[actuator] ( 0.6, 0) -- ( 0.6, 1.5) node[midway, left=0.1](F){$\mathcal{F}_{x}$}; \draw[actuator] ( 0.6, 0) -- ( 0.6, 1.5) node[midway, left=0.1](F){$\mathcal{F}_{x}$};
\draw[fill=white] (-1, 1.5) rectangle (1, 2) node[pos=0.5]{$m$}; \draw[fill=white] (-1, 1.5) rectangle (1, 2) node[pos=0.5]{$m$};
\draw[dashed] (1, 2) -- ++(0.5, 0); \draw[dashed] (1, 2) -- ++(0.5, 0);
\draw[->] (1.5, 2) -- ++(0, 0.5) node[right]{$\mathcal{X}_{x}$}; \draw[->] (1.5, 2) -- ++(0, 0.5) node[right]{$\mathcal{X}_{x}$};
\draw[->] (0, 2) node[]{$\bullet$} -- (0, 2.8) node[below right]{$\mathcal{F}_{x,\text{ext}}$}; \draw[->] (0, 2) node[]{$\bullet$} -- (0, 2.8) node[below right]{$\mathcal{F}_{x,\text{ext}}$};
\end{tikzpicture} \end{tikzpicture}
#+end_src #+end_src
#+name: fig:1dof_actuator_external_forces #+name: fig:1dof_actuator_external_forces
@@ -186,62 +182,62 @@ This can be understood from figure [[fig:1dof_actuator_external_forces]] where $
** Comparison with a flexible support ** Comparison with a flexible support
We now add a flexible support under the Stewart platform. We now add a flexible support under the Stewart platform.
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'flexible'); ground = initializeGround('type', 'flexible');
#+end_src #+end_src
And we perform again the identification. And we perform again the identification.
#+begin_src matlab #+begin_src matlab
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] 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'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
%% Run the linearization %% Run the linearization
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
Gc = minreal(G*inv(stewart.kinematics.J')); Gc = minreal(G*inv(stewart.kinematics.J'));
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'}; Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B} io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext'); io_i = io_i + 1; % External forces/torques applied on {B}
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'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
%% Run the linearization %% Run the linearization
Gd = linearize(mdl, io, options); Gd = linearize(mdl, io, options);
Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'}; Gd.InputName = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src #+end_src
The comparison between the obtained transfer functions is shown in Figure [[fig:comparison_Fext_F_flexible_base]]. The comparison between the obtained transfer functions is shown in Figure [[fig:comparison_Fext_F_flexible_base]].
#+begin_src matlab :exports none #+begin_src matlab :exports none
freqs = logspace(1, 4, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
ax1 = subplot(2, 1, 1); ax1 = subplot(2, 1, 1);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-'); plot(freqs, abs(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
plot(freqs, abs(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--'); plot(freqs, abs(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2); ax2 = subplot(2, 1, 2);
hold on; hold on;
plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-'); plot(freqs, 180/pi*angle(squeeze(freqresp(Gc(1,1), freqs, 'Hz'))), '-');
plot(freqs, 180/pi*angle(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--'); plot(freqs, 180/pi*angle(squeeze(freqresp(Gd(1,1), freqs, 'Hz'))), '--');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]); ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]); yticks([-180, -90, 0, 90, 180]);
legend({'$\mathcal{X}_{x}/\mathcal{F}_{x}$', '$\mathcal{X}_{x}/\mathcal{F}_{x,ext}$'}); legend({'$\mathcal{X}_{x}/\mathcal{F}_{x}$', '$\mathcal{X}_{x}/\mathcal{F}_{x,ext}$'});
linkaxes([ax1,ax2],'x'); linkaxes([ax1,ax2],'x');
#+end_src #+end_src
#+header: :tangle no :exports results :results none :noweb yes #+header: :tangle no :exports results :results none :noweb yes
@@ -258,22 +254,22 @@ We see that $\mathcal{F}_{x}$ applies a force both on $m$ and $m^{\prime}$ where
And thus $\mathcal{F}_{x}$ and $\mathcal{F}_{x,\text{ext}}$ have clearly *not* the same effect on $\mathcal{X}_{x}$. And thus $\mathcal{F}_{x}$ and $\mathcal{F}_{x,\text{ext}}$ have clearly *not* the same effect on $\mathcal{X}_{x}$.
#+begin_src latex :file 2dof_actuator_external_forces.pdf #+begin_src latex :file 2dof_actuator_external_forces.pdf
\begin{tikzpicture} \begin{tikzpicture}
\draw[ground] (-1, 0) -- (1, 0); \draw[ground] (-1, 0) -- (1, 0);
\draw[spring] (0, 0) -- (0, 1.5) node[midway, left=0.1]{$k^{\prime}$}; \draw[spring] (0, 0) -- (0, 1.5) node[midway, left=0.1]{$k^{\prime}$};
\draw[fill=white] (-1, 1.5) rectangle (1, 2) node[pos=0.5]{$m^{\prime}$}; \draw[fill=white] (-1, 1.5) rectangle (1, 2) node[pos=0.5]{$m^{\prime}$};
\draw[spring] (-0.6, 2) -- (-0.6, 3.5) node[midway, left=0.1]{$k$}; \draw[spring] (-0.6, 2) -- (-0.6, 3.5) node[midway, left=0.1]{$k$};
\draw[actuator] ( 0.6, 2) -- ( 0.6, 3.5) node[midway, left=0.1](F){$\mathcal{F}_{x}$}; \draw[actuator] ( 0.6, 2) -- ( 0.6, 3.5) node[midway, left=0.1](F){$\mathcal{F}_{x}$};
\draw[fill=white] (-1, 3.5) rectangle (1, 4) node[pos=0.5]{$m$}; \draw[fill=white] (-1, 3.5) rectangle (1, 4) node[pos=0.5]{$m$};
\draw[dashed] (1, 4) -- ++(0.5, 0); \draw[dashed] (1, 4) -- ++(0.5, 0);
\draw[->] (1.5, 4) -- ++(0, 0.5) node[right]{$\mathcal{X}_{x}$}; \draw[->] (1.5, 4) -- ++(0, 0.5) node[right]{$\mathcal{X}_{x}$};
\draw[->] (0, 4) node[]{$\bullet$} -- (0, 4.8) node[below right]{$\mathcal{F}_{x,\text{ext}}$}; \draw[->] (0, 4) node[]{$\bullet$} -- (0, 4.8) node[below right]{$\mathcal{F}_{x,\text{ext}}$};
\end{tikzpicture} \end{tikzpicture}
#+end_src #+end_src
#+name: fig:2dof_actuator_external_forces #+name: fig:2dof_actuator_external_forces
@@ -293,67 +289,67 @@ In this section, we see how the Compliance matrix of the Stewart platform is lin
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
#+begin_src matlab :exports none :results silent :noweb yes #+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
open('stewart_platform_model.slx') open('stewart_platform_model.slx')
#+end_src #+end_src
** Analysis ** Analysis
Initialization of the Stewart platform. Initialization of the Stewart platform.
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'none'); stewart = initializeInertialSensor(stewart, 'type', 'none');
#+end_src #+end_src
No flexibility below the Stewart platform and no payload. No flexibility below the Stewart platform and no payload.
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
controller = initializeController('type', 'open-loop'); controller = initializeController('type', 'open-loop');
#+end_src #+end_src
Estimation of the transfer function from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$: Estimation of the transfer function from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$:
#+begin_src matlab #+begin_src matlab
%% Options for Linearized %% Options for Linearized
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] 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'], 1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
%% Run the linearization %% Run the linearization
G = linearize(mdl, io, options); G = linearize(mdl, io, options);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
Gc = minreal(G*inv(stewart.kinematics.J')); Gc = minreal(G*inv(stewart.kinematics.J'));
Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'}; Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
#+end_src #+end_src
Let's first look at the low frequency transfer function matrix from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$. Let's first look at the low frequency transfer function matrix from $\mathcal{\bm{F}}$ to $\mathcal{\bm{X}}$.

File diff suppressed because it is too large Load Diff

View File

@@ -9,12 +9,8 @@
#+HTML_LINK_HOME: ./index.html #+HTML_LINK_HOME: ./index.html
#+HTML_LINK_UP: ./index.html #+HTML_LINK_UP: ./index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> #+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
#+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :comments org
@@ -50,66 +46,66 @@ In this document, we discuss the various methods to identify the behavior of the
** Introduction :ignore: ** Introduction :ignore:
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
#+begin_src matlab :exports none :results silent :noweb yes #+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :results none :exports none #+begin_src matlab :results none :exports none
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
open('stewart_platform_model.slx') open('stewart_platform_model.slx')
#+end_src #+end_src
** Initialize the Stewart Platform ** Initialize the Stewart Platform
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart); stewart = initializeFramesPositions(stewart);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart); stewart = initializeInertialSensor(stewart);
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'none');
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
controller = initializeController('type', 'open-loop'); controller = initializeController('type', 'open-loop');
#+end_src #+end_src
** Identification ** Identification
#+begin_src matlab #+begin_src matlab
%% Options for Linearized %% Options for Linearized
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] 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'], 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} io(io_i) = linio([mdl, '/Relative Motion Sensor'], 2, 'openoutput'); io_i = io_i + 1; % Velocity of {B} w.r.t. {A}
%% Run the linearization %% Run the linearization
G = linearize(mdl, io); G = linearize(mdl, io);
% G.InputName = {'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'}; % G.InputName = {'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'};
% G.OutputName = {'Xdx', 'Xdy', 'Xdz', 'Xrx', 'Xry', 'Xrz', 'Vdx', 'Vdy', 'Vdz', 'Vrx', 'Vry', 'Vrz'}; % G.OutputName = {'Xdx', 'Xdy', 'Xdz', 'Xrx', 'Xry', 'Xrz', 'Vdx', 'Vdy', 'Vdz', 'Vrx', 'Vry', 'Vrz'};
#+end_src #+end_src
Let's check the size of =G=: Let's check the size of =G=:
#+begin_src matlab :results replace output #+begin_src matlab :results replace output
size(G) size(G)
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -121,7 +117,7 @@ Let's check the size of =G=:
We expect to have only 12 states (corresponding to the 6dof of the mobile platform). We expect to have only 12 states (corresponding to the 6dof of the mobile platform).
#+begin_src matlab :results replace output #+begin_src matlab :results replace output
Gm = minreal(G); Gm = minreal(G);
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -133,7 +129,7 @@ And indeed, we obtain 12 states.
** Coordinate transformation ** Coordinate transformation
We can perform the following transformation using the =ss2ss= command. We can perform the following transformation using the =ss2ss= command.
#+begin_src matlab #+begin_src matlab
Gt = ss2ss(Gm, Gm.C); Gt = ss2ss(Gm, Gm.C);
#+end_src #+end_src
Then, the =C= matrix of =Gt= is the unity matrix which means that the states of the state space model are equal to the measurements $\bm{Y}$. Then, the =C= matrix of =Gt= is the unity matrix which means that the states of the state space model are equal to the measurements $\bm{Y}$.
@@ -142,29 +138,29 @@ The measurements are the 6 displacement and 6 velocities of mobile platform with
We could perform the transformation by hand: We could perform the transformation by hand:
#+begin_src matlab #+begin_src matlab
At = Gm.C*Gm.A*pinv(Gm.C); At = Gm.C*Gm.A*pinv(Gm.C);
Bt = Gm.C*Gm.B; Bt = Gm.C*Gm.B;
Ct = eye(12); Ct = eye(12);
Dt = zeros(12, 6); Dt = zeros(12, 6);
Gt = ss(At, Bt, Ct, Dt); Gt = ss(At, Bt, Ct, Dt);
#+end_src #+end_src
** Analysis ** Analysis
#+begin_src matlab #+begin_src matlab
[V,D] = eig(Gt.A); [V,D] = eig(Gt.A);
#+end_src #+end_src
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) #+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
ws = imag(diag(D))/2/pi; ws = imag(diag(D))/2/pi;
[ws,I] = sort(ws) [ws,I] = sort(ws)
xi = 100*real(diag(D))./imag(diag(D)); xi = 100*real(diag(D))./imag(diag(D));
xi = xi(I); xi = xi(I);
data2orgtable([[1:length(ws(ws>0))]', ws(ws>0), xi(xi>0)], {}, {'Mode Number', 'Resonance Frequency [Hz]', 'Damping Ratio [%]'}, ' %.1f '); data2orgtable([[1:length(ws(ws>0))]', ws(ws>0), xi(xi>0)], {}, {'Mode Number', 'Resonance Frequency [Hz]', 'Damping Ratio [%]'}, ' %.1f ');
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -184,54 +180,54 @@ To visualize the i'th mode, we may excite the system using the inputs $U_i$ such
Let's first sort the modes and just take the modes corresponding to a eigenvalue with a positive imaginary part. Let's first sort the modes and just take the modes corresponding to a eigenvalue with a positive imaginary part.
#+begin_src matlab #+begin_src matlab
ws = imag(diag(D)); ws = imag(diag(D));
[ws,I] = sort(ws) [ws,I] = sort(ws)
ws = ws(7:end); I = I(7:end); ws = ws(7:end); I = I(7:end);
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
for i = 1:length(ws) for i = 1:length(ws)
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
i_mode = I(i); % the argument is the i'th mode i_mode = I(i); % the argument is the i'th mode
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
lambda_i = D(i_mode, i_mode); lambda_i = D(i_mode, i_mode);
xi_i = V(:,i_mode); xi_i = V(:,i_mode);
a_i = real(lambda_i); a_i = real(lambda_i);
b_i = imag(lambda_i); b_i = imag(lambda_i);
#+end_src #+end_src
Let do 10 periods of the mode. Let do 10 periods of the mode.
#+begin_src matlab #+begin_src matlab
t = linspace(0, 10/(imag(lambda_i)/2/pi), 1000); 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))); U_i = pinv(Gt.B) * real(xi_i * lambda_i * (cos(b_i * t) + 1i*sin(b_i * t)));
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
U = timeseries(U_i, t); U = timeseries(U_i, t);
#+end_src #+end_src
Simulation: Simulation:
#+begin_src matlab #+begin_src matlab
load('mat/conf_simscape.mat'); load('mat/conf_simscape.mat');
set_param(conf_simscape, 'StopTime', num2str(t(end))); set_param(conf_simscape, 'StopTime', num2str(t(end)));
sim(mdl); sim(mdl);
#+end_src #+end_src
Save the movie of the mode shape. Save the movie of the mode shape.
#+begin_src matlab #+begin_src matlab
smwritevideo(mdl, sprintf('figs/mode%i', i), ... smwritevideo(mdl, sprintf('figs/mode%i', i), ...
'PlaybackSpeedRatio', 1/(b_i/2/pi), ... 'PlaybackSpeedRatio', 1/(b_i/2/pi), ...
'FrameRate', 30, ... 'FrameRate', 30, ...
'FrameSize', [800, 400]); 'FrameSize', [800, 400]);
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
end end
#+end_src #+end_src
#+name: fig:mode1 #+name: fig:mode1
@@ -251,83 +247,83 @@ Save the movie of the mode shape.
** Introduction :ignore: ** Introduction :ignore:
** Matlab Init :noexport: ** Matlab Init :noexport:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
#+begin_src matlab :exports none :results silent :noweb yes #+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
open('stewart_platform_model.slx') open('stewart_platform_model.slx')
#+end_src #+end_src
** Initialize the Stewart platform ** Initialize the Stewart platform
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3); stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
#+end_src #+end_src
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$. We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A); ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
payload = initializePayload('type', 'rigid'); payload = initializePayload('type', 'rigid');
controller = initializeController('type', 'open-loop'); controller = initializeController('type', 'open-loop');
#+end_src #+end_src
** Transmissibility ** Transmissibility
#+begin_src matlab #+begin_src matlab
%% Options for Linearized %% Options for Linearized
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; 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, '/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] io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization %% Run the linearization
T = linearize(mdl, io, options); T = linearize(mdl, io, options);
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'}; T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
freqs = logspace(1, 4, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
for ix = 1:6 for ix = 1:6
for iy = 1:6 for iy = 1:6
subplot(6, 6, (ix-1)*6 + iy); subplot(6, 6, (ix-1)*6 + iy);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-'); plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-5, 10]); ylim([1e-5, 10]);
xlim([freqs(1), freqs(end)]); xlim([freqs(1), freqs(end)]);
if ix < 6 if ix < 6
xticklabels({}); xticklabels({});
end end
if iy > 1 if iy > 1
yticklabels({}); yticklabels({});
end end
end end
end end
#+end_src #+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: 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:
@@ -337,26 +333,26 @@ From cite:preumont07_six_axis_singl_stage_activ, one can use the Frobenius norm
\end{align*} \end{align*}
#+begin_src matlab #+begin_src matlab
freqs = logspace(1, 4, 1000); freqs = logspace(1, 4, 1000);
T_norm = zeros(length(freqs), 1); T_norm = zeros(length(freqs), 1);
for i = 1:length(freqs) for i = 1:length(freqs)
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')')); T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
end end
#+end_src #+end_src
And we normalize by a factor $\sqrt{6}$ to obtain a performance metric comparable to the transmissibility of a one-axis isolator: 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} \] \[ \Gamma(\omega) = \|\bm{T}(\omega)\| / \sqrt{6} \]
#+begin_src matlab #+begin_src matlab
Gamma = T_norm/sqrt(6); Gamma = T_norm/sqrt(6);
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
figure; figure;
plot(freqs, Gamma) plot(freqs, Gamma)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
#+end_src #+end_src
* Compliance Analysis * Compliance Analysis
@@ -364,101 +360,101 @@ And we normalize by a factor $\sqrt{6}$ to obtain a performance metric comparabl
** Introduction :ignore: ** Introduction :ignore:
** Matlab Init :noexport: ** Matlab Init :noexport:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
#+begin_src matlab :exports none :results silent :noweb yes #+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
open('stewart_platform_model.slx') open('stewart_platform_model.slx')
#+end_src #+end_src
** Initialize the Stewart platform ** Initialize the Stewart platform
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3); stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
#+end_src #+end_src
We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$. We set the rotation point of the ground to be at the same point at frames $\{A\}$ and $\{B\}$.
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'none'); ground = initializeGround('type', 'none');
payload = initializePayload('type', 'rigid'); payload = initializePayload('type', 'rigid');
controller = initializeController('type', 'open-loop'); controller = initializeController('type', 'open-loop');
#+end_src #+end_src
** Compliance ** Compliance
#+begin_src matlab #+begin_src matlab
%% Options for Linearized %% Options for Linearized
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; 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, '/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] io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization %% Run the linearization
C = linearize(mdl, io, options); C = linearize(mdl, io, options);
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'}; C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
freqs = logspace(1, 4, 1000); freqs = logspace(1, 4, 1000);
figure; figure;
for ix = 1:6 for ix = 1:6
for iy = 1:6 for iy = 1:6
subplot(6, 6, (ix-1)*6 + iy); subplot(6, 6, (ix-1)*6 + iy);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-'); plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-10, 1e-3]); ylim([1e-10, 1e-3]);
xlim([freqs(1), freqs(end)]); xlim([freqs(1), freqs(end)]);
if ix < 6 if ix < 6
xticklabels({}); xticklabels({});
end end
if iy > 1 if iy > 1
yticklabels({}); yticklabels({});
end end
end end
end end
#+end_src #+end_src
We can try to use the Frobenius norm to obtain a scalar value representing the 6-dof compliance of the Stewart platform. 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 #+begin_src matlab
freqs = logspace(1, 4, 1000); freqs = logspace(1, 4, 1000);
C_norm = zeros(length(freqs), 1); C_norm = zeros(length(freqs), 1);
for i = 1:length(freqs) for i = 1:length(freqs)
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')')); C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
end end
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
figure; figure;
plot(freqs, C_norm) plot(freqs, C_norm)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
#+end_src #+end_src
* Functions * Functions
@@ -474,20 +470,20 @@ We can try to use the Frobenius norm to obtain a scalar value representing the 6
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [T, T_norm, freqs] = computeTransmissibility(args) function [T, T_norm, freqs] = computeTransmissibility(args)
% computeTransmissibility - % computeTransmissibility -
% %
% Syntax: [T, T_norm, freqs] = computeTransmissibility(args) % Syntax: [T, T_norm, freqs] = computeTransmissibility(args)
% %
% Inputs: % Inputs:
% - args - Structure with the following fields: % - args - Structure with the following fields:
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm % - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
% - freqs [] - Frequency vector to estimate the Frobenius norm % - freqs [] - Frequency vector to estimate the Frobenius norm
% %
% Outputs: % Outputs:
% - T [6x6 ss] - Transmissibility matrix % - T [6x6 ss] - Transmissibility matrix
% - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix % - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix
% - freqs [length(freqs)x1] - Frequency vector in [Hz] % - freqs [length(freqs)x1] - Frequency vector in [Hz]
#+end_src #+end_src
*** Optional Parameters *** Optional Parameters
@@ -495,14 +491,14 @@ We can try to use the Frobenius norm to obtain a scalar value representing the 6
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
arguments arguments
args.plots logical {mustBeNumericOrLogical} = false args.plots logical {mustBeNumericOrLogical} = false
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000) args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
end end
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
freqs = args.freqs; freqs = args.freqs;
#+end_src #+end_src
*** Identification of the Transmissibility Matrix *** Identification of the Transmissibility Matrix
@@ -510,43 +506,43 @@ We can try to use the Frobenius norm to obtain a scalar value representing the 6
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
%% Options for Linearized %% Options for Linearized
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; 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, '/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] io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization %% Run the linearization
T = linearize(mdl, io, options); T = linearize(mdl, io, options);
T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'}; T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src #+end_src
If wanted, the 6x6 transmissibility matrix is plotted. If wanted, the 6x6 transmissibility matrix is plotted.
#+begin_src matlab #+begin_src matlab
p_handle = zeros(6*6,1); p_handle = zeros(6*6,1);
if args.plots if args.plots
fig = figure; fig = figure;
for ix = 1:6 for ix = 1:6
for iy = 1:6 for iy = 1:6
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy); p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-'); plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6 if ix < 6
xticklabels({}); xticklabels({});
end
if iy > 1
yticklabels({});
end
end end
if iy > 1
yticklabels({});
end
end
end end
linkaxes(p_handle, 'xy') linkaxes(p_handle, 'xy')
@@ -558,7 +554,7 @@ If wanted, the 6x6 transmissibility matrix is plotted.
han.YLabel.Visible = 'on'; han.YLabel.Visible = 'on';
xlabel(han, 'Frequency [Hz]'); xlabel(han, 'Frequency [Hz]');
ylabel(han, 'Transmissibility [m/m]'); ylabel(han, 'Transmissibility [m/m]');
end end
#+end_src #+end_src
*** Computation of the Frobenius norm *** Computation of the Frobenius norm
@@ -566,25 +562,25 @@ If wanted, the 6x6 transmissibility matrix is plotted.
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
T_norm = zeros(length(freqs), 1); T_norm = zeros(length(freqs), 1);
for i = 1:length(freqs) for i = 1:length(freqs)
T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')')); T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
end end
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
T_norm = T_norm/sqrt(6); T_norm = T_norm/sqrt(6);
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
if args.plots if args.plots
figure; figure;
plot(freqs, T_norm) plot(freqs, T_norm)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); xlabel('Frequency [Hz]');
ylabel('Transmissibility - Frobenius Norm'); ylabel('Transmissibility - Frobenius Norm');
end end
#+end_src #+end_src
** Compute the Compliance ** Compute the Compliance
@@ -599,20 +595,20 @@ If wanted, the 6x6 transmissibility matrix is plotted.
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [C, C_norm, freqs] = computeCompliance(args) function [C, C_norm, freqs] = computeCompliance(args)
% computeCompliance - % computeCompliance -
% %
% Syntax: [C, C_norm, freqs] = computeCompliance(args) % Syntax: [C, C_norm, freqs] = computeCompliance(args)
% %
% Inputs: % Inputs:
% - args - Structure with the following fields: % - args - Structure with the following fields:
% - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm % - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
% - freqs [] - Frequency vector to estimate the Frobenius norm % - freqs [] - Frequency vector to estimate the Frobenius norm
% %
% Outputs: % Outputs:
% - C [6x6 ss] - Compliance matrix % - C [6x6 ss] - Compliance matrix
% - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix % - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix
% - freqs [length(freqs)x1] - Frequency vector in [Hz] % - freqs [length(freqs)x1] - Frequency vector in [Hz]
#+end_src #+end_src
*** Optional Parameters *** Optional Parameters
@@ -620,14 +616,14 @@ If wanted, the 6x6 transmissibility matrix is plotted.
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
arguments arguments
args.plots logical {mustBeNumericOrLogical} = false args.plots logical {mustBeNumericOrLogical} = false
args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000) args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
end end
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
freqs = args.freqs; freqs = args.freqs;
#+end_src #+end_src
*** Identification of the Compliance Matrix *** Identification of the Compliance Matrix
@@ -635,43 +631,43 @@ If wanted, the 6x6 transmissibility matrix is plotted.
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
%% Options for Linearized %% Options for Linearized
options = linearizeOptions; options = linearizeOptions;
options.SampleTime = 0; options.SampleTime = 0;
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; 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, '/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] io(io_i) = linio([mdl, '/Absolute Motion Sensor'], 1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
%% Run the linearization %% Run the linearization
C = linearize(mdl, io, options); C = linearize(mdl, io, options);
C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'}; C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'}; C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
#+end_src #+end_src
If wanted, the 6x6 transmissibility matrix is plotted. If wanted, the 6x6 transmissibility matrix is plotted.
#+begin_src matlab #+begin_src matlab
p_handle = zeros(6*6,1); p_handle = zeros(6*6,1);
if args.plots if args.plots
fig = figure; fig = figure;
for ix = 1:6 for ix = 1:6
for iy = 1:6 for iy = 1:6
p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy); p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-'); plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
if ix < 6 if ix < 6
xticklabels({}); xticklabels({});
end
if iy > 1
yticklabels({});
end
end end
if iy > 1
yticklabels({});
end
end
end end
linkaxes(p_handle, 'xy') linkaxes(p_handle, 'xy')
@@ -682,7 +678,7 @@ If wanted, the 6x6 transmissibility matrix is plotted.
han.YLabel.Visible = 'on'; han.YLabel.Visible = 'on';
xlabel(han, 'Frequency [Hz]'); xlabel(han, 'Frequency [Hz]');
ylabel(han, 'Compliance [m/N, rad/(N*m)]'); ylabel(han, 'Compliance [m/N, rad/(N*m)]');
end end
#+end_src #+end_src
*** Computation of the Frobenius norm *** Computation of the Frobenius norm
@@ -690,21 +686,21 @@ If wanted, the 6x6 transmissibility matrix is plotted.
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
freqs = args.freqs; freqs = args.freqs;
C_norm = zeros(length(freqs), 1); C_norm = zeros(length(freqs), 1);
for i = 1:length(freqs) for i = 1:length(freqs)
C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')')); C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
end end
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
if args.plots if args.plots
figure; figure;
plot(freqs, C_norm) plot(freqs, C_norm)
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); xlabel('Frequency [Hz]');
ylabel('Compliance - Frobenius Norm'); ylabel('Compliance - Frobenius Norm');
end end
#+end_src #+end_src

View File

@@ -1,11 +1,10 @@
#+TITLE: Stewart Platforms #+TITLE: Stewart Platforms
:DRAWER: :DRAWER:
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> #+HTML_LINK_HOME: https://research.tdehaeze.xyz/
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> #+HTML_LINK_UP: https://research.tdehaeze.xyz/
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script> #+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}") #+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes #+PROPERTY: header-args:latex+ :imagemagick t :fit yes
@@ -20,8 +19,8 @@
* Introduction :ignore: * Introduction :ignore:
The goal of this project is to provide a Matlab/Simscape Toolbox to study Stewart platforms. The goal of this project is to provide a Matlab/Simscape Toolbox to study Stewart platforms.
The project is divided into several section listed below. The project is divided into several section listed below.
The git repository of the project is accessible [[https://git.tdehaeze.xyz/tdehaeze/stewart-simscape][here]].
* Simulink Project ([[file:simulink-project.org][link]]) * Simulink Project ([[file:simulink-project.org][link]])
The project is managed with a *Simulink Project*. The project is managed with a *Simulink Project*.

View File

@@ -9,12 +9,8 @@
#+HTML_LINK_HOME: ./index.html #+HTML_LINK_HOME: ./index.html
#+HTML_LINK_UP: ./index.html #+HTML_LINK_UP: ./index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> #+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
#+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :comments org
@@ -238,30 +234,30 @@ This will also gives us the range for which the approximate forward kinematic is
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
#+begin_src matlab :exports none :results silent :noweb yes #+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :results none :exports none #+begin_src matlab :results none :exports none
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
** Stewart architecture definition ** Stewart architecture definition
We first define some general Stewart architecture. We first define some general Stewart architecture.
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart); stewart = initializeJointDynamics(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
#+end_src #+end_src
** Comparison for "pure" translations ** Comparison for "pure" translations
@@ -271,31 +267,31 @@ We compute the approximate and exact required strut stroke to have the wanted mo
The estimate required strut stroke for both the approximate and exact solutions are shown in Figure [[fig:inverse_kinematics_approx_validity_x_translation]]. The estimate required strut stroke for both the approximate and exact solutions are shown in Figure [[fig:inverse_kinematics_approx_validity_x_translation]].
The relative strut length displacement is shown in Figure [[fig:inverse_kinematics_approx_validity_x_translation_relative]]. The relative strut length displacement is shown in Figure [[fig:inverse_kinematics_approx_validity_x_translation_relative]].
#+begin_src matlab #+begin_src matlab
Xrs = logspace(-6, -1, 100); % Wanted X translation of the mobile platform [m] Xrs = logspace(-6, -1, 100); % Wanted X translation of the mobile platform [m]
Ls_approx = zeros(6, length(Xrs)); Ls_approx = zeros(6, length(Xrs));
Ls_exact = zeros(6, length(Xrs)); Ls_exact = zeros(6, length(Xrs));
for i = 1:length(Xrs) for i = 1:length(Xrs)
Xr = Xrs(i); Xr = Xrs(i);
L_approx(:, i) = stewart.kinematics.J*[Xr; 0; 0; 0; 0; 0;]; L_approx(:, i) = stewart.kinematics.J*[Xr; 0; 0; 0; 0; 0;];
[~, L_exact(:, i)] = inverseKinematics(stewart, 'AP', [Xr; 0; 0]); [~, L_exact(:, i)] = inverseKinematics(stewart, 'AP', [Xr; 0; 0]);
end end
#+end_src #+end_src
#+begin_src matlab :exports none #+begin_src matlab :exports none
figure; figure;
hold on; hold on;
for i = 1:6 for i = 1:6
set(gca,'ColorOrderIndex',i); set(gca,'ColorOrderIndex',i);
plot(Xrs, abs(L_approx(i, :))); plot(Xrs, abs(L_approx(i, :)));
set(gca,'ColorOrderIndex',i); set(gca,'ColorOrderIndex',i);
plot(Xrs, abs(L_exact(i, :)), '--'); plot(Xrs, abs(L_exact(i, :)), '--');
end end
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Wanted $x$ displacement [m]'); xlabel('Wanted $x$ displacement [m]');
ylabel('Estimated required stroke'); ylabel('Estimated required stroke');
#+end_src #+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes #+HEADER: :tangle no :exports results :results none :noweb yes
@@ -308,15 +304,15 @@ The relative strut length displacement is shown in Figure [[fig:inverse_kinemati
[[file:figs/inverse_kinematics_approx_validity_x_translation.png]] [[file:figs/inverse_kinematics_approx_validity_x_translation.png]]
#+begin_src matlab :exports none #+begin_src matlab :exports none
figure; figure;
hold on; hold on;
for i = 1:6 for i = 1:6
plot(Xrs, abs(L_approx(i, :) - L_exact(i, :))./abs(L_approx(i, :) + L_exact(i, :)), 'k-'); plot(Xrs, abs(L_approx(i, :) - L_exact(i, :))./abs(L_approx(i, :) + L_exact(i, :)), 'k-');
end end
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Wanted $x$ displacement [m]'); xlabel('Wanted $x$ displacement [m]');
ylabel('Relative Stroke Error'); ylabel('Relative Stroke Error');
#+end_src #+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes #+HEADER: :tangle no :exports results :results none :noweb yes
@@ -353,41 +349,41 @@ This is what is analyzed in this section.
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
#+begin_src matlab :exports none :results silent :noweb yes #+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :results none :exports none #+begin_src matlab :results none :exports none
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
** Stewart architecture definition ** Stewart architecture definition
Let's first define the Stewart platform architecture that we want to study. Let's first define the Stewart platform architecture that we want to study.
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart); stewart = initializeJointDynamics(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
#+end_src #+end_src
** Wanted translations and rotations ** Wanted translations and rotations
Let's now define the wanted extreme translations and rotations. Let's now define the wanted extreme translations and rotations.
#+begin_src matlab #+begin_src matlab
Tx_max = 50e-6; % Translation [m] Tx_max = 50e-6; % Translation [m]
Ty_max = 50e-6; % Translation [m] Ty_max = 50e-6; % Translation [m]
Tz_max = 50e-6; % Translation [m] Tz_max = 50e-6; % Translation [m]
Rx_max = 30e-6; % Rotation [rad] Rx_max = 30e-6; % Rotation [rad]
Ry_max = 30e-6; % Rotation [rad] Ry_max = 30e-6; % Rotation [rad]
Rz_max = 0; % Rotation [rad] Rz_max = 0; % Rotation [rad]
#+end_src #+end_src
** Needed stroke for "pure" rotations or translations ** Needed stroke for "pure" rotations or translations
@@ -395,17 +391,17 @@ As a first estimation, we estimate the needed actuator stroke for "pure" rotatio
We do that using either the Inverse Kinematic solution or the Jacobian matrix as an approximation. We do that using either the Inverse Kinematic solution or the Jacobian matrix as an approximation.
#+begin_src matlab #+begin_src matlab
LTx = stewart.kinematics.J*[Tx_max 0 0 0 0 0]'; LTx = stewart.kinematics.J*[Tx_max 0 0 0 0 0]';
LTy = stewart.kinematics.J*[0 Ty_max 0 0 0 0]'; LTy = stewart.kinematics.J*[0 Ty_max 0 0 0 0]';
LTz = stewart.kinematics.J*[0 0 Tz_max 0 0 0]'; LTz = stewart.kinematics.J*[0 0 Tz_max 0 0 0]';
LRx = stewart.kinematics.J*[0 0 0 Rx_max 0 0]'; LRx = stewart.kinematics.J*[0 0 0 Rx_max 0 0]';
LRy = stewart.kinematics.J*[0 0 0 0 Ry_max 0]'; LRy = stewart.kinematics.J*[0 0 0 0 Ry_max 0]';
LRz = stewart.kinematics.J*[0 0 0 0 0 Rz_max]'; LRz = stewart.kinematics.J*[0 0 0 0 0 Rz_max]';
#+end_src #+end_src
The obtain required stroke is: The obtain required stroke is:
#+begin_src matlab :results value replace :exports results #+begin_src matlab :results value replace :exports results
ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', min(min([LTx,LTy,LTz,LRx,LRy])), max(max([LTx,LTy,LTz,LRx,LRy])), 1e6*(max(max([LTx,LTy,LTz,LRx,LRy]))-min(min([LTx,LTy,LTz,LRx,LRy])))) ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', min(min([LTx,LTy,LTz,LRx,LRy])), max(max([LTx,LTy,LTz,LRx,LRy])), 1e6*(max(max([LTx,LTy,LTz,LRx,LRy]))-min(min([LTx,LTy,LTz,LRx,LRy]))))
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -420,11 +416,11 @@ To do so, we may estimate the required actuator stroke for all possible combinat
Let's first generate all the possible combination of maximum translation and rotations. Let's first generate all the possible combination of maximum translation and rotations.
#+begin_src matlab #+begin_src matlab
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max]; Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
#+end_src #+end_src
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) #+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable(Ps, {}, {'*Tx [m]*', '*Ty [m]*', '*Tz [m]*', '*Rx [rad]*', '*Ry [rad]*', '*Rz [rad]*'}, ' %.1e '); data2orgtable(Ps, {}, {'*Tx [m]*', '*Ty [m]*', '*Tz [m]*', '*Rx [rad]*', '*Ry [rad]*', '*Rz [rad]*'}, ' %.1e ');
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -458,17 +454,17 @@ Let's first generate all the possible combination of maximum translation and rot
For all possible combination, we compute the required actuator stroke using the inverse kinematic solution. For all possible combination, we compute the required actuator stroke using the inverse kinematic solution.
#+begin_src matlab #+begin_src matlab
L_min = 0; L_min = 0;
L_max = 0; L_max = 0;
for i = 1:size(Ps,1) for i = 1:size(Ps,1)
Rx = [1 0 0; Rx = [1 0 0;
0 cos(Ps(i, 4)) -sin(Ps(i, 4)); 0 cos(Ps(i, 4)) -sin(Ps(i, 4));
0 sin(Ps(i, 4)) cos(Ps(i, 4))]; 0 sin(Ps(i, 4)) cos(Ps(i, 4))];
Ry = [ cos(Ps(i, 5)) 0 sin(Ps(i, 5)); Ry = [ cos(Ps(i, 5)) 0 sin(Ps(i, 5));
0 1 0; 0 1 0;
-sin(Ps(i, 5)) 0 cos(Ps(i, 5))]; -sin(Ps(i, 5)) 0 cos(Ps(i, 5))];
Rz = [cos(Ps(i, 6)) -sin(Ps(i, 6)) 0; Rz = [cos(Ps(i, 6)) -sin(Ps(i, 6)) 0;
sin(Ps(i, 6)) cos(Ps(i, 6)) 0; sin(Ps(i, 6)) cos(Ps(i, 6)) 0;
@@ -478,17 +474,17 @@ For all possible combination, we compute the required actuator stroke using the
[~, Ls] = inverseKinematics(stewart, 'AP', Ps(i, 1:3)', 'ARB', ARB); [~, Ls] = inverseKinematics(stewart, 'AP', Ps(i, 1:3)', 'ARB', ARB);
if min(Ls) < L_min if min(Ls) < L_min
L_min = min(Ls) L_min = min(Ls)
end end
if max(Ls) > L_max if max(Ls) > L_max
L_max = max(Ls) L_max = max(Ls)
end end
end end
#+end_src #+end_src
We obtain the required actuator stroke: We obtain the required actuator stroke:
#+begin_src matlab :results value replace :exports results #+begin_src matlab :results value replace :exports results
ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', L_min, L_max, 1e6*(L_max-L_min)) ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', L_min, L_max, 1e6*(L_max-L_min))
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -517,36 +513,36 @@ However, for small displacements, we can use the Jacobian as an approximate solu
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
#+begin_src matlab :exports none :results silent :noweb yes #+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :results none :exports none #+begin_src matlab :results none :exports none
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
** Stewart architecture definition ** Stewart architecture definition
Let's first define the Stewart platform architecture that we want to study. Let's first define the Stewart platform architecture that we want to study.
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart); stewart = initializeJointDynamics(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
#+end_src #+end_src
Let's now define the actuator stroke. Let's now define the actuator stroke.
#+begin_src matlab #+begin_src matlab
L_min = -50e-6; % [m] L_min = -50e-6; % [m]
L_max = 50e-6; % [m] L_max = 50e-6; % [m]
#+end_src #+end_src
** Pure translations ** Pure translations
@@ -561,21 +557,21 @@ To obtain the mobility "volume" attainable by the Stewart platform when it's ori
For each possible value of $(\theta, \phi)$, we compute the maximum radius $r$ attainable with the constraint that the stroke of each actuator should be between =L_min= and =L_max=. For each possible value of $(\theta, \phi)$, we compute the maximum radius $r$ attainable with the constraint that the stroke of each actuator should be between =L_min= and =L_max=.
#+begin_src matlab #+begin_src matlab
thetas = linspace(0, pi, 50); thetas = linspace(0, pi, 50);
phis = linspace(0, 2*pi, 50); phis = linspace(0, 2*pi, 50);
rs = zeros(length(thetas), length(phis)); rs = zeros(length(thetas), length(phis));
for i = 1:length(thetas) for i = 1:length(thetas)
for j = 1:length(phis) for j = 1:length(phis)
Tx = sin(thetas(i))*cos(phis(j)); Tx = sin(thetas(i))*cos(phis(j));
Ty = sin(thetas(i))*sin(phis(j)); Ty = sin(thetas(i))*sin(phis(j));
Tz = cos(thetas(i)); Tz = cos(thetas(i));
dL = stewart.kinematics.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction dL = stewart.kinematics.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction
rs(i, j) = max([dL(dL<0)*L_min; dL(dL>0)*L_max]); rs(i, j) = max([dL(dL<0)*L_min; dL(dL>0)*L_max]);
end end
end end
#+end_src #+end_src
@@ -592,13 +588,13 @@ data2orgtable([1e6*L_min, 1e6*L_max, 1e6*(min(min(rs)))], {}, {'=L_min= [$\mu m$
| -50.0 | 50.0 | 31.5 | | -50.0 | 50.0 | 31.5 |
#+begin_src matlab :exports none #+begin_src matlab :exports none
figure; figure;
plot3(reshape(rs.*(sin(thetas)'*cos(phis)), [1, length(thetas)*length(phis)]), ... plot3(reshape(rs.*(sin(thetas)'*cos(phis)), [1, length(thetas)*length(phis)]), ...
reshape(rs.*(sin(thetas)'*sin(phis)), [1, length(thetas)*length(phis)]), ... reshape(rs.*(sin(thetas)'*sin(phis)), [1, length(thetas)*length(phis)]), ...
reshape(rs.*(cos(thetas)'*ones(1, length(phis))), [1, length(thetas)*length(phis)])) reshape(rs.*(cos(thetas)'*ones(1, length(phis))), [1, length(thetas)*length(phis)]))
xlabel('X Translation [m]'); xlabel('X Translation [m]');
ylabel('Y Translation [m]'); ylabel('Y Translation [m]');
zlabel('Z Translation [m]'); zlabel('Z Translation [m]');
#+end_src #+end_src
#+HEADER: :tangle no :exports results :results none :noweb yes #+HEADER: :tangle no :exports results :results none :noweb yes
@@ -617,93 +613,93 @@ using this function https://fr.mathworks.com/help/matlab/ref/contour3.html
** Introduction :ignore: ** Introduction :ignore:
** Matlab Init :noexport:ignore: ** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>> <<matlab-dir>>
#+end_src #+end_src
#+begin_src matlab :exports none :results silent :noweb yes #+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>> <<matlab-init>>
#+end_src #+end_src
#+begin_src matlab :results none :exports none #+begin_src matlab :results none :exports none
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
** Estimation with an analytical model ** Estimation with an analytical model
Let's first define the Stewart Platform Geometry. Let's first define the Stewart Platform Geometry.
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 150e-3); stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 150e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart, 'AP', [0; 0; 0]); stewart = computeJointsPose(stewart, 'AP', [0; 0; 0]);
As_init = stewart.geometry.As; As_init = stewart.geometry.As;
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
Tx_max = 60e-6; % Translation [m] Tx_max = 60e-6; % Translation [m]
Ty_max = 60e-6; % Translation [m] Ty_max = 60e-6; % Translation [m]
Tz_max = 60e-6; % Translation [m] Tz_max = 60e-6; % Translation [m]
Rx_max = 30e-6; % Rotation [rad] Rx_max = 30e-6; % Rotation [rad]
Ry_max = 30e-6; % Rotation [rad] Ry_max = 30e-6; % Rotation [rad]
Rz_max = 0; % Rotation [rad] Rz_max = 0; % Rotation [rad]
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max]; Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
flex_ang = zeros(size(Ps, 1), 6); flex_ang = zeros(size(Ps, 1), 6);
Rxs = zeros(size(Ps, 1), 6) Rxs = zeros(size(Ps, 1), 6)
Rys = zeros(size(Ps, 1), 6) Rys = zeros(size(Ps, 1), 6)
Rzs = zeros(size(Ps, 1), 6) Rzs = zeros(size(Ps, 1), 6)
for Ps_i = 1:size(Ps, 1) for Ps_i = 1:size(Ps, 1)
Rx = [1 0 0; Rx = [1 0 0;
0 cos(Ps(Ps_i, 4)) -sin(Ps(Ps_i, 4)); 0 cos(Ps(Ps_i, 4)) -sin(Ps(Ps_i, 4));
0 sin(Ps(Ps_i, 4)) cos(Ps(Ps_i, 4))]; 0 sin(Ps(Ps_i, 4)) cos(Ps(Ps_i, 4))];
Ry = [ cos(Ps(Ps_i, 5)) 0 sin(Ps(Ps_i, 5)); Ry = [ cos(Ps(Ps_i, 5)) 0 sin(Ps(Ps_i, 5));
0 1 0; 0 1 0;
-sin(Ps(Ps_i, 5)) 0 cos(Ps(Ps_i, 5))]; -sin(Ps(Ps_i, 5)) 0 cos(Ps(Ps_i, 5))];
Rz = [cos(Ps(Ps_i, 6)) -sin(Ps(Ps_i, 6)) 0; Rz = [cos(Ps(Ps_i, 6)) -sin(Ps(Ps_i, 6)) 0;
sin(Ps(Ps_i, 6)) cos(Ps(Ps_i, 6)) 0; sin(Ps(Ps_i, 6)) cos(Ps(Ps_i, 6)) 0;
0 0 1]; 0 0 1];
ARB = Rz*Ry*Rx; ARB = Rz*Ry*Rx;
stewart = computeJointsPose(stewart, 'AP', Ps(Ps_i, 1:3)', 'ARB', ARB); stewart = computeJointsPose(stewart, 'AP', Ps(Ps_i, 1:3)', 'ARB', ARB);
flex_ang(Ps_i, :) = acos(sum(As_init.*stewart.geometry.As)); flex_ang(Ps_i, :) = acos(sum(As_init.*stewart.geometry.As));
for l_i = 1:6 for l_i = 1:6
MRf = stewart.platform_M.MRb(:,:,l_i)*(ARB')*(stewart.platform_F.FRa(:,:,l_i)'); MRf = stewart.platform_M.MRb(:,:,l_i)*(ARB')*(stewart.platform_F.FRa(:,:,l_i)');
Rys(Ps_i, l_i) = atan2(MRf(1,3), sqrt(MRf(1,1)^2 + MRf(2,2)^2)); Rys(Ps_i, l_i) = atan2(MRf(1,3), sqrt(MRf(1,1)^2 + MRf(2,2)^2));
Rxs(Ps_i, l_i) = atan2(-MRf(2,3)/cos(Rys(Ps_i, l_i)), MRf(3,3)/cos(Rys(Ps_i, l_i))); Rxs(Ps_i, l_i) = atan2(-MRf(2,3)/cos(Rys(Ps_i, l_i)), MRf(3,3)/cos(Rys(Ps_i, l_i)));
Rzs(Ps_i, l_i) = atan2(-MRf(1,2)/cos(Rys(Ps_i, l_i)), MRf(1,1)/cos(Rys(Ps_i, l_i))); Rzs(Ps_i, l_i) = atan2(-MRf(1,2)/cos(Rys(Ps_i, l_i)), MRf(1,1)/cos(Rys(Ps_i, l_i)));
end end
end end
#+end_src #+end_src
And the maximum bending of the flexible joints is: (in [mrad]) And the maximum bending of the flexible joints is: (in [mrad])
#+begin_src matlab :results replace value #+begin_src matlab :results replace value
1e3*max(max(abs(flex_ang))) 1e3*max(max(abs(flex_ang)))
#+end_src #+end_src
#+RESULTS: #+RESULTS:
: 1.1704 : 1.1704
#+begin_src matlab :results replace value #+begin_src matlab :results replace value
1e3*max(max(sqrt(Rxs.^2 + Rys.^2))) 1e3*max(max(sqrt(Rxs.^2 + Rys.^2)))
#+end_src #+end_src
#+RESULTS: #+RESULTS:
: 0.075063 : 0.075063
#+begin_src matlab :results replace value #+begin_src matlab :results replace value
1e3*max(max(Rzs)) 1e3*max(max(Rzs))
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -712,89 +708,89 @@ And the maximum bending of the flexible joints is: (in [mrad])
** Estimation using the Simscape Model ** Estimation using the Simscape Model
*** Model Init *** Model Init
#+begin_src matlab #+begin_src matlab
open('stewart_platform_model.slx') open('stewart_platform_model.slx')
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
stewart = initializeStewartPlatform(); stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3); stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
stewart = generateGeneralConfiguration(stewart); stewart = generateGeneralConfiguration(stewart);
stewart = computeJointsPose(stewart); stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart); stewart = initializeStrutDynamics(stewart);
stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalPlatforms(stewart);
stewart = initializeCylindricalStruts(stewart); stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart); stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart); stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3); stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
ground = initializeGround('type', 'rigid'); ground = initializeGround('type', 'rigid');
payload = initializePayload('type', 'none'); payload = initializePayload('type', 'none');
controller = initializeController('type', 'open-loop'); controller = initializeController('type', 'open-loop');
disturbances = initializeDisturbances(); disturbances = initializeDisturbances();
references = initializeReferences(stewart); references = initializeReferences(stewart);
#+end_src #+end_src
*** Controller design to be close to the wanted displacement *** Controller design to be close to the wanted displacement
#+begin_src matlab #+begin_src matlab
%% Name of the Simulink File %% Name of the Simulink File
mdl = 'stewart_platform_model'; mdl = 'stewart_platform_model';
%% Input/Output definition %% Input/Output definition
clear io; io_i = 1; clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N] io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m] io(io_i) = linio([mdl, '/Stewart Platform'], 1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
%% Run the linearization %% Run the linearization
G = linearize(mdl, io); G = linearize(mdl, io);
G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
G.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'}; G.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'};
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
wc = 2*pi*30; wc = 2*pi*30;
Kl = diag(1./diag(abs(freqresp(G, wc)))) * wc/s * 1/(1 + s/3/wc); Kl = diag(1./diag(abs(freqresp(G, wc)))) * wc/s * 1/(1 + s/3/wc);
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
controller = initializeController('type', 'ref-track-L'); controller = initializeController('type', 'ref-track-L');
#+end_src #+end_src
*** Simulations *** Simulations
#+begin_src matlab #+begin_src matlab
Tx_max = 60e-6; % Translation [m] Tx_max = 60e-6; % Translation [m]
Ty_max = 60e-6; % Translation [m] Ty_max = 60e-6; % Translation [m]
Tz_max = 60e-6; % Translation [m] Tz_max = 60e-6; % Translation [m]
Rx_max = 30e-6; % Rotation [rad] Rx_max = 30e-6; % Rotation [rad]
Ry_max = 30e-6; % Rotation [rad] Ry_max = 30e-6; % Rotation [rad]
Rz_max = 0; % Rotation [rad] Rz_max = 0; % Rotation [rad]
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max]; Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
cl_perf = zeros(size(Ps, 1), 1); % Closed loop performance [percentage] cl_perf = zeros(size(Ps, 1), 1); % Closed loop performance [percentage]
Rs = zeros(size(Ps, 1), 5); % Max Flexor angles for the 6 legs [mrad] Rs = zeros(size(Ps, 1), 5); % Max Flexor angles for the 6 legs [mrad]
for Ps_i = 1:size(Ps, 1) for Ps_i = 1:size(Ps, 1)
fprintf('Experiment %i over %i', Ps_i, size(Ps, 1)); fprintf('Experiment %i over %i', Ps_i, size(Ps, 1));
references = initializeReferences(stewart, 't', 0, 'r', Ps(Ps_i, :)'); references = initializeReferences(stewart, 't', 0, 'r', Ps(Ps_i, :)');
set_param('stewart_platform_model','StopTime','0.1'); set_param('stewart_platform_model','StopTime','0.1');
sim('stewart_platform_model'); sim('stewart_platform_model');
cl_perf(Ps_i) = 100*max(abs((simout.y.dLm.Data(end, :) - references.rL.Data(:,1,1)')./simout.y.dLm.Data(end, :))); cl_perf(Ps_i) = 100*max(abs((simout.y.dLm.Data(end, :) - references.rL.Data(:,1,1)')./simout.y.dLm.Data(end, :)));
Rs(Ps_i, :) = [max(abs(1e3*simout.y.Rf.Data(end, 1:2:end))), max(abs(1e3*simout.y.Rf.Data(end, 2:2:end))), max(abs(1e3*simout.y.Rm.Data(end, 1:3:end))), max(abs(1e3*simout.y.Rm.Data(end, 2:3:end))), max(abs(1e3*simout.y.Rm.Data(end, 3:3:end)))]'; Rs(Ps_i, :) = [max(abs(1e3*simout.y.Rf.Data(end, 1:2:end))), max(abs(1e3*simout.y.Rf.Data(end, 2:2:end))), max(abs(1e3*simout.y.Rm.Data(end, 1:3:end))), max(abs(1e3*simout.y.Rm.Data(end, 2:3:end))), max(abs(1e3*simout.y.Rm.Data(end, 3:3:end)))]';
end end
#+end_src #+end_src
Verify that the simulations are all correct: Verify that the simulations are all correct:
#+begin_src matlab :results replace value #+begin_src matlab :results replace value
max(cl_perf) max(cl_perf)
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -802,7 +798,7 @@ Verify that the simulations are all correct:
*** Results *** Results
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) #+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable(max(Rs)', {'Rx bot', 'Ry bot', 'Rx top', 'Ry top', 'Rz top'}, {'Stroke [mrad]'}, ' %.2f '); data2orgtable(max(Rs)', {'Rx bot', 'Ry bot', 'Rx top', 'Ry top', 'Rz top'}, {'Stroke [mrad]'}, ' %.2f ');
#+end_src #+end_src
#+RESULTS: #+RESULTS:
@@ -830,22 +826,22 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [stewart] = computeJacobian(stewart) function [stewart] = computeJacobian(stewart)
% computeJacobian - % computeJacobian -
% %
% Syntax: [stewart] = computeJacobian(stewart) % Syntax: [stewart] = computeJacobian(stewart)
% %
% Inputs: % Inputs:
% - stewart - With at least the following fields: % - stewart - With at least the following fields:
% - geometry.As [3x6] - The 6 unit vectors for each strut expressed in {A} % - geometry.As [3x6] - The 6 unit vectors for each strut expressed in {A}
% - geometry.Ab [3x6] - The 6 position of the joints bi expressed in {A} % - geometry.Ab [3x6] - The 6 position of the joints bi expressed in {A}
% - actuators.K [6x1] - Total stiffness of the actuators % - actuators.K [6x1] - Total stiffness of the actuators
% %
% Outputs: % Outputs:
% - stewart - With the 3 added field: % - stewart - With the 3 added field:
% - kinematics.J [6x6] - The Jacobian Matrix % - kinematics.J [6x6] - The Jacobian Matrix
% - kinematics.K [6x6] - The Stiffness Matrix % - kinematics.K [6x6] - The Stiffness Matrix
% - kinematics.C [6x6] - The Compliance Matrix % - kinematics.C [6x6] - The Compliance Matrix
#+end_src #+end_src
*** Check the =stewart= structure elements *** Check the =stewart= structure elements
@@ -853,14 +849,14 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
assert(isfield(stewart.geometry, 'As'), 'stewart.geometry should have attribute As') assert(isfield(stewart.geometry, 'As'), 'stewart.geometry should have attribute As')
As = stewart.geometry.As; As = stewart.geometry.As;
assert(isfield(stewart.geometry, 'Ab'), 'stewart.geometry should have attribute Ab') assert(isfield(stewart.geometry, 'Ab'), 'stewart.geometry should have attribute Ab')
Ab = stewart.geometry.Ab; Ab = stewart.geometry.Ab;
assert(isfield(stewart.actuators, 'K'), 'stewart.actuators should have attribute K') assert(isfield(stewart.actuators, 'K'), 'stewart.actuators should have attribute K')
Ki = stewart.actuators.K; Ki = stewart.actuators.K;
#+end_src #+end_src
@@ -869,7 +865,7 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
J = [As' , cross(Ab, As)']; J = [As' , cross(Ab, As)'];
#+end_src #+end_src
*** Compute Stiffness Matrix *** Compute Stiffness Matrix
@@ -877,7 +873,7 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
K = J'*diag(Ki)*J; K = J'*diag(Ki)*J;
#+end_src #+end_src
*** Compute Compliance Matrix *** Compute Compliance Matrix
@@ -885,7 +881,7 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
C = inv(K); C = inv(K);
#+end_src #+end_src
*** Populate the =stewart= structure *** Populate the =stewart= structure
@@ -893,9 +889,9 @@ This Matlab function is accessible [[file:../src/computeJacobian.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
stewart.kinematics.J = J; stewart.kinematics.J = J;
stewart.kinematics.K = K; stewart.kinematics.K = K;
stewart.kinematics.C = C; stewart.kinematics.C = C;
#+end_src #+end_src
@@ -938,23 +934,23 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [Li, dLi] = inverseKinematics(stewart, args) function [Li, dLi] = inverseKinematics(stewart, args)
% inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A} % inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}
% %
% Syntax: [stewart] = inverseKinematics(stewart) % Syntax: [stewart] = inverseKinematics(stewart)
% %
% Inputs: % Inputs:
% - stewart - A structure with the following fields % - stewart - A structure with the following fields
% - geometry.Aa [3x6] - The positions ai expressed in {A} % - geometry.Aa [3x6] - The positions ai expressed in {A}
% - geometry.Bb [3x6] - The positions bi expressed in {B} % - geometry.Bb [3x6] - The positions bi expressed in {B}
% - geometry.l [6x1] - Length of each strut % - geometry.l [6x1] - Length of each strut
% - args - Can have the following fields: % - args - Can have the following fields:
% - AP [3x1] - The wanted position of {B} with respect to {A} % - AP [3x1] - The wanted position of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A} % - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
% %
% Outputs: % Outputs:
% - Li [6x1] - The 6 needed length of the struts in [m] to have the wanted pose of {B} w.r.t. {A} % - Li [6x1] - The 6 needed length of the struts in [m] to have the wanted pose of {B} w.r.t. {A}
% - dLi [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A} % - dLi [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
#+end_src #+end_src
*** Optional Parameters *** Optional Parameters
@@ -962,11 +958,11 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
arguments arguments
stewart stewart
args.AP (3,1) double {mustBeNumeric} = zeros(3,1) args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3) args.ARB (3,3) double {mustBeNumeric} = eye(3)
end end
#+end_src #+end_src
*** Check the =stewart= structure elements *** Check the =stewart= structure elements
@@ -974,14 +970,14 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
assert(isfield(stewart.geometry, 'Aa'), 'stewart.geometry should have attribute Aa') assert(isfield(stewart.geometry, 'Aa'), 'stewart.geometry should have attribute Aa')
Aa = stewart.geometry.Aa; Aa = stewart.geometry.Aa;
assert(isfield(stewart.geometry, 'Bb'), 'stewart.geometry should have attribute Bb') assert(isfield(stewart.geometry, 'Bb'), 'stewart.geometry should have attribute Bb')
Bb = stewart.geometry.Bb; Bb = stewart.geometry.Bb;
assert(isfield(stewart.geometry, 'l'), 'stewart.geometry should have attribute l') assert(isfield(stewart.geometry, 'l'), 'stewart.geometry should have attribute l')
l = stewart.geometry.l; l = stewart.geometry.l;
#+end_src #+end_src
@@ -990,11 +986,11 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
Li = sqrt(args.AP'*args.AP + diag(Bb'*Bb) + diag(Aa'*Aa) - (2*args.AP'*Aa)' + (2*args.AP'*(args.ARB*Bb))' - diag(2*(args.ARB*Bb)'*Aa)); Li = sqrt(args.AP'*args.AP + diag(Bb'*Bb) + diag(Aa'*Aa) - (2*args.AP'*Aa)' + (2*args.AP'*(args.ARB*Bb))' - diag(2*(args.ARB*Bb)'*Aa));
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
dLi = Li-l; dLi = Li-l;
#+end_src #+end_src
** =forwardKinematicsApprox=: Compute the Approximate Forward Kinematics ** =forwardKinematicsApprox=: Compute the Approximate Forward Kinematics
@@ -1011,21 +1007,21 @@ This Matlab function is accessible [[file:../src/forwardKinematicsApprox.m][here
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [P, R] = forwardKinematicsApprox(stewart, args) function [P, R] = forwardKinematicsApprox(stewart, args)
% forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using % forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using
% the Jacobian Matrix % the Jacobian Matrix
% %
% Syntax: [P, R] = forwardKinematicsApprox(stewart, args) % Syntax: [P, R] = forwardKinematicsApprox(stewart, args)
% %
% Inputs: % Inputs:
% - stewart - A structure with the following fields % - stewart - A structure with the following fields
% - kinematics.J [6x6] - The Jacobian Matrix % - kinematics.J [6x6] - The Jacobian Matrix
% - args - Can have the following fields: % - args - Can have the following fields:
% - dL [6x1] - Displacement of each strut [m] % - dL [6x1] - Displacement of each strut [m]
% %
% Outputs: % Outputs:
% - P [3x1] - The estimated position of {B} with respect to {A} % - P [3x1] - The estimated position of {B} with respect to {A}
% - R [3x3] - The estimated rotation matrix that gives the orientation of {B} with respect to {A} % - R [3x3] - The estimated rotation matrix that gives the orientation of {B} with respect to {A}
#+end_src #+end_src
*** Optional Parameters *** Optional Parameters
@@ -1033,10 +1029,10 @@ This Matlab function is accessible [[file:../src/forwardKinematicsApprox.m][here
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
arguments arguments
stewart stewart
args.dL (6,1) double {mustBeNumeric} = zeros(6,1) args.dL (6,1) double {mustBeNumeric} = zeros(6,1)
end end
#+end_src #+end_src
*** Check the =stewart= structure elements *** Check the =stewart= structure elements
@@ -1044,8 +1040,8 @@ This Matlab function is accessible [[file:../src/forwardKinematicsApprox.m][here
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
assert(isfield(stewart.kinematics, 'J'), 'stewart.kinematics should have attribute J') assert(isfield(stewart.kinematics, 'J'), 'stewart.kinematics should have attribute J')
J = stewart.kinematics.J; J = stewart.kinematics.J;
#+end_src #+end_src
*** Computation *** Computation
@@ -1056,26 +1052,26 @@ From a small displacement of each strut $d\bm{\mathcal{L}}$, we can compute the
position and orientation of {B} with respect to {A} using the following formula: position and orientation of {B} with respect to {A} using the following formula:
\[ d \bm{\mathcal{X}} = \bm{J}^{-1} d\bm{\mathcal{L}} \] \[ d \bm{\mathcal{X}} = \bm{J}^{-1} d\bm{\mathcal{L}} \]
#+begin_src matlab #+begin_src matlab
X = J\args.dL; X = J\args.dL;
#+end_src #+end_src
The position vector corresponds to the first 3 elements. The position vector corresponds to the first 3 elements.
#+begin_src matlab #+begin_src matlab
P = X(1:3); P = X(1:3);
#+end_src #+end_src
The next 3 elements are the orientation of {B} with respect to {A} expressed The next 3 elements are the orientation of {B} with respect to {A} expressed
using the screw axis. using the screw axis.
#+begin_src matlab #+begin_src matlab
theta = norm(X(4:6)); theta = norm(X(4:6));
s = X(4:6)/theta; s = X(4:6)/theta;
#+end_src #+end_src
We then compute the corresponding rotation matrix. We then compute the corresponding rotation matrix.
#+begin_src matlab #+begin_src matlab
R = [s(1)^2*(1-cos(theta)) + cos(theta) , s(1)*s(2)*(1-cos(theta)) - s(3)*sin(theta), s(1)*s(3)*(1-cos(theta)) + s(2)*sin(theta); R = [s(1)^2*(1-cos(theta)) + cos(theta) , s(1)*s(2)*(1-cos(theta)) - s(3)*sin(theta), s(1)*s(3)*(1-cos(theta)) + s(2)*sin(theta);
s(2)*s(1)*(1-cos(theta)) + s(3)*sin(theta), s(2)^2*(1-cos(theta)) + cos(theta), s(2)*s(3)*(1-cos(theta)) - s(1)*sin(theta); s(2)*s(1)*(1-cos(theta)) + s(3)*sin(theta), s(2)^2*(1-cos(theta)) + cos(theta), s(2)*s(3)*(1-cos(theta)) - s(1)*sin(theta);
s(3)*s(1)*(1-cos(theta)) - s(2)*sin(theta), s(3)*s(2)*(1-cos(theta)) + s(1)*sin(theta), s(3)^2*(1-cos(theta)) + cos(theta)]; s(3)*s(1)*(1-cos(theta)) - s(2)*sin(theta), s(3)*s(2)*(1-cos(theta)) + s(1)*sin(theta), s(3)^2*(1-cos(theta)) + cos(theta)];
#+end_src #+end_src
* Bibliography :ignore: * Bibliography :ignore:

84
org/nass.org Normal file
View File

@@ -0,0 +1,84 @@
#+TITLE: Stewart Platform - NASS
:DRAWER:
#+STARTUP: overview
#+LANGUAGE: en
#+EMAIL: dehaeze.thomas@gmail.com
#+AUTHOR: Dehaeze Thomas
#+HTML_LINK_HOME: ./index.html
#+HTML_LINK_UP: ./index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org
#+PROPERTY: header-args:matlab+ :exports both
#+PROPERTY: header-args:matlab+ :results none
#+PROPERTY: header-args:matlab+ :eval no-export
#+PROPERTY: header-args:matlab+ :noweb yes
#+PROPERTY: header-args:matlab+ :mkdirp yes
#+PROPERTY: header-args:matlab+ :output-dir figs
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
#+PROPERTY: header-args:latex+ :results file raw replace
#+PROPERTY: header-args:latex+ :buffer no
#+PROPERTY: header-args:latex+ :eval no-export
#+PROPERTY: header-args:latex+ :exports results
#+PROPERTY: header-args:latex+ :mkdirp yes
#+PROPERTY: header-args:latex+ :output-dir figs
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
:END:
* NASS
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
#+begin_src matlab
simulinkproject('../');
#+end_src
#+begin_src matlab
open('stewart_platform_model.slx')
#+end_src
** Identification of the Dynamics
#+begin_src matlab
apa = load('./mat/APA300ML.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
flex_joint = load('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
#+end_src
#+begin_src matlab
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 175e-3);
stewart = generateGeneralConfiguration(stewart, 'FH', 20e-3, 'MH', 20e-3, 'FR', 228e-3/2, 'MR', 220e-3/2, 'FTh', [-9, 9, 120-9, 120+9, 240-9, 240+9]*(pi/180), 'MTh', [-60+15, 60-15, 60+15, 180-15, 180+15, -60-15]*(pi/180));
stewart = computeJointsPose(stewart);
stewart = initializeFlexibleStrutDynamics(stewart, 'H', 0.03, 'K', apa.K, 'M', apa.M, 'n_xyz', apa.n_xyz, 'xi', 0.1, 'step_file', 'mat/APA300ML.STEP');
stewart = initializeJointDynamics(stewart, 'type_F', 'flexible', 'K_F', flex_joint.K, 'M_F', flex_joint.M, 'n_xyz_F', flex_joint.n_xyz, 'xi_F', 0.1, 'step_file_F', 'mat/flexor_ID16.STEP', 'type_M', 'flexible', 'K_M', flex_joint.K, 'M_M', flex_joint.M, 'n_xyz_M', flex_joint.n_xyz, 'xi_M', 0.1, 'step_file_M', 'mat/flexor_ID16.STEP');
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 150e-3, 'Mpr', 125e-3);
stewart = initializeCylindricalStruts(stewart, 'type_F', 'none', 'type_M', 'none');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeInertialSensor(stewart);
#+end_src
#+begin_src matlab
ground = initializeGround('type', 'none');
payload = initializePayload('type', 'rigid', 'm', 50);
controller = initializeController('type', 'open-loop');
#+end_src
#+begin_src matlab
disturbances = initializeDisturbances();
references = initializeReferences(stewart);
#+end_src

View File

@@ -9,12 +9,8 @@
#+HTML_LINK_HOME: ./index.html #+HTML_LINK_HOME: ./index.html
#+HTML_LINK_UP: ./index.html #+HTML_LINK_UP: ./index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> #+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
#+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :comments org
@@ -69,12 +65,12 @@ This is done using something called "*Configuration Reference*" ([[https://fr.ma
Basically, the configuration is stored in a mat file =conf_simscape.mat= and then loaded in the workspace for it to be accessible to all the simulink models. Basically, the configuration is stored in a mat file =conf_simscape.mat= and then loaded in the workspace for it to be accessible to all the simulink models.
It is automatically loaded when the Simulink project is open. It can be loaded manually with the command: It is automatically loaded when the Simulink project is open. It can be loaded manually with the command:
#+begin_src matlab :eval no #+begin_src matlab :eval no
load('mat/conf_simscape.mat'); load('mat/conf_simscape.mat');
#+end_src #+end_src
It is however possible to modify specific parameters just for one simulation using the =set_param= command: It is however possible to modify specific parameters just for one simulation using the =set_param= command:
#+begin_src matlab :eval no #+begin_src matlab :eval no
set_param(conf_simscape, 'StopTime', 1); set_param(conf_simscape, 'StopTime', 1);
#+end_src #+end_src
* Subsystem Reference * Subsystem Reference
@@ -162,29 +158,29 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [payload] = initializePayload(args) function [payload] = initializePayload(args)
% initializePayload - Initialize the Payload that can then be used for simulations and analysis % initializePayload - Initialize the Payload that can then be used for simulations and analysis
% %
% Syntax: [payload] = initializePayload(args) % Syntax: [payload] = initializePayload(args)
% %
% Inputs: % Inputs:
% - args - Structure with the following fields: % - args - Structure with the following fields:
% - type - 'none', 'rigid', 'flexible', 'cartesian' % - type - 'none', 'rigid', 'flexible', 'cartesian'
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m] % - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
% This also the position where K and C are defined % This also the position where K and C are defined
% - K [6x1] - Stiffness of the Payload [N/m, N/rad] % - K [6x1] - Stiffness of the Payload [N/m, N/rad]
% - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)] % - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)]
% - m [1x1] - Mass of the Payload [kg] % - m [1x1] - Mass of the Payload [kg]
% - I [3x3] - Inertia matrix for the Payload [kg*m2] % - I [3x3] - Inertia matrix for the Payload [kg*m2]
% %
% Outputs: % Outputs:
% - payload - Struture with the following properties: % - payload - Struture with the following properties:
% - type - 1 (none), 2 (rigid), 3 (flexible) % - type - 1 (none), 2 (rigid), 3 (flexible)
% - h [1x1] - Height of the CoM of the payload w.r.t {M} [m] % - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
% - K [6x1] - Stiffness of the Payload [N/m, N/rad] % - K [6x1] - Stiffness of the Payload [N/m, N/rad]
% - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)] % - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]
% - m [1x1] - Mass of the Payload [kg] % - m [1x1] - Mass of the Payload [kg]
% - I [3x3] - Inertia matrix for the Payload [kg*m2] % - I [3x3] - Inertia matrix for the Payload [kg*m2]
#+end_src #+end_src
*** Optional Parameters *** Optional Parameters
@@ -192,14 +188,14 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
arguments arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', '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.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(6,1)
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1) args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3 args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3
args.m (1,1) double {mustBeNumeric, mustBeNonnegative} = 10 args.m (1,1) double {mustBeNumeric, mustBeNonnegative} = 10
args.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1*eye(3) args.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1*eye(3)
end end
#+end_src #+end_src
*** Add Payload Type *** Add Payload Type
@@ -207,16 +203,16 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
switch args.type switch args.type
case 'none' case 'none'
payload.type = 1; payload.type = 1;
case 'rigid' case 'rigid'
payload.type = 2; payload.type = 2;
case 'flexible' case 'flexible'
payload.type = 3; payload.type = 3;
case 'cartesian' case 'cartesian'
payload.type = 4; payload.type = 4;
end end
#+end_src #+end_src
*** Add Stiffness, Damping and Mass properties of the Payload *** Add Stiffness, Damping and Mass properties of the Payload
@@ -224,12 +220,12 @@ This Matlab function is accessible [[file:../src/initializePayload.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
payload.K = args.K; payload.K = args.K;
payload.C = args.C; payload.C = args.C;
payload.m = args.m; payload.m = args.m;
payload.I = args.I; payload.I = args.I;
payload.h = args.h; payload.h = args.h;
#+end_src #+end_src
** Ground ** Ground
@@ -246,23 +242,23 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [ground] = initializeGround(args) function [ground] = initializeGround(args)
% initializeGround - Initialize the Ground that can then be used for simulations and analysis % initializeGround - Initialize the Ground that can then be used for simulations and analysis
% %
% Syntax: [ground] = initializeGround(args) % Syntax: [ground] = initializeGround(args)
% %
% Inputs: % Inputs:
% - args - Structure with the following fields: % - args - Structure with the following fields:
% - type - 'none', 'solid', 'flexible' % - type - 'none', 'solid', 'flexible'
% - rot_point [3x1] - Rotation point for the ground motion [m] % - rot_point [3x1] - Rotation point for the ground motion [m]
% - K [3x1] - Translation Stiffness of the Ground [N/m] % - K [3x1] - Translation Stiffness of the Ground [N/m]
% - C [3x1] - Translation Damping of the Ground [N/(m/s)] % - C [3x1] - Translation Damping of the Ground [N/(m/s)]
% %
% Outputs: % Outputs:
% - ground - Struture with the following properties: % - ground - Struture with the following properties:
% - type - 1 (none), 2 (rigid), 3 (flexible) % - type - 1 (none), 2 (rigid), 3 (flexible)
% - K [3x1] - Translation Stiffness of the Ground [N/m] % - K [3x1] - Translation Stiffness of the Ground [N/m]
% - C [3x1] - Translation Damping of the Ground [N/(m/s)] % - C [3x1] - Translation Damping of the Ground [N/(m/s)]
#+end_src #+end_src
*** Optional Parameters *** Optional Parameters
@@ -270,12 +266,12 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
arguments arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none' args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none'
args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1)
args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1) args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1)
args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1) args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1)
end end
#+end_src #+end_src
*** Add Ground Type *** Add Ground Type
@@ -283,14 +279,14 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
switch args.type switch args.type
case 'none' case 'none'
ground.type = 1; ground.type = 1;
case 'rigid' case 'rigid'
ground.type = 2; ground.type = 2;
case 'flexible' case 'flexible'
ground.type = 3; ground.type = 3;
end end
#+end_src #+end_src
*** Add Stiffness and Damping properties of the Ground *** Add Stiffness and Damping properties of the Ground
@@ -298,8 +294,8 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
ground.K = args.K; ground.K = args.K;
ground.C = args.C; ground.C = args.C;
#+end_src #+end_src
*** Rotation Point *** Rotation Point
@@ -307,7 +303,7 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
ground.rot_point = args.rot_point; ground.rot_point = args.rot_point;
#+end_src #+end_src
* Initialize Disturbances * Initialize Disturbances
:PROPERTIES: :PROPERTIES:
@@ -322,13 +318,13 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [disturbances] = initializeDisturbances(args) function [disturbances] = initializeDisturbances(args)
% initializeDisturbances - Initialize the disturbances % initializeDisturbances - Initialize the disturbances
% %
% Syntax: [disturbances] = initializeDisturbances(args) % Syntax: [disturbances] = initializeDisturbances(args)
% %
% Inputs: % Inputs:
% - args - % - args -
#+end_src #+end_src
@@ -337,12 +333,12 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
arguments arguments
args.Fd double {mustBeNumeric, mustBeReal} = zeros(6,1) args.Fd double {mustBeNumeric, mustBeReal} = zeros(6,1)
args.Fd_t double {mustBeNumeric, mustBeReal} = 0 args.Fd_t double {mustBeNumeric, mustBeReal} = 0
args.Dw double {mustBeNumeric, mustBeReal} = zeros(6,1) args.Dw double {mustBeNumeric, mustBeReal} = zeros(6,1)
args.Dw_t double {mustBeNumeric, mustBeReal} = 0 args.Dw_t double {mustBeNumeric, mustBeReal} = 0
end end
#+end_src #+end_src
@@ -351,7 +347,7 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
disturbances = struct(); disturbances = struct();
#+end_src #+end_src
** Ground Motion ** Ground Motion
@@ -359,7 +355,7 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
disturbances.Dw = timeseries([args.Dw], args.Dw_t); disturbances.Dw = timeseries([args.Dw], args.Dw_t);
#+end_src #+end_src
** Direct Forces ** Direct Forces
@@ -367,7 +363,7 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
disturbances.Fd = timeseries([args.Fd], args.Fd_t); disturbances.Fd = timeseries([args.Fd], args.Fd_t);
#+end_src #+end_src
* Initialize References * Initialize References
@@ -383,13 +379,13 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
function [references] = initializeReferences(stewart, args) function [references] = initializeReferences(stewart, args)
% initializeReferences - Initialize the references % initializeReferences - Initialize the references
% %
% Syntax: [references] = initializeReferences(args) % Syntax: [references] = initializeReferences(args)
% %
% Inputs: % Inputs:
% - args - % - args -
#+end_src #+end_src
@@ -398,31 +394,31 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
arguments arguments
stewart stewart
args.t double {mustBeNumeric, mustBeReal} = 0 args.t double {mustBeNumeric, mustBeReal} = 0
args.r double {mustBeNumeric, mustBeReal} = zeros(6, 1) args.r double {mustBeNumeric, mustBeReal} = zeros(6, 1)
end end
#+end_src #+end_src
** Compute the corresponding strut length ** Compute the corresponding strut length
#+begin_src matlab #+begin_src matlab
rL = zeros(6, length(args.t)); rL = zeros(6, length(args.t));
for i = 1:length(args.t) for i = 1:length(args.t)
R = [cos(args.r(6,i)) -sin(args.r(6,i)) 0; R = [cos(args.r(6,i)) -sin(args.r(6,i)) 0;
sin(args.r(6,i)) cos(args.r(6,i)) 0; sin(args.r(6,i)) cos(args.r(6,i)) 0;
0 0 1] * ... 0 0 1] * ...
[cos(args.r(5,i)) 0 sin(args.r(5,i)); [cos(args.r(5,i)) 0 sin(args.r(5,i));
0 1 0; 0 1 0;
-sin(args.r(5,i)) 0 cos(args.r(5,i))] * ... -sin(args.r(5,i)) 0 cos(args.r(5,i))] * ...
[1 0 0; [1 0 0;
0 cos(args.r(4,i)) -sin(args.r(4,i)); 0 cos(args.r(4,i)) -sin(args.r(4,i));
0 sin(args.r(4,i)) cos(args.r(4,i))]; 0 sin(args.r(4,i)) cos(args.r(4,i))];
[Li, dLi] = inverseKinematics(stewart, 'AP', [args.r(1,i); args.r(2,i); args.r(3,i)], 'ARB', R); [Li, dLi] = inverseKinematics(stewart, 'AP', [args.r(1,i); args.r(2,i); args.r(3,i)], 'ARB', R);
rL(:, i) = dLi; rL(:, i) = dLi;
end end
#+end_src #+end_src
** References ** References
@@ -430,6 +426,6 @@ This Matlab function is accessible [[file:../src/initializeGround.m][here]].
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
#+begin_src matlab #+begin_src matlab
references.r = timeseries(args.r, args.t); references.r = timeseries(args.r, args.t);
references.rL = timeseries(rL, args.t); references.rL = timeseries(rL, args.t);
#+end_src #+end_src

View File

@@ -9,12 +9,8 @@
#+HTML_LINK_HOME: ./index.html #+HTML_LINK_HOME: ./index.html
#+HTML_LINK_UP: ./index.html #+HTML_LINK_UP: ./index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> #+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
#+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :comments org
@@ -53,30 +49,30 @@ From the [[https://mathworks.com/products/simulink/projects.html][Simulink proje
The project can be opened using the =simulinkproject= function: The project can be opened using the =simulinkproject= function:
#+begin_src matlab #+begin_src matlab
simulinkproject('../'); simulinkproject('../');
#+end_src #+end_src
When the project opens, a startup script is ran. When the project opens, a startup script is ran.
The startup script is defined below and is exported to the =project_startup.m= script. The startup script is defined below and is exported to the =project_startup.m= script.
#+begin_src matlab :eval no :tangle ../src/project_startup.m #+begin_src matlab :eval no :tangle ../src/project_startup.m
project = simulinkproject; project = simulinkproject;
projectRoot = project.RootFolder; projectRoot = project.RootFolder;
myCacheFolder = fullfile(projectRoot, '.SimulinkCache'); myCacheFolder = fullfile(projectRoot, '.SimulinkCache');
myCodeFolder = fullfile(projectRoot, '.SimulinkCode'); myCodeFolder = fullfile(projectRoot, '.SimulinkCode');
Simulink.fileGenControl('set',... Simulink.fileGenControl('set',...
'CacheFolder', myCacheFolder,... 'CacheFolder', myCacheFolder,...
'CodeGenFolder', myCodeFolder,... 'CodeGenFolder', myCodeFolder,...
'createDir', true); 'createDir', true);
%% Load the Simscape Configuration %% Load the Simscape Configuration
load('mat/conf_simscape.mat'); load('mat/conf_simscape.mat');
#+end_src #+end_src
When the project closes, it runs the =project_shutdown.m= script defined below. When the project closes, it runs the =project_shutdown.m= script defined below.
#+begin_src matlab :eval no :tangle ../src/project_shutdown.m #+begin_src matlab :eval no :tangle ../src/project_shutdown.m
Simulink.fileGenControl('reset'); Simulink.fileGenControl('reset');
#+end_src #+end_src
The project also permits to automatically add defined folder to the path when the project is opened. The project also permits to automatically add defined folder to the path when the project is opened.

View File

@@ -9,12 +9,8 @@
#+HTML_LINK_HOME: ./index.html #+HTML_LINK_HOME: ./index.html
#+HTML_LINK_UP: ./index.html #+HTML_LINK_UP: ./index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/htmlize.css"/> #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/> #+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+HTML_HEAD: <script src="./js/jquery.min.js"></script>
#+HTML_HEAD: <script src="./js/bootstrap.min.js"></script>
#+HTML_HEAD: <script src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD: <script src="./js/readtheorg.js"></script>
#+PROPERTY: header-args:matlab :session *MATLAB* #+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org #+PROPERTY: header-args:matlab+ :comments org
@@ -42,16 +38,16 @@
What causes the coupling from $F_i$ to $X_i$ ? What causes the coupling from $F_i$ to $X_i$ ?
#+begin_src latex :file coupling.pdf #+begin_src latex :file coupling.pdf
\begin{tikzpicture} \begin{tikzpicture}
\node[block] (Jt) at (0, 0) {$J^{-T}$}; \node[block] (Jt) at (0, 0) {$J^{-T}$};
\node[block, right= of Jt] (G) {$G$}; \node[block, right= of Jt] (G) {$G$};
\node[block, right= of G] (J) {$J^{-1}$}; \node[block, right= of G] (J) {$J^{-1}$};
\draw[->] ($(Jt.west)+(-0.8, 0)$) -- (Jt.west) node[above left]{$F_i$}; \draw[->] ($(Jt.west)+(-0.8, 0)$) -- (Jt.west) node[above left]{$F_i$};
\draw[->] (Jt.east) -- (G.west) node[above left]{$\tau_i$}; \draw[->] (Jt.east) -- (G.west) node[above left]{$\tau_i$};
\draw[->] (G.east) -- (J.west) node[above left]{$q_i$}; \draw[->] (G.east) -- (J.west) node[above left]{$q_i$};
\draw[->] (J.east) -- ++(0.8, 0) node[above left]{$X_i$}; \draw[->] (J.east) -- ++(0.8, 0) node[above left]{$X_i$};
\end{tikzpicture} \end{tikzpicture}
#+end_src #+end_src
#+name: fig:block_diag_coupling #+name: fig:block_diag_coupling

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,48 @@
function [stewart] = initializeFlexibleStrutAndJointDynamics(stewart, args)
% initializeFlexibleStrutAndJointDynamics - Add Stiffness and Damping properties of each strut
%
% Syntax: [stewart] = initializeFlexibleStrutAndJointDynamics(args)
%
% Inputs:
% - args - Structure with the following fields:
% - K [nxn] - Vertical stiffness contribution of the piezoelectric stack [N/m]
% - M [nxn] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
% - xi [1x1] - Vertical (residual) stiffness when the piezoelectric stack is removed [N/m]
% - step_file [6x1] - Vertical (residual) damping when the piezoelectric stack is removed [N/(m/s)]
% - Gf [6x1] - Gain from strain in [m] to measured [N] such that it matches
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
arguments
stewart
args.K double {mustBeNumeric} = zeros(6,6)
args.M double {mustBeNumeric} = zeros(6,6)
args.H double {mustBeNumeric} = 0
args.n_xyz double {mustBeNumeric} = zeros(2,3)
args.xi double {mustBeNumeric} = 0.1
args.Gf double {mustBeNumeric} = 1
args.step_file char {} = ''
end
stewart.actuators.ax_off = (stewart.geometry.l(1) - args.H)/2; % Axial Offset at the ends of the actuator
stewart.joints_F.type = 10;
stewart.joints_M.type = 10;
stewart.struts_F.type = 3;
stewart.struts_M.type = 3;
stewart.actuators.type = 4;
stewart.actuators.Km = args.K;
stewart.actuators.Mm = args.M;
stewart.actuators.n_xyz = args.n_xyz;
stewart.actuators.xi = args.xi;
stewart.actuators.step_file = args.step_file;
stewart.actuators.K = args.K(3,3); % Axial Stiffness
stewart.actuators.Gf = args.Gf;

View File

@@ -0,0 +1,30 @@
function [stewart] = initializeSolidPlatforms(stewart, args)
% initializeSolidPlatforms - Initialize the geometry of the Fixed and Mobile Platforms
%
% Syntax: [stewart] = initializeSolidPlatforms(args)
%
% Inputs:
% - args - Structure with the following fields:
% - density [1x1] - Density of the platforms [kg]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - platform_F [struct] - structure with the following fields:
% - type = 2
% - M [1x1] - Fixed Platform Density [kg/m^3]
% - platform_M [struct] - structure with the following fields:
% - type = 2
% - M [1x1] - Mobile Platform Density [kg/m^3]
arguments
stewart
args.density (1,1) double {mustBeNumeric, mustBePositive} = 7800
end
stewart.platform_F.type = 2;
stewart.platform_F.density = args.density;
stewart.platform_M.type = 2;
stewart.platform_M.density = args.density;