Probar y sintonizar ciclos PID

One challenge in using sensors to control mechanisms is to have a good algorithm to drive the motors to the proper position or speed. The most commonly used control algorithm is called PID control. There is a good set of videos (look for the robot controls playlist) that explain the control algorithms described here. The PID algorithm converts sensor values into motor speeds by:

  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. The resultant motor speed is then used to drive the motor in the correct direction and a speed that hopefully will reach the setpoint as quickly as possible without overshooting (moving past the setpoint).

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

Tuning the PID controller consists of adjusting constants for accurate results. Shuffleboard helps this process by displaying the details of a PID subsystem with a user interface for setting constant values and testing how well it operates. This is displayed while the robot is operating in test mode (done by setting «Test» in the 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

The enable option does not affect the PIDController introduced in 2020, as the controller is updated every robot loop. See the example below on how to retain this functionality.

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");
GenericEntry shooterEnable = tab.add("Shooter Enable", false).getEntry();

// Command Example assumed to be in a PIDSubsystem
new NetworkButton(shooterEnable).onTrue(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));
}
frc::ShuffleboardTab& tab = frc::Shuffleboard::GetTab("Shooter");
nt::GenericEntry& shooterEnable = *tab.Add("Shooter Enable", false).GetEntry();

// Command-based assumed to be in a PIDSubsystem
frc2::NetworkButton(shooterEnable).OnTrue(frc2::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));
}
from wpilib.shuffleboard import Shuffleboard

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

# Command Example assumed to be in a PIDSubsystem
NetworkButton(shooterEnable).onTrue(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))