2020-02-13 16:46:47 +01:00
|
|
|
%% Clear Workspace and Close figures
|
|
|
|
clear; close all; clc;
|
2020-01-30 11:12:06 +01:00
|
|
|
|
2020-02-13 16:46:47 +01:00
|
|
|
%% Intialize Laplace variable
|
|
|
|
s = zpk('s');
|
2020-01-30 11:12:06 +01:00
|
|
|
|
2020-02-13 16:46:47 +01:00
|
|
|
simulinkproject('../');
|
2020-01-30 11:12:06 +01:00
|
|
|
|
|
|
|
% Stewart architecture definition
|
|
|
|
% Let's first define the Stewart platform architecture that we want to study.
|
|
|
|
|
2020-02-13 16:46:47 +01:00
|
|
|
stewart = initializeStewartPlatform();
|
|
|
|
stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
|
2020-01-30 11:12:06 +01:00
|
|
|
stewart = generateGeneralConfiguration(stewart);
|
|
|
|
stewart = computeJointsPose(stewart);
|
|
|
|
stewart = initializeStewartPose(stewart);
|
|
|
|
stewart = initializeCylindricalPlatforms(stewart);
|
|
|
|
stewart = initializeCylindricalStruts(stewart);
|
2020-02-13 16:46:47 +01:00
|
|
|
stewart = initializeStrutDynamics(stewart);
|
2020-01-30 11:12:06 +01:00
|
|
|
stewart = initializeJointDynamics(stewart);
|
|
|
|
stewart = computeJacobian(stewart);
|
|
|
|
|
|
|
|
% Wanted translations and rotations
|
|
|
|
% Let's now define the wanted extreme translations and rotations.
|
|
|
|
|
|
|
|
Tx_max = 50e-6; % Translation [m]
|
|
|
|
Ty_max = 50e-6; % Translation [m]
|
|
|
|
Tz_max = 50e-6; % Translation [m]
|
|
|
|
Rx_max = 30e-6; % Rotation [rad]
|
|
|
|
Ry_max = 30e-6; % Rotation [rad]
|
|
|
|
Rz_max = 0; % Rotation [rad]
|
|
|
|
|
|
|
|
% Needed stroke for "pure" rotations or translations
|
|
|
|
% As a first estimation, we estimate the needed actuator stroke for "pure" rotations and translation.
|
|
|
|
% We do that using either the Inverse Kinematic solution or the Jacobian matrix as an approximation.
|
|
|
|
|
|
|
|
|
2020-02-13 16:46:47 +01:00
|
|
|
LTx = stewart.kinematics.J*[Tx_max 0 0 0 0 0]';
|
|
|
|
LTy = stewart.kinematics.J*[0 Ty_max 0 0 0 0]';
|
|
|
|
LTz = stewart.kinematics.J*[0 0 Tz_max 0 0 0]';
|
|
|
|
LRx = stewart.kinematics.J*[0 0 0 Rx_max 0 0]';
|
|
|
|
LRy = stewart.kinematics.J*[0 0 0 0 Ry_max 0]';
|
|
|
|
LRz = stewart.kinematics.J*[0 0 0 0 0 Rz_max]';
|
2020-01-30 11:12:06 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% The obtain required stroke is:
|
|
|
|
|
|
|
|
ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', min(min([LTx,LTy,LTz,LRx,LRy])), max(max([LTx,LTy,LTz,LRx,LRy])), 1e6*(max(max([LTx,LTy,LTz,LRx,LRy]))-min(min([LTx,LTy,LTz,LRx,LRy]))))
|
|
|
|
|
|
|
|
% Needed stroke for "combined" rotations or translations
|
|
|
|
% We know would like to have a more precise estimation.
|
|
|
|
|
|
|
|
% To do so, we may estimate the required actuator stroke for all possible combination of translation and rotation.
|
|
|
|
|
|
|
|
% Let's first generate all the possible combination of maximum translation and rotations.
|
|
|
|
|
|
|
|
Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% #+RESULTS:
|
|
|
|
% | *Tx [m]* | *Ty [m]* | *Tz [m]* | *Rx [rad]* | *Ry [rad]* | *Rz [rad]* |
|
|
|
|
% |----------+----------+----------+------------+------------+------------|
|
|
|
|
% | -5.0e-05 | -5.0e-05 | -5.0e-05 | -3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | -5.0e-05 | -5.0e-05 | -3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | -5.0e-05 | -5.0e-05 | 3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | -5.0e-05 | -5.0e-05 | 3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | -5.0e-05 | 5.0e-05 | -3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | -5.0e-05 | 5.0e-05 | -3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | -5.0e-05 | 5.0e-05 | 3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | -5.0e-05 | 5.0e-05 | 3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | 5.0e-05 | -5.0e-05 | -3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | 5.0e-05 | -5.0e-05 | -3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | 5.0e-05 | -5.0e-05 | 3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | 5.0e-05 | -5.0e-05 | 3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | 5.0e-05 | 5.0e-05 | -3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | 5.0e-05 | 5.0e-05 | -3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | 5.0e-05 | 5.0e-05 | 3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | -5.0e-05 | 5.0e-05 | 5.0e-05 | 3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | 5.0e-05 | -5.0e-05 | -5.0e-05 | -3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | 5.0e-05 | -5.0e-05 | -5.0e-05 | -3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | 5.0e-05 | -5.0e-05 | -5.0e-05 | 3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | 5.0e-05 | -5.0e-05 | -5.0e-05 | 3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | 5.0e-05 | -5.0e-05 | 5.0e-05 | -3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | 5.0e-05 | -5.0e-05 | 5.0e-05 | -3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | 5.0e-05 | -5.0e-05 | 5.0e-05 | 3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
% | 5.0e-05 | -5.0e-05 | 5.0e-05 | 3.0e-05 | 3.0e-05 | 0.0e+00 |
|
|
|
|
% | 5.0e-05 | 5.0e-05 | -5.0e-05 | -3.0e-05 | -3.0e-05 | 0.0e+00 |
|
|
|
|
|
|
|
|
% For all possible combination, we compute the required actuator stroke using the inverse kinematic solution.
|
|
|
|
|
|
|
|
L_min = 0;
|
|
|
|
L_max = 0;
|
|
|
|
|
|
|
|
for i = 1:size(Ps,1)
|
|
|
|
Rx = [1 0 0;
|
|
|
|
0 cos(Ps(i, 4)) -sin(Ps(i, 4));
|
|
|
|
0 sin(Ps(i, 4)) cos(Ps(i, 4))];
|
|
|
|
|
|
|
|
Ry = [ cos(Ps(i, 5)) 0 sin(Ps(i, 5));
|
|
|
|
0 1 0;
|
|
|
|
-sin(Ps(i, 5)) 0 cos(Ps(i, 5))];
|
|
|
|
|
|
|
|
Rz = [cos(Ps(i, 6)) -sin(Ps(i, 6)) 0;
|
|
|
|
sin(Ps(i, 6)) cos(Ps(i, 6)) 0;
|
|
|
|
0 0 1];
|
|
|
|
|
|
|
|
ARB = Rz*Ry*Rx;
|
|
|
|
[~, Ls] = inverseKinematics(stewart, 'AP', Ps(i, 1:3)', 'ARB', ARB);
|
|
|
|
|
|
|
|
if min(Ls) < L_min
|
|
|
|
L_min = min(Ls)
|
|
|
|
end
|
|
|
|
if max(Ls) > L_max
|
|
|
|
L_max = max(Ls)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% We obtain the required actuator stroke:
|
|
|
|
|
|
|
|
ans = sprintf('From %.2g[m] to %.2g[m]: Total stroke = %.1f[um]', L_min, L_max, 1e6*(L_max-L_min))
|