Robots suiveurs 3 - Code Tutoriel Contrôle moteurs

De Learning Lab Environnements Connectés
Sauter à la navigation Sauter à la recherche

Codes sources

Comme vu sur la page précédente, les robots sont pilotés à partir de programme appelées controllers.

Pour contrôler les moteurs, il existe 2 solutions possibles, asservir les moteurs en position ou en vitesse. Pour cela, il faut créer un nouveau controller (Voir Tuto sur la création et l'ajout de controller).

Le code pour piloter un moteur (les 2 solutions) peut se trouver ici.


Détails

  • Contrôle des moteurs en position
#include <webots/Robot.hpp>
#include <webots/Motor.hpp> 

Il s'agit ici d'ajouter les bibliothèques nécessaires pour définir le robot et acceder au contrôle de ses moteurs


#define TIME_STEP 64

Definition du pas temporel. Ce paramètre doit nécessairement être un multiple du paramètre basicTimeStep associé au monde généré dans la section WorldInfo, sans quoi la simulation risque de saccader, voire planter.

 Robot *robot = new Robot();

 // get the motor devices
 Motor *leftMotor = robot->getMotor("left wheel motor");
 Motor *rightMotor = robot->getMotor("right wheel motor");
 

Dans cette section, le robot est défini et les moteurs des roues sont associés aux pointeurs créés pour pouvoir être utilisés dans la suite

 // set the target position of the motors
 leftMotor->setPosition(10.0);
 rightMotor->setPosition(10.0);
 

Ici, des "positions" sont données comme cibles au moteurs, mais après certaines expérimentation, plus que des positions, il semblerait s'agir de distances à parcourir pour chaque moteur.

 while (robot->step(TIME_STEP) != -1);

 delete robot;


La fonction step(TIME_STEP) est cruciale et doit être utilisée dans tout controller. Cette fonction actualise les données des capteurs et actionneurs entre Webots et les controllers. Si la fonction n'est pas appelée, il n'y aura alors pas d'action réalisée par le robot dans Webot ni de mise ajour des données retournées par les capteurs dans le controller. Si cette fonction retourne -1, cela indique que Webots est sur le point d'éteindre le controller. Ce moment arrive lorsque l'on appuie sur un des boutons reload ou quit de Webots.



  • Contrôle des moteurs en vitesse


#define MAX_SPEED 6.28

Ici la vitesse maximale angulaire (autorisée par Webots) est de 2*Pi radians/seconde

// get a handler to the motors and set target position to infinity (speed control)
Motor *leftMotor = robot->getMotor("left wheel motor");
Motor *rightMotor = robot->getMotor("right wheel motor");
leftMotor->setPosition(INFINITY);
rightMotor->setPosition(INFINITY);

Les moteurs sont initialisée en position à l'infini, permettant ainsi de tourner en continu tant que la vitesse n'est pas fixé à 0 : Il n'y a donc pas de limite de distance parcourue

// set up the motor speeds at 10% of the MAX_SPEED.
leftMotor->setVelocity(0.1 * MAX_SPEED);
rightMotor->setVelocity(0.1 * MAX_SPEED);

La vitesse est ensuite fixé à 10% de la vitesse max. Sans autre action dans le controller, les roues vont donc tourner sans s’arrêter; Il faudra par la suite ajouter une condition d’arrêt pour que le robot se stoppe.