Vous êtes sur la page 1sur 18

Modèle géométrique direct

(calcul de la position de l’extrémité d’un robot en fonction


des angles des actionneurs)

MEC6503 – Robotique industrielle

Luc Baron, ing, Ph.D.

© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 1/18


© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 2/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 3/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 4/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 5/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 6/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 7/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 8/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 9/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 10/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 11/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 12/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 13/18
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 14/18
function t=reach(pf,t)
n=25; % Nombre maximum d'itération
e=1; % Erreur initiale tres grande (1 metre)
a=0.75; % Amortissement sur le pas

p=position_outil(t); % Position Cartésienne actuelle


while(n>0 & e>0.0001) % Tant que l'erreur est plus de 0.1 mm
(et n>0)
dp=a*(pf-p); % Déplacement Cartésien requis
J=Jacobienne(t); % Évaluation de la Jacobienne
dt=pinv(J)*dp; % Calcul du déplacement theta approx.
t=t+dt; % Calcul la nouvelle position t
p=position_outil(t); % Calcul la nouvelle position p
e=norm(pf-p); % Erreur entre p et pf désirée
n=n-1; % Une itération en moins de disp.
end
if n==0 % Affiche un message lorsque >0.1 mm
disp('Reach: Erreur '); e
end

reach.m

© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 15/18


function etat=enregistre_trj(trj,dT,nom_fichier)
etat=0;
[a,z]=size(trj); % Grandeur de trj
if a==3
fid = fopen(nom_fichier,'w'); % Ouverture du fichier .trj
if fid==-1
disp('Impossible de créer le fichier'); nom_fichier
else
fprintf(fid,'%10.0f ',z); % Nombre de ligne
fprintf(fid,'%10.5f \n',dT); % Pas
for i=1:z % Angles du manipulateur
fprintf(fid,'%5.9f %5.9f %5.9f \n',trj(:,i));
end
fclose(fid); % Fermeture du fichier
etat=1; % Fichier créer
end
else
disp('La matrice trj doit etre de dimension 3 x n.');
end

enregistre_trj.m

© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 16/18


Function r=R(ti)
R.m
R=[cos(ti) –sin(ti);
sin(ti) cos(ti)];

Function p=position_outil(t)
% Longueur des membrures
Position_outil.m
a1=[0.4; 0.0]; a2=[0.4;0.0]; a3=[1.18;0.0];

p=R(t(1))*(a1+R(t(2))*(a2+R(t(3))*a3));

Function J=Jacobienne(t)
% Longueur des membrures
Jacobienne.m
a1=[0.4; 0.0]; a2=[0.4;0.0]; a3=[1.18;0.0];
r3=R(t(1)+t(2)+t(3))*a3;
r2=R(t(1)+t(2))*a2+r3;
r1=R(t(1))*a1+r2;
E=[0 -1; 1 0]; % Rotation de 90 deg.
J=E*[r1 r2 r3]; % Matrice Jacobienne 2 x 3

© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 17/18


%-------------------------------------------------
% Programme: robot3r.m MEC6503 - H2006
% Par : Luc Baron
% Date : janvier 2006 Exemple 2D
%-------------------------------------------------
clear all; % Effacer les variables
theta=[2.3201; -2.4699; -0.03534]; % Position articluaire initiale
P0 = position_outil(theta); % Approche du 1er point
P1 = [0.3; 0.2]; % 1er Point du segment
P2 = [0.7; 0.2]; % 2e Point du segment
pas=0.04; % Pas de simulation (seconde)
T = 15; % Durée du segment (seconde)
iteration=(T/pas)+1; % Nombre d'itérations
t = [0:pas:T]; % Discrétisation du temps
s = (t/T)-sin(2*pi*t/T)/(2*pi); % Discrétisation de l'espace
P = P1*ones(size(s)) + (P2-P1)*s; % Discrétisation du segment
for i=1:iteration % Calcul des positions
theta = reach(P(:,i),theta);
trj(:,i)=theta;
pxy(:,i)=position_outil(theta);
end
etat=enregistre_trj(trj,pas,'robot2.trj') % Creer le fichier trj

robot3r.m
© Hiver 2006 par Luc Baron, MEC6503- Robotique Industrielle 18/18