<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <!-- 2021-04-19 lun. 16:22 --> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title>Nano-Hexapod</title> <meta name="author" content="Dehaeze Thomas" /> <meta name="generator" content="Org Mode" /> <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/> <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script> <script> MathJax = { svg: { scale: 1, fontCache: "global" }, tex: { tags: "ams", multlineWidth: "%MULTLINEWIDTH", tagSide: "right", macros: {bm: ["\\boldsymbol{#1}",1],}, tagIndent: ".8em" } }; </script> <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script> </head> <body> <div id="org-div-home-and-up"> <a accesskey="h" href="./index.html"> UP </a> | <a accesskey="H" href="../../index.html"> HOME </a> </div><div id="content"> <h1 class="title">Nano-Hexapod</h1> <div id="table-of-contents"> <h2>Table of Contents</h2> <div id="text-table-of-contents"> <ul> <li><a href="#org3cc44d5">1. Nano-Hexapod</a> <ul> <li><a href="#org309ec4a">1.1. Nano Hexapod object</a></li> <li><a href="#org3629bed">1.2. Jacobian from Solidworks Model</a></li> <li><a href="#org10f93f2">1.3. Jacobian for encoders on the plates</a></li> <li><a href="#org29732d1">1.4. Compare encoders on the struts and encoders on the platforms</a></li> <li><a href="#orgd0bd54d">1.5. Nano Hexapod</a> <ul> <li><a href="#org3f24e44">1.5.1. DVF Plant</a></li> <li><a href="#org0277dba">1.5.2. IFF Plant</a></li> </ul> </li> <li><a href="#org46d1cf0">1.6. Decoupling at the CoK</a></li> <li><a href="#orga23a393">1.7. Jacobian</a> <ul> <li><a href="#orge9af071">1.7.1. Compute Jacobian</a></li> <li><a href="#org69ca639">1.7.2. Verify Jacobian</a></li> <li><a href="#org508dcc8">1.7.3. Plant from APA forces to sample’s displacement</a></li> <li><a href="#orgc349f1d">1.7.4. Plant in the Cartesian frame</a></li> <li><a href="#org74313d0">1.7.5. Plant in the frame of the legs => Verification of Jacobian for displacements</a></li> </ul> </li> <li><a href="#orgd60e2b2">1.8. Stiffness matrix</a></li> </ul> </li> <li><a href="#org8862f6b">2. Function - Initialize Nano Hexapod</a> <ul> <li><a href="#org438f7d8">Function description</a></li> <li><a href="#org49bef56">Optional Parameters</a></li> <li><a href="#org33f6631">Nano Hexapod Object</a></li> <li><a href="#orgdc3de74">Flexible Joints - Bot</a></li> <li><a href="#org7d4d003">Flexible Joints - Top</a></li> <li><a href="#org3744992">Relative Motion Sensor</a></li> <li><a href="#orgdaa740a">Amplified Piezoelectric Actuator</a></li> <li><a href="#org8187b3b">Save the Structure</a></li> </ul> </li> </ul> </div> </div> <div id="outline-container-org3cc44d5" class="outline-2"> <h2 id="org3cc44d5"><span class="section-number-2">1</span> Nano-Hexapod</h2> <div class="outline-text-2" id="text-1"> </div> <div id="outline-container-org309ec4a" class="outline-3"> <h3 id="org309ec4a"><span class="section-number-3">1.1</span> Nano Hexapod object</h3> <div class="outline-text-3" id="text-1-1"> <p> The nano-hexapod can be initialized and configured using the <code>initializeNanoHexapodFinal</code> function. </p> <div class="org-src-container"> <pre class="src src-matlab">n_hexapod = initializeNanoHexapodFinal(<span class="org-string">'flex_bot_type'</span>, <span class="org-string">'4dof'</span>, ... <span class="org-string">'flex_top_type'</span>, <span class="org-string">'3dof'</span>, ... <span class="org-string">'motion_sensor_type'</span>, <span class="org-string">'struts'</span>, ... <span class="org-string">'actuator_type'</span>, <span class="org-string">'2dof'</span>); </pre> </div> </div> </div> <div id="outline-container-org3629bed" class="outline-3"> <h3 id="org3629bed"><span class="section-number-3">1.2</span> Jacobian from Solidworks Model</h3> <div class="outline-text-3" id="text-1-2"> <p> Center of joints a_i with respect to {F}: </p> <div class="org-src-container"> <pre class="src src-matlab">Fa = [[<span class="org-type">-</span>86.05, <span class="org-type">-</span>74.78, 22.49], [86.05, <span class="org-type">-</span>74.78, 22.49], [107.79, <span class="org-type">-</span>37.13, 22.49], [21.74, 111.91, 22.49], [<span class="org-type">-</span>21.74, 111.91, 22.49], [<span class="org-type">-</span>107.79, <span class="org-type">-</span>37.13, 22.49]]<span class="org-type">'*</span>1e<span class="org-type">-</span>3; </pre> </div> <p> Center of joints a_i with respect to {M}: </p> <div class="org-src-container"> <pre class="src src-matlab">Mb = [[<span class="org-type">-</span>28.47, <span class="org-type">-</span>106.25, <span class="org-type">-</span>22.50], [28.47, <span class="org-type">-</span>106.25, <span class="org-type">-</span>22.50], [106.25, 28.47, <span class="org-type">-</span>22.50], [77.78, 77.78, <span class="org-type">-</span>22.50], [<span class="org-type">-</span>77.78, 77.78, <span class="org-type">-</span>22.50], [<span class="org-type">-</span>106.25, 28.47, <span class="org-type">-</span>22.50]]<span class="org-type">'*</span>1e<span class="org-type">-</span>3; </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">Fb = Mb <span class="org-type">+</span> [0; 0; 95e<span class="org-type">-</span>3]; si = Fb <span class="org-type">-</span> Fa; si = si<span class="org-type">./</span>vecnorm(si); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">ki = ones(1,6); bi = Fb; </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">ki<span class="org-type">.*</span>si<span class="org-type">*</span>si<span class="org-type">'</span> </pre> </div> <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> </colgroup> <tbody> <tr> <td class="org-right">1.8977</td> <td class="org-right">2.4659e-17</td> <td class="org-right">1.3383e-18</td> </tr> <tr> <td class="org-right">2.4659e-17</td> <td class="org-right">1.8977</td> <td class="org-right">-2.3143e-05</td> </tr> <tr> <td class="org-right">1.3383e-18</td> <td class="org-right">-2.3143e-05</td> <td class="org-right">2.2046</td> </tr> </tbody> </table> <div class="org-src-container"> <pre class="src src-matlab">OkX = (ki<span class="org-type">.*</span>cross(bi, si)<span class="org-type">*</span>si<span class="org-type">'</span>)<span class="org-type">/</span>(ki<span class="org-type">.*</span>si<span class="org-type">*</span>si<span class="org-type">'</span>); Ok = [OkX(3,2);OkX(1,3);OkX(2,1)] </pre> </div> <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-right" /> </colgroup> <tbody> <tr> <td class="org-right">-1.7444e-18</td> </tr> <tr> <td class="org-right">2.1511e-06</td> </tr> <tr> <td class="org-right">0.052707</td> </tr> </tbody> </table> <p> The center of the cube is therefore 52.7mm above the bottom platform {F} frame. </p> <p> Let’s compute the Jacobian at this location: </p> <div class="org-src-container"> <pre class="src src-matlab">Jk = [si<span class="org-type">'</span>, cross(bi <span class="org-type">-</span> Ok, si)<span class="org-type">'</span>]; </pre> </div> <p> And the stiffness matrix: </p> <div class="org-src-container"> <pre class="src src-matlab">Jk<span class="org-type">'*</span>diag(ki)<span class="org-type">*</span>Jk </pre> </div> <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> </colgroup> <tbody> <tr> <td class="org-right">1.8977</td> <td class="org-right">0</td> <td class="org-right">0</td> <td class="org-right">0</td> <td class="org-right">-3.4694e-18</td> <td class="org-right">2.5509e-06</td> </tr> <tr> <td class="org-right">0</td> <td class="org-right">1.8977</td> <td class="org-right">-2.3143e-05</td> <td class="org-right">4.1751e-06</td> <td class="org-right">1.3878e-17</td> <td class="org-right">0</td> </tr> <tr> <td class="org-right">0</td> <td class="org-right">-2.3143e-05</td> <td class="org-right">2.2046</td> <td class="org-right">-5.0916e-11</td> <td class="org-right">-3.4694e-18</td> <td class="org-right">0</td> </tr> <tr> <td class="org-right">0</td> <td class="org-right">4.1751e-06</td> <td class="org-right">-5.0916e-11</td> <td class="org-right">0.012594</td> <td class="org-right">2.1684e-19</td> <td class="org-right">8.6736e-19</td> </tr> <tr> <td class="org-right">-3.2704e-18</td> <td class="org-right">0</td> <td class="org-right">-4.206e-18</td> <td class="org-right">3.9451e-19</td> <td class="org-right">0.012594</td> <td class="org-right">-9.3183e-08</td> </tr> <tr> <td class="org-right">2.5509e-06</td> <td class="org-right">0</td> <td class="org-right">0</td> <td class="org-right">8.6736e-19</td> <td class="org-right">-9.3183e-08</td> <td class="org-right">0.043362</td> </tr> </tbody> </table> </div> </div> <div id="outline-container-org10f93f2" class="outline-3"> <h3 id="org10f93f2"><span class="section-number-3">1.3</span> Jacobian for encoders on the plates</h3> <div class="outline-text-3" id="text-1-3"> <p> <b>Goal</b>: Compute the 6-DoF motion of the top platform (relative to the bottom platform) from the 6 encoder measurements. </p> <p> The main differences with the case where the encoders are parallel with the strut are: </p> <ul class="org-ul"> <li>the encoder and ruler may not be parallel anymore as the top platform is moving</li> <li>the derivation of the Jacobian (if possible) will not be the same</li> </ul> </div> </div> <div id="outline-container-org29732d1" class="outline-3"> <h3 id="org29732d1"><span class="section-number-3">1.4</span> Compare encoders on the struts and encoders on the platforms</h3> <div class="outline-text-3" id="text-1-4"> <div class="org-src-container"> <pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span> options = linearizeOptions; options.SampleTime = 0; <span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span> mdl = <span class="org-string">'nano_hexapod'</span>; <span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span> clear io; io_i = 1; io(io_i) = linio([mdl, <span class="org-string">'/F'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Inputs</span> io(io_i) = linio([mdl, <span class="org-string">'/D'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Relative Motion Outputs</span> </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">n_hexapod.motion_sensor = struct(); n_hexapod.motion_sensor.type = 1; <span class="org-comment">% 1: Leg / 2: Plate</span> </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">Gs = linearize(mdl, io, 0.0, options); Gs.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>}; Gs.OutputName = {<span class="org-string">'D1'</span>, <span class="org-string">'D2'</span>, <span class="org-string">'D3'</span>, <span class="org-string">'D4'</span>, <span class="org-string">'D5'</span>, <span class="org-string">'D6'</span>}; </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">n_hexapod.motion_sensor = struct(); n_hexapod.motion_sensor.type = 2; <span class="org-comment">% 1: Leg / 2: Plate</span> </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">Gp = linearize(mdl, io, 0.0, options); Gp.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>}; Gp.OutputName = {<span class="org-string">'D1'</span>, <span class="org-string">'D2'</span>, <span class="org-string">'D3'</span>, <span class="org-string">'D4'</span>, <span class="org-string">'D5'</span>, <span class="org-string">'D6'</span>}; </pre> </div> </div> </div> <div id="outline-container-orgd0bd54d" class="outline-3"> <h3 id="orgd0bd54d"><span class="section-number-3">1.5</span> Nano Hexapod</h3> <div class="outline-text-3" id="text-1-5"> <div class="org-src-container"> <pre class="src src-matlab"><span class="org-matlab-cellbreak"><span class="org-comment">%% Options for Linearized</span></span> options = linearizeOptions; options.SampleTime = 0; <span class="org-matlab-cellbreak"><span class="org-comment">%% Name of the Simulink File</span></span> mdl = <span class="org-string">'nano_hexapod'</span>; <span class="org-matlab-cellbreak"><span class="org-comment">%% Input/Output definition</span></span> clear io; io_i = 1; io(io_i) = linio([mdl, <span class="org-string">'/F'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Actuator Inputs</span> io(io_i) = linio([mdl, <span class="org-string">'/Fe'</span>], 1, <span class="org-string">'openinput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% External Force</span> io(io_i) = linio([mdl, <span class="org-string">'/D'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Relative Motion Outputs</span> io(io_i) = linio([mdl, <span class="org-string">'/Fm'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Force Sensors</span> io(io_i) = linio([mdl, <span class="org-string">'/X'</span>], 1, <span class="org-string">'openoutput'</span>); io_i = io_i <span class="org-type">+</span> 1; <span class="org-comment">% Absolute Motion of top platform</span> <span class="org-matlab-cellbreak"><span class="org-comment">%% Run the linearization</span></span> G = linearize(mdl, io, 0.0, options); G.InputName = {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>, ... <span class="org-string">'Fx'</span>, <span class="org-string">'Fy'</span>, <span class="org-string">'Fz'</span>, <span class="org-string">'Mx'</span>, <span class="org-string">'My'</span>, <span class="org-string">'Mz'</span>}; G.OutputName = {<span class="org-string">'D1'</span>, <span class="org-string">'D2'</span>, <span class="org-string">'D3'</span>, <span class="org-string">'D4'</span>, <span class="org-string">'D5'</span>, <span class="org-string">'D6'</span>, ... <span class="org-string">'Fm1'</span>, <span class="org-string">'Fm2'</span>, <span class="org-string">'Fm3'</span>, <span class="org-string">'Fm4'</span>, <span class="org-string">'Fm5'</span>, <span class="org-string">'Fm6'</span> ... <span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>}; </pre> </div> <pre class="example"> size(G) State-space model with 18 outputs, 12 inputs, and 60 states. </pre> <p> Verify the number of DOF: </p> <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-left" /> <col class="org-right" /> </colgroup> <thead> <tr> <th scope="col" class="org-left">Element</th> <th scope="col" class="org-right">DoF</th> </tr> </thead> <tbody> <tr> <td class="org-left">Bot Plate</td> <td class="org-right">0</td> </tr> <tr> <td class="org-left">Struts</td> <td class="org-right">6*4</td> </tr> <tr> <td class="org-left">Top Plate + Sample</td> <td class="org-right">12</td> </tr> </tbody> <tbody> <tr> <td class="org-left">Total:</td> <td class="org-right">36</td> </tr> </tbody> </table> </div> <div id="outline-container-org3f24e44" class="outline-4"> <h4 id="org3f24e44"><span class="section-number-4">1.5.1</span> DVF Plant</h4> <div class="outline-text-4" id="text-1-5-1"> <p> The DC gain from actuator to relative motion sensor should be equal to (for the 2dof APA): \[ \frac{1}{k + k_a + kk_a/k_e} \] </p> <pre class="example"> 1.8732e-08 </pre> <p> Which is almost the case: </p> <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> </colgroup> <tbody> <tr> <td class="org-right">-1.8676e-08</td> <td class="org-right">5.2396e-11</td> <td class="org-right">-8.8935e-11</td> <td class="org-right">2.6392e-11</td> <td class="org-right">9.7629e-11</td> <td class="org-right">-1.5609e-10</td> </tr> <tr> <td class="org-right">-1.4754e-11</td> <td class="org-right">-1.8725e-08</td> <td class="org-right">1.4348e-11</td> <td class="org-right">-5.7189e-11</td> <td class="org-right">-3.3327e-11</td> <td class="org-right">7.0799e-11</td> </tr> <tr> <td class="org-right">-3.4924e-11</td> <td class="org-right">-7.7445e-11</td> <td class="org-right">-1.8607e-08</td> <td class="org-right">-4.6578e-11</td> <td class="org-right">-1.9592e-11</td> <td class="org-right">4.0299e-11</td> </tr> <tr> <td class="org-right">6.1699e-11</td> <td class="org-right">-7.1962e-11</td> <td class="org-right">1.3374e-11</td> <td class="org-right">-1.8623e-08</td> <td class="org-right">-1.7898e-10</td> <td class="org-right">5.4541e-11</td> </tr> <tr> <td class="org-right">9.735e-11</td> <td class="org-right">-1.0698e-10</td> <td class="org-right">-1.6424e-11</td> <td class="org-right">2.3718e-11</td> <td class="org-right">-1.8826e-08</td> <td class="org-right">8.387e-11</td> </tr> <tr> <td class="org-right">-3.94e-11</td> <td class="org-right">2.6436e-11</td> <td class="org-right">-1.1338e-10</td> <td class="org-right">5.0793e-11</td> <td class="org-right">1.2358e-10</td> <td class="org-right">-1.8792e-08</td> </tr> </tbody> </table> <p> Other (off-diagonal) elements should be close to zero (probably limited to joint’s stiffness). <b>However, when setting joint’s axial stiffness to infinity, I obtain better diagonal</b>. </p> <div id="orgc57a8a2" class="figure"> <p><img src="figs/nano_hexapod_struts_2dof_dvf_plant.png" alt="nano_hexapod_struts_2dof_dvf_plant.png" /> </p> <p><span class="figure-number">Figure 1: </span>IFF Plant</p> </div> </div> </div> <div id="outline-container-org0277dba" class="outline-4"> <h4 id="org0277dba"><span class="section-number-4">1.5.2</span> IFF Plant</h4> <div class="outline-text-4" id="text-1-5-2"> <div id="org07c51e9" class="figure"> <p><img src="figs/nano_hexapod_struts_2dof_iff_plant.png" alt="nano_hexapod_struts_2dof_iff_plant.png" /> </p> <p><span class="figure-number">Figure 2: </span>DVF Plant</p> </div> </div> </div> </div> <div id="outline-container-org46d1cf0" class="outline-3"> <h3 id="org46d1cf0"><span class="section-number-3">1.6</span> Decoupling at the CoK</h3> <div class="outline-text-3" id="text-1-6"> <div class="org-src-container"> <pre class="src src-matlab">Gx = inv(Jk)<span class="org-type">*</span>G({<span class="org-string">'D1'</span>, <span class="org-string">'D2'</span>, <span class="org-string">'D3'</span>, <span class="org-string">'D4'</span>, <span class="org-string">'D5'</span>, <span class="org-string">'D6'</span>}, {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>})<span class="org-type">*</span>inv(Jk<span class="org-type">'</span>); Gx.inputname = {<span class="org-string">'Fx'</span>, <span class="org-string">'Fy'</span>, <span class="org-string">'Fz'</span>, <span class="org-string">'Mx'</span>, <span class="org-string">'My'</span>, <span class="org-string">'Mz'</span>}; Gx.outputname = {<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>}; </pre> </div> <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> </colgroup> <tbody> <tr> <td class="org-right">-9.8399e-09</td> <td class="org-right">-8.0785e-11</td> <td class="org-right">-1.5723e-11</td> <td class="org-right">2.6356e-10</td> <td class="org-right">-4.9857e-10</td> <td class="org-right">5.2177e-11</td> </tr> <tr> <td class="org-right">-8.7554e-11</td> <td class="org-right">-9.8585e-09</td> <td class="org-right">2.6292e-11</td> <td class="org-right">2.0485e-10</td> <td class="org-right">2.0385e-10</td> <td class="org-right">8.2942e-11</td> </tr> <tr> <td class="org-right">4.3837e-11</td> <td class="org-right">-5.5862e-14</td> <td class="org-right">-8.4859e-09</td> <td class="org-right">-9.0036e-12</td> <td class="org-right">2.9325e-10</td> <td class="org-right">-3.104e-11</td> </tr> <tr> <td class="org-right">1.901e-09</td> <td class="org-right">5.3078e-10</td> <td class="org-right">-7.5477e-10</td> <td class="org-right">-1.4759e-06</td> <td class="org-right">-7.7918e-09</td> <td class="org-right">-7.491e-10</td> </tr> <tr> <td class="org-right">-7.1795e-11</td> <td class="org-right">-1.6333e-09</td> <td class="org-right">-1.8359e-10</td> <td class="org-right">5.2707e-09</td> <td class="org-right">-1.4794e-06</td> <td class="org-right">3.2304e-10</td> </tr> <tr> <td class="org-right">7.0322e-11</td> <td class="org-right">1.7713e-12</td> <td class="org-right">-5.8019e-11</td> <td class="org-right">7.4838e-11</td> <td class="org-right">-8.9677e-10</td> <td class="org-right">-4.2938e-07</td> </tr> </tbody> </table> </div> </div> <div id="outline-container-orga23a393" class="outline-3"> <h3 id="orga23a393"><span class="section-number-3">1.7</span> Jacobian</h3> <div class="outline-text-3" id="text-1-7"> </div> <div id="outline-container-orge9af071" class="outline-4"> <h4 id="orge9af071"><span class="section-number-4">1.7.1</span> Compute Jacobian</h4> <div class="outline-text-4" id="text-1-7-1"> <div class="org-src-container"> <pre class="src src-matlab">Ai = [out.b1.Data(1,<span class="org-type">:</span>) out.b2.Data(1,<span class="org-type">:</span>) out.b3.Data(1,<span class="org-type">:</span>) out.b4.Data(1,<span class="org-type">:</span>) out.b5.Data(1,<span class="org-type">:</span>) out.b6.Data(1,<span class="org-type">:</span>)]<span class="org-type">'</span>; Bi = [out.a1.Data(1,<span class="org-type">:</span>) out.a2.Data(1,<span class="org-type">:</span>) out.a3.Data(1,<span class="org-type">:</span>) out.a4.Data(1,<span class="org-type">:</span>) out.a5.Data(1,<span class="org-type">:</span>) out.a6.Data(1,<span class="org-type">:</span>)]<span class="org-type">'</span>; </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">stewart = initializeStewartPlatform(); stewart = initializeFramesPositions(stewart, <span class="org-string">'H'</span>, 95e<span class="org-type">-</span>3, <span class="org-string">'MO_B'</span>, 150e<span class="org-type">-</span>3); stewart = generateGeneralConfiguration(stewart); stewart.platform_F.Fa = Ai; stewart.platform_M.Mb = Bi <span class="org-type">-</span> [0;0;1]<span class="org-type">*</span>stewart.geometry.H; stewart = computeJointsPose(stewart); stewart = initializeStewartPose(stewart, <span class="org-string">'AP'</span>, [0;0;0], <span class="org-string">'ARB'</span>, eye(3)); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalStruts(stewart); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">stewart = initializeStrutDynamics(stewart, <span class="org-string">'K'</span>, 1e6<span class="org-type">*</span>ones(6,1), <span class="org-string">'C'</span>, 1e2<span class="org-type">*</span>ones(6,1)); stewart = initializeAmplifiedStrutDynamics(stewart); stewart = initializeJointDynamics(stewart); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">displayArchitecture(stewart, <span class="org-string">'views'</span>, <span class="org-string">'all'</span>); </pre> </div> <pre class="example" id="org868846b"> describeStewartPlatform(stewart) GEOMETRY: - The height between the fixed based and the top platform is 95 [mm]. - Frame {A} is located 150 [mm] above the top platform. - The initial length of the struts are: 82.8, 82.8, 82.8, 82.8, 82.8, 82.8 [mm] ACTUATORS: - The actuators are mechanicaly amplified. - The vertical stiffness and damping contribution of the piezoelectric stack is: ka = 2e+07 [N/m] ca = 1e+01 [N/(m/s)] - Vertical stiffness when the piezoelectric stack is removed is: kr = 5e+06 [N/m] cr = 1e+01 [N/(m/s)] JOINTS: - The joints on the fixed based are universal joints - The joints on the mobile based are spherical joints - The position of the joints on the fixed based with respect to {F} are (in [mm]): -86.2 -74.7 22.3 86.3 -74.6 22.3 108 -37.3 22.3 21.5 112 22.3 -21.5 112 22.3 -108 -37.5 22.2 - The position of the joints on the mobile based with respect to {M} are (in [mm]): -28.4 -106 -22.4 28.5 -106 -22.5 106 28.5 -22.5 77.8 77.8 -22.5 -77.8 77.8 -22.5 -106 28.4 -22.5 </pre> <div class="org-src-container"> <pre class="src src-matlab">stewart = computeJacobian(stewart); </pre> </div> </div> </div> <div id="outline-container-org69ca639" class="outline-4"> <h4 id="org69ca639"><span class="section-number-4">1.7.2</span> Verify Jacobian</h4> <div class="outline-text-4" id="text-1-7-2"> <div class="org-src-container"> <pre class="src src-matlab">load(<span class="org-string">'./mat/nano_hexapod_object.mat'</span>, <span class="org-string">'stewart'</span>); J = stewart.kinematics.J; </pre> </div> <p> Transformation of motion: </p> <div class="org-src-container"> <pre class="src src-matlab">G1 = <span class="org-type">-</span>inv(J)<span class="org-type">*</span>G({<span class="org-string">'D1'</span>, <span class="org-string">'D2'</span>, <span class="org-string">'D3'</span>, <span class="org-string">'D4'</span>, <span class="org-string">'D5'</span>, <span class="org-string">'D6'</span>}, {<span class="org-string">'Fx'</span>, <span class="org-string">'Fy'</span>, <span class="org-string">'Fz'</span>, <span class="org-string">'Mx'</span>, <span class="org-string">'My'</span>, <span class="org-string">'Mz'</span>}); G2 = G({<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>}, {<span class="org-string">'Fx'</span>, <span class="org-string">'Fy'</span>, <span class="org-string">'Fz'</span>, <span class="org-string">'Mx'</span>, <span class="org-string">'My'</span>, <span class="org-string">'Mz'</span>}); </pre> </div> <p> Transformation of Forces and Torques </p> <div class="org-src-container"> <pre class="src src-matlab">G1 = G({<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>}, {<span class="org-string">'Fx'</span>, <span class="org-string">'Fy'</span>, <span class="org-string">'Fz'</span>, <span class="org-string">'Mx'</span>, <span class="org-string">'My'</span>, <span class="org-string">'Mz'</span>}); G2 = G({<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>}, {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>})<span class="org-type">*</span>inv(J<span class="org-type">'</span>); </pre> </div> <p> <b>Not working because the forces applied on the APA are not really forces applied on the top platform (reduced by a factor ~ka/ke)</b> </p> </div> </div> <div id="outline-container-org508dcc8" class="outline-4"> <h4 id="org508dcc8"><span class="section-number-4">1.7.3</span> Plant from APA forces to sample’s displacement</h4> <div class="outline-text-4" id="text-1-7-3"> <div class="org-src-container"> <pre class="src src-matlab">Gx = G({<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>}, {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>})<span class="org-type">*</span>inv(J<span class="org-type">'</span>); Gx.inputname = {<span class="org-string">'Fx'</span>, <span class="org-string">'Fy'</span>, <span class="org-string">'Fz'</span>, <span class="org-string">'Mx'</span>, <span class="org-string">'My'</span>, <span class="org-string">'Mz'</span>}; </pre> </div> </div> </div> <div id="outline-container-orgc349f1d" class="outline-4"> <h4 id="orgc349f1d"><span class="section-number-4">1.7.4</span> Plant in the Cartesian frame</h4> <div class="outline-text-4" id="text-1-7-4"> <p> Transfer function from forces/torque to displacement/rotation: </p> <div class="org-src-container"> <pre class="src src-matlab">GJ = inv(J)<span class="org-type">*</span>G({<span class="org-string">'D1'</span>, <span class="org-string">'D2'</span>, <span class="org-string">'D3'</span>, <span class="org-string">'D4'</span>, <span class="org-string">'D5'</span>, <span class="org-string">'D6'</span>}, {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>})<span class="org-type">*</span>inv(J<span class="org-type">'</span>); GJ.inputname = {<span class="org-string">'Fx'</span>, <span class="org-string">'Fy'</span>, <span class="org-string">'Fz'</span>, <span class="org-string">'Mx'</span>, <span class="org-string">'My'</span>, <span class="org-string">'Mz'</span>}; GJ.outputname = {<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>}; </pre> </div> </div> </div> <div id="outline-container-org74313d0" class="outline-4"> <h4 id="org74313d0"><span class="section-number-4">1.7.5</span> Plant in the frame of the legs => Verification of Jacobian for displacements</h4> <div class="outline-text-4" id="text-1-7-5"> <p> Transfer Function in the frame of the legs </p> <div class="org-src-container"> <pre class="src src-matlab">G1 = <span class="org-type">-</span>J<span class="org-type">*</span>G({<span class="org-string">'Dx'</span>, <span class="org-string">'Dy'</span>, <span class="org-string">'Dz'</span>, <span class="org-string">'Rx'</span>, <span class="org-string">'Ry'</span>, <span class="org-string">'Rz'</span>}, {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>}); G1.outputname = {<span class="org-string">'D1'</span>, <span class="org-string">'D2'</span>, <span class="org-string">'D3'</span>, <span class="org-string">'D4'</span>, <span class="org-string">'D5'</span>, <span class="org-string">'D6'</span>}; G2 = G({<span class="org-string">'D1'</span>, <span class="org-string">'D2'</span>, <span class="org-string">'D3'</span>, <span class="org-string">'D4'</span>, <span class="org-string">'D5'</span>, <span class="org-string">'D6'</span>}, {<span class="org-string">'F1'</span>, <span class="org-string">'F2'</span>, <span class="org-string">'F3'</span>, <span class="org-string">'F4'</span>, <span class="org-string">'F5'</span>, <span class="org-string">'F6'</span>}); </pre> </div> <div class="important" id="org0505913"> <p> It is working fine (until internal resonance of strut). </p> </div> </div> </div> </div> <div id="outline-container-orgd60e2b2" class="outline-3"> <h3 id="orgd60e2b2"><span class="section-number-3">1.8</span> Stiffness matrix</h3> <div class="outline-text-3" id="text-1-8"> <p> Neglecting stiffness of the joints, we have: \[ K = J^t \mathcal{K} J \] where \(\mathcal{K}\) is a diagonal 6x6 matrix with axial stiffness of the struts on the diagonal. </p> <p> Let’s note the axial stiffness of the APA: \[ k_{\text{APA}} = k + \frac{k_e k_a}{k_e + k_a} \] </p> <p> Them axial stiffness of the struts \(k_s\): \[ k_s = \frac{k_z k_{\text{APA}}}{k_z + 2 k_{\text{APA}}} \] </p> <div class="org-src-container"> <pre class="src src-matlab">kAPA = k <span class="org-type">+</span> ke<span class="org-type">*</span>ka<span class="org-type">/</span>(ke <span class="org-type">+</span> ka); ks = kz<span class="org-type">*</span>kAPA<span class="org-type">/</span>(kz <span class="org-type">+</span> 2<span class="org-type">*</span>kAPA); </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">Ks = J<span class="org-type">'*</span>(ks<span class="org-type">*</span>eye(6))<span class="org-type">*</span>J </pre> </div> <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> </colgroup> <tbody> <tr> <td class="org-right">1.9937e-06</td> <td class="org-right">7.7027e-12</td> <td class="org-right">-1.5885e-11</td> <td class="org-right">-1.6811e-10</td> <td class="org-right">8.7902e-06</td> <td class="org-right">3.0476e-11</td> </tr> <tr> <td class="org-right">7.7027e-12</td> <td class="org-right">1.9937e-06</td> <td class="org-right">2.7221e-11</td> <td class="org-right">-8.7901e-06</td> <td class="org-right">6.5081e-12</td> <td class="org-right">2.8619e-11</td> </tr> <tr> <td class="org-right">-1.5885e-11</td> <td class="org-right">2.7221e-11</td> <td class="org-right">2.6114e-07</td> <td class="org-right">-1.3209e-10</td> <td class="org-right">-6.1725e-11</td> <td class="org-right">4.0402e-11</td> </tr> <tr> <td class="org-right">-1.6811e-10</td> <td class="org-right">-8.7901e-06</td> <td class="org-right">-1.3209e-10</td> <td class="org-right">4.5712e-05</td> <td class="org-right">-5.7781e-10</td> <td class="org-right">-4.5817e-10</td> </tr> <tr> <td class="org-right">8.7902e-06</td> <td class="org-right">6.5081e-12</td> <td class="org-right">-6.1725e-11</td> <td class="org-right">-5.7781e-10</td> <td class="org-right">4.5712e-05</td> <td class="org-right">5.1628e-10</td> </tr> <tr> <td class="org-right">3.0476e-11</td> <td class="org-right">2.8619e-11</td> <td class="org-right">4.0402e-11</td> <td class="org-right">-4.5817e-10</td> <td class="org-right">5.1628e-10</td> <td class="org-right">1.3277e-05</td> </tr> </tbody> </table> <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> </colgroup> <tbody> <tr> <td class="org-right">1.9869e-06</td> <td class="org-right">2.043e-08</td> <td class="org-right">1.6444e-09</td> <td class="org-right">-4.094e-08</td> <td class="org-right">8.7579e-06</td> <td class="org-right">-3.5002e-09</td> </tr> <tr> <td class="org-right">3.746e-09</td> <td class="org-right">1.9841e-06</td> <td class="org-right">-5.5274e-09</td> <td class="org-right">-8.7257e-06</td> <td class="org-right">-5.5082e-08</td> <td class="org-right">-7.6978e-09</td> </tr> <tr> <td class="org-right">-3.2056e-09</td> <td class="org-right">-6.4295e-11</td> <td class="org-right">2.6079e-07</td> <td class="org-right">3.4103e-10</td> <td class="org-right">-9.3873e-09</td> <td class="org-right">9.6146e-10</td> </tr> <tr> <td class="org-right">-1.1677e-08</td> <td class="org-right">-8.736e-06</td> <td class="org-right">2.4322e-08</td> <td class="org-right">4.5343e-05</td> <td class="org-right">2.52e-07</td> <td class="org-right">2.5932e-08</td> </tr> <tr> <td class="org-right">8.7439e-06</td> <td class="org-right">8.441e-08</td> <td class="org-right">5.9144e-09</td> <td class="org-right">-1.6879e-07</td> <td class="org-right">4.546e-05</td> <td class="org-right">-9.8986e-09</td> </tr> <tr> <td class="org-right">3.3453e-09</td> <td class="org-right">4.508e-10</td> <td class="org-right">1.8718e-09</td> <td class="org-right">-2.7294e-09</td> <td class="org-right">2.8776e-08</td> <td class="org-right">1.3193e-05</td> </tr> </tbody> </table> <p> We can see that we have almost the same stiffness: </p> <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> <col class="org-right" /> </colgroup> <tbody> <tr> <td class="org-right">1.0034</td> <td class="org-right">0.00037703</td> <td class="org-right">-0.0096597</td> <td class="org-right">0.0041063</td> <td class="org-right">1.0037</td> <td class="org-right">-0.0087071</td> </tr> <tr> <td class="org-right">0.0020562</td> <td class="org-right">1.0048</td> <td class="org-right">-0.0049247</td> <td class="org-right">1.0074</td> <td class="org-right">-0.00011815</td> <td class="org-right">-0.0037178</td> </tr> <tr> <td class="org-right">0.0049552</td> <td class="org-right">-0.42338</td> <td class="org-right">1.0013</td> <td class="org-right">-0.38734</td> <td class="org-right">0.0065754</td> <td class="org-right">0.042021</td> </tr> <tr> <td class="org-right">0.014397</td> <td class="org-right">1.0062</td> <td class="org-right">-0.005431</td> <td class="org-right">1.0081</td> <td class="org-right">-0.0022929</td> <td class="org-right">-0.017668</td> </tr> <tr> <td class="org-right">1.0053</td> <td class="org-right">7.7101e-05</td> <td class="org-right">-0.010436</td> <td class="org-right">0.0034233</td> <td class="org-right">1.0055</td> <td class="org-right">-0.052157</td> </tr> <tr> <td class="org-right">0.0091102</td> <td class="org-right">0.063485</td> <td class="org-right">0.021584</td> <td class="org-right">0.16786</td> <td class="org-right">0.017941</td> <td class="org-right">1.0063</td> </tr> </tbody> </table> </div> </div> </div> <div id="outline-container-org8862f6b" class="outline-2"> <h2 id="org8862f6b"><span class="section-number-2">2</span> Function - Initialize Nano Hexapod</h2> <div class="outline-text-2" id="text-2"> <p> <a id="orgfdb5239"></a> </p> </div> <div id="outline-container-org438f7d8" class="outline-3"> <h3 id="org438f7d8">Function description</h3> <div class="outline-text-3" id="text-org438f7d8"> <div class="org-src-container"> <pre class="src src-matlab"> <span class="org-keyword">function</span> <span class="org-variable-name">[nano_hexapod]</span> = <span class="org-function-name">initializeNanoHexapodFinal</span>(<span class="org-variable-name">args</span>) </pre> </div> </div> </div> <div id="outline-container-org49bef56" class="outline-3"> <h3 id="org49bef56">Optional Parameters</h3> <div class="outline-text-3" id="text-org49bef56"> <div class="org-src-container"> <pre class="src src-matlab"> <span class="org-keyword">arguments</span> <span class="org-matlab-cellbreak"><span class="org-comment">%% Bottom Flexible Joints</span></span> <span class="org-variable-name">args</span>.flex_bot_type char {mustBeMember(args.flex_bot_type,{<span class="org-string">'2dof'</span>, <span class="org-string">'3dof'</span>, <span class="org-string">'4dof'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'4dof'</span> <span class="org-variable-name">args</span>.flex_bot_kRx (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>5 <span class="org-comment">% X bending stiffness [Nm/rad]</span> <span class="org-variable-name">args</span>.flex_bot_kRy (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>5 <span class="org-comment">% Y bending stiffness [Nm/rad]</span> <span class="org-variable-name">args</span>.flex_bot_kRz (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>260 <span class="org-comment">% Torsionnal stiffness [Nm/rad]</span> <span class="org-variable-name">args</span>.flex_bot_kz (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1e8 <span class="org-comment">% Axial Stiffness [N/m]</span> <span class="org-variable-name">args</span>.flex_bot_cRx (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>0.1 <span class="org-comment">% X bending Damping [Nm/(rad/s)]</span> <span class="org-variable-name">args</span>.flex_bot_cRy (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>0.1 <span class="org-comment">% Y bending Damping [Nm/(rad/s)]</span> <span class="org-variable-name">args</span>.flex_bot_cRz (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>0.1 <span class="org-comment">% Torsionnal Damping [Nm/(rad/s)]</span> <span class="org-variable-name">args</span>.flex_bot_cz (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1e2 <span class="org-comment">% Axial Damping [N/(m/s)]</span> <span class="org-matlab-cellbreak"><span class="org-comment">%% Top Flexible Joints</span></span> <span class="org-variable-name">args</span>.flex_top_type char {mustBeMember(args.flex_top_type,{<span class="org-string">'2dof'</span>, <span class="org-string">'3dof'</span>, <span class="org-string">'4dof'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'4dof'</span> <span class="org-variable-name">args</span>.flex_top_kRx (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>5 <span class="org-comment">% X bending stiffness [Nm/rad]</span> <span class="org-variable-name">args</span>.flex_top_kRy (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>5 <span class="org-comment">% Y bending stiffness [Nm/rad]</span> <span class="org-variable-name">args</span>.flex_top_kRz (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>260 <span class="org-comment">% Torsionnal stiffness [Nm/rad]</span> <span class="org-variable-name">args</span>.flex_top_kz (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1e8 <span class="org-comment">% Axial Stiffness [N/m]</span> <span class="org-variable-name">args</span>.flex_top_cRx (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>0.1 <span class="org-comment">% X bending Damping [Nm/(rad/s)]</span> <span class="org-variable-name">args</span>.flex_top_cRy (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>0.1 <span class="org-comment">% Y bending Damping [Nm/(rad/s)]</span> <span class="org-variable-name">args</span>.flex_top_cRz (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>0.1 <span class="org-comment">% Torsionnal Damping [Nm/(rad/s)]</span> <span class="org-variable-name">args</span>.flex_top_cz (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1e2 <span class="org-comment">% Axial Damping [N/(m/s)]</span> <span class="org-matlab-cellbreak"><span class="org-comment">%% Relative Motion Sensor</span></span> <span class="org-variable-name">args</span>.motion_sensor_type char {mustBeMember(args.motion_sensor_type,{<span class="org-string">'struts'</span>, <span class="org-string">'plates'</span>})} = <span class="org-string">'struts'</span> <span class="org-matlab-cellbreak"><span class="org-comment">%% Actuators</span></span> <span class="org-variable-name">args</span>.actuator_type char {mustBeMember(args.actuator_type,{<span class="org-string">'2dof'</span>, <span class="org-string">'flexible frame'</span>, <span class="org-string">'flexible'</span>})} = <span class="org-string">'flexible'</span> <span class="org-variable-name">args</span>.actuator_Ga (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1 <span class="org-comment">% Actuator gain [N/V]</span> <span class="org-variable-name">args</span>.actuator_Gs (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1 <span class="org-comment">% Sensor gain [V/m]</span> <span class="org-comment">% For 2DoF</span> <span class="org-variable-name">args</span>.actuator_k (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>0.35e6 <span class="org-comment">% [N/m]</span> <span class="org-variable-name">args</span>.actuator_ke (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1.5e6 <span class="org-comment">% [N/m]</span> <span class="org-variable-name">args</span>.actuator_ka (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>43e6 <span class="org-comment">% [N/m]</span> <span class="org-variable-name">args</span>.actuator_c (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>3e1 <span class="org-comment">% [N/(m/s)]</span> <span class="org-variable-name">args</span>.actuator_ce (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1e1 <span class="org-comment">% [N/(m/s)]</span> <span class="org-variable-name">args</span>.actuator_ca (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1e1 <span class="org-comment">% [N/(m/s)]</span> <span class="org-variable-name">args</span>.actuator_Leq (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>0.056 <span class="org-comment">% [m]</span> <span class="org-comment">% For Flexible Frame</span> <span class="org-variable-name">args</span>.actuator_ks (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>235e6 <span class="org-comment">% Stiffness of one stack [N/m]</span> <span class="org-variable-name">args</span>.actuator_cs (6,1) double {mustBeNumeric} = ones(6,1)<span class="org-type">*</span>1e1 <span class="org-comment">% Stiffness of one stack [N/m]</span> <span class="org-comment">% For Flexible</span> <span class="org-variable-name">args</span>.actuator_xi (1,1) double {mustBeNumeric} = 0.01 <span class="org-comment">% Sensor gain [V/m]</span> <span class="org-keyword">end</span> </pre> </div> </div> </div> <div id="outline-container-org33f6631" class="outline-3"> <h3 id="org33f6631">Nano Hexapod Object</h3> <div class="outline-text-3" id="text-org33f6631"> <div class="org-src-container"> <pre class="src src-matlab">nano_hexapod = struct(); </pre> </div> </div> </div> <div id="outline-container-orgdc3de74" class="outline-3"> <h3 id="orgdc3de74">Flexible Joints - Bot</h3> <div class="outline-text-3" id="text-orgdc3de74"> <div class="org-src-container"> <pre class="src src-matlab">nano_hexapod.flex_bot = struct(); <span class="org-keyword">switch</span> <span class="org-constant">args.flex_bot_type</span> <span class="org-keyword">case</span> <span class="org-string">'2dof'</span> nano_hexapod.flex_bot.type = 1; <span class="org-keyword">case</span> <span class="org-string">'3dof'</span> nano_hexapod.flex_bot.type = 2; <span class="org-keyword">case</span> <span class="org-string">'4dof'</span> nano_hexapod.flex_bot.type = 3; <span class="org-keyword">case</span> <span class="org-string">'flexible'</span> nano_hexapod.flex_bot.type = 4; <span class="org-keyword">end</span> nano_hexapod.flex_bot.kRx = args.flex_bot_kRx; <span class="org-comment">% X bending stiffness [Nm/rad]</span> nano_hexapod.flex_bot.kRy = args.flex_bot_kRy; <span class="org-comment">% Y bending stiffness [Nm/rad]</span> nano_hexapod.flex_bot.kRz = args.flex_bot_kRz; <span class="org-comment">% Torsionnal stiffness [Nm/rad]</span> nano_hexapod.flex_bot.kz = args.flex_bot_kz; <span class="org-comment">% Axial stiffness [N/m]</span> nano_hexapod.flex_bot.cRx = args.flex_bot_cRx; <span class="org-comment">% [Nm/(rad/s)]</span> nano_hexapod.flex_bot.cRy = args.flex_bot_cRy; <span class="org-comment">% [Nm/(rad/s)]</span> nano_hexapod.flex_bot.cRz = args.flex_bot_cRz; <span class="org-comment">% [Nm/(rad/s)]</span> nano_hexapod.flex_bot.cz = args.flex_bot_cz; <span class="org-comment">%[N/(m/s)]</span> </pre> </div> </div> </div> <div id="outline-container-org7d4d003" class="outline-3"> <h3 id="org7d4d003">Flexible Joints - Top</h3> <div class="outline-text-3" id="text-org7d4d003"> <div class="org-src-container"> <pre class="src src-matlab">nano_hexapod.flex_top = struct(); <span class="org-keyword">switch</span> <span class="org-constant">args.flex_top_type</span> <span class="org-keyword">case</span> <span class="org-string">'2dof'</span> nano_hexapod.flex_top.type = 1; <span class="org-keyword">case</span> <span class="org-string">'3dof'</span> nano_hexapod.flex_top.type = 2; <span class="org-keyword">case</span> <span class="org-string">'4dof'</span> nano_hexapod.flex_top.type = 3; <span class="org-keyword">case</span> <span class="org-string">'flexible'</span> nano_hexapod.flex_top.type = 4; <span class="org-keyword">end</span> nano_hexapod.flex_top.kRx = args.flex_top_kRx; <span class="org-comment">% X bending stiffness [Nm/rad]</span> nano_hexapod.flex_top.kRy = args.flex_top_kRy; <span class="org-comment">% Y bending stiffness [Nm/rad]</span> nano_hexapod.flex_top.kRz = args.flex_top_kRz; <span class="org-comment">% Torsionnal stiffness [Nm/rad]</span> nano_hexapod.flex_top.kz = args.flex_top_kz; <span class="org-comment">% Axial stiffness [N/m]</span> nano_hexapod.flex_top.cRx = args.flex_top_cRx; <span class="org-comment">% [Nm/(rad/s)]</span> nano_hexapod.flex_top.cRy = args.flex_top_cRy; <span class="org-comment">% [Nm/(rad/s)]</span> nano_hexapod.flex_top.cRz = args.flex_top_cRz; <span class="org-comment">% [Nm/(rad/s)]</span> nano_hexapod.flex_top.cz = args.flex_top_cz; <span class="org-comment">%[N/(m/s)]</span> </pre> </div> </div> </div> <div id="outline-container-org3744992" class="outline-3"> <h3 id="org3744992">Relative Motion Sensor</h3> <div class="outline-text-3" id="text-org3744992"> <div class="org-src-container"> <pre class="src src-matlab">nano_hexapod.motion_sensor = struct(); <span class="org-keyword">switch</span> <span class="org-constant">args.motion_sensor_type</span> <span class="org-keyword">case</span> <span class="org-string">'struts'</span> nano_hexapod.motion_sensor.type = 1; <span class="org-keyword">case</span> <span class="org-string">'plates'</span> nano_hexapod.motion_sensor.type = 2; <span class="org-keyword">end</span> </pre> </div> </div> </div> <div id="outline-container-orgdaa740a" class="outline-3"> <h3 id="orgdaa740a">Amplified Piezoelectric Actuator</h3> <div class="outline-text-3" id="text-orgdaa740a"> <div class="org-src-container"> <pre class="src src-matlab">nano_hexapod.actuator = struct(); <span class="org-keyword">switch</span> <span class="org-constant">args.actuator_type</span> <span class="org-keyword">case</span> <span class="org-string">'2dof'</span> nano_hexapod.actuator.type = 1; <span class="org-keyword">case</span> <span class="org-string">'flexible frame'</span> nano_hexapod.actuator.type = 2; <span class="org-keyword">case</span> <span class="org-string">'flexible'</span> nano_hexapod.actuator.type = 3; <span class="org-keyword">end</span> </pre> </div> <div class="org-src-container"> <pre class="src src-matlab">nano_hexapod.actuator.Ga = args.actuator_Ga; <span class="org-comment">% Actuator gain [N/V]</span> nano_hexapod.actuator.Gs = args.actuator_Gs; <span class="org-comment">% Sensor gain [V/m]</span> </pre> </div> <p> 2dof </p> <div class="org-src-container"> <pre class="src src-matlab">nano_hexapod.actuator.k = args.actuator_k; <span class="org-comment">% [N/m]</span> nano_hexapod.actuator.ke = args.actuator_ke; <span class="org-comment">% [N/m]</span> nano_hexapod.actuator.ka = args.actuator_ka; <span class="org-comment">% [N/m]</span> nano_hexapod.actuator.c = args.actuator_c; <span class="org-comment">% [N/(m/s)]</span> nano_hexapod.actuator.ce = args.actuator_ce; <span class="org-comment">% [N/(m/s)]</span> nano_hexapod.actuator.ca = args.actuator_ca; <span class="org-comment">% [N/(m/s)]</span> nano_hexapod.actuator.Leq = args.actuator_Leq; <span class="org-comment">% [m]</span> </pre> </div> <p> Flexible frame and fully flexible </p> <div class="org-src-container"> <pre class="src src-matlab"><span class="org-keyword">switch</span> <span class="org-constant">args.actuator_type</span> <span class="org-keyword">case</span> <span class="org-string">'flexible frame'</span> nano_hexapod.actuator.K = readmatrix(<span class="org-string">'APA300ML_b_mat_K.CSV'</span>); <span class="org-comment">% Stiffness Matrix</span> nano_hexapod.actuator.M = readmatrix(<span class="org-string">'APA300ML_b_mat_M.CSV'</span>); <span class="org-comment">% Mass Matrix</span> nano_hexapod.actuator.P = extractNodes(<span class="org-string">'APA300ML_b_out_nodes_3D.txt'</span>); <span class="org-comment">% Node coordinates [m]</span> <span class="org-keyword">case</span> <span class="org-string">'flexible'</span> nano_hexapod.actuator.K = readmatrix(<span class="org-string">'APA300ML_full_mat_K.CSV'</span>); <span class="org-comment">% Stiffness Matrix</span> nano_hexapod.actuator.M = readmatrix(<span class="org-string">'APA300ML_full_mat_M.CSV'</span>); <span class="org-comment">% Mass Matrix</span> nano_hexapod.actuator.P = extractNodes(<span class="org-string">'APA300ML_full_out_nodes_3D.txt'</span>); <span class="org-comment">% Node coordiantes [m]</span> <span class="org-keyword">end</span> nano_hexapod.actuator.xi = args.actuator_xi; <span class="org-comment">% Damping ratio</span> nano_hexapod.actuator.ks = args.actuator_ks; <span class="org-comment">% Stiffness of one stack [N/m]</span> nano_hexapod.actuator.cs = args.actuator_cs; <span class="org-comment">% Damping of one stack [N/m]</span> </pre> </div> </div> </div> <div id="outline-container-org8187b3b" class="outline-3"> <h3 id="org8187b3b">Save the Structure</h3> <div class="outline-text-3" id="text-org8187b3b"> <div class="org-src-container"> <pre class="src src-matlab"><span class="org-keyword">if</span> nargout <span class="org-type">==</span> 0 save(<span class="org-string">'./mat/stages.mat'</span>, <span class="org-string">'nano_hexapod'</span>, <span class="org-string">'-append'</span>); <span class="org-keyword">end</span> </pre> </div> </div> </div> </div> </div> <div id="postamble" class="status"> <p class="author">Author: Dehaeze Thomas</p> <p class="date">Created: 2021-04-19 lun. 16:22</p> </div> </body> </html>