Écrire le code d’une commande

Les classes Subsystem font bouger les mécanismes de votre robot, mais pour que les mouvements de ces mécanismes s’arrêtent au bon moment et se synchronisent à travers des opérations plus complexes, vous écrivez des commandes. Auparavant, dans writing the code for a subsystem, nous avons développé le code du sous-système Claw sur un robot pour démarrer l’ouverture de la pince, sa fermeture ou pour arrêter son mouvement. Maintenant, nous allons écrire le code pour une commande qui sera effectivement activer le moteur de la pince au moment opportun afin d’ouvrir ou de fermer la pince. Notre exemple de pince est un mécanisme très simple où nous activons le moteur pendant 1 seconde pour l’ouvrir ou jusqu’à ce que l’interrupteur de fin de course soit déclenché pour la fermer.

Commande Close Claw dans RobotBuilder

../../../../../_images/writing-command-code-1.png

Ceci est la définition de la commande CloseClaw dans RobotBuilder. Notez qu’elle requiert le sous-système Claw. Cela s’explique à l’étape suivante.

Classe CloseClaw générée

11 // ROBOTBUILDER TYPE: Command.
12
13 package frc.robot.commands;
14 import edu.wpi.first.wpilibj2.command.CommandBase;
15
16 // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=IMPORTS
17 import frc.robot.subsystems.Claw;
18
19     // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=IMPORTS
20
21 /**
22 *
23 */
24 public class CloseClaw extends CommandBase {
25
26     // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_DECLARATIONS
27         private final Claw m_claw;
28
29     // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_DECLARATIONS
30
31     // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
32
33
34     public CloseClaw(Claw subsystem) {
35
36
37     // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
38         // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_SETTING
39
40     // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_SETTING
41         // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=REQUIRES
42
43         m_claw = subsystem;
44         addRequirements(m_claw);
45
46     // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=REQUIRES
47     }
48
49     // Called when the command is initially scheduled.
50     @Override
51     public void initialize() {
52         m_claw.close(); // (1)
53     }
54
55     // Called every time the scheduler runs while the command is scheduled.
56     @Override
57     public void execute() {
58     }
59
60     // Called once the command ends or is interrupted.
61     @Override
62     public void end(boolean interrupted) {
63         m_claw.stop(); // (3)
64     }
65
66     // Returns true when the command should end.
67     @Override
68     public boolean isFinished() {
69         return m_claw.isGripping(); // (2)
70     }
71
72     @Override
73     public boolean runsWhenDisabled() {
74         // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DISABLED
75         return false;
76
77     // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DISABLED
78     }
79 }
11// ROBOTBUILDER TYPE: Command.
12
13// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTOR
14
15#include "commands/CloseClaw.h"
16
17CloseClaw::CloseClaw(Claw* m_claw)
18:m_claw(m_claw){
19
20    // Use AddRequirements() here to declare subsystem dependencies
21    // eg. AddRequirements(m_Subsystem);
22    SetName("CloseClaw");
23    AddRequirements({m_claw});
24
25// END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTOR
26
27}
28
29// Called just before this Command runs the first time
30void CloseClaw::Initialize() {
31    m_claw->Close(); // (1)
32}
33
34// Called repeatedly when this Command is scheduled to run
35void CloseClaw::Execute() {
36
37}
38
39// Make this return true when this Command no longer needs to run execute()
40bool CloseClaw::IsFinished() {
41    return m_claw->IsGripping(); // (2)
42}
43
44// Called once after isFinished returns true
45void CloseClaw::End(bool interrupted) {
46    m_claw->Stop(); // (3)
47}
48
49bool CloseClaw::RunsWhenDisabled() const {
50    // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DISABLED
51    return false;
52
53    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DISABLED
54}

RobotBuilder générera les fichiers de classe pour la commande CloseClaw. La commande représente le comportement de la pince, c’est-à-dire son opération dans le temps. Pour faire fonctionner ce mécanisme de pince très simple, le moteur doit fonctionner pendant 1 seconde dans la direction de fermeture. Le sous-système Claw est pourvu de méthodes pour démarrer le moteur dans la bonne direction et pour l’arrêter. La responsabilité des commandes est de faire tourner le moteur pour le délai requis. Les lignes de code qui sont affichées dans les boîtes sont ajoutées pour créer ce comportement.

  1. Démarrer le moteur qui controle la pince, pour qu’elle se déplaçe dans la direction de fermeture Ceci est accompli en appelant la méthode Close() qui a été ajoutée au sous-système Claw la méthode d’initialisation de CloseClaw .

  2. This command is finished when the limit switch in the Claw subsystem is tripped.

  3. La méthode End() est alors appelée lorsque la commande est terminée et c’est un moment idéal pour réinitialiser certaines variables et relâcher les ressources qui ne seront plus utilisées. Dans ce cas, on arrête le moteur car le temps est écoulé.