Suivre un mur
Question
Le robot doit suivre un mur (celui de droite par exemple). On essaiera de minimiser au maximum l'effet de gigue.
Le robot doit rester à une distance de 5cm du bord du mur +/- 2,5mm.
function azolla.main(azolla)
while true do
front = azolla:readsensor(0)
right = azolla:readsensor(1)
if(front<10) then
azolla:setspeed(-10,10)
else
if(right>5.25) then
azolla:setspeed(4,5) --Correction
else
if(right<4.75) then
azolla:setspeed(5,4) --Correction
else
azolla:setspeed(5,5)
end
end
end
azolla:stepforward()
end
end
Tentative d'amélioration du comportement
L'observation du comportement montre que :
lorsqu'on augmente la vitesse de correction, on obtient une grande instabilité (fréquence de la gigue) mais une faible amplitude de l'erreur de position par rapport au mur. Le robot avance lentement.
lorsque l'on diminue la vitesse de correction, on obtient une meilleure stabilité mais une plus grande amplitude de l'erreur de position par rapport au mur. Le robot avance plus vite.
La vitesse de correction a donc une influence sur la position par rapport au mur et sur la vitesse globale de déplacement du robot. Dans l'algorithme précédent, on a corrigé la trajectoire en imposant une vitesse de correction identique quelque soit la position du robot par rapport au mur. Il serait bon de pouvoir moduler cette vitesse de correction en fonction de la position du robot. Une solution envisageable est de calculer une loi de vitesse permettant d'augmenter cette vitesse de correction lorsque le robot s'éloigne de la position voulue et de la diminuer lorsque le robot se rapproche de la position voulue. |
Question
Ce type de correcteur s'appelle « Correcteur proportionnel ».
L'expression de la vitesse de correction est donc :
On appliquera donc les vitesses suivantes sur les moteurs :
Moteur droit : Vmoy + Vc
Moteur gauche : Vmoy – Vc
Remarque : Le coefficient de correction est généralement noté Kp (coefficient du correcteur proportionnel). Ici, Kp=4Vmax
On pourra modifier la valeur de Kp et vérifier le comportement du robot
Avec correcteur PID
function azolla.main(azolla)
Vmoy=10
moyenne = 5
somme=0
derive=0
ErreurPrecedente=0
Kp=9 -- Coefficient de correction proportieonnelle
Ki=0.01 -- Coefficient de correction intégrale
Kd=20 -- Coefficient de correction dérivé
while true do
front = azolla:readsensor(0)
right = azolla:readsensor(1)
delta = right - moyenne
somme=somme+delta
derive=delta-ErreurPrecedente
Vc=Kp*delta+Ki*somme+Kd*derive
if(front<moyenne) then
azolla:setspeed(-5,5)
else
azolla:setspeed(Vmoy+Vc,Vmoy-Vc)
end
ErreurPrecedente=delta
azolla:stepforward()
end
end