Model flexible nano-hexapod elements

This commit is contained in:
Thomas Dehaeze 2020-11-03 09:45:50 +01:00
parent 184c755fb8
commit bd054638b2
23 changed files with 2872 additions and 2739 deletions

View File

@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2020-05-05 mar. 11:50 -->
<!-- 2020-11-03 mar. 09:45 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Study of the Flexible Joints</title>
<meta name="generator" content="Org mode" />
@ -37,19 +36,19 @@
<ul>
<li><a href="#orge032d30">1. Bending and Torsional Stiffness</a>
<ul>
<li><a href="#org8fdef7f">1.1. Initialization</a></li>
<li><a href="#orge82a7c2">1.1. Initialization</a></li>
<li><a href="#orgde60939">1.2. Realistic Bending Stiffness Values</a>
<ul>
<li><a href="#orgdb214f9">1.2.1. Direct Velocity Feedback</a></li>
<li><a href="#org4069e58">1.2.2. Primary Plant</a></li>
<li><a href="#orga32adf0">1.2.3. Conclusion</a></li>
<li><a href="#orge13b41c">1.2.1. Direct Velocity Feedback</a></li>
<li><a href="#orgd5fd59b">1.2.2. Primary Plant</a></li>
<li><a href="#org865157e">1.2.3. Conclusion</a></li>
</ul>
</li>
<li><a href="#org8ad3f34">1.3. Parametric Study</a>
<ul>
<li><a href="#org4adf147">1.3.1. Direct Velocity Feedback</a></li>
<li><a href="#org53e5f08">1.3.2. Primary Control</a></li>
<li><a href="#orgc45ccb0">1.3.3. Conclusion</a></li>
<li><a href="#orgc98ee7c">1.3.1. Direct Velocity Feedback</a></li>
<li><a href="#org15c2c08">1.3.2. Primary Control</a></li>
<li><a href="#org5322ecd">1.3.3. Conclusion</a></li>
</ul>
</li>
</ul>
@ -58,22 +57,29 @@
<ul>
<li><a href="#org969d9e7">2.1. Realistic Translation Stiffness Values</a>
<ul>
<li><a href="#orge82a7c2">2.1.1. Initialization</a></li>
<li><a href="#org44f67b8">2.1.2. Direct Velocity Feedback</a></li>
<li><a href="#orgd5fd59b">2.1.3. Primary Plant</a></li>
<li><a href="#org552093a">2.1.4. Conclusion</a></li>
<li><a href="#org7dd21d5">2.1.1. Initialization</a></li>
<li><a href="#org47be52b">2.1.2. Direct Velocity Feedback</a></li>
<li><a href="#org15105f5">2.1.3. Primary Plant</a></li>
<li><a href="#org2098f1e">2.1.4. Conclusion</a></li>
</ul>
</li>
<li><a href="#org0275632">2.2. Parametric study</a>
<ul>
<li><a href="#orge13b41c">2.2.1. Direct Velocity Feedback</a></li>
<li><a href="#org15c2c08">2.2.2. Primary Control</a></li>
<li><a href="#orgd87b94b">2.2.1. Direct Velocity Feedback</a></li>
<li><a href="#orge5d1c12">2.2.2. Primary Control</a></li>
</ul>
</li>
<li><a href="#orgce1052e">2.3. Conclusion</a></li>
<li><a href="#org382b3cb">2.3. Conclusion</a></li>
</ul>
</li>
<li><a href="#orgb6f6c0a">3. Conclusion</a></li>
<li><a href="#orgdf2870d">4. Designed Flexible Joints</a>
<ul>
<li><a href="#orgd355fcb">4.1. Initialization</a></li>
<li><a href="#org43c7d3c">4.2. Direct Velocity Feedback</a></li>
<li><a href="#org056a1de">4.3. Integral Force Feedback</a></li>
</ul>
</li>
<li><a href="#org865157e">3. Conclusion</a></li>
</ul>
</div>
</div>
@ -106,8 +112,8 @@ In this section, we wish to study the effect of the rotation flexibility of the
</p>
</div>
<div id="outline-container-org8fdef7f" class="outline-3">
<h3 id="org8fdef7f"><span class="section-number-3">1.1</span> Initialization</h3>
<div id="outline-container-orge82a7c2" class="outline-3">
<h3 id="orge82a7c2"><span class="section-number-3">1.1</span> Initialization</h3>
<div class="outline-text-3" id="text-1-1">
<p>
Let&rsquo;s initialize all the stages with default parameters.
@ -128,8 +134,8 @@ initializeMirror();
Let&rsquo;s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
</p>
<div class="org-src-container">
<pre class="src src-matlab">initializeSample('mass', 50, 'freq', 200*ones(6,1));
initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 60);
<pre class="src src-matlab">initializeSample(<span class="org-string">'mass'</span>, 50, <span class="org-string">'freq'</span>, 200<span class="org-type">*</span>ones(6,1));
initializeReferences(<span class="org-string">'Rz_type'</span>, <span class="org-string">'rotating-not-filtered'</span>, <span class="org-string">'Rz_period'</span>, 60);
</pre>
</div>
</div>
@ -147,10 +153,10 @@ Let&rsquo;s compare the ideal case (zero stiffness in rotation and infinite stif
</ul>
<div class="org-src-container">
<pre class="src src-matlab">Kf_M = 15*ones(6,1);
Kf_F = 15*ones(6,1);
Kt_M = 20*ones(6,1);
Kt_F = 20*ones(6,1);
<pre class="src src-matlab">Kf_M = 15<span class="org-type">*</span>ones(6,1);
Kf_F = 15<span class="org-type">*</span>ones(6,1);
Kt_M = 20<span class="org-type">*</span>ones(6,1);
Kt_F = 20<span class="org-type">*</span>ones(6,1);
</pre>
</div>
@ -158,8 +164,8 @@ Kt_F = 20*ones(6,1);
The stiffness and damping of the nano-hexapod&rsquo;s legs are:
</p>
<div class="org-src-container">
<pre class="src src-matlab">k_opt = 1e5; % [N/m]
c_opt = 2e2; % [N/(m/s)]
<pre class="src src-matlab">k_opt = 1e5; <span class="org-comment">% [N/m]</span>
c_opt = 2e2; <span class="org-comment">% [N/(m/s)]</span>
</pre>
</div>
@ -168,8 +174,8 @@ This corresponds to the optimal identified stiffness.
</p>
</div>
<div id="outline-container-orgdb214f9" class="outline-4">
<h4 id="orgdb214f9"><span class="section-number-4">1.2.1</span> Direct Velocity Feedback</h4>
<div id="outline-container-orge13b41c" class="outline-4">
<h4 id="orge13b41c"><span class="section-number-4">1.2.1</span> Direct Velocity Feedback</h4>
<div class="outline-text-4" id="text-1-2-1">
<p>
We identify the dynamics from actuators force \(\tau_i\) to relative motion sensors \(d\mathcal{L}_i\) with and without considering the flexible joint stiffness.
@ -189,8 +195,8 @@ It is shown that the adding of stiffness for the flexible joints does increase a
</div>
</div>
<div id="outline-container-org4069e58" class="outline-4">
<h4 id="org4069e58"><span class="section-number-4">1.2.2</span> Primary Plant</h4>
<div id="outline-container-orgd5fd59b" class="outline-4">
<h4 id="orgd5fd59b"><span class="section-number-4">1.2.2</span> Primary Plant</h4>
<div class="outline-text-4" id="text-1-2-2">
<p>
Let&rsquo;s now identify the dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for the primary controller designed in the frame of the legs).
@ -210,10 +216,10 @@ The plant dynamics is not found to be changing significantly.
</div>
</div>
<div id="outline-container-orga32adf0" class="outline-4">
<h4 id="orga32adf0"><span class="section-number-4">1.2.3</span> Conclusion</h4>
<div id="outline-container-org865157e" class="outline-4">
<h4 id="org865157e"><span class="section-number-4">1.2.3</span> Conclusion</h4>
<div class="outline-text-4" id="text-1-2-3">
<div class="important">
<div class="important" id="org69f9617">
<p>
Considering realistic flexible joint bending stiffness for the nano-hexapod does not seems to impose any limitation on the DVF control nor on the primary control.
</p>
@ -239,7 +245,7 @@ This will help to determine the requirements on the joint&rsquo;s stiffness.
Let&rsquo;s consider the following bending stiffness of the flexible joints:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Ks = [1, 5, 10, 50, 100]; % [Nm/rad]
<pre class="src src-matlab">Ks = [1, 5, 10, 50, 100]; <span class="org-comment">% [Nm/rad]</span>
</pre>
</div>
@ -248,8 +254,8 @@ We also consider here a nano-hexapod with the identified optimal actuator stiffn
</p>
</div>
<div id="outline-container-org4adf147" class="outline-4">
<h4 id="org4adf147"><span class="section-number-4">1.3.1</span> Direct Velocity Feedback</h4>
<div id="outline-container-orgc98ee7c" class="outline-4">
<h4 id="orgc98ee7c"><span class="section-number-4">1.3.1</span> Direct Velocity Feedback</h4>
<div class="outline-text-4" id="text-1-3-1">
<p>
The dynamics from the actuators to the relative displacement sensor in each leg is identified and shown in Figure <a href="#org8fbbf9d">3</a>.
@ -279,8 +285,8 @@ It is shown that the bending stiffness of the flexible joints does indeed change
</div>
</div>
<div id="outline-container-org53e5f08" class="outline-4">
<h4 id="org53e5f08"><span class="section-number-4">1.3.2</span> Primary Control</h4>
<div id="outline-container-org15c2c08" class="outline-4">
<h4 id="org15c2c08"><span class="section-number-4">1.3.2</span> Primary Control</h4>
<div class="outline-text-4" id="text-1-3-2">
<p>
The dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for the primary controller designed in the frame of the legs) is shown in Figure <a href="#orgb739560">5</a>.
@ -299,10 +305,10 @@ It is shown that the bending stiffness of the flexible joints have very little i
</div>
</div>
<div id="outline-container-orgc45ccb0" class="outline-4">
<h4 id="orgc45ccb0"><span class="section-number-4">1.3.3</span> Conclusion</h4>
<div id="outline-container-org5322ecd" class="outline-4">
<h4 id="org5322ecd"><span class="section-number-4">1.3.3</span> Conclusion</h4>
<div class="outline-text-4" id="text-1-3-3">
<div class="important">
<div class="important" id="orga223c1a">
<p>
The bending stiffness of the flexible joint does not significantly change the dynamics.
</p>
@ -333,16 +339,16 @@ We choose realistic values of the axial stiffness of the joints:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Kz_F = 60e6*ones(6,1); % [N/m]
Kz_M = 60e6*ones(6,1); % [N/m]
Cz_F = 1*ones(6,1); % [N/(m/s)]
Cz_M = 1*ones(6,1); % [N/(m/s)]
<pre class="src src-matlab">Ka_F = 60e6<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/m]</span>
Ka_M = 60e6<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/m]</span>
Ca_F = 1<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/(m/s)]</span>
Ca_M = 1<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/(m/s)]</span>
</pre>
</div>
</div>
<div id="outline-container-orge82a7c2" class="outline-4">
<h4 id="orge82a7c2"><span class="section-number-4">2.1.1</span> Initialization</h4>
<div id="outline-container-org7dd21d5" class="outline-4">
<h4 id="org7dd21d5"><span class="section-number-4">2.1.1</span> Initialization</h4>
<div class="outline-text-4" id="text-2-1-1">
<p>
Let&rsquo;s initialize all the stages with default parameters.
@ -363,15 +369,15 @@ initializeMirror();
Let&rsquo;s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
</p>
<div class="org-src-container">
<pre class="src src-matlab">initializeSample('mass', 50, 'freq', 200*ones(6,1));
initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 60);
<pre class="src src-matlab">initializeSample(<span class="org-string">'mass'</span>, 50, <span class="org-string">'freq'</span>, 200<span class="org-type">*</span>ones(6,1));
initializeReferences(<span class="org-string">'Rz_type'</span>, <span class="org-string">'rotating-not-filtered'</span>, <span class="org-string">'Rz_period'</span>, 60);
</pre>
</div>
</div>
</div>
<div id="outline-container-org44f67b8" class="outline-4">
<h4 id="org44f67b8"><span class="section-number-4">2.1.2</span> Direct Velocity Feedback</h4>
<div id="outline-container-org47be52b" class="outline-4">
<h4 id="org47be52b"><span class="section-number-4">2.1.2</span> Direct Velocity Feedback</h4>
<div class="outline-text-4" id="text-2-1-2">
<p>
The dynamics from actuators force \(\tau_i\) to relative motion sensors \(d\mathcal{L}_i\) with and without considering the flexible joint stiffness are identified.
@ -390,11 +396,11 @@ The obtained dynamics are shown in Figure <a href="#org78dd87a">6</a>.
</div>
</div>
<div id="outline-container-orgd5fd59b" class="outline-4">
<h4 id="orgd5fd59b"><span class="section-number-4">2.1.3</span> Primary Plant</h4>
<div id="outline-container-org15105f5" class="outline-4">
<h4 id="org15105f5"><span class="section-number-4">2.1.3</span> Primary Plant</h4>
<div class="outline-text-4" id="text-2-1-3">
<div class="org-src-container">
<pre class="src src-matlab">Kdvf = 5e3*s/(1+s/2/pi/1e3)*eye(6);
<pre class="src src-matlab">Kdvf = 5e3<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>1e3)<span class="org-type">*</span>eye(6);
</pre>
</div>
@ -415,10 +421,10 @@ The dynamics is compare with and without the joint flexibility in Figure <a href
</div>
</div>
<div id="outline-container-org552093a" class="outline-4">
<h4 id="org552093a"><span class="section-number-4">2.1.4</span> Conclusion</h4>
<div id="outline-container-org2098f1e" class="outline-4">
<h4 id="org2098f1e"><span class="section-number-4">2.1.4</span> Conclusion</h4>
<div class="outline-text-4" id="text-2-1-4">
<div class="important">
<div class="important" id="org3a7d9f4">
<p>
For the realistic value of the flexible joint axial stiffness, the dynamics is not much impact, and this should not be a problem for control.
</p>
@ -439,7 +445,7 @@ We wish now to see what is the impact of the <b>axial</b> stiffness of the flexi
Let&rsquo;s consider the following values for the axial stiffness:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Kzs = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m]
<pre class="src src-matlab">Kas = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; <span class="org-comment">% [N/m]</span>
</pre>
</div>
@ -448,8 +454,8 @@ We also consider here a nano-hexapod with the identified optimal actuator stiffn
</p>
</div>
<div id="outline-container-orge13b41c" class="outline-4">
<h4 id="orge13b41c"><span class="section-number-4">2.2.1</span> Direct Velocity Feedback</h4>
<div id="outline-container-orgd87b94b" class="outline-4">
<h4 id="orgd87b94b"><span class="section-number-4">2.2.1</span> Direct Velocity Feedback</h4>
<div class="outline-text-4" id="text-2-2-1">
<p>
The dynamics from the actuators to the relative displacement sensor in each leg is identified and shown in Figure <a href="#orgab9ab86">8</a>.
@ -491,8 +497,8 @@ It can be seen that very little active damping can be achieve for axial stiffnes
</div>
</div>
<div id="outline-container-org15c2c08" class="outline-4">
<h4 id="org15c2c08"><span class="section-number-4">2.2.2</span> Primary Control</h4>
<div id="outline-container-orge5d1c12" class="outline-4">
<h4 id="orge5d1c12"><span class="section-number-4">2.2.2</span> Primary Control</h4>
<div class="outline-text-4" id="text-2-2-2">
<p>
The dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for the primary controller designed in the frame of the legs) is shown in Figure <a href="#org6070692">11</a>.
@ -508,10 +514,10 @@ The dynamics from \(\bm{\tau}^\prime\) to \(\bm{\epsilon}_{\mathcal{X}_n}\) (for
</div>
</div>
<div id="outline-container-orgce1052e" class="outline-3">
<h3 id="orgce1052e"><span class="section-number-3">2.3</span> Conclusion</h3>
<div id="outline-container-org382b3cb" class="outline-3">
<h3 id="org382b3cb"><span class="section-number-3">2.3</span> Conclusion</h3>
<div class="outline-text-3" id="text-2-3">
<div class="important">
<div class="important" id="org422e802">
<p>
The axial stiffness of the flexible joints should be maximized.
</p>
@ -533,14 +539,14 @@ We may interpolate the results and say that the axial joint stiffness should be
</div>
</div>
<div id="outline-container-org865157e" class="outline-2">
<h2 id="org865157e"><span class="section-number-2">3</span> Conclusion</h2>
<div id="outline-container-orgb6f6c0a" class="outline-2">
<h2 id="orgb6f6c0a"><span class="section-number-2">3</span> Conclusion</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="org6614f42"></a>
</p>
<div class="important">
<div class="important" id="org3cbf243">
<p>
In this study we considered the bending, torsional and axial stiffnesses of the flexible joints used for the nano-hexapod.
</p>
@ -575,10 +581,80 @@ As there is generally a trade-off between bending stiffness and axial stiffness,
</div>
</div>
</div>
<div id="outline-container-orgdf2870d" class="outline-2">
<h2 id="orgdf2870d"><span class="section-number-2">4</span> Designed Flexible Joints</h2>
<div class="outline-text-2" id="text-4">
</div>
<div id="outline-container-orgd355fcb" class="outline-3">
<h3 id="orgd355fcb"><span class="section-number-3">4.1</span> Initialization</h3>
<div class="outline-text-3" id="text-4-1">
<p>
Let&rsquo;s initialize all the stages with default parameters.
</p>
<div class="org-src-container">
<pre class="src src-matlab">initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod();
initializeAxisc(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
initializeMirror(<span class="org-string">'type'</span>, <span class="org-string">'none'</span>);
initializeMirror();
</pre>
</div>
<p>
Let&rsquo;s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
</p>
<div class="org-src-container">
<pre class="src src-matlab">initializeSample(<span class="org-string">'mass'</span>, 50, <span class="org-string">'freq'</span>, 200<span class="org-type">*</span>ones(6,1));
initializeReferences(<span class="org-string">'Rz_type'</span>, <span class="org-string">'rotating-not-filtered'</span>, <span class="org-string">'Rz_period'</span>, 60);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">flex_joint = load(<span class="org-string">'./mat/flexor_025.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>);
apa = load(<span class="org-string">'./mat/APA300ML_simplified_model.mat'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">initializeNanoHexapod(<span class="org-string">'actuator'</span>, <span class="org-string">'amplified'</span>, ...
<span class="org-string">'ke'</span>, apa.ke, <span class="org-string">'ka'</span>, apa.ka, <span class="org-string">'k1'</span>, apa.k1, <span class="org-string">'c1'</span>, apa.c1, <span class="org-string">'F_gain'</span>, apa.F_gain, ...
<span class="org-string">'type_M'</span>, <span class="org-string">'spherical_3dof'</span>, ...
<span class="org-string">'Kr_M'</span>, flex_joint.K(1,1)<span class="org-type">*</span>ones(6,1), ...
<span class="org-string">'Ka_M'</span>, flex_joint.K(3,3)<span class="org-type">*</span>ones(6,1), ...
<span class="org-string">'Kf_M'</span>, flex_joint.K(4,4)<span class="org-type">*</span>ones(6,1), ...
<span class="org-string">'Kt_M'</span>, flex_joint.K(6,6)<span class="org-type">*</span>ones(6,1), ...
<span class="org-string">'type_F'</span>, <span class="org-string">'spherical_3dof'</span>, ...
<span class="org-string">'Kr_F'</span>, flex_joint.K(1,1)<span class="org-type">*</span>ones(6,1), ...
<span class="org-string">'Ka_F'</span>, flex_joint.K(3,3)<span class="org-type">*</span>ones(6,1), ...
<span class="org-string">'Kf_F'</span>, flex_joint.K(4,4)<span class="org-type">*</span>ones(6,1), ...
<span class="org-string">'Kt_F'</span>, flex_joint.K(6,6)<span class="org-type">*</span>ones(6,1));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">initializeNanoHexapod();
</pre>
</div>
</div>
</div>
<div id="outline-container-org43c7d3c" class="outline-3">
<h3 id="org43c7d3c"><span class="section-number-3">4.2</span> Direct Velocity Feedback</h3>
</div>
<div id="outline-container-org056a1de" class="outline-3">
<h3 id="org056a1de"><span class="section-number-3">4.3</span> Integral Force Feedback</h3>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-05-05 mar. 11:50</p>
<p class="date">Created: 2020-11-03 mar. 09:45</p>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
mat/APA300ML.mat Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
mat/flexor_025.mat Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -534,10 +534,10 @@ We choose realistic values of the axial stiffness of the joints:
\[ K_a = 60\,[N/\mu m] \]
#+begin_src matlab
Kz_F = 60e6*ones(6,1); % [N/m]
Kz_M = 60e6*ones(6,1); % [N/m]
Cz_F = 1*ones(6,1); % [N/(m/s)]
Cz_M = 1*ones(6,1); % [N/(m/s)]
Ka_F = 60e6*ones(6,1); % [N/m]
Ka_M = 60e6*ones(6,1); % [N/m]
Ca_F = 1*ones(6,1); % [N/(m/s)]
Ca_M = 1*ones(6,1); % [N/(m/s)]
#+end_src
*** Initialization
@ -591,10 +591,10 @@ The obtained dynamics are shown in Figure [[fig:flex_joint_trans_dvf]].
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
'type_F', 'universal_3dof', ...
'type_M', 'spherical_3dof', ...
'Kz_F', Kz_F, ...
'Kz_M', Kz_M, ...
'Cz_F', Cz_F, ...
'Cz_M', Cz_M);
'Ka_F', Ka_F, ...
'Ka_M', Ka_M, ...
'Ca_F', Ca_F, ...
'Ca_M', Ca_M);
G_dvf_3dof = linearize(mdl, io);
G_dvf_3dof.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
@ -674,10 +674,10 @@ The dynamics is compare with and without the joint flexibility in Figure [[fig:f
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
'type_F', 'universal_3dof', ...
'type_M', 'spherical_3dof', ...
'Kz_F', Kz_F, ...
'Kz_M', Kz_M, ...
'Cz_F', Cz_F, ...
'Cz_M', Cz_M);
'Ka_F', Ka_F, ...
'Ka_M', Ka_M, ...
'Ca_F', Ca_F, ...
'Ca_M', Ca_M);
G = linearize(mdl, io);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
@ -759,7 +759,7 @@ We wish now to see what is the impact of the *axial* stiffness of the flexible j
Let's consider the following values for the axial stiffness:
#+begin_src matlab
Kzs = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m]
Kas = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m]
#+end_src
We also consider here a nano-hexapod with the identified optimal actuator stiffness ($k = 10^5\,[N/m]$).
@ -788,16 +788,16 @@ It can be seen that very little active damping can be achieve for axial stiffnes
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Force Sensors
G_dvf_3dof_s = {zeros(length(Kzs), 1)};
G_dvf_3dof_s = {zeros(length(Kas), 1)};
for i = 1:length(Kzs)
for i = 1:length(Kas)
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
'type_F', 'universal_3dof', ...
'type_M', 'spherical_3dof', ...
'Kz_F', Kzs(i), ...
'Kz_M', Kzs(i), ...
'Cz_F', 0.05*sqrt(Kzs(i)*10), ...
'Cz_M', 0.05*sqrt(Kzs(i)*10));
'Ka_F', Kas(i), ...
'Ka_M', Kas(i), ...
'Ca_F', 0.05*sqrt(Kas(i)*10), ...
'Ca_M', 0.05*sqrt(Kas(i)*10));
G = linearize(mdl, io);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
@ -814,7 +814,7 @@ It can be seen that very little active damping can be achieve for axial stiffnes
ax1 = subplot(2, 1, 1);
hold on;
for i = 1:length(Kzs)
for i = 1:length(Kas)
plot(freqs, abs(squeeze(freqresp(G_dvf_3dof_s{i}(1, 1), freqs, 'Hz'))));
end
plot(freqs, abs(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz'))), 'k--');
@ -824,9 +824,9 @@ It can be seen that very little active damping can be achieve for axial stiffnes
ax2 = subplot(2, 1, 2);
hold on;
for i = 1:length(Kzs)
for i = 1:length(Kas)
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf_3dof_s{i}(1, 1), freqs, 'Hz')))), ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kzs(i)));
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kas(i)));
end
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz')))), 'k--', ...
'DisplayName', 'Perfect Joint');
@ -855,10 +855,10 @@ It can be seen that very little active damping can be achieve for axial stiffnes
gains = logspace(2, 5, 300);
hold on;
for i = 1:length(Kzs)
for i = 1:length(Kas)
set(gca,'ColorOrderIndex',i);
plot(real(pole(G_dvf_3dof_s{i})), imag(pole(G_dvf_3dof_s{i})), 'x', ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kzs(i)));
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kas(i)));
set(gca,'ColorOrderIndex',i);
plot(real(tzero(G_dvf_3dof_s{i})), imag(tzero(G_dvf_3dof_s{i})), 'o', ...
'HandleVisibility', 'off');
@ -918,16 +918,16 @@ The dynamics from $\bm{\tau}^\prime$ to $\bm{\epsilon}_{\mathcal{X}_n}$ (for the
load('mat/stages.mat', 'nano_hexapod');
Gl_3dof_s = {zeros(length(Kzs), 1)};
Gl_3dof_s = {zeros(length(Kas), 1)};
for i = 1:length(Kzs)
for i = 1:length(Kas)
initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
'type_F', 'universal_3dof', ...
'type_M', 'spherical_3dof', ...
'Kz_F', Kzs(i), ...
'Kz_M', Kzs(i), ...
'Cz_F', 0.05*sqrt(Kzs(i)*10), ...
'Cz_M', 0.05*sqrt(Kzs(i)*10));
'Ka_F', Kas(i), ...
'Ka_M', Kas(i), ...
'Ca_F', 0.05*sqrt(Kas(i)*10), ...
'Ca_M', 0.05*sqrt(Kas(i)*10));
G = linearize(mdl, io);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
@ -946,7 +946,7 @@ The dynamics from $\bm{\tau}^\prime$ to $\bm{\epsilon}_{\mathcal{X}_n}$ (for the
ax1 = subplot(2, 1, 1);
hold on;
for i = 1:length(Kzs)
for i = 1:length(Kas)
plot(freqs, abs(squeeze(freqresp(Gl_3dof_s{i}(1, 1), freqs, 'Hz'))));
end
hold off;
@ -955,9 +955,9 @@ The dynamics from $\bm{\tau}^\prime$ to $\bm{\epsilon}_{\mathcal{X}_n}$ (for the
ax2 = subplot(2, 1, 2);
hold on;
for i = 1:length(Kzs)
for i = 1:length(Kas)
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gl_3dof_s{i}(1, 1), freqs, 'Hz')))), ...
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kzs(i)));
'DisplayName', sprintf('$k = %.0g$ [N/m]', Kas(i)));
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
@ -1012,3 +1012,262 @@ The dynamics from $\bm{\tau}^\prime$ to $\bm{\epsilon}_{\mathcal{X}_n}$ (for the
As there is generally a trade-off between bending stiffness and axial stiffness, it should be highlighted that the *axial* stiffness is the most important property of the flexible joints.
#+end_important
* Designed Flexible Joints
** 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 :tangle no
simulinkproject('../');
#+end_src
#+begin_src matlab
load('mat/conf_simulink.mat');
open('nass_model.slx')
#+end_src
** Initialization
Let's initialize all the stages with default parameters.
#+begin_src matlab
initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod();
initializeAxisc('type', 'none');
initializeMirror('type', 'none');
initializeMirror();
#+end_src
#+begin_src matlab :exports none
initializeSimscapeConfiguration();
initializeDisturbances('enable', false);
initializeLoggingConfiguration('log', 'none');
initializeController('type', 'hac-dvf');
#+end_src
Let's consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
#+begin_src matlab
initializeSample('mass', 50, 'freq', 200*ones(6,1));
initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 60);
#+end_src
#+begin_src matlab :exports none
K = tf(zeros(6));
Kdvf = tf(zeros(6));
#+end_src
#+begin_src matlab
flex_joint = load('./mat/flexor_025.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
apa = load('./mat/APA300ML_simplified_model.mat');
#+end_src
#+begin_src matlab
initializeNanoHexapod('actuator', 'amplified', ...
'ke', apa.ke, 'ka', apa.ka, 'k1', apa.k1, 'c1', apa.c1, 'F_gain', apa.F_gain, ...
'type_M', 'spherical_3dof', ...
'Kr_M', flex_joint.K(1,1)*ones(6,1), ...
'Ka_M', flex_joint.K(3,3)*ones(6,1), ...
'Kf_M', flex_joint.K(4,4)*ones(6,1), ...
'Kt_M', flex_joint.K(6,6)*ones(6,1), ...
'type_F', 'spherical_3dof', ...
'Kr_F', flex_joint.K(1,1)*ones(6,1), ...
'Ka_F', flex_joint.K(3,3)*ones(6,1), ...
'Kf_F', flex_joint.K(4,4)*ones(6,1), ...
'Kt_F', flex_joint.K(6,6)*ones(6,1));
#+end_src
#+begin_src matlab
initializeNanoHexapod();
#+end_src
** Direct Velocity Feedback
#+begin_src matlab :exports none
%% Name of the Simulink File
mdl = 'nass_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Force Sensors
#+end_src
#+begin_src matlab :exports none
G_dvf = linearize(mdl, io);
G_dvf.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G_dvf.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'};
#+end_src
#+begin_src matlab :exports none
freqs = logspace(0, 4, 1000);
figure;
ax1 = subplot(2, 1, 1);
hold on;
plot(freqs, abs(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2);
hold on;
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz')))), ...
'DisplayName', 'Designed Joints');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-270, 90]);
yticks([-360:90:360]);
legend('location', 'northeast');
linkaxes([ax1,ax2],'x');
#+end_src
#+begin_src matlab :exports none
K_iff = 1e6*s/(1 + s/2/pi/100)/(1 + s/2/pi/100);
freqs = logspace(0, 4, 1000);
figure;
ax1 = subplot(2, 1, 1);
hold on;
plot(freqs, abs(squeeze(freqresp(K_iff*G_dvf(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2);
hold on;
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(K_iff*G_dvf(1, 1), freqs, 'Hz')))), ...
'DisplayName', 'Designed Joints');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-270, 90]);
yticks([-360:90:360]);
legend('location', 'northeast');
linkaxes([ax1,ax2],'x');
#+end_src
#+begin_src matlab :exports none
gains = logspace(0, 5, 100);
figure;
hold on;
plot(real(pole(G_dvf)), imag(pole(G_dvf)), 'x');
set(gca,'ColorOrderIndex',1);
plot(real(tzero(G_dvf)), imag(tzero(G_dvf)), 'o');
for i = 1:length(gains)
set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G_dvf, (gains(i)*s/(1+s/2/pi/100)^2)*eye(6)));
plot(real(cl_poles), imag(cl_poles), '.');
end
% ylim([0, 2*pi*500]);
% xlim([-2*pi*500,0]);
xlabel('Real Part')
ylabel('Imaginary Part')
axis square
#+end_src
** Integral Force Feedback
#+begin_src matlab :exports none
%% Name of the Simulink File
mdl = 'nass_model';
%% Input/Output definition
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors
#+end_src
#+begin_src matlab :exports none
G_iff = linearize(mdl, io);
G_iff.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G_iff.OutputName = {'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'};
#+end_src
#+begin_src matlab :exports none
freqs = logspace(0, 4, 1000);
figure;
ax1 = subplot(2, 1, 1);
hold on;
plot(freqs, abs(squeeze(freqresp(G_iff(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2);
hold on;
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_iff(1, 1), freqs, 'Hz')))), ...
'DisplayName', 'Designed Joints');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-270, 90]);
yticks([-360:90:360]);
legend('location', 'northeast');
linkaxes([ax1,ax2],'x');
#+end_src
#+begin_src matlab :exports none
K_iff = -1e4/(s + 2*pi*5)*s/(s + 2*pi*5);
freqs = logspace(-1, 4, 1000);
figure;
ax1 = subplot(2, 1, 1);
hold on;
plot(freqs, abs(squeeze(freqresp(K_iff*G_iff(1, 1), freqs, 'Hz'))));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Loop Gain'); set(gca, 'XTickLabel',[]);
ax2 = subplot(2, 1, 2);
hold on;
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(K_iff*G_iff(1, 1), freqs, 'Hz')))), ...
'DisplayName', 'Designed Joints');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-180, 180]);
yticks([-360:90:360]);
legend('location', 'northeast');
linkaxes([ax1,ax2],'x');
#+end_src
#+begin_src matlab :exports none
gains = logspace(0, 5, 100);
figure;
hold on;
plot(real(pole(G_iff)), imag(pole(G_iff)), 'x');
set(gca,'ColorOrderIndex',1);
plot(real(tzero(G_iff)), imag(tzero(G_iff)), 'o');
for i = 1:length(gains)
set(gca,'ColorOrderIndex',1);
cl_poles = pole(feedback(G_iff, -(gains(i)/(s + 2*pi*5)*s/(s + 2*pi*5))*eye(6)));
plot(real(cl_poles), imag(cl_poles), '.');
end
ylim([0, 2*pi*500]);
xlim([-2*pi*500,0]);
xlabel('Real Part')
ylabel('Imaginary Part')
axis square
#+end_src

