Manettes (Joysticks)

Un joystick peut être utilisé avec le programme Driver Station pour contrôler le robot. Presque tous les « contrôleurs » reconnus par Windows peuvent être utilisés comme joystick. Les manettes sont accessibles en utilisant la classe GenericHID. Cette classe a trois sous-classes pertinentes pour les joysticks préconfigurés. Vous pouvez également implémenter le vôtre pour d’autres contrôleurs en étendant GenericHID. Le premier est Joystick qui est utile pour les joysticks de pilotage aérien standard. Le second est XboxController qui fonctionne pour la Xbox 360, Xbox One ou Logitech F310 (en mode XInput). Enfin, la classe PS4Controller est idéale pour utiliser ce contrôleur. Chaque axe du contrôleur va de -1 à 1.

The command based way to use the these classes is detailed in the section: Liaison de commandes à des déclencheurs.

Joysticks du poste de conduite

Le 4e onglet en bas à gauche est l'onglet Périphériques USB.

L’onglet USB Devices de Driver Station est utilisé pour installer et configurer le joystick à utiliser avec le robot. En appuyant sur un bouton d’un joystick, son entrée dans le tableau s’allumera en vert. La sélection du joystick affichera les valeurs des axes, des boutons et le PDV qui peuvent être utilisés pour déterminer le mappage entre les caractéristiques physiques du joystick et les numéros d’axe ou de bouton.

Sur l'onglet USB, les indicateurs s'allument pour indiquer ce qui est actuellement enfoncé.

L’onglet Périphériques USB attribue également un index de joystick à chaque joystick. Pour réorganiser les joysticks, cliquez simplement et faites glisser. Le logiciel Driver Station essaiera de préserver l’ordre des périphériques entre les exécutions. C’est une bonne idée de noter dans quel ordre vos appareils doivent être et de vérifier chaque fois que vous démarrez le logiciel Driver Station qu’ils sont corrects.

Lorsque la Driver Station est en mode désactivé, elle recherche régulièrement les changements d’état sur les dispositifs joysticks. Les appareils débranchés sont supprimés de la liste et de nouveaux appareils sont ouverts et ajoutés. Lorsqu’il n’est pas connecté au FMS, le fait de débrancher un joystick forcera la Driver Station en mode désactivé. Pour recommencer à utiliser le joystick : branchez le joystick, vérifiez qu’il s’affiche au bon endroit, puis réactivez le robot. Tant que la Driver Station est en mode activé, elle ne recherchera pas de nouveaux périphériques. Il s’agit d’une opération qui prend du temps et la mise à jour rapide des signaux des appareils connectés est prioritaire.

Note

Pour certains joysticks, la routine de démarrage lira quelle que soit la position des joysticks comme position centrale, par conséquent, lorsque l’ordinateur est allumé (ou lorsque le joystick est branché), les joysticks doivent être à leur position centrale.

Lorsque le robot est connecté au Field Management System en compétition, le mode Driver Station est dicté par le FMS. Cela signifie que vous ne pouvez pas désactiver votre robot et que le DS ne peut pas se désactiver lui-même afin de détecter les changements de joystick. Un rafraîchissement manuel complet des joysticks peut être initié en appuyant sur la touche F1 du clavier. Notez que cela fermera et rouvrira tous les manettes, donc celles-ci doivent être dans leur position centrale comme indiqué ci-dessus.

Classe Joystick

Une manette Logitech utilisé pour le pilotage aérien avec une explication des valeurs des axes et des boutons.
Joystick exampleJoystick = new Joystick(0); // 0 is the USB Port to be used as indicated on the Driver Station
Joystick exampleJoystick{0}; // 0 is the USB Port to be used as indicated on the Driver Station
exampleJoystick = wpilib.Joystick(0) # 0 is the USB Port to be used as indicated on the Driver Station

La classe Joystick est conçue pour faciliter considérablement l’utilisation d’un joystick de pilotage aérien pour faire fonctionner le robot. Selon le joystick, l’utilisateur peut avoir besoin de définir les canaux X, Y, Z et Throttle spécifiques que votre joystick de pilotage aérien utilise. Cette classe propose des méthodes spéciales pour accéder à l’angle et à la magnitude du joystick.

Important

Due to differences in coordinate systems, teams usually negate the values when reading joystick axes. See the Joystick and controller coordinate system section for more detail.

Classe XboxController

Manette Xbox d'origine.
XboxController exampleXbox = new XboxController(0); // 0 is the USB Port to be used as indicated on the Driver Station
XboxController exampleXbox{0}; // 0 is the USB Port to be used as indicated on the Driver Station
exampleXbox = wpilib.XboxController(0) # 0 is the USB Port to be used as indicated on the Driver Station

The XboxController class provides named methods (e.g. getXButton, getXButtonPressed, getXButtonReleased) for each of the buttons, and the indices can be accessed with XboxController.Button.kX.value. The rumble feature of the controller can be controlled by using XboxController.setRumble(GenericHID.RumbleType.kRightRumble, value). Many users do a split stick arcade drive that uses the left stick for just forwards / backwards and the right stick for left / right turning.

Important

Due to differences in coordinate systems, teams usually negate the values when reading joystick axes. See the Joystick and controller coordinate system section for more detail.

Classe PS4Controller

