Créer le programme du robot

Une fois que tout est installé, nous sommes prêts à créer un programme pour le robot. WPILib fournit plusieurs modèles de programmes de robot. 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 de robot à partir de zéro.

Choix d’une classe de base

Pour démarrer un projet à l’aide d’un des modèles WPILib de programme de robot, les utilisateurs doivent d’abord choisir une classe de base pour leur robot. Les utilisateurs sous-classent ces classes de base pour créer leur classe primaire Robot, qui contrôle le flux principal du programme du robot. Trois choix sont disponibles pour la classe de base:

TimedRobot

Documentation: Java - C++

Source: Java - C++

The TimedRobot class is the base class recommended for most users. It provides control of the robot program through a collection of init(), periodic(), and exit() methods, which are called by WPILib during specific robot states (e.g. autonomous or teleoperated). During these calls, your code typically polls each input device and acts according to the data it receives. For instance, you would typically determine the position of the joystick and state of the joystick buttons on each call and act accordingly. The TimedRobot class also provides an example of retrieving autonomous routines through SendableChooser (Java/ C++)

Note

Un modèle TimedRobot Skeleton est disponible; celui-ci supprime certains commentaires informatifs et l’exemple autonome. Vous pouvez l’utiliser si vous êtes déjà familier avec TimedRobot. L’exemple ci-dessous est de TimedRobot Skeleton.

 7import edu.wpi.first.wpilibj.TimedRobot;
 8
 9/**
10 * The VM is configured to automatically run this class, and to call the functions corresponding to
11 * each mode, as described in the TimedRobot documentation. If you change the name of this class or
12 * the package after creating this project, you must also update the build.gradle file in the
13 * project.
14 */
15public class Robot extends TimedRobot {
16  /**
17   * This function is run when the robot is first started up and should be used for any
18   * initialization code.
19   */
20  @Override
21  public void robotInit() {}
22
23  @Override
24  public void robotPeriodic() {}
25
26  @Override
27  public void autonomousInit() {}
28
29  @Override
30  public void autonomousPeriodic() {}
31
32  @Override
33  public void teleopInit() {}
34
35  @Override
36  public void teleopPeriodic() {}
37
38  @Override
39  public void disabledInit() {}
40
41  @Override
42  public void disabledPeriodic() {}
43
44  @Override
45  public void testInit() {}
46
47  @Override
48  public void testPeriodic() {}
49
50  @Override
51  public void simulationInit() {}
52
53  @Override
54  public void simulationPeriodic() {}
55}
 5#include "Robot.h"
 6
 7void Robot::RobotInit() {}
 8void Robot::RobotPeriodic() {}
 9
10void Robot::AutonomousInit() {}
11void Robot::AutonomousPeriodic() {}
12
13void Robot::TeleopInit() {}
14void Robot::TeleopPeriodic() {}
15
16void Robot::DisabledInit() {}
17void Robot::DisabledPeriodic() {}
18
19void Robot::TestInit() {}
20void Robot::TestPeriodic() {}
21
22void Robot::SimulationInit() {}
23void Robot::SimulationPeriodic() {}
24
25#ifndef RUNNING_FRC_TESTS
26int main() {
27  return frc::StartRobot<Robot>();
28}
29#endif

Les méthodes périodiques sont appelées toutes les 20 ms par défaut. Cela peut être changé en sollicitant le constructeur de superclasse avec le taux de mise à jour souhaité.

Danger

Changing your robot rate can cause some unintended behavior (loop overruns). Teams can also use Notifiers to schedule methods at a custom rate.

public Robot() {
  super(0.03); // Periodic methods will now be called every 30 ms.
}
Robot() : frc::TimedRobot(30_ms) {}

RobotBase

Documentation: Java - C++

Source: Java - C++

La classe RobotBase est la classe de base la plus simpliste offerte et n’est généralement pas recommandée pour une utilisation directe. Aucun flux de contrôle du robot n’est géré pour l’utilisateur; tout doit être écrit à partir de zéro dans la méthode startCompetition(). Le modèle par défaut montre comment traiter les différents modes de fonctionnement (teleop, auto, etc.).

Note

Un modèle RobotBase Skeleton est disponible qui offre une méthode startCompetition() vide de code

Commande Robot

Le framework Command Robot ajoute à la fonctionnalité de base d’un Timed Robot en interrogeant automatiquement les entrées et en convertissant les données d’entrée brutes en événements. Ces événements sont liés au code utilisateur, qui est exécuté lorsque l’événement est déclenché. Par exemple, lorsqu’un bouton est enfoncé, le code lié à l’appui sur ce bouton est automatiquement appelé et il n’est pas nécessaire d’interroger ou de suivre directement l’état de ce bouton. Le framework Command Robot facilite l’écriture de code compact facile à lire avec un comportement complexe, mais nécessite un investissement initial supplémentaire en temps de la part d’un programmeur afin de comprendre le fonctionnement du framework Command Robot.

