mardi 13 décembre 2011

Matelots ! Pagayez ferme ! Droit devant !

Désormais le robot sait tourner jusqu'à un angle assez précisement, maintenant il va falloir avancer pour aller jusqu'aux coordonnées du point Cible.
Il va ici falloir adapter sa vitesse en fonction de la distance qu'il reste à parcourir et corriger la direction en fonction de l'écart qu'il pourrait y avoir entre le cap du robot et le cap à prendre.

Adapter sa vitesse :

Il va y avoir trois modes :
- Le freinage : A mon avis la plus importante. Si nous arrivons trop rapidement, nous risquons de dépasser le point cible pendant le calcul et donc le robot ne s'en rendrait pas compte et ferait demi tour ensuite. Si nous arrivons trop doucement, nous perdrons des secondes très précieuses.
- L'accélération : Qui est une phase aussi importante mais qui sera surtout fonction de la réaction mécanique du robot durant cette phase. Ainsi une accélération trop grande pourrait faire patiner les roues motrices et faire démarrer le robot un peu n'importe comment.
- La vitesse constante : Qui est le fonctionnement du robot à vitesse maxi. Le but étant d'atteindre la plus grande vitesse de déplacement sans que cela ne pose d'autres problèmes. Ainsi si nous n'arrivons pas à corriger le cap du robot parce que nous allons trop vite, il faudra soit adapter la vitesse soit modifier la façon de corriger la trajectoire.


- La phase d'approche :
Je n'ai pas parlé de la phase d'approche qui se situe après la décélération. Cette phase permettra de corriger précisément le cap du robot et d'aller suffisament lentement pour s'approcher le plus précisement du point Cible.

A vitesse constante :

Dans mon cas, en terme de régulation de vitesse, il ne se passe rien dans cette phase sauf si Vmot est supérieur à Vmax, dans ce cas Vmot prend la valeur de Vmax. Vmax ne sera pas un paramètre prédéfini mais une constante fonction de ce que détecte le sonar, nous y reviendrons un peu plus tard. Par contre Vmax pourra prendre la vitesse Vmaxi si le sonar ne détecte rien.

L'accélération :

Pour ma part, j'ai programmé simplement la phase d'accélération par élimination. Si le robot n'est pas dans la phase finale et que Vmot est diffèrent de Vmax alors
Vmot = Vmot + CoeffAcc
où CoeffAcc sera un coefficient défini au fur et à mesure des essais.

La décélération :

Cette phase est importante pour éviter au robot de passer de Vmax à Vmini en une fraction de seconde et de provoquer ainsi un à coup inutile à l'approche de la cible. Le calcul à faire est le suivant :

Vmot = DistCibl . (Vmaxi - Vmini) / (DistFreinMax - DistApproch) + Vmax - DistFreinMax . (Vmaxi - Vmini) / (DistFreinMax - DistApproch)

avec DistCibl la distance séparant le robot de la cible ;
Vmaxi la vitesse max pouvant être atteinte si le sonar ne détecte rien ;
Vmini la vitesse mini définie pour la phase d'approche ;
DistFreinMax la distance définissant le début de la phase de décélération ;
DistApproch la distance définissant le début de la phase d'approche à Vmini ;

Ce calcul est un peu 'lourd' pendant la boucle de calcul de Vmot, aussi je remplace la partie finale par ConstanteDec car ce calcul dépend de paramètres défini au démarrage :
(9) ConstanteDec = DistFreinMax . (Vmaxi - Vmini) / (DistFreinMax - DistApproch)
Ce qui nous donne :

(10) Vmot = DistCibl . (Vmaxi - Vmini) / (DistFreinMax - DistApproch) + Vmax - ConstanteDec


La phase d'approche :

Cette phase est simple à programmer puisqu'une fois que DistCibl est inférieure à DistApproch alors Vmot prend la valeur Vmini. Cependant au vu de ce que j'ai pu programmer, le robot ne s'arrêtera jamais aux coordonnées exactes de la cible, j'ai donc rajouté un paramètre, ApprCibl, qui sera défini avant chaque déplacement, qui permettra au robot de passer à l'action suivante une fois que DistCibl sera inférieure à ApprCibl. Ainsi le robot pourra atteindre des positions très précises, ou juste s'approcher d'un point de passage avant de prendre une autre direction.


Corriger la direction :

Rappelez vous, avant d'aller tout droit, le robot devra sortir du mode rotation. Dans mon cas, il faudra que AlphaRC, la diffèrence entre le cap du robot et le cap à prendre, soit inférieure à AlphaRotMax pour que le robot sorte du mode rotation et commence à avancer.

Ensuite, une fois que le robot avance, il faut qu'il corrige sa trajectoire pour aligner le cap du robot au cap à prendre. Pour cela, il faut, à partir de la valeur d'AlphaRC, provoquer un ralentissement sur la bonne roue du robot pour qu'il tourne, de plus il faut que ce ralentissement soit proportionnel à la valeur d'AlphaRC. Après plusieurs programmations concernant surtout le ralentissement provoqué sur la roue, je me suis finalement tourné vers quelque chose de très simple : Le bloc 'déplacer' !

Et désormais lorsque le robot rentre dans le mode 'avancer', Vmot donne la consigne de vitesse et AlphaRC donne la rotation à faire !

C'est très simple mais attention, ce n'est pas très efficace pour des valeurs au delà d'environ 50° d'écart du cap à tenir. Le robot n'avance quasiment pas car il se préoccupe surtout de tourner. La valeur n'est pas sûre car je n'ai pas fais les essais pour vérifier ce que je dis. Je n'ai pas non plus vérifier encore que ce problème ne vient pas de mon programme.
De plus, avec cette méthode, même si on gagne en temps de calcul, on perd en vitesse maxi car ce n'est pas aussi efficace que de mettre les moteurs à 100 et contrôler la puissance.

Aucun commentaire:

Enregistrer un commentaire