Subsistemas simples

Importante

Esta documentación describe el uso de la biblioteca heredada 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.

Los subsistemas son las partes de su robot que se controlan de forma independiente, como colectores, tiradores, bases de accionamiento, elevadores, brazos, muñecas, pinzas, etc. Cada subsistema se codifica como una instancia de la clase Subsistema. Los subsistemas deben tener métodos que definan el funcionamiento de los actuadores y sensores, pero no un comportamiento más complejo que ocurre con el tiempo.

Crear un subsistema

import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj.Victor;
import edu.wpi.first.wpilibj.command.Subsystem;

/**
 * The claw subsystem is a simple system with a motor for opening and closing.
 * If using stronger motors, you should probably use a sensor so that the motors
 * don't stall.
 */
public class Claw extends Subsystem {
  private final Victor m_motor = new Victor(7);
  private final DigitalInput m_contact = new DigitalInput(5);

  /**
   * Create a new claw subsystem.
   */
  public Claw() {
    super();
  }

  @Override
  public void initDefaultCommand() {
  }

  /**
   * Set the claw motor to move in the open direction.
   */
  public void open() {
    m_motor.set(-1);
  }

  /**
   * Set the claw motor to move in the close direction.
   */
  @Override
  public void close() {
    m_motor.set(1);
  }

  /**
   * Stops the claw motor from moving.
   */
  public void stop() {
    m_motor.set(0);
  }

  /**
   * Return true when the robot is grabbing an object hard enough to trigger
   * the limit switch.
   */
  public boolean isGrabbing() {
    return m_contact.get();
  }
}

Este es un ejemplo de un subsistema bastante sencillo que opera una garra en un robot. El mecanismo de garra tiene un solo motor para abrir o cerrar la garra y no tiene sensores (no necesariamente una buena idea en la práctica, pero funciona para el ejemplo). La idea es que la apertura y cierre las operaciones son simplemente cronometradas. Hay tres métodos, open(), close() y stop() que operan el motor de la garra. Observe que no hay un código específico que realmente verifique si la garra está abierta o cerrado El método abierto hace que la garra se mueva en la dirección de apertura y el método de cierre hace que la garra se mueva en la dirección cerrada. Use un comando para controlar el tiempo de esta operación para asegurarse de que la garra se abre y se cierra durante un período de tiempo específico.

Operar la garra con un comando

package org.usfirst.frc.team1.robot.commands;

import edu.wpi.first.wpilibj.command.Command;
import org.usfirst.frc.team1.robot.Robot;

public class OpenClaw extends Command {

   public OpenClaw() {
       requires(Robot.claw);
       setTimeout(.9);
   }

   protected void initialize() {
      Robot.claw.open()
   }

   protected void execute() {
   }

   protected boolean isFinished() {
       return isTimedOut();
   }

   protected void end() {
      Robot.claw.stop();
   }

   protected void interrupted() {
      end();
   }
}

Los comandos proveen el tiempo y sincronización de las operaciones de los subsistemas. Cada comando haría una operación diferente con los subsistemas, la garra en este caso. Los comandos proveerían el tiempo para abrirla o cerrarla. Aquí se muestra un ejemplo de un comando simple que controla abrir la garra. Note que un timeout se asigna a este comando (0.9 segundos) para abrir la garra y revisar el tiempo en el método isFinished(). Puede encontrar más detalles en el artículo using commands.