120 lines
4.8 KiB
Mathematica
120 lines
4.8 KiB
Mathematica
|
|
||
|
|
||
|
simulinkproject('./');
|
||
|
|
||
|
% Stewart architecture definition
|
||
|
% Let's first define the Stewart platform architecture that we want to study.
|
||
|
|
||
|
stewart = initializeFramesPositions('H', 90e-3, 'MO_B', 45e-3);
|
||
|
stewart = generateGeneralConfiguration(stewart);
|
||
|
stewart = computeJointsPose(stewart);
|
||
|
stewart = initializeStewartPose(stewart);
|
||
|
stewart = initializeCylindricalPlatforms(stewart);
|
||
|
stewart = initializeCylindricalStruts(stewart);
|
||
|
stewart = initializeStrutDynamics(stewart, 'Ki', 1e6*ones(6,1), 'Ci', 1e2*ones(6,1));
|
||
|
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.
|
||
|
|
||
|
|
||
|
LTx = stewart.J*[Tx_max 0 0 0 0 0]';
|
||
|
LTy = stewart.J*[0 Ty_max 0 0 0 0]';
|
||
|
LTz = stewart.J*[0 0 Tz_max 0 0 0]';
|
||
|
LRx = stewart.J*[0 0 0 Rx_max 0 0]';
|
||
|
LRy = stewart.J*[0 0 0 0 Ry_max 0]';
|
||
|
LRz = stewart.J*[0 0 0 0 0 Rz_max]';
|
||
|
|
||
|
|
||
|
|
||
|
% 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))
|