Création de votre Programme prototype (C++/Java)

Une fois que tout est installé, nous sommes prêts à créer un programme de robots. WPILib est livré avec plusieurs modèles pour les programmes de robots. L’utilisation de ces modèles est fortement recommandée pour les nouveaux utilisateurs; cependant, les utilisateurs avancés sont libres d’écrire leur propre code robot à partir de zéro. Cet article explore la création d’un projet à partir de l’un des exemples fournis qui a un certain code déjà écrit pour conduire un robot de base.

Création d’un nouveau projet WPILib

Faites apparaitre la palette de commande Visual Studio Code avec Ctrl+Shift+P:

Opening the Command Palette.

Ensuite, tapez « WPILib » dans l’invite. Étant donné que toutes les commandes WPILib commencent par « WPILib » cette opération fera apparaitre la liste des commandes VS Code propres à WPILib :

Typing WPILib to filter for just the WPILib commands.

Sélectionnez maintenant la commande « Create a new project »:

Choose "WPILib: Create a new project".

Cette opération fera ressortir la fenêtre « New Project Creator Window »:

The different parts of the new project creation window.

Les éléments de la fenêtre New Project Creator sont expliqués ci-dessous :

  1. Project Type: Le genre de projet que nous voulons créer. Pour cet exemple, sélectionnez Example

  2. Language: C’est le langage de programmation (C++ ou Java) qui sera utilisé pour ce projet.

  3. Project Base: Cette zone est utilisée pour sélectionner la classe de base ou l’exemple à partir de laquelle ou duquel générer le projet. Pour cet exemple, sélectionnez Getting Started

  4. Base Folder: Ce paramètre détermine le dossier dans lequel le projet de robot sera situé.

  5. Project Name: Le nom du projet de robot. Ce paramètre spécifie également le nom du dossier du projet si la case Create New Folder est cochée.

  6. Create a New Folder: Si cette case est cochée, un nouveau dossier sera créé pour contenir le projet dans le dossier précédemment spécifié. Si elle n’est pas cochée, le projet sera situé directement dans le dossier précédemment spécifié. Une erreur sera générée si le dossier n’est pas vide et que cette case n’est pas cochée. Un dossier de projet sera créé si la case Create New Folder est cochée.

  7. Team Number: Numéro d’équipe du projet, qui sera utilisé pour les noms de packages dans le projet et pour localiser le robot au moment du déploiement du code.

  8. Enable Desktop Support: Permet de faire le test unitaire et la simulation. Bien que WPILib prenne en charge cette fonctionnalité, pour les bibliothèques de logiciels tiers cette prise en charge n’est pas garantie. Si les bibliothèques logicielles ne prennent pas en charge les applications de bureau, votre code peut ne pas compiler ou se bloquer. Cette case doit être laissée non cochée à moins que des tests unitaires ou une simulation ne soient nécessaires et que toutes les bibliothèques de logiciels le prennent en charge. Pour cet exemple, ne cochez pas cette case.

Une fois que tout ce qui précède a été configuré, cliquez sur « Generate Project » et le projet robot sera créé.

Note

Toutes les erreurs lors de la génération de projet apparaîtront dans le coin inférieur droit de l’écran.

Ouverture du nouveau projet

Après avoir créé votre projet avec succès, VS Code vous donnera la possibilité d’ouvrir le projet comme indiqué ci-dessous. Nous pouvons choisir de le faire maintenant ou plus tard en tapant Ctrl+K puis Ctrl+O (ou simplement Command+O sous macOS) et sélectionnez le dossier dans lequel nous avons enregistré notre projet.

Une fois ouvert, nous pouvons voir la hiérarchie du projet à gauche. En double-cliquant sur un fichier, on ouvre ce fichier dans l’éditeur.

The robo.java code shown after opening a new project.

Configurations C++ (C++ uniquement)

Pour les projets C++, il y a une étape de plus pour configurer IntelliSense. Chaque fois que nous ouvrons un projet, nous devrions obtenir un pop-up dans le coin inférieur droit demandant de rafraîchir les configurations C++. Cliquez sur « Yes » pour configurer IntelliSense.

You must choose "Yes" to refrest the C++ configurations.

Imports/Includes

 7
 8
 9
10
11
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.PWMVictorSPX;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;

