La meilleure façon de tourner

Introduction



Ce tutoriel va vous expliquer comment faire tourner votre robot de différentes manières.

Il abordera également les calculs à effectuer pour orienter votre robot selon un angle précis.

Maîtriser la rotation va vous permettre, en complément de la translation vu dans le tutoriel précédent, de diriger votre robot où bon vous semble en effectuant des parcours mixant ces deux mouvements de bases.

Bon, arrêtons de tourner en rond et allons-y en tournant la page .... :lol

Le bloc Moteur



Avant d'entamer la partie sur les différentes manières de tourner avec un robot, il nous faut étudier la description d'un nouveau bloc qui nous sera utile pour la suite du tutoriel.

Ce bloc c'est le bloc "Moteur".

Il est très similaire au bloc "Déplacer" que vous avez vu dans le tutoriel précédent, car il concerne également la mise en fonctionnement et le contrôle des moteurs. Toutefois, la différence principale entre ces deux blocs est que le bloc "Moteur" ne peut commander qu'un seul moteur à la fois alors que le bloc "Déplacer" permet d'en commander jusqu'à trois en même temps.

Voici donc à quoi ressemble le bloc "Moteur" :



Et la description des paramètres dans son panneau de configuration :




Port : Ces boutons vous permettent de sélectionner le port sur lequel est connecté votre moteur. Par défaut, c'est le moteur A qui est sélectionné.

Direction : C'est grâce à ces boutons que vous pouvez indiquer le sens de rotation de votre moteur à l'aide des flèches ou au contraire de stopper le moteur en sélectionnant l'option arrêter représentée par une icône en forme de sens interdit. Bien évidemment, pour stopper le moteur encore faut-il qu'il est était mis en fonctionnement par le placement d'un précédent bloc "Déplacer" ou "Moteur" !

Action : Ce paramètre uniquement disponible pour les durées exprimées en nombre de rotation ou en degrés vous permet de sélectionner un profil de vitesse pour le moteur en question. Ainsi, par défaut, c'est le profil de vitesse constante qui est établie. Cela indique que la vitesse du moteur sera atteinte immédiatement et restera constante pendant toute la durée de son fonctionnement.

Toutefois vous avez la possibilité de sélectionner un profil d'accélération progressive qui fera en sorte que le moteur atteigne sa consigne de vitesse de manière progressive et non de façon immédiate comme dans le cas du profile constant.

Il existe enfin un profil de ralentissement progressif faisant en sorte de ramener la vitesse du moteur à 0, c'est à dire de le stopper, mais de manière là aussi progressive et non de manière immédiate. Bien évidemment, il faut que le moteur soit déjà en fonctionnement à l'aide d'un précédent bloc pour avoir l'utilité de cette fonction.


Image provenant d'un article du ClubElek, utilisée avec autorisation.



Alimentation : Le réglage d'alimentation du moteur est ici exactement le même que pour le bloc "Déplacer". C'est avec ce paramètre que vous indiquez à quel vitesse le moteur doit tourner.

Contrôle : La seule possibilité dans ce paramètre est l'activation ou non de l'option Puissance moteur. Normalement, si vous tentez de freiner le moteur avec votre main la vitesse de celui ci sera réduit car il ne peut pas dépasser sa vitesse de consigne indiqué dans le paramètre Alimentation. Toutefois, si l'option Puissance moteur est sélectionnée et lorsqu'une charge sur le moteur tente de le freiner, le NXT appliquera plus de puissance au moteur de manière à ce qu'il continue de tourner à la vitesse indiqué dans le paramètre Alimentation.

Durée : Là encore, de la même manière que pour le bloc "Déplacer", cette option permet d'indiquer la durée de fonctionnement du moteur que se soit de manière illimité, pendants quelques secondes ou pour un certain nombre de degrés ou de rotations.

Attendre : Cette option, activée par défaut, vous permet d'indiquer si le programme doit attendre ou non la fin de la durée de fonctionnement du moteur avant d'exécuter le bloc suivant.