View File

@ -278,6 +278,7 @@ The output =sample_pos= corresponds to the impact point of the X-ray.
args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
args.sample_pos (1,1) double {mustBeNumeric} = 0.8 % Height of the measurment point [m]
end
#+end_src
@ -322,7 +323,7 @@ Properties of the Material and link to the geometry of the granite.
Z-offset for the initial position of the sample with respect to the granite top surface.
#+begin_src matlab
granite.sample_pos = 0.8; % [m]
granite.sample_pos = args.sample_pos; % [m]
#+end_src
** Stiffness and Damping properties
@ -1169,7 +1170,7 @@ We define the geometrical values.
#+begin_src matlab
mirror.h = 0.05; % Height of the mirror [m]
mirror.thickness = 0.025; % Thickness of the plate supporting the sample [m]
mirror.thickness = 0.02; % Thickness of the plate supporting the sample [m]
mirror.hole_rad = 0.125; % radius of the hole in the mirror [m]
@ -1178,11 +1179,11 @@ We define the geometrical values.
% point of interest offset in z (above the top surfave) [m]
switch args.type
case 'none'
mirror.jacobian = 0.20;
mirror.jacobian = 0.205;
case 'rigid'
mirror.jacobian = 0.20 - mirror.h;
mirror.jacobian = 0.205 - mirror.h;
case 'flexible'
mirror.jacobian = 0.20 - mirror.h;
mirror.jacobian = 0.205 - mirror.h;
end
mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
@ -1269,8 +1270,8 @@ The =mirror= structure is saved.
arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
% initializeFramesPositions
args.H (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
args.MO_B (1,1) double {mustBeNumeric} = 175e-3
args.H (1,1) double {mustBeNumeric, mustBePositive} = 95e-3
args.MO_B (1,1) double {mustBeNumeric} = 170e-3
% generateGeneralConfiguration
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
@ -1284,25 +1285,28 @@ The =mirror= structure is saved.
args.ke (1,1) double {mustBeNumeric} = 5e6
args.ka (1,1) double {mustBeNumeric} = 60e6
args.c1 (1,1) double {mustBeNumeric} = 10
args.ce (1,1) double {mustBeNumeric} = 10
args.ca (1,1) double {mustBeNumeric} = 10
args.F_gain (1,1) double {mustBeNumeric} = 1
args.k (1,1) double {mustBeNumeric} = -1
args.c (1,1) double {mustBeNumeric} = -1
% initializeJointDynamics
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
args.Ka_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Ca_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
args.Cr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
args.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
args.Cz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
args.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Ca_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
args.Cr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
% initializeCylindricalPlatforms
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
@ -1355,9 +1359,8 @@ The =mirror= structure is saved.
'k1', args.k1*ones(6,1), ...
'c1', args.c1*ones(6,1), ...
'ka', args.ka*ones(6,1), ...
'ca', args.ca*ones(6,1), ...
'ke', args.ke*ones(6,1), ...
'ce', args.ce*ones(6,1));
'F_gain', args.F_gain*ones(6,1));
else
error('args.actuator should be piezo, lorentz or amplified');
end
@ -1367,18 +1370,22 @@ The =mirror= structure is saved.
stewart = initializeJointDynamics(stewart, ...
'type_F', args.type_F, ...
'type_M', args.type_M, ...
'Kf_M' , args.Kf_M, ...
'Cf_M' , args.Cf_M, ...
'Kt_M' , args.Kt_M, ...
'Ct_M' , args.Ct_M, ...
'Kz_M' , args.Kz_M, ...
'Cz_M' , args.Cz_M, ...
'Kf_F' , args.Kf_F, ...
'Cf_F' , args.Cf_F, ...
'Kt_F' , args.Kt_F, ...
'Ct_F' , args.Ct_F, ...
'Kz_F' , args.Kz_F, ...
'Cz_F' , args.Cz_F);
'Kf_M', args.Kf_M, ...
'Cf_M', args.Cf_M, ...
'Kt_M', args.Kt_M, ...
'Ct_M', args.Ct_M, ...
'Kf_F', args.Kf_F, ...
'Cf_F', args.Cf_F, ...
'Kt_F', args.Kt_F, ...
'Ct_F', args.Ct_F, ...
'Ka_F', args.Ka_F, ...
'Ca_F', args.Ca_F, ...
'Kr_F', args.Kr_F, ...
'Cr_F', args.Cr_F, ...
'Ka_M', args.Ka_M, ...
'Ca_M', args.Ca_M, ...
'Kr_M', args.Kr_M, ...
'Cr_M', args.Cr_M);
#+end_src
#+begin_src matlab