Notre code doit faire référence aux composants de WPILib qui sont utilisés. En C++, cette condition est réalisée à l’aide d’instructions #include ; en Java, elle est réalisée avec des instructions import. Le programme fait référence à des classes pour Joystick (pour la conduite), PWMVictorSPX (pour contrôler les moteurs), TimedRobot (la classe de base utilisée pour l’exemple), Timer (utilisé pour le mode autonome), DifferentialDrive (pour connecter le contrôle joystick aux moteurs) et LiveWindow (C++ uniquement).

Définition des variables de notre prototype de robot

19
20
21
22
23
public class Robot extends TimedRobot {
  private final DifferentialDrive m_robotDrive =
      new DifferentialDrive(new PWMVictorSPX(0), new PWMVictorSPX(1));
  private final Joystick m_stick = new Joystick(0);
  private final Timer m_timer = new Timer();

Le prototype de robot dans nos exemples aura un joystick sur le port USB 0 pour l’entraînement arcade et deux moteurs sur les ports PWM 0 et 1. Ici, nous créons des objets de type DifférentielDrive (m_robotDrive), Joystick (m_stick) et le temps (m_timer). Cette section du code accomplit trois choses :

  1. Définit les variables en tant que membres de notre classe Robot.

  2. Initialise les variables.

Note

L’initialisation des variables en C++ se trouve dans la section private en bas du programme. Ce qui signifie qu’ils sont privés à la classe Robot. Le code C++ définit configure également le paramètre Motor Safety expiration à 0,1 seconde (le déplacement s’arrêtera si nous ne lui donnons pas une commande toutes les 0,1 secondes) et démarre le Timer utilisé pour le mode autonome.

Initialisation du robot

@Override
public void robotInit() {}

La méthode RobotInit est exécutée lorsque le programme robot démarre, mais après le constructeur. La méthode RobotInit dans notre exemple de programme ne fait rien. Si nous voulions exécuter quelque chose ici, nous pourrions fournir le code ci-dessus et surchager la méthode par défaut.

Exemple de mode autonome simple

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  /** This function is run once each time the robot enters autonomous mode. */
  @Override
  public void autonomousInit() {
    m_timer.reset();
    m_timer.start();
  }

  /** This function is called periodically during autonomous. */
  @Override
  public void autonomousPeriodic() {
    // Drive for 2 seconds
    if (m_timer.get() < 2.0) {
      m_robotDrive.arcadeDrive(0.5, 0.0); // drive forwards half speed
    } else {
      m_robotDrive.stopMotor(); // stop robot
    }
  }

La méthode AutonomousInit est exécutée une fois à chaque fois que le robot passe au mode autonomie à partir d’un autre mode. Dans ce programme, nous réinitialisons le Timer et le repartons ensuite dans cette méthode.

AutonomousPeriodic est exécuté une fois par période lorsque que le robot est en mode autonome. Dans la classe TimedRobot la période est de durée fixe, qui par défaut est égale à 20ms. Dans cet exemple, le code périodique vérifie si la minuterie est inférieure à 2 secondes et, dans ce cas, fait avancer le robot à mi-vitesse à l’aide de la méthode ArcadeDrive de la classe DifferentialDrive. S’il s’est écoulé plus de 2 secondes, le code met fin au déplacement du robot.

Contrôle par Joystick pendant le mode téléopéré

50
51
52
53
54
55
56
57
58
  /** This function is called once each time the robot enters teleoperated mode. */
  @Override
  public void teleopInit() {}

  /** This function is called periodically during teleoperated mode. */
  @Override
  public void teleopPeriodic() {
    m_robotDrive.arcadeDrive(m_stick.getY(), m_stick.getX());
  }

Comme dans le mode Autonomous, le mode Teleop possède les fonctions TeleopInit et TeleopPeriodic. Dans cet exemple, nous n’avons rien à faire dans TeleopInit, qui est fourni uniquement à des fins d’illustration. Dans TeleopPeriodic, le code utilise la méthode ArcadeDrive pour faire correspondre l’axe Y du Joystick pour le mouvement en ligne droite avancer/reculer des moteurs d’entraînement et l’axe X pour le mouvement de rotation.

Mode test

60
61
62
63
64
65
66
67
  /** This function is called once each time the robot enters test mode. */
  @Override
  public void testInit() {}

  /** This function is called periodically during test mode. */
  @Override
  public void testPeriodic() {}
}

Le mode test est utilisé afin de tester la fonctionnalité du robot. À l’instar de TeleopInit, les méthodes TestInit et TestPeriodic sont fournies ici uniquement à des fins d’illustration.

Déploiement du code projet sur un robot

Veuillez consulter les instructions ici pour déployer le programme sur un robot.