Action suivante : Cela permet d'indiquer si vous voulez freiner le moteur une fois accomplie sa durée de fonctionnement ou si vous désirez le laisser continuer en roue libre sans le freiner jusqu'à ce qu'il s'arrête de lui même.

Rien de bien compliqué concernant ce nouveau bloc. Passons donc au fond du problème qui occupe ce tutoriel.

Je tourne en rond, je tourne en rond, je tourne en rond ...



Il existe plusieurs façons de faire tourner son robot.

La première est la plus simple, mais également la moins précise. C'est même un euphémisme de dire qu'elle est la moins précise car, en fait, elle n'est absolument pas précise du tout. Voyons là quand même ....

Placer un bloc "Déplacer" sur le rayon de séquence de votre programme :



Réglé-le de la manière suivante en utilisant la glissière et en lui indiquant un certain nombre de rotations à effectuer :



Cette glissière de commande indique au robot de tourner un peu du côté du moteur B. En testant ce programme, vous apercevrez effectivement votre robot en train de tourner vers la droite car la vitesse du moteur B est plus faible que celle du moteur C.

Plus vous déplacez la glissière vers un moteur et plus la vitesse de celui-ci est réduite par rapport à l'autre moteur, ce qui fait tourner le robot.

Cette commande est simple et vous permet de faire effectuer une ligne courbe à votre robot. Toutefois, vous remarquerez également que vous ne disposez de rien d'autre que la glissière pour faire votre réglage .... Aucune zone de saisie numérique n'existe, donc vous ne disposez d'aucune précision sur le rayon de virage de votre ligne courbe !

Dans certain cas, cela pourra vous être utile d'utiliser un bloc "Déplacer" pour faire effectuer une ligne courbe d'une certaine longueur à votre robot. Mais votre réglage sera approximatif et trouvé après plusieurs test. Bref, on ne peut pas vraiment dire que cette méthode soit précise ! :(

Lorsque vous voudrez orienter votre robot de manière plus précise, vous devrez avoir recours à une autre technique. Cette technique se trouve être plus précise que la précédente, mais un peu plus compliqué à mettre en œuvre. Elle suppose la connaissance d'un minimum de théorie, ce qui fera l'objet de la suite de cette partie ...


S'arrêter pour tourner




L'exemple précédent démontre qu'il est possible de tourner en se déplaçant en même temps. Toujours est-il que ce n'est pas forcement la meilleur manière de faire !

En effet, la démonstration précédente manque de précision. Et elle peut même manquer de rapidité vu que, et c'est bien connu, la ligne droite représente la distance la plus courte entre deux points. Effectuer un trajet courbe n'est donc pas le plus rapide ....

L'idéale est de s'arrêter, tourner dans la direction du point à atteindre, puis de rejoindre ce dernier en ligne droite.

Seulement voila, encore faut-il savoir tourner dans une direction précise. C'est ce que nous allons voir maintenant.

Les deux façons de tourner



Il faut savoir que votre robot peut tourner de deux façons différentes. La bonne nouvelle, c'est qu'elles reposent toutes les deux sur la même théorie. Seule la mise en oeuvre change d'une façon à l'autre.

Commençons donc par la théorie.


Une histoire de cercle




La première façon de tourner est celle qui consiste à bloquer une roue pendant que l'autre tourne. On appel cette technique "un crochet", du fait de la forme de la trajectoire du robot.

En effectuant un tour complet, le robot décrit un cercle dont le centre se trouve être la roue bloquée. L'image ci-dessous le montre très bien :



Ce cercle a pour rayon la distance entre les centres des roues. Si vous mesurez avec une règle la distance entre les centres des deux roues de votre robot, vous connaissez donc le rayon de ce cercle.

De là, vous pouvez calculer son diamètre et sa circonférence en utilisant la même formule que vu précédemment dans le tutoriel sur la translation.
Mais ici, au lieu de calculer la circonférence d'une roue, on calcule la circonférence du cercle de rotation du robot !

C'est encore une fois très joli ton histoire, mais ça sert à quoi ?

Justement, c'est la connaissance de cette circonférence qui va permettre de calculer ensuite le nombre de rotations à faire effectuer à la roue pour que votre robot tourne selon un angle définit par vous même. Un peu comme dans la translation pour parcourir une certaine distance .... :hehe

Ah .... Et comment on fait ?

J'y viens, j'y viens .... ;)

