Notre robot se déplace grâce à deux roues motrices indépendantes. Les moteurs sont des moteurs à courant continu 12V-2A équipés de codeurs incrémentaux.
Notre objectif est que le robot se déplace de manière fluide jusqu'à une pose donnée (position x,y et orientation angulaire O).
Le chemin est la courbe qui relit la position initiale du robot à sa position finale. Il doit tenir compte du gabarit du robot, des obstacles fixes ou mobiles qu'il peut rencontrer. Cette courbe peut être une ligne droite (si l'environnement n'est pas perturbé) ou une courbe (courbe BSpline si l'environnement contient des obstacles). Le chemin ne dépend que de la vitesse du robot.
La trajectoire est un chemin qu'il faut parcourir en fonction du temps. Elle va définir les coordonnées (x,y,t). Le suivi de trajectoire est utilisé pour synchroniser des robots dans une chaîne de montage par exemple. Les pièces doivent être posée dans un ordre déterminé donc dépendant du temps pour éviter les collisions.
Ce suivi demande un asservissement rapide et lourd en calcul. Si le robot est en retard sur sa consigne, il va devoir partir brusquement pour compenser son retard.
Nous allons nous intéresser au suivi de chemin car la composante temporelle n'est pas importante dans notre cas. Même si le robot doit être rapide, le temps qu'il met à atteindre sa position finale n'est pas primordial. Nous allons considérer que l'environnement est libre (sans obstacles) donc le robot se déplacera en ligne droite puis il ajustera son orientation.
Le robot est équipé de deux moteurs CC. La première solution est d'asservir les deux moteurs indépendamment (l'asservissement de position d'un moteur est expliqué ici ). Cette solution fonctionne bien si les moteurs sont sensiblement identiques.
En asservissant les deux moteurs séparément, on devrait théoriquement avoir la même réponse et le robot devrait rouler droit. Malheureusement, en pratique, 2 moteurs d'une même série ne sont pas exactement identiques (inertie, résistance, jeu du réducteur…) donc même en appliquant la même consigne aux moteurs, les 2 vont réagir différemment. Si un des moteurs est plus réactif, il va accélérer plus vite que l'autre et le robot va tourner sur lui même au lieu d'aller tout droit.
Il faut donc travailler sur l'ensemble des 2 moteurs en asservissant un moteur en tenant compte de l'autre. En couplant l'asservissement du moteur droit à celui du moteur gauche, si le moteur gauche prend du retard sur le moteur droit, le moteur gauche va accélérer alors que le moteur droit va ralentir.
Pour plus de simplicité, nous allons travailler en coordonnées polaires et donc définir une position et une vitesse, linéaire et angulaire pour l'ensemble du robot.
Grâce aux encodeurs placés sur les moteurs, nous pouvons mesurer la vitesse des moteur droit et gauche. A partir de ces mesures, nous allons calculer la vitesse linéaire (vitesse de déplacement) et la vitesse angulaire (vitesse de rotation) du robot :
A partir de ces 2 vitesses, nous allons déterminer la position du robot par odométrie.
L'asservissement va se dérouler en 2 étapes. D'abord on va asservir la position (x,y) du robot. Une fois que le robot est arrivé à la position consigne, on va asservir son orientation.
Dans un premier temps, nous allons chercher à positionner correctement le robot à sa position cible (x, y). Pour cela, nous allons calculer une erreur de distance et une erreur d'angle (erreur en coordonnée polaire):
Une fois le robot positionné, il faut l'orienter correctement. La consigne de distance sera mise à zéro (erreur de distance = 0) et la consigne angulaire sera l'orientation O de la consigne initiale.
Une fois que l'erreur de distance et orientation est calculée (étape 1 ou 2), nous appliquons 2 asservissements de position/vitesse en parallèle (un pour la distance, l'autre pour l'angle). Puis nous allons coupler les commandes distance et angulaire pour obtenir les commandes moteurs droit et gauche.
Pour être réactif, l'asservissement doit être effectué régulièrement et fréquemment (ici nous prendrons 10 ou 20 ms). Si la fréquence est trop basse, le robot ne sera pas réactif et aura du mal à corriger. Au contraire, si la fréquence est trop élevée, les mesures (de vitesse principalement) ne seront pas significatives (0, 1 ou 2 pulses par cycles d'asservissement) et le robot ne corrigera pas bien.