Utilisation des classes WPILib pour piloter votre robot

WPILib comprend de nombreuses classes pour faciliter le développement de la programmation et obtenir un robot fonctionnel plus rapidement.

Transmissions standard

Robots à entraînement différentiel

The wiring of a simple differential drive robot.

Ces bases d’entraînement ont généralement deux ou plusieurs roues motrices en ligne ou omnidirectionnelles par côté (par exemple, 6WD ou 8WD) et peuvent également être appelées « skid-steer », « tank drive » ou « West Coast Drive ». La transmission du Kit de pièces est un exemple d’entraînement différentiel. Ces transmissions sont capables de faire avancer ou reculer le robot et peuvent le faire tourner en activant les moteurs de chaque côté dans des directions opposées, ce qui fait déraper les roues latéralement. Ces transmissions ne sont pas capables d’exécuter des mouvements de translation latéraux.

Entraînement de type Mécanum

A four wheel Mecanum robot using the KOP chassis.

L’entraînement Mécanum est une méthode de conduite utilisant des roues spécialement conçues qui permettent au robot de conduire dans n’importe quelle direction sans changer l’orientation du robot. Un robot avec une transmission conventionnelle (toutes les roues pointant dans la même direction) doit tourner dans la direction qu’il doit conduire. Un robot Mécanum peut se déplacer dans n’importe quelle direction sans avoir à tourner au préalable et est appelé un entraînement holonomique. Les roues (montrées sur ce robot) ont des rouleaux qui font que les forces de la conduite sont appliquées à un angle de 45 degrés plutôt que droit comme dans le cas d’un entraînement conventionnel.

Lorsqu’ils sont vus du haut, les rouleaux d’une transmission Mécanum doivent former un motif en “X”. Il en résulte que les vecteurs de force (lors de la conduite de la roue vers l’avant) sur les deux roues avant pointent vers l’avant et vers l’intérieur et les deux roues arrière pointent vers l’avant et vers l’extérieur. En faisant tourner les roues dans différentes directions, divers composants des vecteurs de force s’annulent, entraînant le mouvement souhaité du robot. Un tableau rapide des différents mouvements a été fourni ci-dessous, en traçant les vecteurs de force pour chacun de ces mouvements peut aider à comprendre comment ces transmissions fonctionnent. En faisant varier les vitesses des roues en plus de la direction, les mouvements peuvent être combinés, ce qui entraîne une translation dans n’importe quelle direction et rotation, simultanément.

Conventions utilisées par les classes

Motor Inversion

Par défaut, la classe inverse les signaux allant au moteur du côté droit de la transmission. En règle générale, cela signifie qu’aucune inversion ne doit être effectuée sur les objets SpeedController individuels. Pour désactiver ce comportement, utilisez la méthode setRightSideInverted().

Squaring Inputs

Lors de la conduite de robots, il est souvent souhaitable de manipuler les entrées du joystick de sorte que le robot ait un contrôle plus précis à basse vitesse tout en utilisant toute la plage de sortie disponible. Une façon d’y parvenir est d’élever au carré la valeur absolue de l’entrée du joystick, puis de réappliquer le signe. Par défaut, la classe Differential Drive mettra les entrées au carré. Si cela n’est pas souhaité (par exemple, si vous transmettez des valeurs à partir d’un PIDController), utilisez l’une des méthodes d’entraînement et initialiser le paramètre squaredInputs à False.

Input Deadband

Par défaut, la classe DifferentialDrive applique une zone morte d’entrée de 0.02. Cela signifie que toutes les valeurs d’entrée qui sont inférieures à 0.02 (après la mise au carré décrite ci-dessus) seront plutôt considérées comme ayant une valeur de zéro. Dans la plupart des cas, ces petites valeurs d’entrée résultent d’un centrage imparfait du joystick et ne sont pas suffisantes pour provoquer un mouvement du robot. En appliquant une zone morte, on réduit l’échauffement des moteurs provenant de l’énergie appliquée inutilement aux moteurs, lorsque le robot ne bouge pas. Pour modifier la zone morte, utilisez la méthode setDeadband().

Maximum Output

