Académique Documents
Professionnel Documents
Culture Documents
Suivi de ligne
On considère un robot se déplaçant sur un plan et décrit par les équations d’état suivantes :
𝑥̇ = cos(𝜃)
{ 𝑦̇ = sin(𝜃)
𝜃̇ = 𝑢
Oû θ est le cap du robot et (x,y) les coordonnées de son centre, le vecteur d’état est donné par x =
(x,y,θ).
Travail à faire :
1) Motif du Robot
Soit le scripte ci-dessous.
a) Dire à quoi il correspond
b) Identifier le Motif du véhicule, et essayer de le modifier à votre façon.
c) Identifier la matrice de transformation homogène utilisé, interpréter ces paramètres et
dire à quoi sert-elle.
d) Effectuer quelques opérations sur cette matrice et voir l’effet sur l’exécution,
function draw_tank(x,color,sizetank)
if (exist('sizetank')==0), sizetank=1; end;
M = sizetank*...
[ 1 -1 0 0 -1 -1 0 0 -1 1 0 0 3 3 0;
-2 -2 -2 -1 -1 1 1 2 2 2 2 1 0.5 -0.5 -1];
M=[M;ones(1,length(M))];
R=[cos(x(3)),-sin(x(3)),x(1);sin(x(3)),cos(x(3)),x(2);0 0 1];
M =R*M;
plot(M(1,:),M(2,:),color,'LineWidth',2);
end
Rappel : La méthode d’Euler peut être interpréter comme une formule de Taylor à l’ordre 1, en effet,
un système décrit par l’équation d’état 𝒙̇ = 𝒇(𝒙(𝒕), 𝒖(𝒕)), son évolution peut être approximé par
𝒙(𝒕 + 𝒅𝒕) ≈ 𝒙(𝒕) + 𝒙̇ . 𝒅𝒕 = 𝒙(𝒕) + 𝒇(𝒙(𝒕), 𝒖(𝒕)). 𝒅𝒕
considerer maintenant le scripte ci-dessous.
function tank_line
function xdot=f(x,u)
theta=x(3);
xdot=[cos(theta);sin(theta);u];
end
x=[0;0;1]; % x,y,theta
dt=0.1;u=0 ;
for t=0:dt:1;
clf(); hold on; axis([-30 30 -30 30]); axis square;
x=x+f(x,u)*dt;
draw_tank(x,'blue');
drawnow();
end
end
3) Régulation en CAP
̅ la consigne sur le
Soit 𝜽 le cap du robot et 𝜽
𝒆 = 𝒆 + 𝟐𝝅.
Pour pouvoir représenter cette erreur on utilise la fonction en dent de scie suivante :
𝒆
𝒆𝒇 = 𝒂𝒕𝒂𝒏(𝒕𝒂𝒏 ( ))
𝟐
̅ en essayant de lui donner des valeurs de la
Exécuter le scripte ci-dessous et changer la consigne 𝜽
forme 𝒙𝒆𝒕𝒙 + 𝟐𝝅. Conclure.
function tank_line
function xdot=f(x,u)
theta=x(3);
xdot=[cos(theta);sin(theta);u];
end
x=[0;0;1]; % x,y,theta
dt=0.1; thetabar = -1;
for t=0:dt:30;
clf(); hold on; axis([-30 30 -30 30]); axis square;
u=atan(tan((thetabar-x(3))/2));
x=x+f(x,u)*dt;
draw_tank(x,'blue')
drawnow();
end
end
Exécuter le scripte ci-dessous pour différente pente de la droite ‘ab’ et pour différentes positions
initiales du robot.
function tank_line
function xdot=f(x,u)
theta=x(3);
xdot=[cos(theta);sin(theta);u];
end
a=[-30;-4];b=[30;6];
x=[-20;20;14]; % x,y,theta
dt=0.1;
for t=0:dt:50;
clf(); hold on; axis([-30 30 -30 30]); axis square;
phi=atan2(b(2)-a(2),b(1)-a(1));
m=x(1:2);
e=det([b-a,m-a])/norm(b-a); % distance à la ligne
thetabar=phi-atan(e);
u=atan(tan((thetabar-x(3))/2));
x=x+f(x,u)*dt;
draw_tank(x,'blue');
plot([a(1);b(1)],[a(2);b(2)],'red');
drawnow();
end
end