Crear grupos de comandos

Importante

Esta documentación describe el uso de la biblioteca dejada basada en comandos. Si bien esta documentación se ha conservado para ayudar a los equipos que aún no lo han hecho, se recomienda encarecidamente a los equipos que migren a la nueva biblioteca basada en comandos.

Nota

Una vez que haya creado comandos para operar los mecanismos en su robot, se pueden agrupar para obtener operaciones más complejas. Estas agrupaciones de comandos se denominan CommandGroups y se definen fácilmente como se muestra en este artículo.

Operaciones complejas

public class PlaceSoda extends CommandGroup {

    public PlaceSoda() {
       addSequential(new SetElevatorSetpoint(Elevator.TABLE_HEIGHT));
       addSequential(new SetWristSetpoint(Wrist.PICKUP));
       addSequential(new OpenClaw());
    }
}

Este es un ejemplo de un grupo de comandos que coloca una lata de refresco en una mesa. Para lograr esto, (1) el elevador del robot debe moverse a TABLE_HEIGHT, luego (2) establecer el ángulo de la muñeca, luego (3) abrir la garra. Todas estas tareas deben ejecutarse secuencialmente para asegurarse de que la lata de refresco no se caiga. El método addSequential() toma un comando (o un grupo de comandos) como parámetro y los ejecutará uno tras otro cuando este comando esté programado.

Ejecución de comandos en paralelo

public class PrepareToGrab extends CommandGroup {

    public PrepareToGrab() {
       addParallel(new SetWristSetpoint(Wrist.PICKUP));
       addParallel(new SetElevatorSetpoint(Elevator.BOTTOM));
       addParallel(new OpenClaw());
    }
}

Para que el programa sea más eficiente, a menudo es deseable ejecutar múltiples comandos al mismo tiempo. En este ejemplo, el robot se está preparando para agarrar una lata de refresco. Dado que el robot no sostiene nada, todas las articulaciones pueden moverse al mismo tiempo sin preocuparse por dejar caer nada. Aquí todos los comandos se ejecutan en paralelo, por lo que todos los motores funcionan al mismo tiempo y cada uno se completa cada vez que se llama al método isFinished(). Los comandos pueden completarse fuera de servicio. Los pasos son: (1) mover la muñeca al punto de ajuste de la recolección, luego (2) mover el elevador a la posición de recolección del piso y (3) abrir la garra

Mezclando comandos paralelos y secuenciales

public class Grab extends CommandGroup {

    public Grab() {
       addSequential(new CloseClaw());
       addParallel(new SetElevatorSetpoint(Elevator.STOW));
       addSequential(new SetWristSetpoint(Wrist.STOW));
    }
}

A menudo hay algunas partes de un grupo de comandos que deben completarse antes de que se ejecuten otras partes. En este ejemplo, se agarra una lata de refresco, luego el elevador y la muñeca se pueden mover a sus posiciones guardadas. En este caso, la muñeca y el elevador tienen que esperar hasta que agarren la lata, luego pueden operar de forma independiente. El primer comando (1) CloseClaw toma el refresco y nada más se ejecuta hasta que se termina, ya que es secuencial, luego el (2) elevador y (3) la muñeca se mueven al mismo tiempo.