Les équipes utilisant Commande Robot devraient se reférer à Dictaticiel sur la programmation orientée commande.

Romi

Les équipes utilisant un Romi devraient utiliser le modèle Romi - Timed ou Romi - Command Bot

Romi - Timed

Le modèle Romi - Timed fournit une classe RomiDrivetrain qui expose une méthode arcadeDrive(double xaxisSpeed, double zaxisRotate). C’est à l’utilisateur d’alimenter cette fonction arcadeDrive.

Cette classe fournit également des fonctions pour récupérer et réinitialiser les encodeurs embarqués du Romi.

Romi - Command Bot

Le modèle Romi - Command Bot fournit un sous-système RomiDrivetrain qui expose une méthode arcadeDrive(double xaxisSpeed, double zaxisRotate). C’est à l’utilisateur d’alimenter cette fonction arcadeDrive.

Ce sous-système fournit également des fonctions pour récupérer et réinitialiser les codeurs embarqués du Romi.

Choisir de ne pas utiliser une classe de base

Les utilisateurs peuvent omettre complètement la classe de base et simplement écrire leur programme dans une méthode main(), comme ils le feraient pour tout autre programme. Ceci est fortement déconseillé - les utilisateurs n’ont pas à « réinventer la roue » lors de l’écriture du code de leur robot - mais ceci est néanmoins pris en charge pour ceux qui souhaitent avoir un contrôle absolu sur le flux de leur programme.

Avertissement

Les utilisateurs ne doivent pas modifier la méthode main() du programme du robot à moins qu’ils ne soient absolument sûrs de ce qu’ils font.

Créer un nouveau projet WPILib

Une fois que nous avons décidé d’une classe de base, nous pouvons créer notre nouveau projet de robot. Affichez la palette de commandes de Visual Studio Code avec Ctrl+Shift+P. Ensuite, tapez « WPILib » dans l’invite. Étant donné que toutes les commandes WPILib commencent par « WPILib », cela affichera la liste des commandes VS Code spécifiques à WPILib. Maintenant, sélectionnez la commande Create a new project :

Met en surbrillance la commande "WPILib: Create a new project"

La fenêtre « New Project Creator Window » apparaîtra.

Écran du créateur de nouveau projet.

Le contenu de la fenêtre « New Project Creator Window » est expliqué ci-dessous:

  1. Project Type: Le genre de projet à créer. Il peut s’agir d’un exemple de projet ou de l’un des modèles de projet fournis par WPILib. Des modèles existent pour chacune des classes de base de robot. De plus, un modèle existe pour des projets orientés commandes qui sont rédigés à partir de la classe de base TimedRobot mais qui comprennent un certain nombre de fonctionnalités supplémentaires - ce type de programme de robot est fortement recommandé pour les nouvelles équipes.

  2. Language: Le langage (C++ ou Java) qui sera utilisé pour ce projet.

  3. Base Folder: S’il s’agit d’un modèle de projet, ce paramètre spécifie le type de modèle qui sera utilisé.

  4. Project Location: Le dossier dans lequel le projet du robot sera enregistré.

  5. Project Name: Le nom du projet du robot. Cela 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 cela n’est pas vérifié.

  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 lors du déploiement du code.

  8. Enable Desktop Support: Permet les tests unitaires et la simulation. Bien que WPILib les prennent en charge, il est possible que les librairies tierces ne puissent pas le faire. Si les librairies ne supportent pas le l’application bureau, votre code peut ne pas compiler ou peut se planter. Ce paramètre ne doit pas être coché à moins que des tests unitaires ou des simulations ne soient nécessaires et que toutes les librairies le prennent en charge.

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

Note

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

Avertissement

Creating projects on OneDrive is not supported as OneDrive’s caching interferes with the build system. Some Windows installations put the Documents and Desktop folders on OneDrive by default.

Un exemple complet est illustré ci-dessous.

L’écran de créateur  nouveau projet rempli.

Ouvrir le 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.

Opening Project pop-up in VS Code

Une fois ouvert, la hiérarchie du projet s’affiche sur la gauche. Double-cliquez sur le fichier pour l’ouvrir dans l’éditeur.

Ouverture d’un fichier dans l’éditeur VS Code.

Configurations C++ (C++ seulement)

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.

En choisissant "Yes" lorsque vous êtes invité à actualiser les configurations C++.