Probar y sintonizar ciclos PID

Uno de los retos que se encuentran al utilizar sensores para controlar mecanismos es tener un buen algoritmo para manejar apropiadamente la velocidad y dirección de los motores. El algoritmo más utilizado se llama control PID. Existe una gran cantidad de videos (busca la lista de reproducción sobre controles para el robot) que explican los algoritmos de control descritos aquí. El algoritmo PID convierte los valores de los sensores en velocidad para el motor de la siguiente manera:

  1. Al leer los valores del sensor se determina la distancia entre el robot o el mecanismo y el punto de control deseado. El punto de control es el valor del sensor que corresponde con el objetivo. Por ejemplo, un brazo robótico con una articulación tipo muñeca debería moverse a un ángulo específico rápidamente y detenerse cuando el sensor indica dicho ángulo. Un potenciómetro es un sensor que puede medir el ángulo rotacional. Al conectarlo a una entrada análoga, el programa puede determinar un voltaje que sea directamente proporcional al ángulo.

  2. Al calcular un error (la diferencia entre los valores del sensor y los esperados). La señal de error en los valores indica en qué lado del punto de control se encuentra la muñeca. Por ejemplo, valores negativos pueden indicar que el ángulo medido es mayor al deseado. La magnitud del error determina la distancia entre el valor actual y el valor esperado del ángulo de la muñeca. Si el error es cero, esto quiere decir que el valor medido es exactamente igual al valor esperado. El error puede utilizarse como un dato de entrada para que el algoritmo PID calcule la velocidad del motor.

  3. La velocidad resultante del motor es utilizada después para conducir al robot en la dirección correcta a una velocidad que alcanzará el punto de control rápidamente sin excederse (moviéndose más allá del punto de control).

WPILib cuenta con una clase PIDController que implementa el algoritmo PID y acepta constantes que corresponden a los valores Kp, Ki y Kd. El algoritmo PID tiene tres componentes que contribuyen al cálculo de la velocidad del motor a través del error.

  1. P (proporcional) – Es el término que, al multiplicarse por una constante (Kp) generará una velocidad del motor que ayudará a mover al motor en la dirección correcta con la velocidad adecuada.

  2. I (integral) - Es el término de la suma de errores sucesivos. Mientras más tiempo exista el error más grande será la contribución integral. Simplemente es una suma de todos los errores a través del tiempo. Si la muñeca no se acerca lo suficiente al punto de control debido a la gran carga que intenta mover, el término integral continuará aumentando (suma de errores) hasta que contribuya lo suficiente para que la velocidad del motor pueda alcanzar el punto de control. La suma de los errores se multiplica por una constante (Ki) para escalar el término integral para el sistema

  3. D (diferencial) – Este valor es la tasa de cambio de los errores. Se utiliza para alentar la velocidad del motor cuando se mueve demasiado rápido. Se calcula de la diferencia entre el valor actual de error y el valor del error anterior. También se multiplica por una constante (Kd) para escalarlo y homologarlo con el resto del sistema.

Sintonizar el controlador PID

Sintonizar el controlador PID consiste en elegir valores constantes que aseguren un buen funcionamiento. Shuffleboard contribuye a este proceso al mostrar los detalles del subsistema PID a través de una interfaz de usuario para configurar los valores constantes y probar si operan adecuadamente. Esto se visualiza mientras el robot está operando en el modo de prueba (se configura habilitando “Test” en la driver station).

Covers each section of the PIDController Subsystem widget.

Esta es la imagen del modo de prueba de un subsistema de muñeca que tiene un potenciómetro como sensor (pot) y un controlador de motor conectado al motor. Tiene una serie de áreas que corresponden al PIDSubsystem.

  1. El valor de la entrada análoga del voltaje del potenciómetro. Este es el valor de entrada del sensor.

  2. Un intensificador que mueve el motor de la muñeca del brazo en cualquier dirección, con 0 como detenido. Los valores positivos y negativos corresponden a arriba o abajo.

  3. Las constantes PID descritas arriba (F es para un valor preliminar que se utiliza en los lazos PID).

  4. El punto de control que corresponde al valor de pot cuando la muñeca ha alcanzado el valor esperado.

  5. Habilita el controlador PID - Ya no funciona, vea abajo.

Pruebe varias varias veces el controlador PID para obtener el rendimiento de motor deseado. Puede mirar el vídeo enlazado al principio de este artículo o en otras fuentes de Internet para obtener el rendimiento deseado.

Importante

La opción de activación no afecta al PIDController introducido en 2020, ya que el controlador se actualiza en cada bucle del robot. Vea el ejemplo a continuación sobre cómo conservar esta funcionalidad.

Habilitar la Funcionalidad en el Nuevo Controlador PID

El siguiente ejemplo demuestra cómo crear un botón en la dashboard que habilite/deshabilite el controlador PID.

ShuffleboardTab tab = Shuffleboard.getTab("Shooter");
NetworkTableEntry shooterEnable = tab.add("Shooter Enable", false).getEntry();

// Command Example assumed to be in a PIDSubsystem
new NetworkButton(shooterEnable).whenPressed(new InstantCommand(m_shooter::enable));

// Timed Robot Example
if (shooterEnable.getBoolean()) {
  // Calculates the output of the PID algorithm based on the sensor reading
  // and sends it to a motor
  motor.set(pid.calculate(encoder.getDistance(), setpoint));
}