Alors, il faut savoir que tout les cercles font 360 degrés (symbole : °).

Attend là ... Tu parle de degrés de température, comme dans les fours ?

Non, non, pas du tout .... Ça serait trop chaud !!! :|

En fait, je ne parle pas de degrés Celsius ou Fahrenheit. Je parle de degrés tout court ...

Le degré est une mesure d'angle et ça ne se mesure ni avec une règle, ni avec un thermomètre, mais avec un rapporteur. Et un cercle fait toujours 360°.

Donc, pour revenir à nos moutons .... ou nos robots .... Comment fait-on pour calculer le nombre de rotations de la roue pour, par exemple, faire tourner notre robot de 90°.

Rentrez la valeur 90° dans un bloc "Moteur", comme ci-dessous :




Tester le programme. Vous remarquez que ce n'est pas votre robot qui tourne de 90°, mais c'est le moteur et donc la roue placée dessus qui effectue une rotation de 90° !



Ce n'est pas ce que nous voulons, mais c'est tout à fait normal puisque ces 90° font référence à la circonférence de la roue et non à la circonférence du cercle de rotation du robot.

Réfléchissons donc un peu ...

Les 90° s'inscrivent dans le cercle de rotation du robot, comme sur l'image ci-dessous :



Autrement dit, le robot doit effectuer 90° sur les 360° du cercle de rotation du robot. Écrivons cela sous forme mathématique :

90/360



Hors, nous savons que la distance représentée par les 360°du cercle correspond à sa circonférence. De même, la distance parcourue par la roue correspond au 90° que nous voulons effectuer. Sous forme mathématique, nous avons donc une égalité entre les deux rapports :

90/360~=~Distance/Circonference



La circonférence pouvant être calculé depuis le diamètre du cercle de rotation du robot, comme vu précédemment, la seule inconnue se trouve être encore une fois la distance que la roue devra parcourir pour faire pivoter le robot de 90°. Une simple transformation de la formule ci-dessus nous donne l'équation permettant de calculer cette distance :

Distance~=~(~90/360)~*~Circonference



Autrement dit, diviser l'angle souhaité (ici 90° pour l'exemple) par l'angle d'un cercle complet (toujours égal à 360°) puis multiplier le résultat par la circonférence du cercle de rotation de votre robot et vous obtiendrez la distance que doit parcourir une des roues de votre robot pour le faire pivoter de l'angle désiré ! :top

Connaissant la distance que doit parcourir la roue, il est facile de calculer le nombre de rotation quelle devra effectuer en fonction de sa circonférence. Le principe est le même que dans le tutoriel concernant la translation.

Tout ça c'est formidable, mais tu nous avais pas parlé d'une autre façon de tourner ?

Oui, en effet. Il existe la possibilité de faire tourner le robot d'une autre façon.

Cette fois-ci, au lieu de faire tourner une roue et d'en bloquer une autre, il faut faire tourner les deux roues .... Mais en sens opposés !

Pendant qu'une roue tourne, comme pour aller en marche avant, l'autre roue tourne également mais comme pour aller en marche arrière.

Résultat, le robot tourne sur lui-même. Et si il fait un tour complet sur lui-même, il s'inscrira aussi dans un cercle de rotation comme sur l'image ci-dessous :



Ce cercle a pour diamètre la distance entre les centres des roues.

C'est ici la seule différence théorique entre les deux façons de tourner !

Tout le reste concernant les calculs est exactement le même .... ;)

Donc, retenez bien ceci :

La distance entre les centres des deux roues de votre robot représente :



Voila, vous savez tout ce qu'il faut savoir pour faire tourner votre robot.

Après cette partie théorique, passons à la pratique en tournant .... la page ! :hehe

Tourner en pratique



Dans cette partie, nous allons voir comment programmer notre robot pour le faire tourner de différentes manières.

Commençons donc par un crochet avant droit de 90°, pour illustrer l'exemple de la partie théorique. Donc, pour ne pas changer, les calculs se baseront sur la plate-forme de base téléchargeable sur ce site.

