Conduire le robot avec le mode Tank Drive et Joysticks

Un cas d’utilisation courant est d’avoir un joystick qui devrait entraîner certains dispositifs actionneurs qui font partie d’un sous-système. Le problème est que le joystick est créé dans la classe OI et que les moteurs à contrôler sont dans le sous-système. L’idée est de créer une commande qui, lorsqu’elle est planifiée, lit les entrées du joystick et appelle une méthode créée sur le sous-système qui entraîne les moteurs.

Dans cet exemple, un sous-système de base d’entraînement est montré qui fonctionne en entraînement de réservoir à l’aide d’une paire de joysticks.

Créer un sous-système d’entraînement

../../../../../_images/driving-with-joysticks-subsystem.png

Créez un sous-système appelé Drive Train. Sa responsabilité sera de gérer la conduite de la base de robots.

../../../../../_images/driving-with-joysticks-differential-drive.png

À l’intérieur du Drive Train créer un objet Differential Drive pour un entraînement à deux moteurs. Il y a un moteur gauche et un moteur droit dans le cadre de la classe Differential Drive.

../../../../../_images/driving-with-joysticks-speed-controller-group.png

Puisque nous voulons utiliser plus de deux moteurs pour conduire le robot, à l’intérieur de l’objet Differential Drive, créer deux groupes de contrôleurs de vitesse ou Speed Controller Groups. Ceux-ci regrouperont plusieurs contrôleurs de vitesse afin qu’ils puissent être utilisés avec l’objet Differential Drive.

../../../../../_images/driving-with-joysticks-speed-controller.png

Enfin, créez deux objets Speed Controllers créez dans chaque objet Speed Controller Group.

Ajouter les joysticks à l’interface opérateur

../../../../../_images/driving-with-joysticks-joysticks.png

Ajoutez deux joysticks à l’interface opérateur, l’un est le joystick gauche et l’autre est le joystick droit. L’axe des y sur les deux joysticks est utilisé pour contrôler les moteurs gauche et droit du robot, respectivement.

Note

Assurez-vous d’exporter votre programme en C++ ou Java avant de passer à l’étape suivante.

Créer une méthode pour écrire aux moteurs dans le sous-système

public class Drivetrain extends SubsystemBase {

    // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
private PWMVictorSPX left1;
private PWMVictorSPX left2;
private SpeedControllerGroup leftMotor;
private PWMVictorSPX right1;
private PWMVictorSPX right2;
private SpeedControllerGroup rightMotor;
private DifferentialDrive drive;

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS

    public Drivetrain() {
        // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
left1 = new PWMVictorSPX(0);
 addChild("left1",left1);
 left1.setInverted(false);

left2 = new PWMVictorSPX(1);
 addChild("left2",left2);
 left2.setInverted(false);

SpeedControllerGroup leftMotor = new SpeedControllerGroup(left1, left2  );
 addChild("Left Motor",leftMotor);


right1 = new PWMVictorSPX(5);
 addChild("right1",right1);
 right1.setInverted(false);

right2 = new PWMVictorSPX(6);
 addChild("right2",right2);
 right2.setInverted(false);

SpeedControllerGroup rightMotor = new SpeedControllerGroup(right1, right2  );
 addChild("Right Motor",rightMotor);


drive = new DifferentialDrive(leftMotor, left1);
 addChild("Drive",drive);
 drive.setSafetyEnabled(true);
drive.setExpiration(0.1);
drive.setMaxOutput(1.0);

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
    }

    // Put methods for controlling this subsystem
    // here. Call these from Commands.

    public void drive(double left, double right) {
        drive.tankDrive(left, right);
    }
}

Créez une méthode qui prend les entrées des deux joysticks. Les valeurs sont transmises à l’objet RobotDrive qui à son tour, se charge de diriger le robot en mode Tank à l’aide des valeurs du joystick. Créez également une méthode que vous appelerez stop(), qui empêchera le robot de bouger, cela sera utile ultérieurement.

Note

Certaines sorties du RobotBuilder ont été supprimées dans cet exemple pour plus de clarté

Lire les valeurs des joysticks et appeler les méthodes du sous-système

../../../../../_images/driving-with-joysticks-command.png

Créez une commande, dans ce cas appelée Tank Drive. Son but sera de lire une valeur de joystick et de la renvoyer au sous-système « Drive Base ». Notez que cette commande nécessite le sous-système « Drive Train ». Ce qui fera en sorte que cette commande cessera de fonctionner chaque fois que quelque chose d’autre tentera d’utiliser le « Drive Train »

Note

Assurez-vous d’exporter votre programme en C++ ou Java avant de passer à l’étape suivante.

Ajoutez le code pour conduite le robot

public class TankDrive extends CommandBase {

    // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_DECLARATIONS
        private final Drivetrain m_drivetrain;

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_DECLARATIONS

    private Joystick leftJoystick = RobotContainer.getInstance().getJoystick1();
    private Joystick rightJoystick = RobotContainer.getInstance().getJoystick2();

    // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS


    public TankDrive(Drivetrain subsystem) {


    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTRUCTORS
        // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_SETTING

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=VARIABLE_SETTING
        // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=REQUIRES

        m_drivetrain = subsystem;
        addRequirements(m_drivetrain);

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=REQUIRES
    }

    // Called when the command is initially scheduled.
    @Override
    public void initialize() {
    }

    // Called every time the scheduler runs while the command is scheduled.
    @Override
    public void execute() {
        m_drivetrain.drive(leftJoystick.getY(), rightJoystick.getY());
    }

    // Called once the command ends or is interrupted.
    @Override
    public void end(boolean interrupted) {
        m_drivetrain.drive(0.0, 0.0);
    }

    // Returns true when the command should end.
    @Override
    public boolean isFinished() {
        return false;
    }

    @Override
    public boolean runsWhenDisabled() {
        // BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DISABLED
        return false;

    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DISABLED
    }
}

Ajoutez du code à la méthode d’exécution pour effectuer la conduite réelle. Il suffit d’obtenir les objets Joystick pour les joysticks gauche et droit et de les transmettre au sous-système « Drive Train ». Le sous-système les utilise uniquement pour ce type de conduite sur objet RobotDrive. Et nous obtenons une conduite en mode Tank.

Nous avons également rempli la méthodes end() afin que lorsque cette commande est interrompue ou arrêtée, les moteurs soient arrêtés par mesure de sécurité.

Créer une commande par défaut

../../../../../_images/driving-with-joysticks-default-command.png

La dernière étape consiste à faire de la commande Tank Drive la « commande par défaut » du sous-système « Drive Train ». Cela signifie que les joysticks seront en contrôle tout le temps de la conduite, sauf lorsqu’une autre commande va utiliser « Drive Train ». C’est probablement le comportement souhaitable. Lorsque le code du mode autonome est en cours d’exécution, il nécessitera également « Drive Train » et interrompra la commande Tank Drive. Une fois le code autonome terminé, la commande Tank Drive redémarrera automatiquement (car il s’agit de la commande par défaut) et les opérateurs reprendront le contrôle. Si vous écrivez un code qui effectue une conduite automatisée (en se servant de capteurs, par exemple), ces commandes nécessitent également le DriveTrain et elles aussi vont interrompre la commande Tank Drive pour et prendre le contrôle du déplacement.

Note

Assurez-vous d’exporter votre programme en C++ ou Java avant de continuer.