Parfois, les pilotes ont l’impression que leur transmission roule trop vite et veulent limiter la sortie. Cela peut être accompli avec la méthode setMaxOutput(). Cette sortie maximale est multipliée par le résultat des fonctions d’entraînement précédentes comme deadband et squared inputs.

La sécurité moteur (Motor Safety)

Motor Safety est un mécanisme dans WPILib qui prend le concept d’un chien de garde (Watchdog) et crée une minuterie de sécurité pour chaque dispositif actionneur qui contrôle un moteur. Notez que ce mécanisme de protection s’ajoute au System Watchdog, celui-ci étant contrôlé par le code de communication réseau et le FPGA. Le Watchdog désactivera toutes les sorties du dispositif actionneur s’il ne reçoit pas de paquet de données valides pendant un délai de 125 ms.

Le but du mécanisme Motor Safety est le même que le but d’une minuterie de surveillance, de désactiver les mécanismes qui peuvent s’endommager, poser un danger physique aux personnes ou endommager les biens environnant si le code se verrouille et ne met pas correctement à jour la sortie de l’actionneur. La fonctionnalité Motor Safety ramène ce concept sur une base par actionneur afin que vous puissiez déterminer de façon appropriée le cas où il est nécessaire et le cas où il n’est pas. Des exemples de mécanismes qui devraient être pourvus de la fonctionnalité Motor Safety sont des systèmes comme les trains d’entraînement et les bras. Si ces systèmes sont configurés sur une valeur particulière, ils pourraient causer des dommages à leur environnement immédiat ou à eux-mêmes. Un exemple d’un mécanisme qui peut ne nécessite pas de Motor Safety sécurité est une roue volante pour un tireur. Si ce mécanisme se trouve verrouillé sur une valeur particulière, il continuera simplement à tourner jusqu’à ce que le robot soit désactivé. Par défaut, Motor safety est activé pour les objets RobotDrive, DifferentialDrive, KilloughDrive et MecanumDrive et désactivé pour tous les autres contrôleurs de moteurs et servos.

La fonction Motor Safety d’un actionneur fonctionne en maintenant un timer qui surveille et enregistre le temps qui s’est écoulé depuis que le dernier appel de la méthode feed() pour cet actionneur. Un code dans la classe DriverStation initie une comparaison de ces timers aux valeurs de délai d’attente pour tout actionneur avec la sécurité activé tous les 5 paquets reçus (100ms nominal). Les méthodes set() de chaque classe de contrôleur de moteur et les méthodes set() et setAngle() de la classe servo font un appel à la méthode feed() pour indiquer que la sortie de l’actionneur a été mise à jour.

L’interface Motor Safety des contrôleurs moteurs peut être en interaction avec l’utilisateur par l’intermédiaire des méthodes suivantes :

exampleJaguar.setSafetyEnabled(true);
exampleJaguar.setSafetyEnabled(false);
exampleJaguar.setExpiration(.1);
exampleJaguar.feed()

Par défaut, tous les objets RobotDrive activent Motor Safety. Selon le mécanisme et la structure de votre programme, vous pouvez régler le délai de la minuterie (timeout) de Motor Safety (en secondes). Ce délai est spécifique è chaque dispositif actionneur et par conséquant, n’est pas un paramètre global. La valeur par défaut (et minimale utile) est de 100 ms.

Conventions des axes

Show the axis of the robot with X+ going forward.  Y+ to the right and Z+ downward.

Cette librairie utilise la convention des axes NED (North-East-Down, ou Nord-Est-Bas comme référence). L’axe X positif pointe vers l’avant, l’axe Y positif pointe vers la droite et l’axe Z positif pointe vers le bas. Les rotations suivent la règle de la main droite, donc une rotation dans le sens des aiguilles d’une montre autour de l’axe Z est positive.

Avertissement

Cette convention est différente de la convention pour les joysticks qui ont généralement -Y correspondant à Up (communément mappé à l’accélérateur) et + X comme Right. Portez une attention particulière aux exemples ci-dessous si vous souhaitez obtenir de l’aide avec la correspondance Joystick-> Drive typique.

Utilisation de la classe DifferentialDrive pour contrôler les robots à entraînement différentiel (WCD)

Note

