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);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% Let's now define the actuator stroke.
|
|
|
|
|
|
|
|
L_min = -50e-6; % [m]
|
|
|
|
L_max = 50e-6; % [m]
|
|
|
|
|
|
|
|
% Pure translations
|
|
|
|
% Let's first estimate the mobility in translation when the orientation of the Stewart platform stays the same.
|
|
|
|
|
|
|
|
% As shown previously, for such small stroke, we can use the approximate Forward Dynamics solution using the Jacobian matrix:
|
|
|
|
% \begin{equation*}
|
|
|
|
% \delta\bm{\mathcal{L}} = \bm{J} \delta\bm{\mathcal{X}}
|
|
|
|
% \end{equation*}
|
|
|
|
|
|
|
|
% To obtain the mobility "volume" attainable by the Stewart platform when it's orientation is set to zero, we use the spherical coordinate $(r, \theta, \phi)$.
|
|
|
|
|
|
|
|
% For each possible value of $(\theta, \phi)$, we compute the maximum radius $r$ attainable with the constraint that the stroke of each actuator should be between =L_min= and =L_max=.
|
|
|
|
|
|
|
|
thetas = linspace(0, pi, 50);
|
|
|
|
phis = linspace(0, 2*pi, 50);
|
|
|
|
rs = zeros(length(thetas), length(phis));
|
|
|
|
|
|
|
|
for i = 1:length(thetas)
|
|
|
|
for j = 1:length(phis)
|
|
|
|
Tx = sin(thetas(i))*cos(phis(j));
|
|
|
|
Ty = sin(thetas(i))*sin(phis(j));
|
|
|
|
Tz = cos(thetas(i));
|
|
|
|
|
2020-02-13 16:46:47 +01:00
|
|
|
dL = stewart.kinematics.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction
|
2020-01-30 11:12:06 +01:00
|
|
|
|
|
|
|
rs(i, j) = max([dL(dL<0)*L_min; dL(dL>0)*L_max]);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% #+RESULTS:
|
|
|
|
% | =L_min= [$\mu m$] | =L_max= [$\mu m$] | =R= [$\mu m$] |
|
|
|
|
% |-------------------+-------------------+---------------|
|
|
|
|
% | -50.0 | 50.0 | 31.5 |
|
|
|
|
|
|
|
|
|
|
|
|
figure;
|
|
|
|
plot3(reshape(rs.*(sin(thetas)'*cos(phis)), [1, length(thetas)*length(phis)]), ...
|
|
|
|
reshape(rs.*(sin(thetas)'*sin(phis)), [1, length(thetas)*length(phis)]), ...
|
|
|
|
reshape(rs.*(cos(thetas)'*ones(1, length(phis))), [1, length(thetas)*length(phis)]))
|
|
|
|
xlabel('X Translation [m]');
|
|
|
|
ylabel('Y Translation [m]');
|
|
|
|
zlabel('Z Translation [m]');
|