Écrire le code d’un sous-système
L’ajout de code pour créer un sous-système fonctionnel est très simple. Pour les sous-systèmes qui n’utilisent pas de rétroaction, cela s’avère extrêmement simple. Dans cette section, nous allons regarder un exemple de sous-système de pince ou Claw sur un bras articulé de robot. Le sous-système Claw dispose également d’un interrupteur de fin de course pour déterminer si un objet est bien saisi.
Représentation de RobotBuilder du sous-système Claw

La pince à l’extrémité du bras du robot est un sous-système actionné par un seul contrôleur de moteur VictorSPX. Il y a trois choses que nous voulons que la pince fasse, commence à s’ouvrir, commencer à se fermer, et s’arrêter. C’est la responsabilité du sous-système. La prise en charge pour l’ouverture et la fermeture sera assurée par une commande plus tard dans ce didacticiel. Nous définirons également une méthode pour savoir si la pince est en train de saisir un objet.
Ajout de capacités de sous-système
11// ROBOTBUILDER TYPE: Subsystem.
12
13package frc.robot.subsystems;
14
15
16import frc.robot.commands.*;
17import edu.wpi.first.wpilibj.livewindow.LiveWindow;
18import edu.wpi.first.wpilibj2.command.SubsystemBase;
19
20// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=IMPORTS
21import edu.wpi.first.wpilibj.DigitalInput;
22import edu.wpi.first.wpilibj.motorcontrol.PWMVictorSPX;
23
24 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=IMPORTS
25
26
27/**
28 *
29 */
30public class Claw extends SubsystemBase {
31 // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
32
33 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
34
35 // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
36private PWMVictorSPX motor;
37private DigitalInput limitswitch;
38
39 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
40
41 /**
42 *
43 */
44 public Claw() {
45 // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
46motor = new PWMVictorSPX(4);
47 addChild("motor",motor);
48 motor.setInverted(false);
49
50limitswitch = new DigitalInput(4);
51 addChild("limit switch", limitswitch);
52
53
54
55 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
56 }
57
58 @Override
59 public void periodic() {
60 // This method will be called once per scheduler run
61
62 }
63
64 @Override
65 public void simulationPeriodic() {
66 // This method will be called once per scheduler run when in simulation
67
68 }
69
70 // Put methods for controlling this subsystem
71 // here. Call these from Commands.
72
73 public void open() {
74 motor.set(1.0);
75 }
76
77 public void close() {
78 motor.set(-1.0);
79 }
80
81 public void stop() {
82 motor.set(0.0);
83 }
84
85 public boolean isGripping() {
86 return limitswitch.get();
87 }
88
89}
11// ROBOTBUILDER TYPE: Subsystem.
12
13// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=INCLUDES
14#include "subsystems/Claw.h"
15#include <frc/smartdashboard/SmartDashboard.h>
16
17 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=INCLUDES
18
19Claw::Claw(){
20 SetName("Claw");
21 // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
22 SetSubsystem("Claw");
23
24 AddChild("limit switch", &m_limitswitch);
25
26
27 AddChild("motor", &m_motor);
28 m_motor.SetInverted(false);
29
30
31 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
32}
33
34void Claw::Periodic() {
35 // Put code here to be run every loop
36
37}
38
39void Claw::SimulationPeriodic() {
40 // This method will be called once per scheduler run when in simulation
41
42}
43
44// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CMDPIDGETTERS
45
46 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CMDPIDGETTERS
47
48
49// Put methods for controlling this subsystem
50// here. Call these from Commands.
51
52void Claw::Open() {
53 m_motor.Set(1.0);
54}
55
56void Claw::Close() {
57 m_motor.Set(-1.0);
58}
59
60void Claw::Stop() {
61 m_motor.Set(0.0);
62}
63
64bool Claw::IsGripping() {
65 return m_limitswitch.Get();
66}
Ajoutez des méthodes aux fichiers claw.java ou claw.cpp qui ouvriront, fermeront et empêcheront la pince de bouger et de lire l’état de l’interrupteur de fin de course de la pince. Ceux-ci seront utilisés par les commandes qui gèrent réellement le fonctionnement de la pince.
Notez que les variables membres appelées motor et limitswitch sont créés par RobotBuilder afin qu’elles puissent être utilisées dans l’ensemble du sous-système. Chacun de vos éléments glissés dans la palette aura une variable membre avec le nom donné dans RobotBuilder.
Ajout des déclarations de méthode au fichier Header, ou d’en-tête (C ++ uniquement)
11// ROBOTBUILDER TYPE: Subsystem.
12#pragma once
13
14// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=INCLUDES
15#include <frc2/command/SubsystemBase.h>
16#include <frc/DigitalInput.h>
17#include <frc/motorcontrol/PWMVictorSPX.h>
18
19 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=INCLUDES
20
21/**
22 *
23 *
24 * @author ExampleAuthor
25 */
26class Claw: public frc2::SubsystemBase {
27private:
28 // It's desirable that everything possible is private except
29 // for methods that implement subsystem capabilities
30 // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
31frc::DigitalInput m_limitswitch{4};
32frc::PWMVictorSPX m_motor{4};
33
34 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
35public:
36Claw();
37
38 void Periodic() override;
39 void SimulationPeriodic() override;
40 void Open();
41 void Close();
42 void Stop();
43 bool IsGripping();
44
45 // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CMDPIDGETTERS
46
47 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CMDPIDGETTERS
48 // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
49
50 // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
51
52
53};
En plus d’ajouter les méthodes au fichier d’implémentation de classe, Claw.cpp, les déclarations des méthodes doivent être ajoutées au fichier d’en-tête, soit Claw.h. Les déclarations à ajouter sont indiquées ici.
Pour ajouter la fonctionnalité au sous-système Claw afin de gérer l’ouverture et la fermeture, vous devez définir des commandes.