WPILib fournit des classes Robot Drive distinctes pour les configurations de trains d’entraînement les plus courantes (différentiel, Mécanum et Killough). La classe DifferentialDrive gère la configuration de la transmission différentielle. Ces bases d’entraînement ont généralement deux ou plusieurs roues motrices en ligne ou omnidirectionnelles par côté (par exemple, 6WD ou 8WD) et peuvent également être appelées « skid-steer », « tank drive » ou « West Coast Drive ». La transmission du Kit de pièces est un exemple d’entraînement différentiel. Il existe des méthodes pour contrôler l’entrainement avec 3 styles différents (« Tank », « Arcade » ou « Curvature »), expliqués dans l’article ci-dessous.

DifferentialDrive est une méthode fournie pour le contrôle des transmissions « skid-steer » ou « West Coast », comme le châssis du Kit de pièces. L’instanciation d’un DifferentialDrive est aussi simple que cela:

public class Robot {
    Spark m_left = new Spark(1);
    Spark m_right = new Spark(2);
    DifferentialDrive m_drive = new DifferentialDrive(m_left, m_right);

    public void robotInit() {
        m_left.setInverted(true); // if you want to invert motor outputs, you must do so here
    }

Entraînement différentiel multi-moteur avec SpeedControllerGroups

Beaucoup de transmissions en FRC® ont plus de 1 moteur de chaque côté. Afin de les utiliser avec la classe DifferentialDrive, les moteurs de chaque côté doivent être collectés dans un seul objet SpeedController, en utilisant la classe SpeedControllerGroup. Les exemples ci-dessous montrent une transmission à 4 moteurs (2 par côté). Pour s’étendre à plus de moteurs, il suffit de créer les contrôleurs supplémentaires et de les transmettre tous dans le constructeur du groupe SpeedController (il prend un nombre arbitraire d’entrées).

public class Robot {
    Spark m_frontLeft = new Spark(1);
    Spark m_rearLeft = new Spark(2);
    SpeedControllerGroup m_left = new SpeedControllerGroup(m_frontLeft, m_rearLeft);

    Spark m_frontRight = new Spark(3);
    Spark m_rearRight = new Spark(4);
    SpeedControllerGroup m_right = new SpeedControllerGroup(m_frontRight, m_rearRight);
    DifferentialDrive m_drive = new DifferentialDrive(m_left, m_right);

    public void robotInit() {
        m_left.setInverted(true); // if you want to invert the entire side you can do so here
    }

Modes de conduite

Note

La classe DifferentialDrive contient trois différents modes de pilotage (par défaut)

  • Tank Drive, qui contrôle les côtés gauche et droit de façon indépendante

  • Arcade Drive, qui contrôle la vitesse vers l’avant/arrière et le virage