Pour les tests, aidez-vous du cercle gradué de 10° en 10° imprimé au centre de votre planche de test.


Les paramètres de bases du crochet




Les paramètres de bases du crochet seront donc les suivants :



Donc, pour effectuer une rotation de 90° :

Distance~=~(~90/360)~*~792~=~0,25~*~792~=~198~millimetres



La roue gauche devra parcourir une distance de 198 millimètres. Ce qui représente :

Nombre~de~rotations~=~198/136~=~1,45~rotation



Un total de 1,45 rotation.


Programmation du crochet




Seule la roue gauche devant tourner, nous n'activerons que le moteur C comme ci-dessous :




Pour effectuer un crochet arrière droit, il suffira uniquement de changer le sens de rotation du moteur C :



En ce qui concerne les crochets avant et arrière gauche, c'est exactement le même principe. Si ce n'est que ce sera le moteur B qui tournera au lieu du moteur C.

Bref, comme vous le constatez, il n'y a rien de sorcier là-dedans ! ;)

Voyons maintenant la rotation du robot sur lui-même.


Les paramètres de bases de la rotation




Les paramètres de bases de la rotation seront donc les suivants :



Donc, pour effectuer une rotation de 90° :

Distance~=~(~90/360)~*~396~=~0,25~*~396~=~99~millimetres



Les deux roues du robot devront parcourir une distance de 99 millimètres. Ce qui représente :

Nombre~de~rotations~=~99/136~=~0,72~rotation



Un total de 0,72 rotation.


Programmation de la rotation




Dans ce mouvement, comme les deux roues doivent tourner simultanément, la première idée qui vient à l'esprit est d'utiliser un bloc "Déplacer" :




Toutefois, lors du test, vous constaterez une erreur très importante dans l'angle de rotation effectué par votre robot.

Mais les calculs sont bons pourtant .... D'où vient cette erreur ?

Pour comprendre ce phénomène, je vous propose de rajouter un bloc qui permet d'afficher sur l'écran du NXT le nombre de rotations réellement effectuées par chaque moteur. Ce bloc, qui est un bloc réalisé personnellement, est disponible au téléchargement.

Le fichier "Nombre de rotations.rbt" est à placer dans votre dossier "Blocs Web" sur votre ordinateur. Dans mon cas, l'emplacement est celui-ci :

Votre nom d'utilisateur/Documents/LEGO Creations/MINDSTORMS Projects/Profiles/Default/Blocks/Blocs Web



Normalement, ce bloc devrait être disponible dans la palette personnalisée du logiciel LEGO MINDSTORMS NXT.

Il ne vous reste plus qu'à le rajouter en parallèle dans votre programme de rotation, comme ci-dessous :



En exécutant à nouveau le test précédent, vous remarquerez la même erreur. Mais cette fois-ci, le nombre de rotations effectués réellement par les deux moteurs sera affiché sur l'écran du NXT.

Ce qui vous permettra de comprendre ce qu'il se passe .... En effet, vous constaterez qu'il n'y a que le moteur C qui effectue bien 0,72 rotation.
Le moteur B, quant à lui, effectue plus de rotations. Ce qui produit l'erreur constatée ! :\'(

Cela est inhérent au fonctionnement interne du bloc "Déplacer" et nous n'y pouvons rien. :s

De ce fait, la seule manière de faire est d'effectuer plusieurs tests successif jusqu'à trouver le nombre de rotation permettant au robot de faire environ 90°. Dans le cas de ce robot, et comme montré sur l'image ci-dessous, la valeur trouvée est de l'ordre de 0,63 rotation.



Nous n'arriverons jamais à la précision requise en utilisant un bloc "Déplacer".

Une autre solution s'offre à vous si vous désirez une certaine précision, mais Il va falloir vous rabattre sur deux blocs "Moteur" .... |-)


L'utilisation des blocs Moteur dans une rotation




Mais attention, ne placer pas vos deux blocs "Moteur" n'importe comment !

