Model flexible nano-hexapod elements

This commit is contained in:
2020-11-03 09:45:50 +01:00
parent 184c755fb8
commit bd054638b2
23 changed files with 2872 additions and 2739 deletions
+146 -70
View File
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-05-05 mar. 11:50 --> <!-- 2020-11-03 mar. 09:45 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Study of the Flexible Joints</title> <title>Study of the Flexible Joints</title>
<meta name="generator" content="Org mode" /> <meta name="generator" content="Org mode" />
@@ -37,19 +36,19 @@
<ul> <ul>
<li><a href="#orge032d30">1. Bending and Torsional Stiffness</a> <li><a href="#orge032d30">1. Bending and Torsional Stiffness</a>
<ul> <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> <li><a href="#orgde60939">1.2. Realistic Bending Stiffness Values</a>
<ul> <ul>
<li><a href="#orgdb214f9">1.2.1. Direct Velocity Feedback</a></li> <li><a href="#orge13b41c">1.2.1. Direct Velocity Feedback</a></li>
<li><a href="#org4069e58">1.2.2. Primary Plant</a></li> <li><a href="#orgd5fd59b">1.2.2. Primary Plant</a></li>
<li><a href="#orga32adf0">1.2.3. Conclusion</a></li> <li><a href="#org865157e">1.2.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org8ad3f34">1.3. Parametric Study</a> <li><a href="#org8ad3f34">1.3. Parametric Study</a>
<ul> <ul>
<li><a href="#org4adf147">1.3.1. Direct Velocity Feedback</a></li> <li><a href="#orgc98ee7c">1.3.1. Direct Velocity Feedback</a></li>
<li><a href="#org53e5f08">1.3.2. Primary Control</a></li> <li><a href="#org15c2c08">1.3.2. Primary Control</a></li>
<li><a href="#orgc45ccb0">1.3.3. Conclusion</a></li> <li><a href="#org5322ecd">1.3.3. Conclusion</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@@ -58,22 +57,29 @@
<ul> <ul>
<li><a href="#org969d9e7">2.1. Realistic Translation Stiffness Values</a> <li><a href="#org969d9e7">2.1. Realistic Translation Stiffness Values</a>
<ul> <ul>
<li><a href="#orge82a7c2">2.1.1. Initialization</a></li> <li><a href="#org7dd21d5">2.1.1. Initialization</a></li>
<li><a href="#org44f67b8">2.1.2. Direct Velocity Feedback</a></li> <li><a href="#org47be52b">2.1.2. Direct Velocity Feedback</a></li>
<li><a href="#orgd5fd59b">2.1.3. Primary Plant</a></li> <li><a href="#org15105f5">2.1.3. Primary Plant</a></li>
<li><a href="#org552093a">2.1.4. Conclusion</a></li> <li><a href="#org2098f1e">2.1.4. Conclusion</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org0275632">2.2. Parametric study</a> <li><a href="#org0275632">2.2. Parametric study</a>
<ul> <ul>
<li><a href="#orge13b41c">2.2.1. Direct Velocity Feedback</a></li> <li><a href="#orgd87b94b">2.2.1. Direct Velocity Feedback</a></li>
<li><a href="#org15c2c08">2.2.2. Primary Control</a></li> <li><a href="#orge5d1c12">2.2.2. Primary Control</a></li>
</ul> </ul>
</li> </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> </ul>
</li> </li>
<li><a href="#org865157e">3. Conclusion</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -106,8 +112,8 @@ In this section, we wish to study the effect of the rotation flexibility of the
</p> </p>
</div> </div>
<div id="outline-container-org8fdef7f" class="outline-3"> <div id="outline-container-orge82a7c2" class="outline-3">
<h3 id="org8fdef7f"><span class="section-number-3">1.1</span> Initialization</h3> <h3 id="orge82a7c2"><span class="section-number-3">1.1</span> Initialization</h3>
<div class="outline-text-3" id="text-1-1"> <div class="outline-text-3" id="text-1-1">
<p> <p>
Let&rsquo;s initialize all the stages with default parameters. 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. Let&rsquo;s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">initializeSample('mass', 50, 'freq', 200*ones(6,1)); <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('Rz_type', 'rotating-not-filtered', 'Rz_period', 60); 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> </pre>
</div> </div>
</div> </div>
@@ -147,10 +153,10 @@ Let&rsquo;s compare the ideal case (zero stiffness in rotation and infinite stif
</ul> </ul>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">Kf_M = 15*ones(6,1); <pre class="src src-matlab">Kf_M = 15<span class="org-type">*</span>ones(6,1);
Kf_F = 15*ones(6,1); Kf_F = 15<span class="org-type">*</span>ones(6,1);
Kt_M = 20*ones(6,1); Kt_M = 20<span class="org-type">*</span>ones(6,1);
Kt_F = 20*ones(6,1); Kt_F = 20<span class="org-type">*</span>ones(6,1);
</pre> </pre>
</div> </div>
@@ -158,8 +164,8 @@ Kt_F = 20*ones(6,1);
The stiffness and damping of the nano-hexapod&rsquo;s legs are: The stiffness and damping of the nano-hexapod&rsquo;s legs are:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">k_opt = 1e5; % [N/m] <pre class="src src-matlab">k_opt = 1e5; <span class="org-comment">% [N/m]</span>
c_opt = 2e2; % [N/(m/s)] c_opt = 2e2; <span class="org-comment">% [N/(m/s)]</span>
</pre> </pre>
</div> </div>
@@ -168,8 +174,8 @@ This corresponds to the optimal identified stiffness.
</p> </p>
</div> </div>
<div id="outline-container-orgdb214f9" class="outline-4"> <div id="outline-container-orge13b41c" class="outline-4">
<h4 id="orgdb214f9"><span class="section-number-4">1.2.1</span> Direct Velocity Feedback</h4> <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"> <div class="outline-text-4" id="text-1-2-1">
<p> <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. 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> </div>
<div id="outline-container-org4069e58" class="outline-4"> <div id="outline-container-orgd5fd59b" class="outline-4">
<h4 id="org4069e58"><span class="section-number-4">1.2.2</span> Primary Plant</h4> <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"> <div class="outline-text-4" id="text-1-2-2">
<p> <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). 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> </div>
<div id="outline-container-orga32adf0" class="outline-4"> <div id="outline-container-org865157e" class="outline-4">
<h4 id="orga32adf0"><span class="section-number-4">1.2.3</span> Conclusion</h4> <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="outline-text-4" id="text-1-2-3">
<div class="important"> <div class="important" id="org69f9617">
<p> <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. 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> </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: Let&rsquo;s consider the following bending stiffness of the flexible joints:
</p> </p>
<div class="org-src-container"> <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> </pre>
</div> </div>
@@ -248,8 +254,8 @@ We also consider here a nano-hexapod with the identified optimal actuator stiffn
</p> </p>
</div> </div>
<div id="outline-container-org4adf147" class="outline-4"> <div id="outline-container-orgc98ee7c" class="outline-4">
<h4 id="org4adf147"><span class="section-number-4">1.3.1</span> Direct Velocity Feedback</h4> <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"> <div class="outline-text-4" id="text-1-3-1">
<p> <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>. 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> </div>
<div id="outline-container-org53e5f08" class="outline-4"> <div id="outline-container-org15c2c08" class="outline-4">
<h4 id="org53e5f08"><span class="section-number-4">1.3.2</span> Primary Control</h4> <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"> <div class="outline-text-4" id="text-1-3-2">
<p> <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>. 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> </div>
<div id="outline-container-orgc45ccb0" class="outline-4"> <div id="outline-container-org5322ecd" class="outline-4">
<h4 id="orgc45ccb0"><span class="section-number-4">1.3.3</span> Conclusion</h4> <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="outline-text-4" id="text-1-3-3">
<div class="important"> <div class="important" id="orga223c1a">
<p> <p>
The bending stiffness of the flexible joint does not significantly change the dynamics. The bending stiffness of the flexible joint does not significantly change the dynamics.
</p> </p>
@@ -333,16 +339,16 @@ We choose realistic values of the axial stiffness of the joints:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">Kz_F = 60e6*ones(6,1); % [N/m] <pre class="src src-matlab">Ka_F = 60e6<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/m]</span>
Kz_M = 60e6*ones(6,1); % [N/m] Ka_M = 60e6<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/m]</span>
Cz_F = 1*ones(6,1); % [N/(m/s)] Ca_F = 1<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/(m/s)]</span>
Cz_M = 1*ones(6,1); % [N/(m/s)] Ca_M = 1<span class="org-type">*</span>ones(6,1); <span class="org-comment">% [N/(m/s)]</span>
</pre> </pre>
</div> </div>
</div> </div>
<div id="outline-container-orge82a7c2" class="outline-4"> <div id="outline-container-org7dd21d5" class="outline-4">
<h4 id="orge82a7c2"><span class="section-number-4">2.1.1</span> Initialization</h4> <h4 id="org7dd21d5"><span class="section-number-4">2.1.1</span> Initialization</h4>
<div class="outline-text-4" id="text-2-1-1"> <div class="outline-text-4" id="text-2-1-1">
<p> <p>
Let&rsquo;s initialize all the stages with default parameters. 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. Let&rsquo;s consider the heaviest mass which should we the most problematic with it comes to the flexible joints.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-matlab">initializeSample('mass', 50, 'freq', 200*ones(6,1)); <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('Rz_type', 'rotating-not-filtered', 'Rz_period', 60); 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> </pre>
</div> </div>
</div> </div>
</div> </div>
<div id="outline-container-org44f67b8" class="outline-4"> <div id="outline-container-org47be52b" class="outline-4">
<h4 id="org44f67b8"><span class="section-number-4">2.1.2</span> Direct Velocity Feedback</h4> <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"> <div class="outline-text-4" id="text-2-1-2">
<p> <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. 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> </div>
<div id="outline-container-orgd5fd59b" class="outline-4"> <div id="outline-container-org15105f5" class="outline-4">
<h4 id="orgd5fd59b"><span class="section-number-4">2.1.3</span> Primary Plant</h4> <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="outline-text-4" id="text-2-1-3">
<div class="org-src-container"> <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> </pre>
</div> </div>
@@ -415,10 +421,10 @@ The dynamics is compare with and without the joint flexibility in Figure <a href
</div> </div>
</div> </div>
<div id="outline-container-org552093a" class="outline-4"> <div id="outline-container-org2098f1e" class="outline-4">
<h4 id="org552093a"><span class="section-number-4">2.1.4</span> Conclusion</h4> <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="outline-text-4" id="text-2-1-4">
<div class="important"> <div class="important" id="org3a7d9f4">
<p> <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. 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> </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: Let&rsquo;s consider the following values for the axial stiffness:
</p> </p>
<div class="org-src-container"> <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> </pre>
</div> </div>
@@ -448,8 +454,8 @@ We also consider here a nano-hexapod with the identified optimal actuator stiffn
</p> </p>
</div> </div>
<div id="outline-container-orge13b41c" class="outline-4"> <div id="outline-container-orgd87b94b" class="outline-4">
<h4 id="orge13b41c"><span class="section-number-4">2.2.1</span> Direct Velocity Feedback</h4> <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"> <div class="outline-text-4" id="text-2-2-1">
<p> <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>. 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> </div>
<div id="outline-container-org15c2c08" class="outline-4"> <div id="outline-container-orge5d1c12" class="outline-4">
<h4 id="org15c2c08"><span class="section-number-4">2.2.2</span> Primary Control</h4> <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"> <div class="outline-text-4" id="text-2-2-2">
<p> <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>. 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> </div>
<div id="outline-container-orgce1052e" class="outline-3"> <div id="outline-container-org382b3cb" class="outline-3">
<h3 id="orgce1052e"><span class="section-number-3">2.3</span> Conclusion</h3> <h3 id="org382b3cb"><span class="section-number-3">2.3</span> Conclusion</h3>
<div class="outline-text-3" id="text-2-3"> <div class="outline-text-3" id="text-2-3">
<div class="important"> <div class="important" id="org422e802">
<p> <p>
The axial stiffness of the flexible joints should be maximized. The axial stiffness of the flexible joints should be maximized.
</p> </p>
@@ -533,14 +539,14 @@ We may interpolate the results and say that the axial joint stiffness should be
</div> </div>
</div> </div>
<div id="outline-container-org865157e" class="outline-2"> <div id="outline-container-orgb6f6c0a" class="outline-2">
<h2 id="org865157e"><span class="section-number-2">3</span> Conclusion</h2> <h2 id="orgb6f6c0a"><span class="section-number-2">3</span> Conclusion</h2>
<div class="outline-text-2" id="text-3"> <div class="outline-text-2" id="text-3">
<p> <p>
<a id="org6614f42"></a> <a id="org6614f42"></a>
</p> </p>
<div class="important"> <div class="important" id="org3cbf243">
<p> <p>
In this study we considered the bending, torsional and axial stiffnesses of the flexible joints used for the nano-hexapod. In this study we considered the bending, torsional and axial stiffnesses of the flexible joints used for the nano-hexapod.
</p> </p>
@@ -575,10 +581,80 @@ As there is generally a trade-off between bending stiffness and axial stiffness,
</div> </div>
</div> </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>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p> <p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-05-05 mar. 11:50</p> <p class="date">Created: 2020-11-03 mar. 09:45</p>
</div> </div>
</body> </body>
</html> </html>
+1158 -1151
View File
File diff suppressed because it is too large Load Diff
+1020 -1138
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View 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.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
+292 -33
View File
@@ -534,10 +534,10 @@ We choose realistic values of the axial stiffness of the joints:
\[ K_a = 60\,[N/\mu m] \] \[ K_a = 60\,[N/\mu m] \]
#+begin_src matlab #+begin_src matlab
Kz_F = 60e6*ones(6,1); % [N/m] Ka_F = 60e6*ones(6,1); % [N/m]
Kz_M = 60e6*ones(6,1); % [N/m] Ka_M = 60e6*ones(6,1); % [N/m]
Cz_F = 1*ones(6,1); % [N/(m/s)] Ca_F = 1*ones(6,1); % [N/(m/s)]
Cz_M = 1*ones(6,1); % [N/(m/s)] Ca_M = 1*ones(6,1); % [N/(m/s)]
#+end_src #+end_src
*** Initialization *** Initialization
@@ -591,10 +591,10 @@ The obtained dynamics are shown in Figure [[fig:flex_joint_trans_dvf]].
initializeNanoHexapod('k', k_opt, 'c', c_opt, ... initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
'type_F', 'universal_3dof', ... 'type_F', 'universal_3dof', ...
'type_M', 'spherical_3dof', ... 'type_M', 'spherical_3dof', ...
'Kz_F', Kz_F, ... 'Ka_F', Ka_F, ...
'Kz_M', Kz_M, ... 'Ka_M', Ka_M, ...
'Cz_F', Cz_F, ... 'Ca_F', Ca_F, ...
'Cz_M', Cz_M); 'Ca_M', Ca_M);
G_dvf_3dof = linearize(mdl, io); G_dvf_3dof = linearize(mdl, io);
G_dvf_3dof.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}; 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, ... initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
'type_F', 'universal_3dof', ... 'type_F', 'universal_3dof', ...
'type_M', 'spherical_3dof', ... 'type_M', 'spherical_3dof', ...
'Kz_F', Kz_F, ... 'Ka_F', Ka_F, ...
'Kz_M', Kz_M, ... 'Ka_M', Ka_M, ...
'Cz_F', Cz_F, ... 'Ca_F', Ca_F, ...
'Cz_M', Cz_M); 'Ca_M', Ca_M);
G = linearize(mdl, io); G = linearize(mdl, io);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}; 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: Let's consider the following values for the axial stiffness:
#+begin_src matlab #+begin_src matlab
Kzs = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m] Kas = [1e4, 1e5, 1e6, 1e7, 1e8, 1e9]; % [N/m]
#+end_src #+end_src
We also consider here a nano-hexapod with the identified optimal actuator stiffness ($k = 10^5\,[N/m]$). 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, '/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 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, ... initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
'type_F', 'universal_3dof', ... 'type_F', 'universal_3dof', ...
'type_M', 'spherical_3dof', ... 'type_M', 'spherical_3dof', ...
'Kz_F', Kzs(i), ... 'Ka_F', Kas(i), ...
'Kz_M', Kzs(i), ... 'Ka_M', Kas(i), ...
'Cz_F', 0.05*sqrt(Kzs(i)*10), ... 'Ca_F', 0.05*sqrt(Kas(i)*10), ...
'Cz_M', 0.05*sqrt(Kzs(i)*10)); 'Ca_M', 0.05*sqrt(Kas(i)*10));
G = linearize(mdl, io); G = linearize(mdl, io);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}; 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); ax1 = subplot(2, 1, 1);
hold on; 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')))); plot(freqs, abs(squeeze(freqresp(G_dvf_3dof_s{i}(1, 1), freqs, 'Hz'))));
end end
plot(freqs, abs(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz'))), 'k--'); 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); ax2 = subplot(2, 1, 2);
hold on; 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')))), ... 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 end
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz')))), 'k--', ... plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G_dvf(1, 1), freqs, 'Hz')))), 'k--', ...
'DisplayName', 'Perfect Joint'); '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); gains = logspace(2, 5, 300);
hold on; hold on;
for i = 1:length(Kzs) for i = 1:length(Kas)
set(gca,'ColorOrderIndex',i); set(gca,'ColorOrderIndex',i);
plot(real(pole(G_dvf_3dof_s{i})), imag(pole(G_dvf_3dof_s{i})), 'x', ... 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); set(gca,'ColorOrderIndex',i);
plot(real(tzero(G_dvf_3dof_s{i})), imag(tzero(G_dvf_3dof_s{i})), 'o', ... plot(real(tzero(G_dvf_3dof_s{i})), imag(tzero(G_dvf_3dof_s{i})), 'o', ...
'HandleVisibility', 'off'); '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'); 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, ... initializeNanoHexapod('k', k_opt, 'c', c_opt, ...
'type_F', 'universal_3dof', ... 'type_F', 'universal_3dof', ...
'type_M', 'spherical_3dof', ... 'type_M', 'spherical_3dof', ...
'Kz_F', Kzs(i), ... 'Ka_F', Kas(i), ...
'Kz_M', Kzs(i), ... 'Ka_M', Kas(i), ...
'Cz_F', 0.05*sqrt(Kzs(i)*10), ... 'Ca_F', 0.05*sqrt(Kas(i)*10), ...
'Cz_M', 0.05*sqrt(Kzs(i)*10)); 'Ca_M', 0.05*sqrt(Kas(i)*10));
G = linearize(mdl, io); G = linearize(mdl, io);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}; 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); ax1 = subplot(2, 1, 1);
hold on; 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')))); plot(freqs, abs(squeeze(freqresp(Gl_3dof_s{i}(1, 1), freqs, 'Hz'))));
end end
hold off; 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); ax2 = subplot(2, 1, 2);
hold on; 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')))), ... 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 end
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); 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. 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 #+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
+40 -33
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.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.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.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
#+end_src #+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. Z-offset for the initial position of the sample with respect to the granite top surface.
#+begin_src matlab #+begin_src matlab
granite.sample_pos = 0.8; % [m] granite.sample_pos = args.sample_pos; % [m]
#+end_src #+end_src
** Stiffness and Damping properties ** Stiffness and Damping properties
@@ -1169,7 +1170,7 @@ We define the geometrical values.
#+begin_src matlab #+begin_src matlab
mirror.h = 0.05; % Height of the mirror [m] 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] 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] % point of interest offset in z (above the top surfave) [m]
switch args.type switch args.type
case 'none' case 'none'
mirror.jacobian = 0.20; mirror.jacobian = 0.205;
case 'rigid' case 'rigid'
mirror.jacobian = 0.20 - mirror.h; mirror.jacobian = 0.205 - mirror.h;
case 'flexible' case 'flexible'
mirror.jacobian = 0.20 - mirror.h; mirror.jacobian = 0.205 - mirror.h;
end end
mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m] mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
@@ -1269,8 +1270,8 @@ The =mirror= structure is saved.
arguments arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible' args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
% initializeFramesPositions % initializeFramesPositions
args.H (1,1) double {mustBeNumeric, mustBePositive} = 90e-3 args.H (1,1) double {mustBeNumeric, mustBePositive} = 95e-3
args.MO_B (1,1) double {mustBeNumeric} = 175e-3 args.MO_B (1,1) double {mustBeNumeric} = 170e-3
% generateGeneralConfiguration % generateGeneralConfiguration
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3 args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e-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.ke (1,1) double {mustBeNumeric} = 5e6
args.ka (1,1) double {mustBeNumeric} = 60e6 args.ka (1,1) double {mustBeNumeric} = 60e6
args.c1 (1,1) double {mustBeNumeric} = 10 args.c1 (1,1) double {mustBeNumeric} = 10
args.ce (1,1) double {mustBeNumeric} = 10 args.F_gain (1,1) double {mustBeNumeric} = 1
args.ca (1,1) double {mustBeNumeric} = 10
args.k (1,1) double {mustBeNumeric} = -1 args.k (1,1) double {mustBeNumeric} = -1
args.c (1,1) double {mustBeNumeric} = -1 args.c (1,1) double {mustBeNumeric} = -1
% initializeJointDynamics % initializeJointDynamics
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal' 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', 'spherical_3dof'})} = 'spherical' 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} = 15*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.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.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.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.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*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.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*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.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.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*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 % initializeCylindricalPlatforms
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1 args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3 args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
@@ -1355,9 +1359,8 @@ The =mirror= structure is saved.
'k1', args.k1*ones(6,1), ... 'k1', args.k1*ones(6,1), ...
'c1', args.c1*ones(6,1), ... 'c1', args.c1*ones(6,1), ...
'ka', args.ka*ones(6,1), ... 'ka', args.ka*ones(6,1), ...
'ca', args.ca*ones(6,1), ...
'ke', args.ke*ones(6,1), ... 'ke', args.ke*ones(6,1), ...
'ce', args.ce*ones(6,1)); 'F_gain', args.F_gain*ones(6,1));
else else
error('args.actuator should be piezo, lorentz or amplified'); error('args.actuator should be piezo, lorentz or amplified');
end end
@@ -1367,18 +1370,22 @@ The =mirror= structure is saved.
stewart = initializeJointDynamics(stewart, ... stewart = initializeJointDynamics(stewart, ...
'type_F', args.type_F, ... 'type_F', args.type_F, ...
'type_M', args.type_M, ... 'type_M', args.type_M, ...
'Kf_M' , args.Kf_M, ... 'Kf_M', args.Kf_M, ...
'Cf_M' , args.Cf_M, ... 'Cf_M', args.Cf_M, ...
'Kt_M' , args.Kt_M, ... 'Kt_M', args.Kt_M, ...
'Ct_M' , args.Ct_M, ... 'Ct_M', args.Ct_M, ...
'Kz_M' , args.Kz_M, ... 'Kf_F', args.Kf_F, ...
'Cz_M' , args.Cz_M, ... 'Cf_F', args.Cf_F, ...
'Kf_F' , args.Kf_F, ... 'Kt_F', args.Kt_F, ...
'Cf_F' , args.Cf_F, ... 'Ct_F', args.Ct_F, ...
'Kt_F' , args.Kt_F, ... 'Ka_F', args.Ka_F, ...
'Ct_F' , args.Ct_F, ... 'Ca_F', args.Ca_F, ...
'Kz_F' , args.Kz_F, ... 'Kr_F', args.Kr_F, ...
'Cz_F' , args.Cz_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 #+end_src
#+begin_src matlab #+begin_src matlab
+94 -210
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}. 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]]). 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} \begin{tikzpicture}
% Internal and external limit % Internal and external limit
\draw[fill=white!80!black] (0, 0) circle [radius=3]; \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 - $v_{m}$ represents the absolute velocity of the top part of the actuator
- $d_{m}$ represents the total relative displacement 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} \begin{tikzpicture}
\draw (-1, 0) -- (1, 0); \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.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical'
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1) args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1) args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
args.k1 (6,1) double {mustBeNumeric} = 1e6 args.k1 (6,1) double {mustBeNumeric} = 1e6*ones(6,1)
args.ke (6,1) double {mustBeNumeric} = 5e6 args.ke (6,1) double {mustBeNumeric} = 5e6*ones(6,1)
args.ka (6,1) double {mustBeNumeric} = 60e6 args.ka (6,1) double {mustBeNumeric} = 60e6*ones(6,1)
args.c1 (6,1) double {mustBeNumeric} = 10 args.c1 (6,1) double {mustBeNumeric} = 10*ones(6,1)
args.ce (6,1) double {mustBeNumeric} = 10 args.F_gain (6,1) double {mustBeNumeric} = 1*ones(6,1)
args.ca (6,1) double {mustBeNumeric} = 10 args.me (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
args.me (6,1) double {mustBeNumeric} = 0.05 args.ma (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
args.ma (6,1) double {mustBeNumeric} = 0.05
end end
#+end_src #+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.c1 = args.c1;
stewart.actuators.ka = args.ka; stewart.actuators.ka = args.ka;
stewart.actuators.ca = args.ca;
stewart.actuators.ke = args.ke; stewart.actuators.ke = args.ke;
stewart.actuators.ce = args.ce;
stewart.actuators.F_gain = args.F_gain;
stewart.actuators.ma = args.ma; stewart.actuators.ma = args.ma;
stewart.actuators.me = args.me; stewart.actuators.me = args.me;
#+end_src #+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 * =initializeJointDynamics=: Add Stiffness and Damping properties for spherical joints
:PROPERTIES: :PROPERTIES:
:header-args:matlab+: :tangle ../src/initializeJointDynamics.m :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] % - 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)] % - 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)] % - 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] % - 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] % - 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] - 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)] % - 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: % Outputs:
% - stewart - updated Stewart structure with the added fields: % - 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 #+begin_src matlab
arguments arguments
stewart stewart
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal' 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', 'spherical_3dof'})} = 'spherical' 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} = 15*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.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.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.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*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.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*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.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.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*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
#+end_src #+end_src
@@ -1051,11 +930,15 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
case 'spherical' case 'spherical'
stewart.joints_F.type = 2; stewart.joints_F.type = 2;
case 'universal_p' case 'universal_p'
stewart.joints_F.type = 1; stewart.joints_F.type = 3;
case 'spherical_p' case 'spherical_p'
stewart.joints_F.type = 2; stewart.joints_F.type = 4;
case 'universal_3dof' case 'flexible'
stewart.joints_F.type = 5; stewart.joints_F.type = 5;
case 'universal_3dof'
stewart.joints_F.type = 6;
case 'spherical_3dof'
stewart.joints_F.type = 7;
end end
switch args.type_M switch args.type_M
@@ -1064,56 +947,38 @@ This Matlab function is accessible [[file:../src/initializeJointDynamics.m][here
case 'spherical' case 'spherical'
stewart.joints_M.type = 2; stewart.joints_M.type = 2;
case 'universal_p' case 'universal_p'
stewart.joints_M.type = 1; stewart.joints_M.type = 3;
case 'spherical_p' case 'spherical_p'
stewart.joints_M.type = 2; stewart.joints_M.type = 4;
case 'spherical_3dof' case 'flexible'
stewart.joints_M.type = 5;
case 'universal_3dof'
stewart.joints_M.type = 6; stewart.joints_M.type = 6;
case 'spherical_3dof'
stewart.joints_M.type = 7;
end end
#+end_src #+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 ** Add Stiffness and Damping in Translation of each strut
:PROPERTIES: :PROPERTIES:
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
Translation Stiffness Axial and Radial (shear) Stiffness
#+begin_src matlab #+begin_src matlab
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p') stewart.joints_M.Ka = args.Ka_M;
stewart.joints_M.Kz = args.Kz_M; stewart.joints_M.Kr = args.Kr_M;
stewart.joints_M.Cz = args.Cz_M;
end
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p') stewart.joints_F.Ka = args.Ka_F;
stewart.joints_F.Kz = args.Kz_F; stewart.joints_F.Kr = args.Kr_F;
stewart.joints_F.Cz = args.Cz_F; #+end_src
end
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 #+end_src
** Add Stiffness and Damping in Rotation of each strut ** Add Stiffness and Damping in Rotation of each strut
@@ -1122,21 +987,40 @@ Translation Stiffness
:END: :END:
Rotational Stiffness Rotational Stiffness
#+begin_src matlab #+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.Kf = args.Kf_M; stewart.joints_M.Kt = args.Kt_M;
stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Kt = args.Kt_M; stewart.joints_F.Kf = args.Kf_F;
stewart.joints_M.Ct = args.Ct_M; stewart.joints_F.Kt = args.Kt_F;
end #+end_src
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p') Rotational Damping
stewart.joints_F.Kf = args.Kf_F; #+begin_src matlab
stewart.joints_F.Cf = args.Cf_F; stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Ct = args.Ct_M;
stewart.joints_F.Kt = args.Kt_F; stewart.joints_F.Cf = args.Cf_F;
stewart.joints_F.Ct = args.Ct_F; stewart.joints_F.Ct = args.Ct_F;
end #+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 #+end_src
* =initializeInertialSensor=: Initialize the inertial sensor in each strut * =initializeInertialSensor=: Initialize the inertial sensor in each strut
+8
View File
@@ -46,6 +46,10 @@ switch stewart.joints_F.type
fprintf('- The joints on the fixed based are universal joints\n') fprintf('- The joints on the fixed based are universal joints\n')
case 2 case 2
fprintf('- The joints on the fixed based are spherical joints\n') 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 end
switch stewart.joints_M.type 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') fprintf('- The joints on the mobile based are universal joints\n')
case 2 case 2
fprintf('- The joints on the mobile based are spherical joints\n') 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 end
fprintf('- The position of the joints on the fixed based with respect to {F} are (in [mm]):\n') fprintf('- The position of the joints on the fixed based with respect to {F} are (in [mm]):\n')
+2 -1
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.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.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.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
granite = struct(); granite = struct();
@@ -29,7 +30,7 @@ end
granite.density = args.density; % [kg/m3] granite.density = args.density; % [kg/m3]
granite.STEP = './STEPS/granite/granite.STEP'; 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.K = args.K; % [N/m]
granite.C = args.C; % [N/(m/s)] granite.C = args.C; % [N/(m/s)]
+65 -60
View File
@@ -11,14 +11,10 @@ function [stewart] = initializeJointDynamics(stewart, args)
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad] % - 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)] % - 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)] % - 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] % - 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] % - 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] - 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)] % - 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: % Outputs:
% - stewart - updated Stewart structure with the added fields: % - stewart - updated Stewart structure with the added fields:
@@ -33,20 +29,34 @@ function [stewart] = initializeJointDynamics(stewart, args)
arguments arguments
stewart stewart
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal' 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', 'spherical_3dof'})} = 'spherical' 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} = 15*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.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.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.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*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.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*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.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.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*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
switch args.type_F switch args.type_F
@@ -55,11 +65,15 @@ switch args.type_F
case 'spherical' case 'spherical'
stewart.joints_F.type = 2; stewart.joints_F.type = 2;
case 'universal_p' case 'universal_p'
stewart.joints_F.type = 1; stewart.joints_F.type = 3;
case 'spherical_p' case 'spherical_p'
stewart.joints_F.type = 2; stewart.joints_F.type = 4;
case 'universal_3dof' case 'flexible'
stewart.joints_F.type = 5; stewart.joints_F.type = 5;
case 'universal_3dof'
stewart.joints_F.type = 6;
case 'spherical_3dof'
stewart.joints_F.type = 7;
end end
switch args.type_M switch args.type_M
@@ -68,59 +82,50 @@ switch args.type_M
case 'spherical' case 'spherical'
stewart.joints_M.type = 2; stewart.joints_M.type = 2;
case 'universal_p' case 'universal_p'
stewart.joints_M.type = 1; stewart.joints_M.type = 3;
case 'spherical_p' case 'spherical_p'
stewart.joints_M.type = 2; stewart.joints_M.type = 4;
case 'spherical_3dof' case 'flexible'
stewart.joints_M.type = 5;
case 'universal_3dof'
stewart.joints_M.type = 6; stewart.joints_M.type = 6;
case 'spherical_3dof'
stewart.joints_M.type = 7;
end end
stewart.joints_M.Kx = zeros(6,1); stewart.joints_M.Ka = args.Ka_M;
stewart.joints_M.Ky = zeros(6,1); stewart.joints_M.Kr = args.Kr_M;
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_F.Ka = args.Ka_F;
stewart.joints_M.Kt = zeros(6,1); stewart.joints_F.Kr = args.Kr_F;
stewart.joints_F.Kf = zeros(6,1);
stewart.joints_F.Kt = zeros(6,1);
stewart.joints_M.Cx = zeros(6,1); stewart.joints_M.Ca = args.Ca_M;
stewart.joints_M.Cy = zeros(6,1); stewart.joints_M.Cr = args.Cr_M;
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_F.Ca = args.Ca_F;
stewart.joints_M.Ct = zeros(6,1); stewart.joints_F.Cr = args.Cr_F;
stewart.joints_F.Cf = zeros(6,1);
stewart.joints_F.Ct = zeros(6,1);
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p') stewart.joints_M.Kf = args.Kf_M;
stewart.joints_M.Kz = args.Kz_M; stewart.joints_M.Kt = args.Kt_M;
stewart.joints_M.Cz = args.Cz_M;
end
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p') stewart.joints_F.Kf = args.Kf_F;
stewart.joints_F.Kz = args.Kz_F; stewart.joints_F.Kt = args.Kt_F;
stewart.joints_F.Cz = args.Cz_F;
end
if ~strcmp(args.type_M, 'universal_p') || ~strcmp(args.type_M, 'spherical_p') stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Kf = args.Kf_M; stewart.joints_M.Ct = args.Ct_M;
stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Kt = args.Kt_M; stewart.joints_F.Cf = args.Cf_F;
stewart.joints_M.Ct = args.Ct_M; stewart.joints_F.Ct = args.Ct_F;
end
if ~strcmp(args.type_F, 'universal_p') || ~strcmp(args.type_F, 'spherical_p') stewart.joints_F.M = args.M_F;
stewart.joints_F.Kf = args.Kf_F; stewart.joints_F.K = args.K_F;
stewart.joints_F.Cf = args.Cf_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_M.M = args.M_M;
stewart.joints_F.Ct = args.Ct_F; stewart.joints_M.K = args.K_M;
end 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;
+4 -4
View File
@@ -32,7 +32,7 @@ mirror.Deq = zeros(6,1);
mirror.h = 0.05; % Height of the mirror [m] 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] 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] % point of interest offset in z (above the top surfave) [m]
switch args.type switch args.type
case 'none' case 'none'
mirror.jacobian = 0.20; mirror.jacobian = 0.205;
case 'rigid' case 'rigid'
mirror.jacobian = 0.20 - mirror.h; mirror.jacobian = 0.205 - mirror.h;
case 'flexible' case 'flexible'
mirror.jacobian = 0.20 - mirror.h; mirror.jacobian = 0.205 - mirror.h;
end end
mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m] mirror.rad = 0.180; % radius of the mirror (at the bottom surface) [m]
+34 -28
View File
@@ -3,8 +3,8 @@ function [nano_hexapod] = initializeNanoHexapod(args)
arguments arguments
args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible' args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'init'})} = 'flexible'
% initializeFramesPositions % initializeFramesPositions
args.H (1,1) double {mustBeNumeric, mustBePositive} = 90e-3 args.H (1,1) double {mustBeNumeric, mustBePositive} = 95e-3
args.MO_B (1,1) double {mustBeNumeric} = 175e-3 args.MO_B (1,1) double {mustBeNumeric} = 170e-3
% generateGeneralConfiguration % generateGeneralConfiguration
args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3 args.FH (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 args.FR (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
@@ -18,25 +18,28 @@ arguments
args.ke (1,1) double {mustBeNumeric} = 5e6 args.ke (1,1) double {mustBeNumeric} = 5e6
args.ka (1,1) double {mustBeNumeric} = 60e6 args.ka (1,1) double {mustBeNumeric} = 60e6
args.c1 (1,1) double {mustBeNumeric} = 10 args.c1 (1,1) double {mustBeNumeric} = 10
args.ce (1,1) double {mustBeNumeric} = 10 args.F_gain (1,1) double {mustBeNumeric} = 1
args.ca (1,1) double {mustBeNumeric} = 10
args.k (1,1) double {mustBeNumeric} = -1 args.k (1,1) double {mustBeNumeric} = -1
args.c (1,1) double {mustBeNumeric} = -1 args.c (1,1) double {mustBeNumeric} = -1
% initializeJointDynamics % initializeJointDynamics
args.type_F char {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'universal_3dof'})} = 'universal' 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', 'spherical_3dof'})} = 'spherical' 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} = 15*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.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.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.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.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 33*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.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*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.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.Ka_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.2e8*ones(6,1)
args.Cz_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e2*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 % initializeCylindricalPlatforms
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1 args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3 args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
@@ -81,9 +84,8 @@ elseif strcmp(args.actuator, 'amplified')
'k1', args.k1*ones(6,1), ... 'k1', args.k1*ones(6,1), ...
'c1', args.c1*ones(6,1), ... 'c1', args.c1*ones(6,1), ...
'ka', args.ka*ones(6,1), ... 'ka', args.ka*ones(6,1), ...
'ca', args.ca*ones(6,1), ...
'ke', args.ke*ones(6,1), ... 'ke', args.ke*ones(6,1), ...
'ce', args.ce*ones(6,1)); 'F_gain', args.F_gain*ones(6,1));
else else
error('args.actuator should be piezo, lorentz or amplified'); error('args.actuator should be piezo, lorentz or amplified');
end end
@@ -91,18 +93,22 @@ end
stewart = initializeJointDynamics(stewart, ... stewart = initializeJointDynamics(stewart, ...
'type_F', args.type_F, ... 'type_F', args.type_F, ...
'type_M', args.type_M, ... 'type_M', args.type_M, ...
'Kf_M' , args.Kf_M, ... 'Kf_M', args.Kf_M, ...
'Cf_M' , args.Cf_M, ... 'Cf_M', args.Cf_M, ...
'Kt_M' , args.Kt_M, ... 'Kt_M', args.Kt_M, ...
'Ct_M' , args.Ct_M, ... 'Ct_M', args.Ct_M, ...
'Kz_M' , args.Kz_M, ... 'Kf_F', args.Kf_F, ...
'Cz_M' , args.Cz_M, ... 'Cf_F', args.Cf_F, ...
'Kf_F' , args.Kf_F, ... 'Kt_F', args.Kt_F, ...
'Cf_F' , args.Cf_F, ... 'Ct_F', args.Ct_F, ...
'Kt_F' , args.Kt_F, ... 'Ka_F', args.Ka_F, ...
'Ct_F' , args.Ct_F, ... 'Ca_F', args.Ca_F, ...
'Kz_F' , args.Kz_F, ... 'Kr_F', args.Kr_F, ...
'Cz_F' , args.Cz_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); stewart = initializeCylindricalPlatforms(stewart, 'Fpm', args.Fpm, 'Fph', args.Fph, 'Fpr', args.Fpr, 'Mpm', args.Mpm, 'Mph', args.Mph, 'Mpr', args.Mpr);
+9 -11
View File
@@ -19,14 +19,13 @@ arguments
args.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical' args.type char {mustBeMember(args.type,{'classical', 'amplified'})} = 'classical'
args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1) args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1) args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
args.k1 (6,1) double {mustBeNumeric} = 1e6 args.k1 (6,1) double {mustBeNumeric} = 1e6*ones(6,1)
args.ke (6,1) double {mustBeNumeric} = 5e6 args.ke (6,1) double {mustBeNumeric} = 5e6*ones(6,1)
args.ka (6,1) double {mustBeNumeric} = 60e6 args.ka (6,1) double {mustBeNumeric} = 60e6*ones(6,1)
args.c1 (6,1) double {mustBeNumeric} = 10 args.c1 (6,1) double {mustBeNumeric} = 10*ones(6,1)
args.ce (6,1) double {mustBeNumeric} = 10 args.F_gain (6,1) double {mustBeNumeric} = 1*ones(6,1)
args.ca (6,1) double {mustBeNumeric} = 10 args.me (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
args.me (6,1) double {mustBeNumeric} = 0.05 args.ma (6,1) double {mustBeNumeric} = 0.01*ones(6,1)
args.ma (6,1) double {mustBeNumeric} = 0.05
end end
if strcmp(args.type, 'classical') if strcmp(args.type, 'classical')
@@ -42,10 +41,9 @@ stewart.actuators.k1 = args.k1;
stewart.actuators.c1 = args.c1; stewart.actuators.c1 = args.c1;
stewart.actuators.ka = args.ka; stewart.actuators.ka = args.ka;
stewart.actuators.ca = args.ca;
stewart.actuators.ke = args.ke; stewart.actuators.ke = args.ke;
stewart.actuators.ce = args.ce;
stewart.actuators.F_gain = args.F_gain;
stewart.actuators.ma = args.ma; stewart.actuators.ma = args.ma;
stewart.actuators.me = args.me; stewart.actuators.me = args.me;