  • Curvature Drive, un sous-ensemble d’Arcade Drive, qui fait que votre robot se comporte comme une voiture avec des virages à courbure constante.

La classe DifferentialDrive contient trois méthodes par défaut pour contrôler les robots de dérapage ou de WCD. Notez que vous pouvez créer vos propres méthodes de contrôle de la conduite du robot et les faire appeler tankDrive() avec les entrées dérivées pour les moteurs gauche et droit.

Le mode Tank Drive est utilisé pour contrôler chaque côté du train d’entraînement de façon indépendante (généralement avec un axe de joystick (manette) individuel contrôlant chacun des côtés). Cet exemple montre comment utiliser l’axe Y de deux joysticks séparés pour un train d’entraînement opéré en mode Tank. La construction des objets a été omise, ci-dessus pour la transmission et ci-dessous pour la construction du joystick.

Le mode Arcade Drive est utilisé pour contrôler le train d’entraînement en utilisant la vitesse/l’accélérateur et le taux de rotation. Ceci est implémenté soit avec les deux axes provenant d’un seul joystick, soit divisé en joysticks (souvent sur une seule manette de jeu) avec l’accélérateur venant d’un joystick et la rotation d’un autre. Cet exemple montre comment utiliser un seul joystick avec le mode Arcade. La construction des objets a été omise, ci-dessus pour la transmission et c-dessous pour la construction du joystick.

Comme Arcade Drive, le mode Curvature Drive est utilisé pour contrôler la transmission en utilisant la vitesse/accélérateur et la vitesse de rotation. La différence est que l’entrée de commande de rotation contrôle le rayon de courbure au lieu du taux de changement de cap, un peu comme le volant d’une voiture. Ce mode prend également en charge la mise en place, qui est activée lorsque le troisième paramètre boolean est à l’état vrai (true).

public void teleopPeriodic() {
    // Tank drive with a given left and right rates
    myDrive.tankDrive(-leftStick.getY(), -rightStick.getY());

    // Arcade drive with a given forward and turn rate
    myDrive.arcadeDrive(-driveStick.getY(), driveStick.getX());

    // Curvature drive with a given forward and turn rate, as well as a quick-turn button
    myDrive.curvatureDrive(-driveStick.getY(), driveStick.getX(), driveStick.getButton(1));
}

Utilisation de la classe MecanumDrive pour contrôler les robots avec trains d’entraînement Mécanum

MecanumDrive est une méthode fournie pour le contrôle des transmissions holonomiques avec roues Mécanum, telles que le châssis du Kit de pièces, augmenté du kit Mécanum, comme illustré ci-dessus. Instancier un MecanumDrive est aussi simple que ceci:

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  public void robotInit() {
    PWMVictorSPX frontLeft = new PWMVictorSPX(kFrontLeftChannel);
    PWMVictorSPX rearLeft = new PWMVictorSPX(kRearLeftChannel);
    PWMVictorSPX frontRight = new PWMVictorSPX(kFrontRightChannel);
    PWMVictorSPX rearRight = new PWMVictorSPX(kRearRightChannel);

    // Invert the left side motors.
    // You may need to change or remove this to match your robot.
    frontLeft.setInverted(true);
    rearLeft.setInverted(true);

    m_robotDrive = new MecanumDrive(frontLeft, rearLeft, frontRight, rearRight);

    m_stick = new Joystick(kJoystickChannel);
  }

Modes d’entraînement Mécanum

Note

Les conventions d’axe d’entraînement sont différentes des conventions d’axe de joystick courantes. Voir les Conventions d’axe ci-dessus pour plus d’informations.

La classe MecanumDrive contient deux différents modes de pilotage (par défaut)

  • driveCartesian: Les angles sont mesurés dans le sens horaire à partir de l’axe X positif. La vitesse du robot est indépendante de son angle ou de sa vitesse de rotation.

  • drivePolar: Les angles sont mesurés dans le sens antihoraire à partir de la ligne droite. La vitesse à laquelle le robot roule (translation) est indépendante de son angle ou de sa vitesse de rotation.

public void teleopPeriodic() {
    m_robotDrive.driveCartesian(m_stick.getX(), -m_stick.getY(), m_stick.getZ());
    m_robotDrive.drivePolar(m_stick.getX(), -m_stick.getY(), m_stick.getZ());
}

Conduite orientée sur le terrain

Un 4ème paramètre peut être fourni à la méthode driveCartesian (double ySpeed, double xSpeed, double zRotation, double gyroAngle), soit l’angle renvoyé par un capteur gyroscopique. Cela ajustera la valeur de rotation fournie. Ceci est particulièrement utile avec le Mécanum car, aux fins de la direction, le robot n’a vraiment ni avant, ni arrière, ni côtés. Il peut aller dans n’importe quelle direction. L’ajout de l’angle en degrés par rapport à un objet gyroscopique entraînera le robot à s’éloigner des pilotes lorsque le joystick est poussé vers l’avant et vers les pilotes lorsqu’il est tiré vers eux, quelle que soit la direction dans laquelle le robot fait face.

L’utilisation de la conduite orientée sur le terrain rend souvent le robot beaucoup plus facile à conduire, en particulier par rapport à un système d’entraînement « orienté robot » où les commandes sont inversées lorsque le robot fait face aux conducteurs.

N’oubliez pas d’obtenir l’angle gyroscopique chaque fois que la méthode driveCartesian() est appelée.

Note

Beaucoup d’équipes aiment aussi augmenter linéairement les entrées des joysticks au fil du temps pour avoir une accélération en douceur et réduire le jerk. Ceci peut être accompli avec un Slew Rate Limiter.