Si vous les placer l'un à la suite de l'autre, vous obtiendrez deux crochets successifs au lieu d'une seule rotation. Car le programme attendra que le premier bloc est terminé son travail avant d'exécuter l'autre bloc.

Sauf, si vous décochez la case "Attendre la fin" du premier bloc. Mais dans ce cas là, le problème se posera à la fin de la rotation car le premier bloc ne freinera pas le moteur et celui-ci continuera de tourner bien au delà de ce qui lui est demandé .... Emporté par l'inertie du poids du robot, ce qui gérera à nouveau une erreur d'angle de rotation.

Il existe bien la possibilité de placer les deux blocs "Moteur" en fonctionnement infini, mais cela oblige à utiliser un troisième bloc "Attendre capteur de rotation" suivi de deux autres blocs "Moteur" pour arrêter les deux moteurs une fois le nombre de rotations effectuées. Solution "lourde" et qui demanderai une initialisation du capteur de rotation avant chaque nouveau déplacement !

Bref, vous l'aurez compris, la solution à adopter est celle qui consiste à placer les deux blocs "Moteur" en parallèle, comme ci-dessous :





Placer ici tout de suite le bloc "Nombre de rotations" de manière à voir le résultat de ce programme.

Après le test, vous pourrez constater que l'angle de rotation du robot est correct car les deux moteurs ont effectués le même nombre de rotations.

Il subsistera sans doute une petite erreur que vous pourrez quantifier comme vous l'avez vu dans le tutoriel sur la translation. Notez que cette erreur peut être plus importante en rotation qu'en translation. Mais votre robot restera tout de même relativement précis.

Toutefois, vous remarquerez sans doute un léger déplacement du centre de votre robot.

En effet, idéalement, les vitesses des deux moteurs devraient être à tout moment identiques. Mais là encore, des différences infimes de vitesses entre les deux moteurs peuvent apparaître pour les mêmes raisons qu'énoncées dans le tutoriel sur la translation. Moteurs pas parfaitement identiques, irrégularité du sol, ...

Pour mettre en évidence mes propos, je vous propose là encore de rajouter un bloc personnel dans votre programme. Ce bloc appelé "Courbes de vitesses", disponible au téléchargement et s'installant de la même manière que le précédent, permet d'afficher sur l'écran du NXT les vitesses des moteurs B et C sous forme de courbes superposées en nombre de rotations par seconde et ce sur 2,25 secondes de durée. Il affiche également la vitesse moyenne des deux moteurs en haut de l'écran.

L'échelle horizontale en bas de l'écran étant la durée en secondes et l'échelle vertical étant la vitesse en nombre de rotations par seconde. Les données des mesures sont disponibles dans deux fichiers nommés respectivement "Vitesse B" et "Vitesse C". Ses fichiers, disponibles dans la mémoire du NXT à la catégorie "Divers" et récupérable sur votre ordinateur, contiennent les 89 mesures de vitesses suivies d'une dernière valeur calculée représentant la moyenne de la vitesse du moteur.

Rajoutez donc ce bloc dans votre dossier "Blocs Web" et remplacer le bloc personnel précédent par celui-ci dans votre programme comme ci-dessous :



Vous pourrez ainsi mettre en évidence le fait que les deux moteurs ne tournent pas à tout moment à la même vitesse et il se peut même que les moyennes de vitesse des deux moteurs ne soient pas identiques. Ce qui engendre le déplacement minime du centre de rotation de votre robot.

Bien évidemment, vous pourrez vous passer de ces blocs personnels par la suite lors de vos différentes rotations. Ils n'avaient ici qu'une utilisation pédagogique ! :d

Conclusion



Le mouvement de rotation constitue avec le mouvement de translation la base des déplacements d'un robot mobile.
Car, en effet, le robot effectuera une succession de ses deux mouvements de base pour parcourir une trajectoire plus sophistiquée.

Afin de vous évitez des calculs à chaque mouvement de base, un outil sous forme de programme est disponible au téléchargement.

Voila, le tutoriel sur les différentes façons de faire tourner votre robot touche à sa fin.

Faite tourner vos serviettes robots et ne tournez pas en rond .... :top