diff --git a/docs/figs/nano_hexapod_cartesian_plant_encoder_comp.pdf b/docs/figs/nano_hexapod_cartesian_plant_encoder_comp.pdf index f54c4f1..dd05fe2 100644 Binary files a/docs/figs/nano_hexapod_cartesian_plant_encoder_comp.pdf and b/docs/figs/nano_hexapod_cartesian_plant_encoder_comp.pdf differ diff --git a/docs/figs/nano_hexapod_cartesian_plant_encoder_comp.png b/docs/figs/nano_hexapod_cartesian_plant_encoder_comp.png index d2f29dd..f701720 100644 Binary files a/docs/figs/nano_hexapod_cartesian_plant_encoder_comp.png and b/docs/figs/nano_hexapod_cartesian_plant_encoder_comp.png differ diff --git a/docs/figs/nano_hexapod_cartesian_plant_perfect_joints.pdf b/docs/figs/nano_hexapod_cartesian_plant_perfect_joints.pdf new file mode 100644 index 0000000..6ca4f5a Binary files /dev/null and b/docs/figs/nano_hexapod_cartesian_plant_perfect_joints.pdf differ diff --git a/docs/figs/nano_hexapod_cartesian_plant_perfect_joints.png b/docs/figs/nano_hexapod_cartesian_plant_perfect_joints.png new file mode 100644 index 0000000..bf6f980 Binary files /dev/null and b/docs/figs/nano_hexapod_cartesian_plant_perfect_joints.png differ diff --git a/docs/figs/nano_hexapod_comp_cartesian_plants_plates.pdf b/docs/figs/nano_hexapod_comp_cartesian_plants_plates.pdf index 764f14a..1d2cda7 100644 Binary files a/docs/figs/nano_hexapod_comp_cartesian_plants_plates.pdf and b/docs/figs/nano_hexapod_comp_cartesian_plants_plates.pdf differ diff --git a/docs/figs/nano_hexapod_comp_cartesian_plants_plates.png b/docs/figs/nano_hexapod_comp_cartesian_plants_plates.png index 1473777..25467fc 100644 Binary files a/docs/figs/nano_hexapod_comp_cartesian_plants_plates.png and b/docs/figs/nano_hexapod_comp_cartesian_plants_plates.png differ diff --git a/docs/figs/nano_hexapod_comp_cartesian_plants_struts.pdf b/docs/figs/nano_hexapod_comp_cartesian_plants_struts.pdf index cd4e037..42edc31 100644 Binary files a/docs/figs/nano_hexapod_comp_cartesian_plants_struts.pdf and b/docs/figs/nano_hexapod_comp_cartesian_plants_struts.pdf differ diff --git a/docs/figs/nano_hexapod_comp_cartesian_plants_struts.png b/docs/figs/nano_hexapod_comp_cartesian_plants_struts.png index 140ea7a..fb2fd8a 100644 Binary files a/docs/figs/nano_hexapod_comp_cartesian_plants_struts.png and b/docs/figs/nano_hexapod_comp_cartesian_plants_struts.png differ diff --git a/docs/figs/nano_hexapod_effect_encoder.pdf b/docs/figs/nano_hexapod_effect_encoder.pdf index 5405b27..a25b02b 100644 Binary files a/docs/figs/nano_hexapod_effect_encoder.pdf and b/docs/figs/nano_hexapod_effect_encoder.pdf differ diff --git a/docs/figs/nano_hexapod_effect_encoder.png b/docs/figs/nano_hexapod_effect_encoder.png index eafff35..9b986bb 100644 Binary files a/docs/figs/nano_hexapod_effect_encoder.png and b/docs/figs/nano_hexapod_effect_encoder.png differ diff --git a/docs/nano_hexapod.html b/docs/nano_hexapod.html index fa16bc6..f90c338 100644 --- a/docs/nano_hexapod.html +++ b/docs/nano_hexapod.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Nano-Hexapod @@ -58,6 +58,8 @@
  • 1.8. Decentralized Plant - Decoupling at the Center of Stiffness @@ -76,26 +78,26 @@
  • 2. Active Damping using Integral Force Feedback
  • 3. Active Damping using Direct Velocity Feedback - Encoders on the struts
  • 4. Active Damping using Direct Velocity Feedback - Encoders on the plates
  • 5. Function - Initialize Nano Hexapod @@ -129,31 +131,31 @@ In this document, a Simscape model of the nano-hexapod is developed and studied. It is structured as follows:

    1 Nano-Hexapod

    - +

    1.1 Nano Hexapod - Configuration

    - +

    -The nano-hexapod can be initialized and configured using the initializeNanoHexapodFinal function (link). +The nano-hexapod can be initialized and configured using the initializeNanoHexapodFinal function (link).

    -The following code would produce the model shown in Figure 1. +The following code would produce the model shown in Figure 1.

    n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ...
    @@ -165,7 +167,7 @@ The following code would produce the model shown in Figure 
     
     
    -
    +

    nano_hexapod_simscape_encoder_struts.png

    Figure 1: 3D view of the Sismcape model for the Nano-Hexapod

    @@ -175,21 +177,21 @@ The following code would produce the model shown in Figure

    1.1.1 Flexible Joints

    - +

    -The model of the flexible joint is composed of 3 solid bodies as shown in Figure 2 which are connected by joints representing the flexibility of the joint. +The model of the flexible joint is composed of 3 solid bodies as shown in Figure 2 which are connected by joints representing the flexibility of the joint.

    @@ -202,10 +204,10 @@ We can represent:

    -The configurations and the represented flexibilities are summarized in Table 1. +The configurations and the represented flexibilities are summarized in Table 1.

    - +
    @@ -254,7 +256,7 @@ Of course, adding more DoF for the flexible joint will induce an addition of man

    -
    +

    simscape_model_flexible_joint.png

    Figure 2: 3D view of the Sismcape model for the Flexible joint (4DoF configuration)

    @@ -266,7 +268,7 @@ Of course, adding more DoF for the flexible joint will induce an addition of man

    1.1.2 Amplified Piezoelectric Actuators

    - +

    @@ -278,11 +280,11 @@ The APA can be modeled in different ways which can be configured with the

    -The simplest model is a 2-DoF system shown in Figure 3. +The simplest model is a 2-DoF system shown in Figure 3.

    -
    +

    2dof_apa_model.png

    Figure 3: Schematic of the 2DoF model for the Amplified Piezoelectric Actuator

    @@ -298,11 +300,11 @@ Then, a more complex model based on a Finite Element Model can be used.

    1.1.3 Encoders

    - +

    -The encoders can be either fixed directly on the struts (Figure 4) or on the two plates (Figure 5). +The encoders can be either fixed directly on the struts (Figure 4) or on the two plates (Figure 5).

    @@ -310,32 +312,32 @@ This can be configured with the motion_sensor_type parameters which

    -
    +

    encoder_struts.png

    Figure 4: 3D view of the Encoders fixed on the struts

    -
    +

    encoders_plates_with_apa.png

    Figure 5: 3D view of the Encoders fixed on the plates

    -A complete view of the nano-hexapod with encoders fixed to the struts is shown in Figure 1 while it is shown in Figure 6 when the encoders are fixed to the plates. +A complete view of the nano-hexapod with encoders fixed to the struts is shown in Figure 1 while it is shown in Figure 6 when the encoders are fixed to the plates.

    -
    +

    nano_hexapod_simscape_encoder_plates.png

    Figure 6: Nano-Hexapod with encoders fixed to the plates

    -The encoder model is schematically represented in Figure 7: +The encoder model is schematically represented in Figure 7:

    • a frame {B}, fixed to the ruler is positioned on its top surface
    • @@ -347,18 +349,18 @@ The output measurement is then the x displacement of the origin of the frame {F}

      -
      +

      simscape_encoder_model.png

      Figure 7: Schematic of the encoder model

      -If the encoder is experiencing some tilt, it is then “converted” into a measured displacement as shown in Figure 8. +If the encoder is experiencing some tilt, it is then “converted” into a measured displacement as shown in Figure 8.

      -
      +

      simscape_encoder_model_disp.png

      Figure 8: Schematic of the encoder model

      @@ -370,7 +372,7 @@ If the encoder is experiencing some tilt, it is then “converted” int

      1.1.4 Jacobians

      - +

      @@ -390,7 +392,7 @@ Same thing can be done for the measured encoder displacements.

      1.2 Effect of encoders on the decentralized plant

      - +

      @@ -401,14 +403,7 @@ We here wish to compare the plant from actuators to the encoders when the encode We initialize the identification parameters.

      -
      %% Options for Linearized
      -options = linearizeOptions;
      -options.SampleTime = 0;
      -
      -%% Name of the Simulink File
      -mdl = 'nano_hexapod';
      -
      -%% Input/Output definition
      +
      %% Input/Output definition
       clear io; io_i = 1;
       io(io_i) = linio([mdl, '/F'],  1, 'openinput');  io_i = io_i + 1; % Actuator Inputs
       io(io_i) = linio([mdl, '/D'],  1, 'openoutput'); io_i = io_i + 1; % Relative Motion Outputs
      @@ -420,7 +415,7 @@ Identify the plant when the encoders are on the struts:
       

      n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ...
      -                                       'flex_top_type', '3dof', ...
      +                                       'flex_top_type', '4dof', ...
                                              'motion_sensor_type', 'struts', ...
                                              'actuator_type', '2dof');
       
      @@ -435,7 +430,7 @@ And identify the plant when the encoders are fixed on the plates:
       

      n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ...
      -                                       'flex_top_type', '3dof', ...
      +                                       'flex_top_type', '4dof', ...
                                              'motion_sensor_type', 'plates', ...
                                              'actuator_type', '2dof');
       
      @@ -446,19 +441,20 @@ Gp.OutputName = {'D1', 
       

      -The obtained plants are compared in Figure 9. +The obtained plants are compared in Figure 9.

      -
      +

      nano_hexapod_effect_encoder.png

      Figure 9: Comparison of the plants from actuator to associated encoder when the encoders are either fixed to the struts or to the plates

      -
      +

      -The zeros at 400Hz and 800Hz should corresponds to resonances of the system when one of the APA is blocked. +The zeros at 280Hz should corresponds to resonances of the system when one of the APA is blocked. It is linked to the axial stiffness of the flexible joints: increasing the axial stiffness of the joints will increase the frequency of the zeros. +This will be verified in

      @@ -469,7 +465,7 @@ It is linked to the axial stiffness of the flexible joints: increasing the axial

      1.3 Effect of APA flexibility

      - +

      @@ -504,15 +500,15 @@ Gf.OutputName = {'D1',

      -
      +

      nano_hexapod_effect_flexible_apa.png

      Figure 10: Comparison of the plants from actuator to associated strut encoder when the APA are modelled with a 2DoF system of with a flexible one

      -
      +

      -The first resonance is strange when using the flexible APA model (Figure 10). +The first resonance is strange when using the flexible APA model (Figure 10). Moreover the system is unstable. Otherwise, the 2DoF model matches quite well the flexible model considering its simplicity.

      @@ -525,7 +521,7 @@ Otherwise, the 2DoF model matches quite well the flexible model considering its

      1.4 Nano Hexapod - Number of DoF

      - +

      @@ -550,10 +546,10 @@ There are 24 states.

      -These states are summarized on table 2. +These states are summarized on table 2.

      -
    Table 1: Flexible joint’s configuration and associated represented flexibility
    +
    @@ -637,7 +633,7 @@ There are 60 states. -
    +

    Obtained number of states is very comprehensible. Depending on the physical effects we want to model, we therefore know how many states are added when configuring the model. @@ -651,27 +647,20 @@ Depending on the physical effects we want to model, we therefore know how many s

    1.5 Direct Velocity Feedback Plant

    - +

    The transfer function from actuator forces \(\tau_i\) to the encoder measurements \(\mathcal{L}_i\) is now identified both when the encoders are fixed to the struts.

    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'nano_hexapod';
    -
    -%% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
     io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1; % Actuator Inputs [N]
     io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; % Relative displacements [m]
     
     n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ...
    -                                       'flex_top_type', '3dof', ...
    +                                       'flex_top_type', '4dof', ...
                                            'motion_sensor_type', 'struts', ...
                                            'actuator_type', '2dof');
     
    @@ -693,9 +682,9 @@ DCgain = 1.87e-08 [m/N]
     
     
     

    -Let’s verify that by looking at the DC gain of the \(6 \times 6\) DVF plant in Table 3. +Let’s verify that by looking at the DC gain of the \(6 \times 6\) DVF plant in Table 3.

    -
    Table 2: Number of states for the minimalist model
    +
    @@ -769,10 +758,10 @@ Let’s verify that by looking at the DC gain of the \(6 \times 6\) DVF plan
    Table 3: DC gain of the DVF plant

    -And the bode plot of the DVF plant is shown in Figure 11. +And the bode plot of the DVF plant is shown in Figure 11.

    -
    +

    nano_hexapod_struts_2dof_dvf_plant.png

    Figure 11: Bode plot of the transfer functions from actuator forces \(\tau_i\) to relative motion sensors attached to the struts \(\mathcal{L}_i\). Diagonal terms are shown in blue, and off-diagonal terms in black.

    @@ -784,27 +773,21 @@ And the bode plot of the DVF plant is shown in Figure 111.6 Integral Force Feedback Plant

    - +

    The transfer function from actuators to force sensors is identified. +It corresponds to the plant for the Integral Force Feedback (IFF) control strategy.

    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'nano_hexapod';
    -
    -%% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
     io(io_i) = linio([mdl, '/F'],  1, 'openinput');   io_i = io_i + 1; % Actuator Inputs
     io(io_i) = linio([mdl, '/Fm'],  1, 'openoutput'); io_i = io_i + 1; % Force Sensors
     
     n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ...
    -                                       'flex_top_type', '3dof', ...
    +                                       'flex_top_type', '4dof', ...
                                            'motion_sensor_type', 'struts', ...
                                            'actuator_type', '2dof');
     
    @@ -813,14 +796,100 @@ Giff = linearize(mdl, io, 0.0, options);
     

    -This is corresponding to the dynamics for the Integral Force Feedback (IFF) control strategy. +The DC gain from actuator to the force sensor should be equal to (for the 2dof APA): +\[ \frac{k_e k_1}{k_1 k_e + k_a k_1 + k_e k_a} \]

    -The bode plot is shown in Figure 12. +Which is equal to: +

    +
    +DCgain = 6.56e-03 [m/N]
    +
    + + +

    +This is indeed close to what we see on DC gain of the \(6 \times 6\) IFF plant in Table 4. +Also, the off diagonal terms are quite small compared to the diagonal terms. +

    + + + +++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 4: DC gain of the IFF plant
    0.00680.0002-0.0002-0.00.0002-0.0001
    0.00030.00680.0001-0.0001-0.00010.0002
    0.00010.00.0068-0.0001-0.00010.0001
    -0.0002-0.00030.00010.0068-0.0002-0.0
    -0.0001-0.0003-0.00.00010.00650.0
    0.00010.0001-0.0002-0.00.00020.0066
    + +

    +The bode plot is shown in Figure 12.

    -
    +

    nano_hexapod_struts_2dof_iff_plant.png

    Figure 12: Bode plot of the transfer functions from actuator forces \(\tau_i\) to force sensors \(F_{m,i}\). Diagonal terms are shown in blue, and off-diagonal terms in black.

    @@ -832,10 +901,10 @@ The bode plot is shown in Figure 12.

    1.7 Decentralized Plant - Cartesian coordinates

    - +

    -Consider the plant shown in Figure 13 with: +Consider the plant shown in Figure 13 with:

    • \(\tau\) the 6 input forces (APA)
    • @@ -845,7 +914,7 @@ Consider the plant shown in Figure 13 with:
    -
    +

    nano_hexapod_decentralized_schematic.png

    Figure 13: Plant in the cartesian Frame

    @@ -862,14 +931,7 @@ The “perfect” sensor output \(\mathcal{X}\) is used to verify that t Let’s then identify the plant for both configuration, and compare the transfer functions from \(\mathcal{F}\) to \(d\mathcal{X}\) and to \(\mathcal{X}\).

    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'nano_hexapod';
    -
    -%% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
     io(io_i) = linio([mdl, '/F'],  1, 'openinput');  io_i = io_i + 1; % Actuator Inputs
     io(io_i) = linio([mdl, '/D'],  1, 'openoutput'); io_i = io_i + 1; % Relative Motion Outputs
    @@ -882,7 +944,7 @@ Start when the encoders are fixed on the struts.
     

    n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ...
    -                                       'flex_top_type', '3dof', ...
    +                                       'flex_top_type', '4dof', ...
                                            'motion_sensor_type', 'struts', ...
                                            'actuator_type', '2dof', ...
                                            'MO_B', 150e-3);
    @@ -899,10 +961,10 @@ Gsp = -Gs({'Dx', <
     

    -The diagonal elements of the plant are shown in Figure 14. +The diagonal elements of the plant are shown in Figure 14.

    -
    +

    nano_hexapod_comp_cartesian_plants_struts.png

    Figure 14: Bode plot of the diagonal elements of the decentralized (cartesian) plant when using the sensor Jacobian (solid) and when using “perfect” 6dof sensor (dashed). The encoders are fixed on the struts.

    @@ -913,7 +975,7 @@ The same if performed when the encoders are fixed to the plates.

    n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ...
    -                                       'flex_top_type', '3dof', ...
    +                                       'flex_top_type', '4dof', ...
                                            'motion_sensor_type', 'plates', ...
                                            'actuator_type', '2dof', ...
                                            'MO_B', 150e-3);
    @@ -930,16 +992,16 @@ Gpp = -Gp({'Dx', <
     

    -The obtained bode plots are shown in Figure 15. +The obtained bode plots are shown in Figure 15.

    -
    +

    nano_hexapod_comp_cartesian_plants_plates.png

    Figure 15: Bode plot of the diagonal elements of the decentralized (cartesian) plant when using the sensor Jacobian (solid) and when using “perfect” 6dof sensor (dashed). The encoders are fixed on the plates.

    -
    +

    The Jacobian for the encoders is working properly both when the encoders are fixed to the plates or to the struts.

    @@ -956,14 +1018,104 @@ However, then the encoders are fixed to the struts, there is a mismatch between

    1.7.2 Comparison of the decentralized plants

    -The decentralized plants are now compared whether the encoders are fixed on the struts or on the plates in Figure 16. +The decentralized plants are now compared whether the encoders are fixed on the struts or on the plates in Figure 16.

    -
    +

    nano_hexapod_cartesian_plant_encoder_comp.png

    Figure 16: Bode plot of the “cartesian” plant (transfer function from \(\mathcal{F}\) to \(d\mathcal{X}\)) when the encoders are fixed on the struts (solid) and on the plates (dashed)

    + +
    +

    +Is the complex conjugate zeros on Figure 16 could be due to the axial stiffness of the joints? +Let’s find out by using a model with no axial flexibility on the joints and see if we still have this zero. +

    + +
    +
    +
    + +
    +

    1.7.3 Perfect axial stiffness of the joints

    +
    +

    +Let’s initialize the Nano-Hexapod with perfect joints (no axial stiffness): +

    +
    +
    n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '3dof', ...
    +                                       'flex_top_type', '2dof', ...
    +                                       'motion_sensor_type', 'struts', ...
    +                                       'actuator_type', '2dof', ...
    +                                       'MO_B', 150e-3);
    +
    +
    + +

    +Identify its dynamics. +

    +
    +
    G = linearize(mdl, io, 0.0, options);
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'D1', 'D2', 'D3', 'D4', 'D5', 'D6', ...
    +                'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +
    +
    + +

    +And compute the transfer function in the cartesian frame. +

    +
    +
    G = inv(n_hexapod.geometry.Js)*G({'D1', 'D2', 'D3', 'D4', 'D5', 'D6'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'})*inv(n_hexapod.geometry.J)';
    +
    +
    + +

    +The obtained dynamics is shown in Figure 17. +It is shown that there are no zeros at high frequency. +

    + +
    +

    nano_hexapod_cartesian_plant_perfect_joints.png +

    +

    Figure 17: Bode plot of the “cartesian” plant (transfer function from \(\mathcal{F}\) to \(d\mathcal{X}\)) when the encoders are fixed on the struts and with perfect joints (infinite axial stiffness)

    +
    + +
    +

    +The zeros appearing between 100Hz and 500Hz are due to the axial stiffness of the flexible joints. +They appear when the relative motion sensors are fixed to the struts. +They basically correspond to the resonance frequency where the APA are infinitively stiff. +

    + +
    +
    +
    + +
    +

    1.7.4 Frequency of the zeros

    +
    +

    +Let’s verify this last affirmation by generating a nano-hexapod with very stiff APA. +

    +
    +
    n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ...
    +                                       'flex_top_type', '4dof', ...
    +                                       'motion_sensor_type', 'struts', ...
    +                                       'actuator_type', '2dof', ...
    +                                       'actuator_k',  1e9*ones(6,1));
    +Gs = linearize(mdl, io, 0.0, options);
    +Gs.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Gs.OutputName = {'D1', 'D2', 'D3', 'D4', 'D5', 'D6'};
    +
    +
    + +
    +
    Gs_p = imag(pole(Gs))/2/pi;
    +sort(Gs_p(Gs_p > 0))
    +
    +
    @@ -972,7 +1124,7 @@ The decentralized plants are now compared whether the encoders are fixed on the

    1.8 Decentralized Plant - Decoupling at the Center of Stiffness

    - +

    @@ -980,7 +1132,7 @@ The decentralized plants are now compared whether the encoders are fixed on the

    1.8.1 Center of Stiffness

    - +

    @@ -1086,8 +1238,8 @@ And the (normalized) stiffness matrix is computed as follows:

    - - +
    Table 4: Normalized Stiffness Matrix - Center of Stiffness
    +@@ -1172,14 +1324,7 @@ And we indeed obtain a diagonal stiffness matrix. Let’s identify the transfer function from \(\tau\) to \(d\mathcal{L}\) and from \(\tau\) to \(\mathcal{X}\).

    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'nano_hexapod';
    -
    -%% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
     io(io_i) = linio([mdl, '/F'],  1, 'openinput');  io_i = io_i + 1; % Actuator Inputs
     io(io_i) = linio([mdl, '/D'],  1, 'openoutput'); io_i = io_i + 1; % Relative Motion Outputs
    @@ -1203,10 +1348,10 @@ Then use the Jacobian matrices to obtain the “cartesian” centralized
     

    -The DC gain of the obtained plant is shown in Table 5. +The DC gain of the obtained plant is shown in Table 6.

    -
    Table 5: Normalized Stiffness Matrix - Center of Stiffness
    - +
    Table 5: DC gain of the centralized plant at the center of stiffness
    +@@ -1287,16 +1432,16 @@ As the rotations and translations have very different gains, we normalize each m

    -The diagonal and off-diagonal elements are shown in Figure 17, and we can see good decoupling at low frequency. +The diagonal and off-diagonal elements are shown in Figure 18, and we can see good decoupling at low frequency.

    -
    +

    nano_hexapod_diagonal_plant_cok.png

    -

    Figure 17: Diagonal and off-diagonal elements of the (normalized) decentralized plant with the Jacobians estimated at the “center of stiffness”

    +

    Figure 18: Diagonal and off-diagonal elements of the (normalized) decentralized plant with the Jacobians estimated at the “center of stiffness”

    -
    +

    The Jacobian matrices can be used to decoupled the plant at low frequency.

    @@ -1310,7 +1455,7 @@ The Jacobian matrices can be used to decoupled the plant at low frequency.

    1.9 Stiffness matrix

    - +

    The stiffness matrix of the nano-hexapod describes its induced static displacement/rotation when a force/torque is applied on its top platform. @@ -1322,9 +1467,9 @@ Such location (or frame) is then used for the computation of the Jacobian which

    1.9.1 Compute the theoretical stiffness of the nano-hexapod

    -Neglecting stiffness of the joints, we have: +Neglecting the torsional/bending 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. +where \(\mathcal{K}\) is a diagonal 6x6 matrix with the axial stiffness of the struts on the diagonal.

    @@ -1333,7 +1478,7 @@ Let’s note the axial stiffness of the APA:

    -Them axial stiffness of the struts \(k_s\): +The axial stiffness of the struts \(k_s\) is then: \[ k_s = \frac{k_z k_{\text{APA}}}{k_z + 2 k_{\text{APA}}} \] with \(k_z\) the axial stiffness of the flexible joints.

    @@ -1349,25 +1494,9 @@ Let’s initialize the nano-hexapod.
    -

    -The axial stiffness of the joints and stiffnesses of the 2-DoF actuators are defined below. -

    -
    -
    k  = n_hexapod.actuator.k(1);
    -ke = n_hexapod.actuator.ke(1);
    -ka = n_hexapod.actuator.ka(1);
    -kz = n_hexapod.flex_top.kz(1); % Joint's axial stiffness [m/N]
    -
    -
    -

    The total axial stiffness of the APA is:

    -
    -
    kAPA = k + ke*ka/(ke + ka);
    -
    -
    -
     kAPA = 1.799e+06 [N/m]
     
    @@ -1376,19 +1505,14 @@ kAPA = 1.799e+06 [N/m]

    And the total axial stiffness of the struts is:

    -
    -
    ks = kz*kAPA/(kz + 2*kAPA);
    -
    -
    -
     ks = 1.737e+06 [N/m]
     
    -
    +

    -We can see that the axial stiffness of the flexible joint as little impact on the total axial stiffness of the struts. +We can see that the axial stiffness of the flexible joint as little impact on the total axial stiffness of the struts as it is much stiffer than the APA.

    @@ -1410,10 +1534,10 @@ And the compliance matrix can be computed as the inverse of the stiffness matrix

    -The obtained compliance matrix is shown in Table 6. +The obtained compliance matrix is shown in Table 7.

    -
    Table 6: DC gain of the centralized plant at the center of stiffness
    - +
    Table 6: Compliance Matrix - Perfect Joints
    +@@ -1494,14 +1618,7 @@ The obtained compliance matrix is shown in Table 6. Let’s now identify the compliance matrix using Simscape.

    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'nano_hexapod';
    -
    -%% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
     io(io_i) = linio([mdl, '/Fe'],  1, 'openinput');  io_i = io_i + 1; % External forces [N, Nm/rad]
     io(io_i) = linio([mdl, '/X'],   1, 'openoutput'); io_i = io_i + 1; % Induced motion [m, rad]
    @@ -1516,11 +1633,11 @@ It takes into account the bending and torsional stiffness of the flexible joints
     

    -The obtained compliance matrix is shown in Table 7. +The obtained compliance matrix is shown in Table 8.

    -
    Table 7: Compliance Matrix - Perfect Joints
    - +
    Table 7: Compliance Matrix - Estimated from Simscape
    +@@ -1592,13 +1709,93 @@ The obtained compliance matrix is shown in Table 7.
    Table 8: Compliance Matrix - Estimated from Simscape
    -

    -The bending and torsional stiffness of the flexible joints induces a lot of coupling between forces/torques applied to the to platform to its displacement/rotation. -It can be seen by comparison the compliance matrices in Tables 6 and 7. +Let’s compare the two obtained compliance matrices. +The results are shown in Table 9. +The diagonal terms are matching quite good, as well as the 1/4 and 2/5 of diagonal terms that are the most important ones.

    +

    +All the other terms are zero in the ideal case (Table 7). +There are not zero when considering the bending/torsional stiffness of the joints (Table 8), however they are still small as compared to the diagonal terms. +

    +
    +
    C./dcgain(G)
    +
    + + + + +++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 9: Compliance Matrices - Comparison
    1.0037-9.3741e-151.4613e-14-1.5751e-141.00690.090379
    8.6313e-151.014-0.00296561.02042.4404e-151.7641e-20
    -1.8807e-14-0.0249171.0028-0.020701-3.4857e-144.3304e-18
    6.6502e-151.0157-0.00299431.01932.3673e-151.9265e-20
    1.0061-1.0288e-142.1354e-14-1.7844e-141.00850.032102
    0.0048048-3.1201e-14-6.5769e-19-2.5589e-140.0028991.005
    @@ -1608,7 +1805,7 @@ It can be seen by comparison the compliance matrices in Tables 2 Active Damping using Integral Force Feedback

    - +

    In this section Integral Force Feedback (IFF) strategy is used to damp the nano-hexapod resonances. @@ -1618,17 +1815,17 @@ In this section Integral Force Feedback (IFF) strategy is used to damp th It is structured as follows:

      -
    • Section 2.1: the IFF plant is identified
    • -
    • Section 2.2: the optimal control gain is identified using the Root Locus plot
    • -
    • Section 2.3: the IFF is applied, and the effect on the damped plant is identified and compared with the un-damped one
    • -
    • Section 2.4: the IFF is applied, and the effect on the compliance is identified
    • +
    • Section 2.1: the IFF plant is identified
    • +
    • Section 2.2: the optimal control gain is identified using the Root Locus plot
    • +
    • Section 2.3: the IFF is applied, and the effect on the damped plant is identified and compared with the un-damped one
    • +
    • Section 2.4: the IFF is applied, and the effect on the compliance is identified
    -
    -

    2.1 Plant Identification

    +
    +

    2.1 Plant Identification

    - +

    @@ -1646,14 +1843,7 @@ The nano-hexapod is initialized as usual. The transfer function from actuator inputs to force sensors outputs is identified.

    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'nano_hexapod';
    -
    -%% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
     io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;  % Actuator Inputs
     io(io_i) = linio([mdl, '/Fm'], 1, 'openoutput'); io_i = io_i + 1; % Force Sensors
    @@ -1668,19 +1858,19 @@ Giff.OutputName = {'Fm1', 
    +

    nano_hexapod_iff_plant_bode_plot.png

    -

    Figure 18: Integral Force Feedback plant

    +

    Figure 19: Integral Force Feedback plant

    -
    -

    2.2 Root Locus

    +
    +

    2.2 Root Locus

    - +

    @@ -1703,14 +1893,14 @@ It is here chosen to have quite a large \(\omega_c\) in order to not modify the

    -The obtained Root Locus is shown in Figure 19. +The obtained Root Locus is shown in Figure 20. The control gain chosen for future plots is shown by the red crosses.

    -
    +

    nano_hexapod_iff_root_locus.png

    -

    Figure 19: Root locus for the decentralized IFF control strategy

    +

    Figure 20: Root locus for the decentralized IFF control strategy

    @@ -1723,14 +1913,14 @@ The obtained controller is then:

    -The corresponding loop gain of the diagonal terms are shown in Figure 20. +The corresponding loop gain of the diagonal terms are shown in Figure 21. It is shown that the loop gain is quite large around resonances (which allows to add lots of damping) and less than one at low frequency thanks to the large value of \(\omega_c\).

    -
    +

    nano_hexapod_iff_loop_gain.png

    -

    Figure 20: Loop gain of the diagonal terms \(G(i,i) \cdot K_{\text{IFF}}(i,i)\)

    +

    Figure 21: Loop gain of the diagonal terms \(G(i,i) \cdot K_{\text{IFF}}(i,i)\)

    @@ -1739,7 +1929,7 @@ It is shown that the loop gain is quite large around resonances (which allows to

    2.3 Effect of IFF on the plant

    - +

    @@ -1776,16 +1966,16 @@ Giff.OutputName = {'D1', 21. +The obtained plants are compared in Figure 22.

    -
    +

    nano_hexapod_effect_iff_plant.png

    -

    Figure 21: Bode plots of the transfer functions from actuator forces \(\tau_i\) to relative motion sensors \(\mathcal{L}_i\) with and without the IFF controller.

    +

    Figure 22: Bode plots of the transfer functions from actuator forces \(\tau_i\) to relative motion sensors \(\mathcal{L}_i\) with and without the IFF controller.

    -
    +

    The Integral Force Feedback Strategy is very effective to damp the 6 suspension modes of the nano-hexapod.

    @@ -1798,7 +1988,7 @@ The Integral Force Feedback Strategy is very effective to damp the 6 suspension

    2.4 Effect of IFF on the compliance

    - +

    @@ -1807,13 +1997,13 @@ Let’s quantify that for the nano-hexapod. The obtained compliances are compared in Figure

    -
    +

    nano_hexapod_iff_compare_compliance.png

    -

    Figure 22: Comparison of the compliances in Open Loop and with Integral Force Feedback controller

    +

    Figure 23: Comparison of the compliances in Open Loop and with Integral Force Feedback controller

    -
    +

    The use of IFF induces a degradation of the compliance. This degradation is limited due to the use of a pseudo integrator (instead of a pure integrator). @@ -1829,7 +2019,7 @@ Also, it should not be a major problem for the NASS, as no direct forces should

    3 Active Damping using Direct Velocity Feedback - Encoders on the struts

    - +

    In this section, the Direct Velocity Feedback (DVF) strategy is used to damp the nano-hexapod resonances. @@ -1839,17 +2029,17 @@ In this section, the Direct Velocity Feedback (DVF) strategy is used to d It is structured as follows:

      -
    • Section 3.1: the DVF plant is identified
    • -
    • Section 3.2: the optimal control gain is identified using the Root Locus plot
    • -
    • Section 3.3: the DVF is applied, and the effect on the damped plant is identified and compared with the un-damped one
    • -
    • Section 3.4: the DVF is applied, and the effect on the compliance is identified
    • +
    • Section 3.1: the DVF plant is identified
    • +
    • Section 3.2: the optimal control gain is identified using the Root Locus plot
    • +
    • Section 3.3: the DVF is applied, and the effect on the damped plant is identified and compared with the un-damped one
    • +
    • Section 3.4: the DVF is applied, and the effect on the compliance is identified
    -
    -

    3.1 Plant Identification

    +
    +

    3.1 Plant Identification

    - +

    @@ -1867,14 +2057,7 @@ The nano-hexapod is initialized as usual. The transfer function from actuator inputs to force sensors outputs is identified.

    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'nano_hexapod';
    -
    -%% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
     io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1; % Actuator Inputs
     io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; % Relative Motion Outputs
    @@ -1886,22 +2069,22 @@ Gdvf.OutputName = {'D1', 23.
    +Its bode plot is shown in Figure 24.
     

    -
    +

    nano_hexapod_dvf_plant_bode_plot_struts.png

    -

    Figure 23: Direct Velocity Feedback plant

    +

    Figure 24: Direct Velocity Feedback plant

    -
    -

    3.2 Root Locus

    +
    +

    3.2 Root Locus

    - +

    @@ -1921,14 +2104,14 @@ The value of \(\omega_d\) sets the frequency above high the derivative action is

    -The obtained Root Locus is shown in Figure 24. +The obtained Root Locus is shown in Figure 25. The control gain chosen for future plots is shown by the red crosses.

    -
    +

    nano_hexapod_dvf_root_locus_struts.png

    -

    Figure 24: Root locus for the decentralized DVF control strategy

    +

    Figure 25: Root locus for the decentralized DVF control strategy

    @@ -1941,23 +2124,23 @@ The obtained controller is then:

    -The corresponding loop gain of the diagonal terms are shown in Figure 25. +The corresponding loop gain of the diagonal terms are shown in Figure 26. It is shown that the loop gain is quite large around resonances (which allows to add lots of damping) and less than one at low frequency thanks to the large value of \(\omega_c\).

    -
    +

    nano_hexapod_dvf_loop_gain_struts.png

    -

    Figure 25: Loop gain of the diagonal terms \(G(i,i) \cdot K_{\text{DVF}}(i,i)\)

    +

    Figure 26: Loop gain of the diagonal terms \(G(i,i) \cdot K_{\text{DVF}}(i,i)\)

    -
    -

    3.3 Effect of DVF on the plant

    +
    +

    3.3 Effect of DVF on the plant

    - +

    @@ -1994,16 +2177,16 @@ Gdvf.OutputName = {'D1', 26. +The obtained plants are compared in Figure 27.

    -
    +

    nano_hexapod_effect_dvf_plant_struts.png

    -

    Figure 26: Bode plots of the transfer functions from actuator forces \(\tau_i\) to relative motion sensors \(\mathcal{L}_i\) with and without the DVF controller.

    +

    Figure 27: Bode plots of the transfer functions from actuator forces \(\tau_i\) to relative motion sensors \(\mathcal{L}_i\) with and without the DVF controller.

    -
    +

    The Direct Velocity Feedback Strategy is very effective to damp the 6 suspension modes of the nano-hexapod.

    @@ -2012,23 +2195,23 @@ The Direct Velocity Feedback Strategy is very effective to damp the 6 suspension
    -
    -

    3.4 Effect of DVF on the compliance

    +
    +

    3.4 Effect of DVF on the compliance

    - +

    The DVF strategy has the well known drawback of degrading the compliance (transfer function from external forces/torques applied to the top platform to the motion of the top platform), especially at low frequency where the control gain is large. Let’s quantify that for the nano-hexapod. -The obtained compliances are compared in Figure 27. +The obtained compliances are compared in Figure 28.

    -
    +

    nano_hexapod_dvf_compare_compliance_struts.png

    -

    Figure 27: Comparison of the compliances in Open Loop and with Direct Velocity Feedback controller

    +

    Figure 28: Comparison of the compliances in Open Loop and with Direct Velocity Feedback controller

    @@ -2038,7 +2221,7 @@ The obtained compliances are compared in Figure 27.

    4 Active Damping using Direct Velocity Feedback - Encoders on the plates

    - +

    In this section, the Direct Velocity Feedback (DVF) strategy is used to damp the nano-hexapod resonances. @@ -2048,17 +2231,17 @@ In this section, the Direct Velocity Feedback (DVF) strategy is used to d It is structured as follows:

      -
    • Section 4.1: the DVF plant is identified
    • -
    • Section 4.2: the optimal control gain is identified using the Root Locus plot
    • -
    • Section 4.3: the DVF is applied, and the effect on the damped plant is identified and compared with the un-damped one
    • -
    • Section 4.4: the DVF is applied, and the effect on the compliance is identified
    • +
    • Section 4.1: the DVF plant is identified
    • +
    • Section 4.2: the optimal control gain is identified using the Root Locus plot
    • +
    • Section 4.3: the DVF is applied, and the effect on the damped plant is identified and compared with the un-damped one
    • +
    • Section 4.4: the DVF is applied, and the effect on the compliance is identified
    -
    -

    4.1 Plant Identification

    +
    +

    4.1 Plant Identification

    - +

    @@ -2076,14 +2259,7 @@ The nano-hexapod is initialized as usual. The transfer function from actuator inputs to force sensors outputs is identified.

    -
    %% Options for Linearized
    -options = linearizeOptions;
    -options.SampleTime = 0;
    -
    -%% Name of the Simulink File
    -mdl = 'nano_hexapod';
    -
    -%% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
     io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1; % Actuator Inputs
     io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; % Relative Motion Outputs
    @@ -2095,22 +2271,22 @@ Gdvf.OutputName = {'D1', 28.
    +Its bode plot is shown in Figure 29.
     

    -
    +

    nano_hexapod_dvf_plant_bode_plot_plates.png

    -

    Figure 28: Direct Velocity Feedback plant

    +

    Figure 29: Direct Velocity Feedback plant

    -
    -

    4.2 Root Locus

    +
    +

    4.2 Root Locus

    - +

    @@ -2130,14 +2306,14 @@ The value of \(\omega_d\) sets the frequency above high the derivative action is

    -The obtained Root Locus is shown in Figure 29. +The obtained Root Locus is shown in Figure 30. The control gain chosen for future plots is shown by the red crosses.

    -
    +

    nano_hexapod_dvf_root_locus_plates.png

    -

    Figure 29: Root locus for the decentralized DVF control strategy

    +

    Figure 30: Root locus for the decentralized DVF control strategy

    @@ -2150,23 +2326,23 @@ The obtained controller is then:

    -The corresponding loop gain of the diagonal terms are shown in Figure 30. +The corresponding loop gain of the diagonal terms are shown in Figure 31. It is shown that the loop gain is quite large around resonances (which allows to add lots of damping).

    -
    +

    nano_hexapod_dvf_loop_gain_plates.png

    -

    Figure 30: Loop gain of the diagonal terms \(G(i,i) \cdot K_{\text{DVF}}(i,i)\)

    +

    Figure 31: Loop gain of the diagonal terms \(G(i,i) \cdot K_{\text{DVF}}(i,i)\)

    -
    -

    4.3 Effect of DVF on the plant

    +
    +

    4.3 Effect of DVF on the plant

    - +

    @@ -2203,16 +2379,16 @@ Gdvf.OutputName = {'D1', 31. +The obtained plants are compared in Figure 32.

    -
    +

    nano_hexapod_effect_dvf_plant_plates.png

    -

    Figure 31: Bode plots of the transfer functions from actuator forces \(\tau_i\) to relative motion sensors \(\mathcal{L}_i\) with and without the DVF controller.

    +

    Figure 32: Bode plots of the transfer functions from actuator forces \(\tau_i\) to relative motion sensors \(\mathcal{L}_i\) with and without the DVF controller.

    -
    +

    The Direct Velocity Feedback Strategy is very effective in damping the 6 suspension modes of the nano-hexapod.

    @@ -2221,23 +2397,23 @@ The Direct Velocity Feedback Strategy is very effective in damping the 6 suspens
    -
    -

    4.4 Effect of DVF on the compliance

    +
    +

    4.4 Effect of DVF on the compliance

    - +

    The DVF strategy has the well known drawback of degrading the compliance (transfer function from external forces/torques applied to the top platform to the motion of the top platform), especially at low frequency where the control gain is large. Let’s quantify that for the nano-hexapod. -The obtained compliances are compared in Figure 32. +The obtained compliances are compared in Figure 33.

    -
    +

    nano_hexapod_dvf_compare_compliance_plates.png

    -

    Figure 32: Comparison of the compliances in Open Loop and with Direct Velocity Feedback controller

    +

    Figure 33: Comparison of the compliances in Open Loop and with Direct Velocity Feedback controller

    @@ -2247,7 +2423,7 @@ The obtained compliances are compared in Figure 32.

    5 Function - Initialize Nano Hexapod

    - +

    @@ -2294,7 +2470,7 @@ The obtained compliances are compared in Figure 32. args.actuator_type char {mustBeMember(args.actuator_type,{'2dof', 'flexible frame', 'flexible'})} = 'flexible' args.actuator_Ga (6,1) double {mustBeNumeric} = ones(6,1)*1 % Actuator gain [N/V] args.actuator_Gs (6,1) double {mustBeNumeric} = ones(6,1)*1 % Sensor gain [V/m] - % For 2DoF + % For 2DoF args.actuator_k (6,1) double {mustBeNumeric} = ones(6,1)*0.35e6 % [N/m] args.actuator_ke (6,1) double {mustBeNumeric} = ones(6,1)*1.5e6 % [N/m] args.actuator_ka (6,1) double {mustBeNumeric} = ones(6,1)*43e6 % [N/m] @@ -2302,7 +2478,7 @@ The obtained compliances are compared in Figure 32. args.actuator_ce (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % [N/(m/s)] args.actuator_ca (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % [N/(m/s)] args.actuator_Leq (6,1) double {mustBeNumeric} = ones(6,1)*0.056 % [m] - % For Flexible Frame + % For Flexible Frame args.actuator_ks (6,1) double {mustBeNumeric} = ones(6,1)*235e6 % Stiffness of one stack [N/m] args.actuator_cs (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % Stiffness of one stack [N/m] @@ -2605,7 +2781,7 @@ nano_hexapod.geometry.J = [nano_hexapod.geometry.si'

    Author: Dehaeze Thomas

    -

    Created: 2021-04-23 ven. 17:35

    +

    Created: 2021-05-06 jeu. 18:10

    diff --git a/docs/nano_hexapod.pdf b/docs/nano_hexapod.pdf index 22faff0..2185b89 100644 Binary files a/docs/nano_hexapod.pdf and b/docs/nano_hexapod.pdf differ diff --git a/org/nano_hexapod.org b/org/nano_hexapod.org index f473324..40cc879 100644 --- a/org/nano_hexapod.org +++ b/org/nano_hexapod.org @@ -44,6 +44,15 @@ addpath('matlab/nano_hexapod'); open('matlab/nano_hexapod/nano_hexapod.slx') #+end_src +#+begin_src matlab +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'nano_hexapod'; +#+end_src + ** Nano Hexapod - Configuration <> *** Introduction :ignore: @@ -169,13 +178,6 @@ We here wish to compare the plant from actuators to the encoders when the encode We initialize the identification parameters. #+begin_src matlab -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -185,7 +187,7 @@ io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; % Relative Mot Identify the plant when the encoders are on the struts: #+begin_src matlab n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... - 'flex_top_type', '3dof', ... + 'flex_top_type', '4dof', ... 'motion_sensor_type', 'struts', ... 'actuator_type', '2dof'); @@ -197,7 +199,7 @@ Gs.OutputName = {'D1', 'D2', 'D3', 'D4', 'D5', 'D6'}; And identify the plant when the encoders are fixed on the plates: #+begin_src matlab n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... - 'flex_top_type', '3dof', ... + 'flex_top_type', '4dof', ... 'motion_sensor_type', 'plates', ... 'actuator_type', '2dof'); @@ -265,8 +267,9 @@ exportFig('figs/nano_hexapod_effect_encoder.pdf', 'width', 'full', 'height', 'ta [[file:figs/nano_hexapod_effect_encoder.png]] #+begin_important -The zeros at 400Hz and 800Hz should corresponds to resonances of the system when one of the APA is blocked. +The zeros at 280Hz should corresponds to resonances of the system when one of the APA is blocked. It is linked to the axial stiffness of the flexible joints: increasing the axial stiffness of the joints will increase the frequency of the zeros. +This will be verified in #+end_important ** Effect of APA flexibility @@ -453,20 +456,13 @@ Depending on the physical effects we want to model, we therefore know how many s The transfer function from actuator forces $\tau_i$ to the encoder measurements $\mathcal{L}_i$ is now identified both when the encoders are fixed to the struts. #+begin_src matlab -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs [N] io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; % Relative displacements [m] n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... - 'flex_top_type', '3dof', ... + 'flex_top_type', '4dof', ... 'motion_sensor_type', 'struts', ... 'actuator_type', '2dof'); @@ -560,28 +556,49 @@ exportFig('figs/nano_hexapod_struts_2dof_dvf_plant.pdf', 'width', 'full', 'heigh <> The transfer function from actuators to force sensors is identified. +It corresponds to the plant for the Integral Force Feedback (IFF) control strategy. #+begin_src matlab -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs io(io_i) = linio([mdl, '/Fm'], 1, 'openoutput'); io_i = io_i + 1; % Force Sensors n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... - 'flex_top_type', '3dof', ... + 'flex_top_type', '4dof', ... 'motion_sensor_type', 'struts', ... 'actuator_type', '2dof'); Giff = linearize(mdl, io, 0.0, options); #+end_src -This is corresponding to the dynamics for the Integral Force Feedback (IFF) control strategy. +The DC gain from actuator to the force sensor should be equal to (for the 2dof APA): +\[ \frac{k_e k_1}{k_1 k_e + k_a k_1 + k_e k_a} \] + +Which is equal to: +#+begin_src matlab :results value replace :exports results :tangle no +sprintf('DCgain = %.2e [m/N]', n_hexapod.actuator.ke(1)*n_hexapod.actuator.k(1)/(n_hexapod.actuator.k(1)*n_hexapod.actuator.ke(1) + n_hexapod.actuator.ka(1)*n_hexapod.actuator.k(1) + n_hexapod.actuator.ke(1)*n_hexapod.actuator.ka(1))) +#+end_src + +#+RESULTS: +: DCgain = 6.56e-03 [m/N] + +This is indeed close to what we see on DC gain of the $6 \times 6$ IFF plant in Table [[tab:iff_dc_gain]]. +Also, the off diagonal terms are quite small compared to the diagonal terms. +#+begin_src matlab :exports results :results value table replace :tangle no + data2orgtable(dcgain(Giff), {}, {}, ' %.4f '); +#+end_src + +#+name: tab:iff_dc_gain +#+caption: DC gain of the IFF plant +#+attr_latex: :environment tabularx :width 0.8\linewidth :align cccccc +#+attr_latex: :center t :booktabs t :float t +#+RESULTS: +| 0.0068 | 0.0002 | -0.0002 | -0.0 | 0.0002 | -0.0001 | +| 0.0003 | 0.0068 | 0.0001 | -0.0001 | -0.0001 | 0.0002 | +| 0.0001 | 0.0 | 0.0068 | -0.0001 | -0.0001 | 0.0001 | +| -0.0002 | -0.0003 | 0.0001 | 0.0068 | -0.0002 | -0.0 | +| -0.0001 | -0.0003 | -0.0 | 0.0001 | 0.0065 | 0.0 | +| 0.0001 | 0.0001 | -0.0002 | -0.0 | 0.0002 | 0.0066 | The bode plot is shown in Figure [[fig:nano_hexapod_struts_2dof_iff_plant]]. #+begin_src matlab :exports none @@ -677,13 +694,6 @@ The "perfect" sensor output $\mathcal{X}$ is used to verify that the sensor Jaco Let's then identify the plant for both configuration, and compare the transfer functions from $\mathcal{F}$ to $d\mathcal{X}$ and to $\mathcal{X}$. #+begin_src matlab -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -694,7 +704,7 @@ io(io_i) = linio([mdl, '/X'], 1, 'openoutput'); io_i = io_i + 1; % Relative Mot Start when the encoders are fixed on the struts. #+begin_src matlab n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... - 'flex_top_type', '3dof', ... + 'flex_top_type', '4dof', ... 'motion_sensor_type', 'struts', ... 'actuator_type', '2dof', ... 'MO_B', 150e-3); @@ -767,7 +777,7 @@ exportFig('figs/nano_hexapod_comp_cartesian_plants_struts.pdf', 'width', 'wide', The same if performed when the encoders are fixed to the plates. #+begin_src matlab n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... - 'flex_top_type', '3dof', ... + 'flex_top_type', '4dof', ... 'motion_sensor_type', 'plates', ... 'actuator_type', '2dof', ... 'MO_B', 150e-3); @@ -900,6 +910,141 @@ exportFig('figs/nano_hexapod_cartesian_plant_encoder_comp.pdf', 'width', 'full', #+RESULTS: [[file:figs/nano_hexapod_cartesian_plant_encoder_comp.png]] +#+begin_question +Is the complex conjugate zeros on Figure [[fig:nano_hexapod_cartesian_plant_encoder_comp]] could be due to the axial stiffness of the joints? +Let's find out by using a model with no axial flexibility on the joints and see if we still have this zero. +#+end_question + +*** Perfect axial stiffness of the joints +Let's initialize the Nano-Hexapod with perfect joints (no axial stiffness): +#+begin_src matlab +n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '3dof', ... + 'flex_top_type', '2dof', ... + 'motion_sensor_type', 'struts', ... + 'actuator_type', '2dof', ... + 'MO_B', 150e-3); +#+end_src + +Identify its dynamics. +#+begin_src matlab +G = linearize(mdl, io, 0.0, options); +G.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; +G.OutputName = {'D1', 'D2', 'D3', 'D4', 'D5', 'D6', ... + 'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'}; +#+end_src + +And compute the transfer function in the cartesian frame. +#+begin_src matlab +G = inv(n_hexapod.geometry.Js)*G({'D1', 'D2', 'D3', 'D4', 'D5', 'D6'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'})*inv(n_hexapod.geometry.J)'; +#+end_src + +The obtained dynamics is shown in Figure [[fig:nano_hexapod_cartesian_plant_perfect_joints]]. +It is shown that there are no zeros at high frequency. +#+begin_src matlab :exports none +freqs = 5*logspace(0, 2, 1000); + +labels = {'$D_x/\mathcal{F}_x$', '$D_y/\mathcal{F}_y$', '$D_z/\mathcal{F}_z$', ... + '$R_x/\mathcal{M}_x$', '$R_y/\mathcal{M}_y$', '$R_z/\mathcal{M}_z$'}; + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:6 + plot(freqs, abs(squeeze(freqresp(G(i,i), freqs, 'Hz'))), '-', ... + 'DisplayName', labels{i}); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); +legend('location', 'southwest'); +ylim([1e-11, 1e-4]); + +ax2 = nexttile; +hold on; +for i = 1:6 + plot(freqs, 180/pi*angle(squeeze(freqresp(G(i,i), freqs, 'Hz'))), '-'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); +ylim([-180, 180]); +yticks([-180, -90, 0, 90, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([freqs(1), freqs(end)]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/nano_hexapod_cartesian_plant_perfect_joints.pdf', 'width', 'full', 'height', 'tall'); +#+end_src + +#+name: fig:nano_hexapod_cartesian_plant_perfect_joints +#+caption: Bode plot of the "cartesian" plant (transfer function from $\mathcal{F}$ to $d\mathcal{X}$) when the encoders are fixed on the struts and with perfect joints (infinite axial stiffness) +#+RESULTS: +[[file:figs/nano_hexapod_cartesian_plant_perfect_joints.png]] + +#+begin_important +The zeros appearing between 100Hz and 500Hz are due to the axial stiffness of the flexible joints. +They appear when the relative motion sensors are fixed to the struts. +They basically correspond to the resonance frequency where the APA are infinitively stiff. +#+end_important + +*** Frequency of the zeros +Let's verify this last affirmation by generating a nano-hexapod with very stiff APA. +#+begin_src matlab +n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... + 'flex_top_type', '4dof', ... + 'motion_sensor_type', 'struts', ... + 'actuator_type', '2dof', ... + 'actuator_k', 1e9*ones(6,1)); +Gs = linearize(mdl, io, 0.0, options); +Gs.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; +Gs.OutputName = {'D1', 'D2', 'D3', 'D4', 'D5', 'D6'}; +#+end_src + +#+begin_src matlab +Gs_p = imag(pole(Gs))/2/pi; +sort(Gs_p(Gs_p > 0)) +#+end_src + +#+begin_src matlab :exports none +freqs = 5*logspace(0, 2, 1000); + +labels = {'$D_x/\mathcal{F}_x$', '$D_y/\mathcal{F}_y$', '$D_z/\mathcal{F}_z$', ... + '$R_x/\mathcal{M}_x$', '$R_y/\mathcal{M}_y$', '$R_z/\mathcal{M}_z$'}; + +figure; +tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile([2,1]); +hold on; +for i = 1:6 + plot(freqs, abs(squeeze(freqresp(Gsc(i,i), freqs, 'Hz'))), '-', ... + 'DisplayName', labels{i}); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); +legend('location', 'southwest'); +% ylim([1e-11, 1e-4]); + +ax2 = nexttile; +hold on; +for i = 1:6 + plot(freqs, 180/pi*angle(squeeze(freqresp(Gsc(i,i), freqs, 'Hz'))), '-'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); +ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); +ylim([-180, 180]); +yticks([-180, -90, 0, 90, 180]); + +linkaxes([ax1,ax2],'x'); +xlim([freqs(1), freqs(end)]); +#+end_src + ** Decentralized Plant - Decoupling at the Center of Stiffness <> @@ -971,13 +1116,6 @@ And we indeed obtain a diagonal stiffness matrix. *** Obtained plant Let's identify the transfer function from $\tau$ to $d\mathcal{L}$ and from $\tau$ to $\mathcal{X}$. #+begin_src matlab -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -1068,14 +1206,14 @@ The location of the applied force/torque and the expressed displacement/rotation Such location (or frame) is then used for the computation of the Jacobian which in turns is used to compute the stiffness matrix. *** Compute the theoretical stiffness of the nano-hexapod -Neglecting stiffness of the joints, we have: +Neglecting the torsional/bending 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. +where $\mathcal{K}$ is a diagonal 6x6 matrix with the axial stiffness of the struts on the diagonal. Let's note the axial stiffness of the APA: \[ k_{\text{APA}} = k + \frac{k_e k_a}{k_e + k_a} \] -Them axial stiffness of the struts $k_s$: +The axial stiffness of the struts $k_s$ is then: \[ k_s = \frac{k_z k_{\text{APA}}}{k_z + 2 k_{\text{APA}}} \] with $k_z$ the axial stiffness of the flexible joints. @@ -1087,32 +1225,18 @@ n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... 'actuator_type', '2dof'); #+end_src -The axial stiffness of the joints and stiffnesses of the 2-DoF actuators are defined below. -#+begin_src matlab -k = n_hexapod.actuator.k(1); -ke = n_hexapod.actuator.ke(1); -ka = n_hexapod.actuator.ka(1); -kz = n_hexapod.flex_top.kz(1); % Joint's axial stiffness [m/N] -#+end_src - The total axial stiffness of the APA is: -#+begin_src matlab -kAPA = k + ke*ka/(ke + ka); -#+end_src - #+begin_src matlab :results value replace :exports results :tangle no -sprintf('kAPA = %.3e [N/m]', kAPA) +kAPA = n_hexapod.actuator.k(1) + n_hexapod.actuator.ke(1)*n_hexapod.actuator.ka(1)/(n_hexapod.actuator.ke(1) + n_hexapod.actuator.ka(1)); +sprintf('kAPA = %.3e [N/m]', kAPA); #+end_src #+RESULTS: : kAPA = 1.799e+06 [N/m] And the total axial stiffness of the struts is: -#+begin_src matlab -ks = kz*kAPA/(kz + 2*kAPA); -#+end_src - #+begin_src matlab :results value replace :exports results :tangle no +ks = n_hexapod.flex_top.kz(1)*kAPA/(n_hexapod.flex_top.kz(1) + 2*kAPA); sprintf('ks = %.3e [N/m]', ks) #+end_src @@ -1120,7 +1244,7 @@ sprintf('ks = %.3e [N/m]', ks) : ks = 1.737e+06 [N/m] #+begin_important -We can see that the axial stiffness of the flexible joint as little impact on the total axial stiffness of the struts. +We can see that the axial stiffness of the flexible joint as little impact on the total axial stiffness of the struts as it is much stiffer than the APA. #+end_important Let's now compute the stiffness matrix corresponding to an hexapod with perfect joints and the above computed axial strut stiffness: @@ -1153,13 +1277,6 @@ ans = C *** Comparison with Simscape Model Let's now identify the compliance matrix using Simscape. #+begin_src matlab -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/Fe'], 1, 'openinput'); io_i = io_i + 1; % External forces [N, Nm/rad] @@ -1189,10 +1306,27 @@ dcgain(G) | 8.7375e-06 | 9.9165e-08 | 8.135e-09 | -2.5208e-07 | 4.5331e-05 | 3.0602e-09 | | 6.1611e-09 | 6.1733e-09 | 2.6778e-09 | -3.3188e-08 | 3.3887e-08 | 1.3212e-05 | -#+begin_important -The bending and torsional stiffness of the flexible joints induces a lot of coupling between forces/torques applied to the to platform to its displacement/rotation. -It can be seen by comparison the compliance matrices in Tables [[tab:compliance_matrix_perfect_joints]] and [[tab:compliance_matrix_simscape_joints]]. -#+end_important +Let's compare the two obtained compliance matrices. +The results are shown in Table [[tab:compliance_matrices_compare]]. +The diagonal terms are matching quite good, as well as the 1/4 and 2/5 of diagonal terms that are the most important ones. + +All the other terms are zero in the ideal case (Table [[tab:compliance_matrix_perfect_joints]]). +There are not zero when considering the bending/torsional stiffness of the joints (Table [[tab:compliance_matrix_simscape_joints]]), however they are still small as compared to the diagonal terms. +#+begin_src matlab :results value replace :exports both :tangle no +C./dcgain(G) +#+end_src + +#+name: tab:compliance_matrices_compare +#+caption: Compliance Matrices - Comparison +#+attr_latex: :environment tabularx :width 0.85\linewidth :align cccccc +#+attr_latex: :center t :booktabs t :float t +#+RESULTS: +| 1.0037 | -9.3741e-15 | 1.4613e-14 | -1.5751e-14 | 1.0069 | 0.090379 | +| 8.6313e-15 | 1.014 | -0.0029656 | 1.0204 | 2.4404e-15 | 1.7641e-20 | +| -1.8807e-14 | -0.024917 | 1.0028 | -0.020701 | -3.4857e-14 | 4.3304e-18 | +| 6.6502e-15 | 1.0157 | -0.0029943 | 1.0193 | 2.3673e-15 | 1.9265e-20 | +| 1.0061 | -1.0288e-14 | 2.1354e-14 | -1.7844e-14 | 1.0085 | 0.032102 | +| 0.0048048 | -3.1201e-14 | -6.5769e-19 | -2.5589e-14 | 0.002899 | 1.005 | * Active Damping using Integral Force Feedback <> @@ -1228,6 +1362,15 @@ addpath('matlab/nano_hexapod'); open('matlab/nano_hexapod/nano_hexapod.slx') #+end_src +#+begin_src matlab +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'nano_hexapod'; +#+end_src + ** Plant Identification <> @@ -1241,13 +1384,6 @@ n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... The transfer function from actuator inputs to force sensors outputs is identified. #+begin_src matlab -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -1422,13 +1558,6 @@ exportFig('figs/nano_hexapod_iff_loop_gain.pdf', 'width', 'wide', 'height', 'tal Let's now see how the IFF control strategy effectively damps the plant and how it affects the transfer functions from the actuator forces to the relative motion sensors (encoders). #+begin_src matlab :exports none -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -1538,13 +1667,6 @@ The Integral Force Feedback Strategy is very effective to damp the 6 suspension The IFF strategy has the well known drawback of degrading the compliance (transfer function from external forces/torques applied to the top platform to the motion of the top platform), especially at low frequency where the control gain is large. Let's quantify that for the nano-hexapod. #+begin_src matlab :exports none -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/Fe'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -1650,6 +1772,15 @@ addpath('matlab/nano_hexapod'); open('matlab/nano_hexapod/nano_hexapod.slx') #+end_src +#+begin_src matlab +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'nano_hexapod'; +#+end_src + ** Plant Identification <> @@ -1663,13 +1794,6 @@ n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... The transfer function from actuator inputs to force sensors outputs is identified. #+begin_src matlab -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -1843,13 +1967,6 @@ exportFig('figs/nano_hexapod_dvf_loop_gain_struts.pdf', 'width', 'wide', 'height Let's now see how the DVF control strategy effectively damps the plant and how it affects the transfer functions from the actuator forces to the relative motion sensors (encoders). #+begin_src matlab :exports none -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -1959,13 +2076,6 @@ The Direct Velocity Feedback Strategy is very effective to damp the 6 suspension The DVF strategy has the well known drawback of degrading the compliance (transfer function from external forces/torques applied to the top platform to the motion of the top platform), especially at low frequency where the control gain is large. Let's quantify that for the nano-hexapod. #+begin_src matlab :exports none -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/Fe'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -2065,6 +2175,15 @@ addpath('matlab/nano_hexapod'); open('matlab/nano_hexapod/nano_hexapod.slx') #+end_src +#+begin_src matlab +%% Options for Linearized +options = linearizeOptions; +options.SampleTime = 0; + +%% Name of the Simulink File +mdl = 'nano_hexapod'; +#+end_src + ** Plant Identification <> @@ -2078,13 +2197,6 @@ n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... The transfer function from actuator inputs to force sensors outputs is identified. #+begin_src matlab -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -2258,13 +2370,6 @@ exportFig('figs/nano_hexapod_dvf_loop_gain_plates.pdf', 'width', 'wide', 'height Let's now see how the DVF control strategy effectively damps the plant and how it affects the transfer functions from the actuator forces to the relative motion sensors (encoders). #+begin_src matlab :exports none -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -2374,13 +2479,6 @@ The Direct Velocity Feedback Strategy is very effective in damping the 6 suspens The DVF strategy has the well known drawback of degrading the compliance (transfer function from external forces/torques applied to the top platform to the motion of the top platform), especially at low frequency where the control gain is large. Let's quantify that for the nano-hexapod. #+begin_src matlab :exports none -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'nano_hexapod'; - %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/Fe'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs @@ -3325,7 +3423,7 @@ arguments args.actuator_type char {mustBeMember(args.actuator_type,{'2dof', 'flexible frame', 'flexible'})} = 'flexible' args.actuator_Ga (6,1) double {mustBeNumeric} = ones(6,1)*1 % Actuator gain [N/V] args.actuator_Gs (6,1) double {mustBeNumeric} = ones(6,1)*1 % Sensor gain [V/m] - % For 2DoF + % For 2DoF args.actuator_k (6,1) double {mustBeNumeric} = ones(6,1)*0.35e6 % [N/m] args.actuator_ke (6,1) double {mustBeNumeric} = ones(6,1)*1.5e6 % [N/m] args.actuator_ka (6,1) double {mustBeNumeric} = ones(6,1)*43e6 % [N/m] @@ -3333,7 +3431,7 @@ arguments args.actuator_ce (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % [N/(m/s)] args.actuator_ca (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % [N/(m/s)] args.actuator_Leq (6,1) double {mustBeNumeric} = ones(6,1)*0.056 % [m] - % For Flexible Frame + % For Flexible Frame args.actuator_ks (6,1) double {mustBeNumeric} = ones(6,1)*235e6 % Stiffness of one stack [N/m] args.actuator_cs (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % Stiffness of one stack [N/m]