Manette PlayStation 4.
PS4Controller examplePS4 = new PS4Controller(0); // 0 is the USB Port to be used as indicated on the Driver Station
PS4Controller examplePS4{0}; // 0 is the USB Port to be used as indicated on the Driver Station
examplePS4 = wpilib.PS4Controller(0) # 0 is the USB Port to be used as indicated on the Driver Station

The PS4Controller class provides named methods (e.g. getSquareButton, getSquareButtonPressed, getSquareButtonReleased) for each of the buttons, and the indices can be accessed with PS4Controller.Button.kSquare.value. The rumble feature of the controller can be controlled by using PS4Controller.setRumble(GenericHID.RumbleType.kRightRumble, value).

Important

Due to differences in coordinate systems, teams usually negate the values when reading joystick axes. See the Joystick and controller coordinate system section for more detail.

POV

Les angles utilisés par le code du POV/D-pad avec 0 en haut et en continuant dans le sens des aiguilles d'une montre.

On joysticks, the POV is a directional hat that can select one of 8 different angles or read -1 for unpressed. The XboxController/PS4Controller D-pad works the same as a POV. Be careful when using a POV with exact angle requirements as it is hard for the user to ensure they select exactly the angle desired.

Utilisation de GenericHID

An axis can be used with .getRawAxis(int index) (if not using any of the classes above) that returns the current value. Zero and one in this example are each the index of an axis as found in the Driver Station mentioned above.

private final PWMSparkMax m_leftMotor = new PWMSparkMax(Constants.kLeftMotorPort);
private final PWMSparkMax m_rightMotor = new PWMSparkMax(Constants.kRightMotorPort);
private final DifferentialDrive m_robotDrive = new DifferentialDrive(m_leftMotor::set, m_rightMotor::set);
private final GenericHID m_stick = new GenericHID(Constants.kJoystickPort);

m_robotDrive.arcadeDrive(-m_stick.getRawAxis(0), m_stick.getRawAxis(1));
frc::PWMVictorSPX m_leftMotor{Constants::kLeftMotorPort};
frc::PWMVictorSPX m_rightMotor{Constants::kRightMotorPort};
frc::DifferentialDrive m_robotDrive{[&](double output) { m_leftMotor.Set(output); },
                                    [&](double output) { m_rightMotor.Set(output); }};
frc::GenericHID m_stick{Constants::kJoystickPort};

m_robotDrive.ArcadeDrive(-m_stick.GetRawAxis(0), m_stick.GetRawAxis(1));
leftMotor = wpilib.PWMVictorSPX(LEFT_MOTOR_PORT)
rightMotor = wpilib.PWMVictorSPX(RIGHT_MOTOR_PORT)
self.robotDrive = wpilib.drive.DifferentialDrive(leftMotor, rightMotor)
self.stick = wpilib.GenericHID(JOYSTICK_PORT)

self.robotDrive.arcadeDrive(-self.stick.getRawAxis(0), self.stick.getRawAxis(1))

Utilisation des boutons

Note

Usage such as the following is for code not using the command-based framework. For button usage in the command-based framework, see Liaison de commandes à des déclencheurs.

Contrairement à un axe, vous souhaiterez généralement utiliser les méthodes pressed et released pour répondre à l’entrée du bouton. Ceux-ci retourneront vrai si le bouton a été activé depuis la dernière vérification. Ceci est utile pour entreprendre une action une seule fois lorsque l’événement se produit, mais sans avoir à le faire continuellement pendant que le bouton est maintenu enfoncé.

if (joystick.getRawButtonPressed(0)) {
   turnIntakeOn(); // When pressed the intake turns on
}
if (joystick.getRawButtonReleased(0)) {
   turnIntakeOff(); // When released the intake turns off
}

OR

if (joystick.getRawButton(0)) {
   turnIntakeOn();
} else {
   turnIntakeOff();
}
if (joystick.GetRawButtonPressed(0)) {
   turnIntakeOn(); // When pressed the intake turns on
}
if (joystick.GetRawButtonReleased(0)) {
   turnIntakeOff(); // When released the intake turns off
}

OR

if (joystick.GetRawButton(0)) {
   turnIntakeOn();
} else {
   turnIntakeOff();
}
if joystick.getRawButtonPressed(0):
   turnIntakeOn() # When pressed the intake turns on

if joystick.getRawButtonReleased(0):
   turnIntakeOff() # When released the intake turns off

# OR

if joystick.getRawButton(0):
   turnIntakeOn()
else:
   turnIntakeOff()

Une demande courante consiste à activer et désactiver quelque chose en appuyant sur un bouton. Les bascules doivent être utilisées avec prudence, car elles obligent l’utilisateur à suivre l’état du robot.

boolean toggle = false;

if (joystick.getRawButtonPressed(0)) {
   if (toggle) {
      // Current state is true so turn off
      retractIntake();
      toggle = false;
   } else {
      // Current state is false so turn on
      deployIntake();
      toggle = true;
   }
}
bool toggle{false};

if (joystick.GetRawButtonPressed(0)) {
   if (toggle) {
      // Current state is true so turn off
      retractIntake();
      toggle = false;
   } else {
      // Current state is false so turn on
      deployIntake();
      toggle = true;
   }
}
toggle = False

if joystick.getRawButtonPressed(0):
   if toggle:
      # current state is True so turn off
      retractIntake()
      toggle = False
   else:
      # Current state is False so turn on
      deployIntake()
      toggle = True