Robots suiveurs 3 - Code Contrôle au Clavier

De Learning Lab Environnements Connectés
Sauter à la navigation Sauter à la recherche
#include <webots/Robot.hpp>

// Added a new include file
#include <webots/Motor.hpp>
#include <webots/Keyboard.hpp>  // Ajout de la bibliothèque gérant les événements clavier.
#define TIME_STEP 64

#define MAX_SPEED 6.28

// All the webots classes are defined in the "webots" namespace
using namespace webots;

int main(int argc, char **argv) {
Robot *robot = new Robot();

 // 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);

 // Initialisation des moteurs à une vitesse nulle
 leftMotor->setVelocity(0);
 rightMotor->setVelocity(0);

// Initialisation de l'objet clavier
 Keyboard keyboard = Keyboard();
 keyboard.enable(50); // Activation de la détection des événements. La suite du code ne marchera pas sans cette option

 while (robot->step(TIME_STEP) != -1){
 
   int key = keyboard.getKey(); // Détecte le code clavier retourné en fonction de la touche pressée
 
   
   if (key == -1) { // Si le code retourné est -1, aucune touche n'est enfoncée, il faut donc arrêter le robot
           leftMotor->setVelocity(0);
           rightMotor->setVelocity(0);
       }

    while (key > 0) {
      switch (key) {
        
        case 'Z': // Cas Z enfoncé : On applique la vitesse maximale pour avancer
           leftMotor->setVelocity(MAX_SPEED);
           rightMotor->setVelocity(MAX_SPEED);
           
          break;
        case 'S': //Cas S enfoncé : On applique la vitesse maximale négative pour reculer
           leftMotor->setVelocity(-MAX_SPEED);
           rightMotor->setVelocity(-MAX_SPEED);
          break;
        case 'Q': //Cas Q enfoncé : On applique une vitesse à une roue et l'inverse à l'autre pour pivoter à gauche. Au delà de 0.5 fois la vitesse maximale appliquée, la simulation de déplacement du robot saccade.
          leftMotor->setVelocity(-0.49*MAX_SPEED);
           rightMotor->setVelocity(0.49*MAX_SPEED);
          break;
        case 'D': //Cas D enfoncé : On applique une vitesse à une roue et l'inverse à l'autre pour pivoter à droite. Au delà de 0.5 fois la vitesse maximale appliquée, la simulation de déplacement du robot saccade.
          leftMotor->setVelocity(0.49*MAX_SPEED);
           rightMotor->setVelocity(-0.49*MAX_SPEED);
          break;

        //Cas A et E enfoncé : On applique une vitesse à une roue et une vitesse moins élevée à l'autre pour pivoter tout en avançant. Au delà de 0.75 fois la vitesse maximale appliquée, la simulation du déplacement du robot saccade aussi.
        case 'A': 
             leftMotor->setVelocity(0.5*MAX_SPEED);
             rightMotor->setVelocity(0.75*MAX_SPEED);
          break;
          case 'E':
             leftMotor->setVelocity(0.75*MAX_SPEED);
             rightMotor->setVelocity(0.5*MAX_SPEED);
          break;
        default: //Pour toute autre touche on arrête le robot
           leftMotor->setVelocity(0);
           rightMotor->setVelocity(0);
          break;
      }
      key = keyboard.getKey(); // Actualisation de la sortie clavier.
      
      
       
    }
   
    }
    

 delete robot;

 return 0;
}