UP | HOME

# Identification of the Stewart Platform using Simscape

## Table of Contents

- 1. Identification
- 2. Cartesian Plot
- 3. From a force to force sensor
- 4. From a force applied in the leg to the displacement of the leg
- 5. Transmissibility
- 6. Compliance
- 7. Inertial
- 8. identifyPlant

## 1 Identification

The hexapod structure and Sample structure are initialized.

    stewart = initializeGeneralConfiguration();
    stewart = computeGeometricalProperties(stewart);
    stewart = initializeMechanicalElements(stewart);
    save('./mat/stewart.mat', 'stewart');

    initializeSample();

    G = identifyPlant();

    freqs = logspace(2, 4, 1000);

## 2 Cartesian Plot

From a force applied in the Cartesian frame to a displacement in the Cartesian frame.

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_cart(1, 1), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_cart(2, 1), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_cart(3, 1), freqs, 'Hz'))));
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude');

    figure;
    bode(G.G_cart, freqs);

## 3 From a force to force sensor

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_forc(1, 1), freqs, 'Hz'))), 'k-', 'DisplayName', '$F_{m_i}/F_{i}$');
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude [N/N]');
    legend('location', 'southeast');

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_forc(1, 1), freqs, 'Hz'))), 'k-', 'DisplayName', '$F_{m_i}/F_{i}$');
    plot(freqs, abs(squeeze(freqresp(G.G_forc(2, 1), freqs, 'Hz'))), 'k--', 'DisplayName', '$F_{m_j}/F_{i}$');
    plot(freqs, abs(squeeze(freqresp(G.G_forc(3, 1), freqs, 'Hz'))), 'k--', 'HandleVisibility', 'off');
    plot(freqs, abs(squeeze(freqresp(G.G_forc(4, 1), freqs, 'Hz'))), 'k--', 'HandleVisibility', 'off');
    plot(freqs, abs(squeeze(freqresp(G.G_forc(5, 1), freqs, 'Hz'))), 'k--', 'HandleVisibility', 'off');
    plot(freqs, abs(squeeze(freqresp(G.G_forc(6, 1), freqs, 'Hz'))), 'k--', 'HandleVisibility', 'off');
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude [N/N]');
    legend('location', 'southeast');

## 4 From a force applied in the leg to the displacement of the leg

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_legs(1, 1), freqs, 'Hz'))), 'k-', 'DisplayName', '$D_{i}/F_{i}$');
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]');

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_legs(1, 1), freqs, 'Hz'))), 'k-', 'DisplayName', '$D_{i}/F_{i}$');
    plot(freqs, abs(squeeze(freqresp(G.G_legs(2, 1), freqs, 'Hz'))), 'k--', 'DisplayName', '$D_{j}/F_{i}$');
    plot(freqs, abs(squeeze(freqresp(G.G_legs(3, 1), freqs, 'Hz'))), 'k--', 'HandleVisibility', 'off');
    plot(freqs, abs(squeeze(freqresp(G.G_legs(4, 1), freqs, 'Hz'))), 'k--', 'HandleVisibility', 'off');
    plot(freqs, abs(squeeze(freqresp(G.G_legs(5, 1), freqs, 'Hz'))), 'k--', 'HandleVisibility', 'off');
    plot(freqs, abs(squeeze(freqresp(G.G_legs(6, 1), freqs, 'Hz'))), 'k--', 'HandleVisibility', 'off');
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]');
    legend('location', 'northeast');

## 5 Transmissibility

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_tran(1, 1), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_tran(2, 2), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_tran(3, 3), freqs, 'Hz'))));
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude [m/m]');

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_tran(4, 4), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_tran(5, 5), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_tran(6, 6), freqs, 'Hz'))));
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude [$\frac{rad/s}{rad/s}$]');

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_tran(1, 1), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_tran(1, 2), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_tran(1, 3), freqs, 'Hz'))));
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude [m/m]');

## 6 Compliance

From a force applied in the Cartesian frame to a relative displacement of the mobile platform with respect to the base.

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_comp(1, 1), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_comp(2, 2), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_comp(3, 3), freqs, 'Hz'))));
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]');

## 7 Inertial

From a force applied on the Cartesian frame to the absolute displacement of the mobile platform.

    figure;
    hold on;
    plot(freqs, abs(squeeze(freqresp(G.G_iner(1, 1), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_iner(2, 2), freqs, 'Hz'))));
    plot(freqs, abs(squeeze(freqresp(G.G_iner(3, 3), freqs, 'Hz'))));
    hold off;
    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]');

## 8 identifyPlant

    function [sys] = identifyPlant(opts_param)

We use this code block to pass optional parameters.

    %% Default values for opts
    opts = struct();

    %% Populate opts with input parameters
    if exist('opts_param','var')
        for opt = fieldnames(opts_param)'
            opts.(opt{1}) = opts_param.(opt{1});
        end
    end

We defined the options for the `linearize` command. Here, we just identify the system at time \(t = 0\).

    options = linearizeOptions;
    options.SampleTime = 0;

We define the name of the Simulink File used to identification.

    mdl = 'stewart';

Then we defined the input/output of the transfer function we want to identify.

    %% Inputs
    io(1) = linio([mdl, '/F'],  1, 'input'); % Cartesian forces
    io(2) = linio([mdl, '/Fl'], 1, 'input'); % Leg forces
    io(3) = linio([mdl, '/Fd'], 1, 'input'); % Direct forces
    io(4) = linio([mdl, '/Dw'], 1, 'input'); % Base motion

    %% Outputs
    io(5) = linio([mdl, '/Dm'],  1, 'output'); % Relative Motion
    io(6) = linio([mdl, '/Dlm'], 1, 'output'); % Displacement of each leg
    io(7) = linio([mdl, '/Flm'], 1, 'output'); % Force sensor in each leg
    io(8) = linio([mdl, '/Xm'],  1, 'output'); % Absolute motion of platform

The linearization is run.

    G = linearize(mdl, io, 0);

We defined all the Input/Output names of the identified transfer function.

    G.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz', ...
                    'F1', 'F2', 'F3', 'F4', 'F5', 'F6', ...
                    'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz', ...
                    'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'};
    G.OutputName = {'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm', ...
                    'D1m', 'D2m', 'D3m', 'D4m', 'D5m', 'D6m', ...
                    'F1m', 'F2m', 'F3m', 'F4m', 'F5m', 'F6m', ...
                    'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'};

We split the transfer function into sub transfer functions and we compute their minimum realization.

    sys.G_cart = minreal(G({'Dxm',  'Dym',  'Dzm',  'Rxm',  'Rym',  'Rzm'},  {'Fx',  'Fy',  'Fz',  'Mx',  'My',  'Mz'}));
    sys.G_forc = minreal(G({'F1m',  'F2m',  'F3m',  'F4m',  'F5m',  'F6m'},  {'F1',  'F2',  'F3',  'F4',  'F5',  'F6'}));
    sys.G_legs = minreal(G({'D1m',  'D2m',  'D3m',  'D4m',  'D5m',  'D6m'},  {'F1',  'F2',  'F3',  'F4',  'F5',  'F6'}));
    sys.G_tran = minreal(G({'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'}, {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'}));
    sys.G_comp = minreal(G({'Dxm',  'Dym',  'Dzm',  'Rxm',  'Rym',  'Rzm'},  {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'}));
    sys.G_iner = minreal(G({'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'}, {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'}));
    % sys.G_all  = minreal(G);

    end

Author: Thomas Dehaeze

Created: 2019-08-26 lun. 11:55

Validate