668 lines
34 KiB
HTML
668 lines
34 KiB
HTML
<?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 - Decentralized Active Damping</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>
|
|
<script>
|
|
MathJax = {
|
|
svg: {
|
|
scale: 1,
|
|
fontCache: "global"
|
|
},
|
|
tex: {
|
|
tags: "ams",
|
|
multlineWidth: "%MULTLINEWIDTH",
|
|
tagSide: "right",
|
|
macros: {bm: ["\\boldsymbol{#1}",1],},
|
|
tagIndent: ".8em"
|
|
}
|
|
};
|
|
</script>
|
|
<script id="MathJax-script" async
|
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.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 - Decentralized Active Damping</h1>
|
|
<div id="table-of-contents">
|
|
<h2>Table of Contents</h2>
|
|
<div id="text-table-of-contents">
|
|
<ul>
|
|
<li><a href="#orgddaf52f">1. Inertial Control</a>
|
|
<ul>
|
|
<li><a href="#org933440d">1.1. Identification of 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="#org0cea759">1.3. Obtained Damping</a></li>
|
|
<li><a href="#orga866100">1.4. Conclusion</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgf8ed544">2. Integral Force Feedback</a>
|
|
<ul>
|
|
<li><a href="#orga2d019b">2.1. Identification of the Dynamics with perfect Joints</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="#org06e1086">2.3. Obtained Damping</a></li>
|
|
<li><a href="#orgfa832d6">2.4. Conclusion</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgabec4e1">3. Direct Velocity Feedback</a>
|
|
<ul>
|
|
<li><a href="#org19cbcee">3.1. Identification of the Dynamics with perfect Joints</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="#org6c74c9a">3.3. Obtained Damping</a></li>
|
|
<li><a href="#org81b2156">3.4. Conclusion</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgc7e2089">4. Compliance and Transmissibility Comparison</a>
|
|
<ul>
|
|
<li><a href="#org6ec3b9e">4.1. Initialization</a></li>
|
|
<li><a href="#orge87554a">4.2. Identification</a></li>
|
|
<li><a href="#org1d70ccd">4.3. Results</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<p>
|
|
The following decentralized active damping techniques are briefly studied:
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>Inertial Control (proportional feedback of the absolute velocity): Section <a href="#org709d56c">1</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="#org63027d0">3</a></li>
|
|
</ul>
|
|
|
|
<div id="outline-container-orgddaf52f" class="outline-2">
|
|
<h2 id="orgddaf52f"><span class="section-number-2">1</span> Inertial Control</h2>
|
|
<div class="outline-text-2" id="text-1">
|
|
<p>
|
|
<a id="org709d56c"></a>
|
|
</p>
|
|
|
|
<div class="note" id="org1ae7526">
|
|
<p>
|
|
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_inertial.m">here</a>.
|
|
</p>
|
|
|
|
<p>
|
|
To run the script, open the Simulink Project, and type <code>run active_damping_inertial.m</code>.
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org933440d" class="outline-3">
|
|
<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="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>, 45e<span class="org-type">-</span>3);
|
|
stewart = generateGeneralConfiguration(stewart);
|
|
stewart = computeJointsPose(stewart);
|
|
stewart = initializeStrutDynamics(stewart);
|
|
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 = initializeCylindricalStruts(stewart);
|
|
stewart = computeJacobian(stewart);
|
|
stewart = initializeStewartPose(stewart);
|
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'accelerometer'</span>, <span class="org-string">'freq'</span>, 5e3);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<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(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
|
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"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
|
|
options = linearizeOptions;
|
|
options.SampleTime = 0;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'stewart_platform_model'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
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, <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>
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
|
G = linearize(mdl, io, options);
|
|
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 = {<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>
|
|
</div>
|
|
|
|
<p>
|
|
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org5cd47c9">1</a>.
|
|
</p>
|
|
|
|
<div id="org5cd47c9" class="figure">
|
|
<p><img src="figs/inertial_plant_coupling.png" alt="inertial_plant_coupling.png" />
|
|
</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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org2875dd1" class="outline-3">
|
|
<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">
|
|
<p>
|
|
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<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.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 = {<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>
|
|
</div>
|
|
|
|
<p>
|
|
We now use the amplified actuators and re-identify the dynamics
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
|
|
Ga = linearize(mdl, io, options);
|
|
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 = {<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>
|
|
</div>
|
|
|
|
<p>
|
|
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org8fcc87b">2</a>.
|
|
</p>
|
|
|
|
<div id="org8fcc87b" class="figure">
|
|
<p><img src="figs/inertial_plant_flexible_joint_decentralized.png" alt="inertial_plant_flexible_joint_decentralized.png" />
|
|
</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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org0cea759" class="outline-3">
|
|
<h3 id="org0cea759"><span class="section-number-3">1.3</span> Obtained Damping</h3>
|
|
<div class="outline-text-3" id="text-1-3">
|
|
<p>
|
|
The control is a performed in a decentralized manner.
|
|
The \(6 \times 6\) control is a diagonal matrix with pure proportional action on the diagonal:
|
|
\[ K(s) = g
|
|
\begin{bmatrix}
|
|
1 & & 0 \\
|
|
& \ddots & \\
|
|
0 & & 1
|
|
\end{bmatrix} \]
|
|
</p>
|
|
|
|
<p>
|
|
The root locus is shown in figure <a href="#orgaea8656">3</a>.
|
|
</p>
|
|
|
|
<div id="orgaea8656" class="figure">
|
|
<p><img src="figs/root_locus_inertial_rot_stiffness.png" alt="root_locus_inertial_rot_stiffness.png" />
|
|
</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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orga866100" class="outline-3">
|
|
<h3 id="orga866100"><span class="section-number-3">1.4</span> Conclusion</h3>
|
|
<div class="outline-text-3" id="text-1-4">
|
|
<div class="important" id="org91c21ee">
|
|
<p>
|
|
We do not have guaranteed stability with Inertial control. This is because of the flexibility inside the internal sensor.
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf8ed544" class="outline-2">
|
|
<h2 id="orgf8ed544"><span class="section-number-2">2</span> Integral Force Feedback</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
<p>
|
|
<a id="org1f0d316"></a>
|
|
</p>
|
|
|
|
<div class="note" id="org30f755d">
|
|
<p>
|
|
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_iff.m">here</a>.
|
|
</p>
|
|
|
|
<p>
|
|
To run the script, open the Simulink Project, and type <code>run active_damping_iff.m</code>.
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orga2d019b" class="outline-3">
|
|
<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">
|
|
<p>
|
|
We first initialize the Stewart platform without joint stiffness.
|
|
</p>
|
|
<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>, 45e<span class="org-type">-</span>3);
|
|
stewart = generateGeneralConfiguration(stewart);
|
|
stewart = computeJointsPose(stewart);
|
|
stewart = initializeStrutDynamics(stewart);
|
|
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 = initializeCylindricalStruts(stewart);
|
|
stewart = computeJacobian(stewart);
|
|
stewart = initializeStewartPose(stewart);
|
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<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(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
And we identify the dynamics from force actuators to force sensors.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'stewart_platform_model'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
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, <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>
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
|
G = linearize(mdl, io);
|
|
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 = {<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>
|
|
</div>
|
|
|
|
<p>
|
|
The transfer function from actuator forces to force sensors is shown in Figure <a href="#org3b3de64">4</a>.
|
|
</p>
|
|
|
|
<div id="org3b3de64" class="figure">
|
|
<p><img src="figs/iff_plant_coupling.png" alt="iff_plant_coupling.png" />
|
|
</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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org6ac04ee" class="outline-3">
|
|
<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">
|
|
<p>
|
|
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<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.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 = {<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>
|
|
</div>
|
|
|
|
<p>
|
|
We now use the amplified actuators and re-identify the dynamics
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
|
|
Ga = linearize(mdl, io);
|
|
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 = {<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>
|
|
</div>
|
|
|
|
<p>
|
|
The new dynamics from force actuator to force sensor is shown in Figure <a href="#org1902b8f">5</a>.
|
|
</p>
|
|
|
|
<div id="org1902b8f" class="figure">
|
|
<p><img src="figs/iff_plant_flexible_joint_decentralized.png" alt="iff_plant_flexible_joint_decentralized.png" />
|
|
</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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org06e1086" class="outline-3">
|
|
<h3 id="org06e1086"><span class="section-number-3">2.3</span> Obtained Damping</h3>
|
|
<div class="outline-text-3" id="text-2-3">
|
|
<p>
|
|
The control is a performed in a decentralized manner.
|
|
The \(6 \times 6\) control is a diagonal matrix with pure integration action on the diagonal:
|
|
\[ K(s) = g
|
|
\begin{bmatrix}
|
|
\frac{1}{s} & & 0 \\
|
|
& \ddots & \\
|
|
0 & & \frac{1}{s}
|
|
\end{bmatrix} \]
|
|
</p>
|
|
|
|
<p>
|
|
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>
|
|
|
|
<div id="orgce5d8d8" class="figure">
|
|
<p><img src="figs/root_locus_iff_rot_stiffness.png" alt="root_locus_iff_rot_stiffness.png" />
|
|
</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 id="org67419cd" class="figure">
|
|
<p><img src="figs/pole_damping_gain_iff_rot_stiffness.png" alt="pole_damping_gain_iff_rot_stiffness.png" />
|
|
</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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgfa832d6" class="outline-3">
|
|
<h3 id="orgfa832d6"><span class="section-number-3">2.4</span> Conclusion</h3>
|
|
<div class="outline-text-3" id="text-2-4">
|
|
<div class="important" id="orgad0c17b">
|
|
<p>
|
|
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.
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgabec4e1" class="outline-2">
|
|
<h2 id="orgabec4e1"><span class="section-number-2">3</span> Direct Velocity Feedback</h2>
|
|
<div class="outline-text-2" id="text-3">
|
|
<p>
|
|
<a id="org63027d0"></a>
|
|
</p>
|
|
|
|
<div class="note" id="orgadea9d6">
|
|
<p>
|
|
The Matlab script corresponding to this section is accessible <a href="../matlab/active_damping_dvf.m">here</a>.
|
|
</p>
|
|
|
|
<p>
|
|
To run the script, open the Simulink Project, and type <code>run active_damping_dvf.m</code>.
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org19cbcee" class="outline-3">
|
|
<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">
|
|
<p>
|
|
We first initialize the Stewart platform without joint stiffness.
|
|
</p>
|
|
<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>, 45e<span class="org-type">-</span>3);
|
|
stewart = generateGeneralConfiguration(stewart);
|
|
stewart = computeJointsPose(stewart);
|
|
stewart = initializeStrutDynamics(stewart);
|
|
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 = initializeCylindricalStruts(stewart);
|
|
stewart = computeJacobian(stewart);
|
|
stewart = initializeStewartPose(stewart);
|
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<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(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
And we identify the dynamics from force actuators to force sensors.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span>
|
|
options = linearizeOptions;
|
|
options.SampleTime = 0;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span>
|
|
mdl = <span class="org-string">'stewart_platform_model'</span>;
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span>
|
|
clear io; io_i = 1;
|
|
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, <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>
|
|
|
|
<span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span>
|
|
G = linearize(mdl, io, options);
|
|
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 = {<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>
|
|
</div>
|
|
|
|
<p>
|
|
The transfer function from actuator forces to relative motion sensors is shown in Figure <a href="#org34c24ba">8</a>.
|
|
</p>
|
|
|
|
<div id="org34c24ba" class="figure">
|
|
<p><img src="figs/dvf_plant_coupling.png" alt="dvf_plant_coupling.png" />
|
|
</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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-org0fabf01" class="outline-3">
|
|
<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">
|
|
<p>
|
|
We add some stiffness and damping in the flexible joints and we re-identify the dynamics.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<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.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 = {<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>
|
|
</div>
|
|
|
|
<p>
|
|
We now use the amplified actuators and re-identify the dynamics
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">stewart = initializeAmplifiedStrutDynamics(stewart);
|
|
Ga = linearize(mdl, io, options);
|
|
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 = {<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>
|
|
</div>
|
|
|
|
<p>
|
|
The new dynamics from force actuator to relative motion sensor is shown in Figure <a href="#orgba524e3">9</a>.
|
|
</p>
|
|
|
|
<div id="orgba524e3" class="figure">
|
|
<p><img src="figs/dvf_plant_flexible_joint_decentralized.png" alt="dvf_plant_flexible_joint_decentralized.png" />
|
|
</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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org6c74c9a" class="outline-3">
|
|
<h3 id="org6c74c9a"><span class="section-number-3">3.3</span> Obtained Damping</h3>
|
|
<div class="outline-text-3" id="text-3-3">
|
|
<p>
|
|
The control is a performed in a decentralized manner.
|
|
The \(6 \times 6\) control is a diagonal matrix with pure derivative action on the diagonal:
|
|
\[ K(s) = g
|
|
\begin{bmatrix}
|
|
s & & \\
|
|
& \ddots & \\
|
|
& & s
|
|
\end{bmatrix} \]
|
|
</p>
|
|
|
|
<p>
|
|
The root locus is shown in figure <a href="#org0436b4d">10</a>.
|
|
</p>
|
|
|
|
<div id="org0436b4d" class="figure">
|
|
<p><img src="figs/root_locus_dvf_rot_stiffness.png" alt="root_locus_dvf_rot_stiffness.png" />
|
|
</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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org81b2156" class="outline-3">
|
|
<h3 id="org81b2156"><span class="section-number-3">3.4</span> Conclusion</h3>
|
|
<div class="outline-text-3" id="text-3-4">
|
|
<div class="important" id="orgb486ca9">
|
|
<p>
|
|
Joint stiffness does increase the resonance frequencies of the system but does not change the attainable damping when using relative motion sensors.
|
|
</p>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgc7e2089" class="outline-2">
|
|
<h2 id="orgc7e2089"><span class="section-number-2">4</span> Compliance and Transmissibility Comparison</h2>
|
|
<div class="outline-text-2" id="text-4">
|
|
</div>
|
|
<div id="outline-container-org6ec3b9e" class="outline-3">
|
|
<h3 id="org6ec3b9e"><span class="section-number-3">4.1</span> Initialization</h3>
|
|
<div class="outline-text-3" id="text-4-1">
|
|
<p>
|
|
We first initialize the Stewart platform without joint stiffness.
|
|
</p>
|
|
<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>, 45e<span class="org-type">-</span>3);
|
|
stewart = generateGeneralConfiguration(stewart);
|
|
stewart = computeJointsPose(stewart);
|
|
stewart = initializeStrutDynamics(stewart);
|
|
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 = initializeCylindricalStruts(stewart);
|
|
stewart = computeJacobian(stewart);
|
|
stewart = initializeStewartPose(stewart);
|
|
stewart = initializeInertialSensor(stewart, <span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The rotation point of the ground is located at the origin of frame \(\{A\}\).
|
|
</p>
|
|
<div class="org-src-container">
|
|
<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(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
|
|
controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'open-loop'</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orge87554a" class="outline-3">
|
|
<h3 id="orge87554a"><span class="section-number-3">4.2</span> Identification</h3>
|
|
<div class="outline-text-3" id="text-4-2">
|
|
<p>
|
|
Let’s first identify the transmissibility and compliance in the open-loop case.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<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();
|
|
[C_ol, C_norm_ol, freqs] = computeCompliance();
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
Now, let’s identify the transmissibility and compliance for the Integral Force Feedback architecture.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'iff'</span>);
|
|
K_iff = (1e4<span class="org-type">/</span>s)<span class="org-type">*</span>eye(6);
|
|
|
|
[T_iff, T_norm_iff, <span class="org-type">~</span>] = computeTransmissibility();
|
|
[C_iff, C_norm_iff, <span class="org-type">~</span>] = computeCompliance();
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
And for the Direct Velocity Feedback.
|
|
</p>
|
|
<div class="org-src-container">
|
|
<pre class="src src-matlab">controller = initializeController(<span class="org-string">'type'</span>, <span class="org-string">'dvf'</span>);
|
|
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, <span class="org-type">~</span>] = computeTransmissibility();
|
|
[C_dvf, C_norm_dvf, <span class="org-type">~</span>] = computeCompliance();
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1d70ccd" class="outline-3">
|
|
<h3 id="org1d70ccd"><span class="section-number-3">4.3</span> Results</h3>
|
|
<div class="outline-text-3" id="text-4-3">
|
|
|
|
<div id="org908e692" class="figure">
|
|
<p><img src="figs/transmissibility_iff_dvf.png" alt="transmissibility_iff_dvf.png" />
|
|
</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 id="orgc10c609" class="figure">
|
|
<p><img src="figs/compliance_iff_dvf.png" alt="compliance_iff_dvf.png" />
|
|
</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 id="orgd54f179" class="figure">
|
|
<p><img src="figs/frobenius_norm_T_C_iff_dvf.png" alt="frobenius_norm_T_C_iff_dvf.png" />
|
|
</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>
|
|
</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>
|