View File

@ -198,7 +198,7 @@ This Matlab function is accessible [[file:../src/generateGeneralConfiguration.m]
Joints are positions on a circle centered with the Z axis of {F} and {M} and at a chosen distance from {F} and {M}.
The radius of the circles can be chosen as well as the angles where the joints are located (see Figure [[fig:joint_position_general]]).
#+begin_src latex :file stewart_bottom_plate.pdf
#+begin_src latex :file stewart_bottom_plate.pdf :tangle no
\begin{tikzpicture}
% Internal and external limit
\draw[fill=white!80!black] (0, 0) circle [radius=3];
@ -742,7 +742,7 @@ A simplistic model of such amplified actuator is shown in Figure [[fig:actuator_
- $v_{m}$ represents the absolute velocity of the top part of the actuator
- $d_{m}$ represents the total relative displacement of the actuator
#+begin_src latex :file actuator_model_simple.pdf
#+begin_src latex :file actuator_model_simple.pdf :tangle no
\begin{tikzpicture}
\draw (-1, 0) -- (1, 0);
@ -801,14 +801,13 @@ A simplistic model of such amplified actuator is shown in Figure [[fig:actuator_
args.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical'
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
args.k1 (6,1) double {mustBeNumeric} = 1e6
args.ke (6,1) double {mustBeNumeric} = 5e6
args.ka (6,1) double {mustBeNumeric} = 60e6
args.c1 (6,1) double {mustBeNumeric} = 10
args.ce (6,1) double {mustBeNumeric} = 10
args.ca (6,1) double {mustBeNumeric} = 10
args.me (6,1) double {mustBeNumeric} = 0.05
args.ma (6,1) double {mustBeNumeric} = 0.05
args.k1 (6,1) double {mustBeNumeric} = 1e6*ones(6,1)
args.ke (6,1) double {mustBeNumeric} = 5e6*ones(6,1)
args.ka (6,1) double {mustBeNumeric} = 60e6*ones(6,1)
args.c1 (6,1) double {mustBeNumeric} = 10*ones(6,1)
args.F_gain (6,1) double {mustBeNumeric} = 1*ones(6,1)
args.me (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
args.ma (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
end
#+end_src
@ -830,144 +829,14 @@ A simplistic model of such amplified actuator is shown in Figure [[fig:actuator_
stewart.actuators.c1 = args.c1;
stewart.actuators.ka = args.ka;
stewart.actuators.ca = args.ca;
stewart.actuators.ke = args.ke;
stewart.actuators.ce = args.ce;
stewart.actuators.F_gain = args.F_gain;
stewart.actuators.ma = args.ma;
stewart.actuators.me = args.me;
#+end_src
* =initializeAmplifiedStrutDynamics=: Add Stiffness and Damping properties of each strut for an amplified piezoelectric actuator
:PROPERTIES:
:header-args:matlab+: :tangle ../src/initializeAmplifiedStrutDynamics.m
:header-args:matlab+: :comments none :mkdirp yes :eval no
:END:
<<sec:initializeAmplifiedStrutDynamics>>
This Matlab function is accessible [[file:../src/initializeAmplifiedStrutDynamics.m][here]].
** Documentation
:PROPERTIES:
:UNNUMBERED: t
:END:
An amplified piezoelectric actuator is shown in Figure [[fig:cedrat_apa95ml]].
#+name: fig:cedrat_apa95ml
#+attr_html: :width 500px
#+caption: Example of an Amplified piezoelectric actuator with an integrated displacement sensor (Cedrat Technologies)
[[file:figs/amplified_piezo_with_displacement_sensor.jpg]]
A simplistic model of such amplified actuator is shown in Figure [[fig:amplified_piezo_model]] where:
- $K_{r}$ represent the vertical stiffness when the piezoelectric stack is removed
- $K_{a}$ is the vertical stiffness contribution of the piezoelectric stack
- $F_{i}$ represents the part of the piezoelectric stack that is used as a force actuator
- $F_{m,i}$ represents the remaining part of the piezoelectric stack that is used as a force sensor
- $v_{m,i}$ represents the absolute velocity of the top part of the actuator
- $d_{m,i}$ represents the total relative displacement of the actuator
#+begin_src latex :file iff_1dof.pdf
\begin{tikzpicture}
% Ground
\draw (-1.2, 0) -- (1, 0);
% Mass
\draw (-1.2, 1.4) -- ++(2.2, 0);
\node[forcesensor={0.4}{0.4}] (fsensn) at (0, 1){};
\draw[] (-0.4, 1) -- (0.4, 1);
\node[right] at (fsensn.east) {$F_{m}$};
% Spring, Damper, and Actuator
\draw[spring] (-0.4, 0) -- (-0.4, 1) node[midway, right=0.1]{$K_{a}$};
\draw[actuator={0.4}{0.2}] (0.4, 0) -- (0.4, 1) node[midway, right=0.1]{$F$};
\draw[spring] (-1, 0) -- (-1, 1.4) node[midway, left=0.1]{$K_{r}$};
\draw[dashed] (1, 0) -- ++(0.4, 0);
\draw[dashed] (1, 1.4) -- ++(0.4, 0);
\draw[->] (0, 1.4)node[]{$\bullet$} -- ++(0, 0.5) node[right]{$v_{m}$};
\draw[<->] (1.4, 0) -- ++(0, 1.4) node[midway, right]{$d_{m}$};
\end{tikzpicture}
#+end_src
#+name: fig:amplified_piezo_model
#+caption: Model of an amplified actuator
#+RESULTS:
[[file:figs/iff_1dof.png]]
** Function description
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
function [stewart] = initializeAmplifiedStrutDynamics(stewart, args)
% initializeAmplifiedStrutDynamics - Add Stiffness and Damping properties of each strut
%
% Syntax: [stewart] = initializeAmplifiedStrutDynamics(args)
%
% Inputs:
% - args - Structure with the following fields:
% - Ka [6x1] - Vertical stiffness contribution of the piezoelectric stack [N/m]
% - Ca [6x1] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
% - Kr [6x1] - Vertical (residual) stiffness when the piezoelectric stack is removed [N/m]
% - Cr [6x1] - Vertical (residual) damping when the piezoelectric stack is removed [N/(m/s)]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - actuators.type = 2
% - actuators.K [6x1] - Total Stiffness of each strut [N/m]
% - actuators.C [6x1] - Total Damping of each strut [N/(m/s)]
% - actuators.Ka [6x1] - Vertical stiffness contribution of the piezoelectric stack [N/m]
% - actuators.Ca [6x1] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
% - actuators.Kr [6x1] - Vertical stiffness when the piezoelectric stack is removed [N/m]
% - actuators.Cr [6x1] - Vertical damping when the piezoelectric stack is removed [N/(m/s)]
#+end_src
** Optional Parameters
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
arguments
stewart
args.Kr (6,1) double {mustBeNumeric, mustBeNonnegative} = 5e6*ones(6,1)
args.Cr (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Ka (6,1) double {mustBeNumeric, mustBeNonnegative} = 15e6*ones(6,1)
args.Ca (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
end
#+end_src
** Compute the total stiffness and damping
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
K = args.Ka + args.Kr;
C = args.Ca + args.Cr;
#+end_src
** Populate the =stewart= structure
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
stewart.actuators.type = 2;
stewart.actuators.Ka = args.Ka;
stewart.actuators.Ca = args.Ca;
stewart.actuators.Kr = args.Kr;
stewart.actuators.Cr = args.Cr;
stewart.actuators.K = K;
stewart.actuators.C = K;
#+end_src
* =initializeJointDynamics=: Add Stiffness and Damping properties for spherical joints
:PROPERTIES:
:header-args:matlab+: :tangle ../src/initializeJointDynamics.m
@ -995,14 +864,10 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
% - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
% - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
% - Kz_M [6x1] - Translation (Tz) Stiffness for each top joints [N/m]
% - Cz_M [6x1] - Translation (Tz) Damping of each top joint [N/m]
% - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
% - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
% - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
% - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
% - Kz_F [6x1] - Translation (Tz) Stiffness for each bottom joints [N/m]
% - Cz_F [6x1] - Translation (Tz) Damping of each bottom joint [N/m]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
@ -1023,20 +888,34 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
#+begin_src matlab
arguments
stewart
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
args.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
args.Cz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
args.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Ca_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
args.Cr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Ka_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Ca_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
args.Cr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.K_M double {mustBeNumeric} = zeros(6,6)
args.M_M double {mustBeNumeric} = zeros(6,6)
args.n_xyz_M double {mustBeNumeric} = zeros(2,3)
args.xi_M double {mustBeNumeric} = 0.1
args.step_file_M char {} = ''
args.K_F double {mustBeNumeric} = zeros(6,6)
args.M_F double {mustBeNumeric} = zeros(6,6)
args.n_xyz_F double {mustBeNumeric} = zeros(2,3)
args.xi_F double {mustBeNumeric} = 0.1
args.step_file_F char {} = ''
end
#+end_src
@ -1051,11 +930,15 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
case 'spherical'
stewart.joints_F.type = 2;
case 'universal_p'
stewart.joints_F.type = 1;
stewart.joints_F.type = 3;
case 'spherical_p'
stewart.joints_F.type = 2;
case 'universal_3dof'
stewart.joints_F.type = 4;
case 'flexible'
stewart.joints_F.type = 5;
case 'universal_3dof'
stewart.joints_F.type = 6;
case 'spherical_3dof'
stewart.joints_F.type = 7;
end
switch args.type_M
@ -1064,56 +947,38 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
case 'spherical'
stewart.joints_M.type = 2;
case 'universal_p'
stewart.joints_M.type = 1;
stewart.joints_M.type = 3;
case 'spherical_p'
stewart.joints_M.type = 2;
case 'spherical_3dof'
stewart.joints_M.type = 4;
case 'flexible'
stewart.joints_M.type = 5;
case 'universal_3dof'
stewart.joints_M.type = 6;
case 'spherical_3dof'
stewart.joints_M.type = 7;
end
#+end_src
** Initialize Stiffness
#+begin_src matlab
stewart.joints_M.Kx = zeros(6,1);
stewart.joints_M.Ky = zeros(6,1);
stewart.joints_M.Kz = zeros(6,1);
stewart.joints_F.Kx = zeros(6,1);
stewart.joints_F.Ky = zeros(6,1);
stewart.joints_F.Kz = zeros(6,1);
stewart.joints_M.Kf = zeros(6,1);
stewart.joints_M.Kt = zeros(6,1);
stewart.joints_F.Kf = zeros(6,1);
stewart.joints_F.Kt = zeros(6,1);
stewart.joints_M.Cx = zeros(6,1);
stewart.joints_M.Cy = zeros(6,1);
stewart.joints_M.Cz = zeros(6,1);
stewart.joints_F.Cx = zeros(6,1);
stewart.joints_F.Cy = zeros(6,1);
stewart.joints_F.Cz = zeros(6,1);
stewart.joints_M.Cf = zeros(6,1);
stewart.joints_M.Ct = zeros(6,1);
stewart.joints_F.Cf = zeros(6,1);
stewart.joints_F.Ct = zeros(6,1);
#+end_src
** Add Stiffness and Damping in Translation of each strut
:PROPERTIES:
:UNNUMBERED: t
:END:
Translation Stiffness
Axial and Radial (shear) Stiffness
#+begin_src matlab
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
stewart.joints_M.Kz = args.Kz_M;
stewart.joints_M.Cz = args.Cz_M;
end
stewart.joints_M.Ka = args.Ka_M;
stewart.joints_M.Kr = args.Kr_M;
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
stewart.joints_F.Kz = args.Kz_F;
stewart.joints_F.Cz = args.Cz_F;
end
stewart.joints_F.Ka = args.Ka_F;
stewart.joints_F.Kr = args.Kr_F;
#+end_src
Translation Damping
#+begin_src matlab
stewart.joints_M.Ca = args.Ca_M;
stewart.joints_M.Cr = args.Cr_M;
stewart.joints_F.Ca = args.Ca_F;
stewart.joints_F.Cr = args.Cr_F;
#+end_src
** Add Stiffness and Damping in Rotation of each strut
@ -1122,21 +987,40 @@ Translation Stiffness
:END:
Rotational Stiffness
#+begin_src matlab
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
stewart.joints_M.Kf = args.Kf_M;
stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Kf = args.Kf_M;
stewart.joints_M.Kt = args.Kt_M;
stewart.joints_M.Kt = args.Kt_M;
stewart.joints_M.Ct = args.Ct_M;
end
stewart.joints_F.Kf = args.Kf_F;
stewart.joints_F.Kt = args.Kt_F;
#+end_src
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
stewart.joints_F.Kf = args.Kf_F;
stewart.joints_F.Cf = args.Cf_F;
Rotational Damping
#+begin_src matlab
stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Ct = args.Ct_M;
stewart.joints_F.Kt = args.Kt_F;
stewart.joints_F.Ct = args.Ct_F;
end
stewart.joints_F.Cf = args.Cf_F;
stewart.joints_F.Ct = args.Ct_F;
#+end_src
** Stiffness and Mass matrices for flexible joint
:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_src matlab
stewart.joints_F.M = args.M_F;
stewart.joints_F.K = args.K_F;
stewart.joints_F.n_xyz = args.n_xyz_F;
stewart.joints_F.xi = args.xi_F;
stewart.joints_F.xi = args.xi_F;
stewart.joints_F.step_file = args.step_file_F;
stewart.joints_M.M = args.M_M;
stewart.joints_M.K = args.K_M;
stewart.joints_M.n_xyz = args.n_xyz_M;
stewart.joints_M.xi = args.xi_M;
stewart.joints_M.step_file = args.step_file_M;
#+end_src
* =initializeInertialSensor=: Initialize the inertial sensor in each strut

View File

@ -46,6 +46,10 @@ switch stewart.joints_F.type
fprintf('- The joints on the fixed based are universal joints\n')
case 2
fprintf('- The joints on the fixed based are spherical joints\n')
case 3
fprintf('- The joints on the fixed based are perfect universal joints\n')
case 4
fprintf('- The joints on the fixed based are perfect spherical joints\n')
end
switch stewart.joints_M.type
@ -53,6 +57,10 @@ switch stewart.joints_M.type
fprintf('- The joints on the mobile based are universal joints\n')
case 2
fprintf('- The joints on the mobile based are spherical joints\n')
case 3
fprintf('- The joints on the mobile based are perfect universal joints\n')
case 4
fprintf('- The joints on the mobile based are perfect spherical joints\n')
end
fprintf('- The position of the joints on the fixed based with respect to {F} are (in [mm]):\n')

View File

@ -9,6 +9,7 @@ arguments
args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m]
args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m]
args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m]
args.sample_pos (1,1) double {mustBeNumeric} = 0.8 % Height of the measurment point [m]
end
granite = struct();
@ -29,7 +30,7 @@ end
granite.density = args.density; % [kg/m3]
granite.STEP = './STEPS/granite/granite.STEP';
granite.sample_pos = 0.8; % [m]
granite.sample_pos = args.sample_pos; % [m]
granite.K = args.K; % [N/m]
granite.C = args.C; % [N/(m/s)]

View File

@ -11,14 +11,10 @@ function [stewart] = initializeJointDynamics(stewart, args)
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
% - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
% - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
% - Kz_M [6x1] - Translation (Tz) Stiffness for each top joints [N/m]
% - Cz_M [6x1] - Translation (Tz) Damping of each top joint [N/m]
% - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
% - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
% - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
% - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
% - Kz_F [6x1] - Translation (Tz) Stiffness for each bottom joints [N/m]
% - Cz_F [6x1] - Translation (Tz) Damping of each bottom joint [N/m]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
@ -33,20 +29,34 @@ function [stewart] = initializeJointDynamics(stewart, args)
arguments
stewart
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
args.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
args.Cz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
args.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Ca_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
args.Cr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Ka_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Ca_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
args.Cr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.K_M double {mustBeNumeric} = zeros(6,6)
args.M_M double {mustBeNumeric} = zeros(6,6)
args.n_xyz_M double {mustBeNumeric} = zeros(2,3)
args.xi_M double {mustBeNumeric} = 0.1
args.step_file_M char {} = ''
args.K_F double {mustBeNumeric} = zeros(6,6)
args.M_F double {mustBeNumeric} = zeros(6,6)
args.n_xyz_F double {mustBeNumeric} = zeros(2,3)
args.xi_F double {mustBeNumeric} = 0.1
args.step_file_F char {} = ''
end
switch args.type_F
@ -55,11 +65,15 @@ switch args.type_F
case 'spherical'
stewart.joints_F.type = 2;
case 'universal_p'
stewart.joints_F.type = 1;
stewart.joints_F.type = 3;
case 'spherical_p'
stewart.joints_F.type = 2;
case 'universal_3dof'
stewart.joints_F.type = 4;
case 'flexible'
stewart.joints_F.type = 5;
case 'universal_3dof'
stewart.joints_F.type = 6;
case 'spherical_3dof'
stewart.joints_F.type = 7;
end
switch args.type_M
@ -68,59 +82,50 @@ switch args.type_M
case 'spherical'
stewart.joints_M.type = 2;
case 'universal_p'
stewart.joints_M.type = 1;
stewart.joints_M.type = 3;
case 'spherical_p'
stewart.joints_M.type = 2;
case 'spherical_3dof'
stewart.joints_M.type = 4;
case 'flexible'
stewart.joints_M.type = 5;
case 'universal_3dof'
stewart.joints_M.type = 6;
case 'spherical_3dof'
stewart.joints_M.type = 7;
end
stewart.joints_M.Kx = zeros(6,1);
stewart.joints_M.Ky = zeros(6,1);
stewart.joints_M.Kz = zeros(6,1);
stewart.joints_F.Kx = zeros(6,1);
stewart.joints_F.Ky = zeros(6,1);
stewart.joints_F.Kz = zeros(6,1);
stewart.joints_M.Ka = args.Ka_M;
stewart.joints_M.Kr = args.Kr_M;
stewart.joints_M.Kf = zeros(6,1);
stewart.joints_M.Kt = zeros(6,1);
stewart.joints_F.Kf = zeros(6,1);
stewart.joints_F.Kt = zeros(6,1);
stewart.joints_F.Ka = args.Ka_F;
stewart.joints_F.Kr = args.Kr_F;
stewart.joints_M.Cx = zeros(6,1);
stewart.joints_M.Cy = zeros(6,1);
stewart.joints_M.Cz = zeros(6,1);
stewart.joints_F.Cx = zeros(6,1);
stewart.joints_F.Cy = zeros(6,1);
stewart.joints_F.Cz = zeros(6,1);
stewart.joints_M.Ca = args.Ca_M;
stewart.joints_M.Cr = args.Cr_M;
stewart.joints_M.Cf = zeros(6,1);
stewart.joints_M.Ct = zeros(6,1);
stewart.joints_F.Cf = zeros(6,1);
stewart.joints_F.Ct = zeros(6,1);
stewart.joints_F.Ca = args.Ca_F;
stewart.joints_F.Cr = args.Cr_F;
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
stewart.joints_M.Kz = args.Kz_M;
stewart.joints_M.Cz = args.Cz_M;
end
stewart.joints_M.Kf = args.Kf_M;
stewart.joints_M.Kt = args.Kt_M;
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
stewart.joints_F.Kz = args.Kz_F;
stewart.joints_F.Cz = args.Cz_F;
end
stewart.joints_F.Kf = args.Kf_F;
stewart.joints_F.Kt = args.Kt_F;
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p')
stewart.joints_M.Kf = args.Kf_M;
stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Ct = args.Ct_M;
stewart.joints_M.Kt = args.Kt_M;
stewart.joints_M.Ct = args.Ct_M;
end
stewart.joints_F.Cf = args.Cf_F;
stewart.joints_F.Ct = args.Ct_F;
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p')
stewart.joints_F.Kf = args.Kf_F;
stewart.joints_F.Cf = args.Cf_F;
stewart.joints_F.M = args.M_F;
stewart.joints_F.K = args.K_F;
stewart.joints_F.n_xyz = args.n_xyz_F;
stewart.joints_F.xi = args.xi_F;
stewart.joints_F.xi = args.xi_F;
stewart.joints_F.step_file = args.step_file_F;
stewart.joints_F.Kt = args.Kt_F;
stewart.joints_F.Ct = args.Ct_F;
end
stewart.joints_M.M = args.M_M;
stewart.joints_M.K = args.K_M;
stewart.joints_M.n_xyz = args.n_xyz_M;
stewart.joints_M.xi = args.xi_M;
stewart.joints_M.step_file = args.step_file_M;

View File

@ -32,7 +32,7 @@ mirror.Deq = zeros(6,1);
mirror.h = 0.05; % Height of the mirror [m]
mirror.thickness = 0.025; % Thickness of the plate supporting the sample [m]
mirror.thickness = 0.02; % Thickness of the plate supporting the sample [m]
mirror.hole_rad = 0.125; % radius of the hole in the mirror [m]
@ -41,11 +41,11 @@ mirror.support_rad = 0.1; % radius of the support plate [m]
% point of interest offset in z (above the top surfave) [m]
switch args.type
case 'none'
mirror.jacobian = 0.20;
mirror.jacobian = 0.205;
case 'rigid'
mirror.jacobian = 0.20 - mirror.h;
mirror.jacobian = 0.205 - mirror.h;
case 'flexible'
mirror.jacobian = 0.20 - mirror.h;
mirror.jacobian = 0.205 - mirror.h;
end
mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]

View File

@ -3,8 +3,8 @@ function [nano_hexapod] = initializeNanoHexapod(args)
arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
% initializeFramesPositions
args.H (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
args.MO_B (1,1) double {mustBeNumeric} = 175e-3
args.H (1,1) double {mustBeNumeric, mustBePositive} = 95e-3
args.MO_B (1,1) double {mustBeNumeric} = 170e-3
% generateGeneralConfiguration
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
@ -18,25 +18,28 @@ arguments
args.ke (1,1) double {mustBeNumeric} = 5e6
args.ka (1,1) double {mustBeNumeric} = 60e6
args.c1 (1,1) double {mustBeNumeric} = 10
args.ce (1,1) double {mustBeNumeric} = 10
args.ca (1,1) double {mustBeNumeric} = 10
args.F_gain (1,1) double {mustBeNumeric} = 1
args.k (1,1) double {mustBeNumeric} = -1
args.c (1,1) double {mustBeNumeric} = -1
% initializeJointDynamics
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'spherical_3dof'})} = 'spherical'
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'universal'
args.type_M char {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof', 'spherical_3dof', 'flexible'})} = 'spherical'
args.Ka_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Ca_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
args.Cr_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
args.Kz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
args.Cz_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*ones(6,1)
args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 236*ones(6,1)
args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
args.Kz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 60e6*ones(6,1)
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*ones(6,1)
args.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Ca_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
args.Kr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.1e7*ones(6,1)
args.Cr_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
% initializeCylindricalPlatforms
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
@ -81,9 +84,8 @@ elseif strcmp(args.actuator, 'amplified')
'k1', args.k1*ones(6,1), ...
'c1', args.c1*ones(6,1), ...
'ka', args.ka*ones(6,1), ...
'ca', args.ca*ones(6,1), ...
'ke', args.ke*ones(6,1), ...
'ce', args.ce*ones(6,1));
'F_gain', args.F_gain*ones(6,1));
else
error('args.actuator should be piezo, lorentz or amplified');
end
@ -91,18 +93,22 @@ end
stewart = initializeJointDynamics(stewart, ...
'type_F', args.type_F, ...
'type_M', args.type_M, ...
'Kf_M' , args.Kf_M, ...
'Cf_M' , args.Cf_M, ...
'Kt_M' , args.Kt_M, ...
'Ct_M' , args.Ct_M, ...
'Kz_M' , args.Kz_M, ...
'Cz_M' , args.Cz_M, ...
'Kf_F' , args.Kf_F, ...
'Cf_F' , args.Cf_F, ...
'Kt_F' , args.Kt_F, ...
'Ct_F' , args.Ct_F, ...
'Kz_F' , args.Kz_F, ...
'Cz_F' , args.Cz_F);
'Kf_M', args.Kf_M, ...
'Cf_M', args.Cf_M, ...
'Kt_M', args.Kt_M, ...
'Ct_M', args.Ct_M, ...
'Kf_F', args.Kf_F, ...
'Cf_F', args.Cf_F, ...
'Kt_F', args.Kt_F, ...
'Ct_F', args.Ct_F, ...
'Ka_F', args.Ka_F, ...
'Ca_F', args.Ca_F, ...
'Kr_F', args.Kr_F, ...
'Cr_F', args.Cr_F, ...
'Ka_M', args.Ka_M, ...
'Ca_M', args.Ca_M, ...
'Kr_M', args.Kr_M, ...
'Cr_M', args.Cr_M);
stewart = initializeCylindricalPlatforms(stewart, 'Fpm', args.Fpm, 'Fph', args.Fph, 'Fpr', args.Fpr, 'Mpm', args.Mpm, 'Mph', args.Mph, 'Mpr', args.Mpr);

View File

@ -19,14 +19,13 @@ arguments
args.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical'
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
args.k1 (6,1) double {mustBeNumeric} = 1e6
args.ke (6,1) double {mustBeNumeric} = 5e6
args.ka (6,1) double {mustBeNumeric} = 60e6
args.c1 (6,1) double {mustBeNumeric} = 10
args.ce (6,1) double {mustBeNumeric} = 10
args.ca (6,1) double {mustBeNumeric} = 10
args.me (6,1) double {mustBeNumeric} = 0.05
args.ma (6,1) double {mustBeNumeric} = 0.05
args.k1 (6,1) double {mustBeNumeric} = 1e6*ones(6,1)
args.ke (6,1) double {mustBeNumeric} = 5e6*ones(6,1)
args.ka (6,1) double {mustBeNumeric} = 60e6*ones(6,1)
args.c1 (6,1) double {mustBeNumeric} = 10*ones(6,1)
args.F_gain (6,1) double {mustBeNumeric} = 1*ones(6,1)
args.me (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
args.ma (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
end
if strcmp(args.type, 'classical')
@ -42,10 +41,9 @@ stewart.actuators.k1 = args.k1;
stewart.actuators.c1 = args.c1;
stewart.actuators.ka = args.ka;
stewart.actuators.ca = args.ca;
stewart.actuators.ke = args.ke;
stewart.actuators.ce = args.ce;
stewart.actuators.F_gain = args.F_gain;
stewart.actuators.ma = args.ma;
stewart.actuators.me = args.me;