Test et réglage des boucles 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. Lecture des valeurs du capteur pour déterminer la distance du robot ou du mécanisme par rapport à la valeur cible souhaitée. La cible est la valeur du capteur qui correspond à l’objectif attendu. Par exemple, un bras de robot avec un joint articulé similaire à un poignet, défini ci-dessous comme « poignet » pour alléger le texte, devrait pouvoir se déplacer très rapidement selon un angle spécifié et s’arrêter à cet angle, comme indiqué par un capteur. Un potentiomètre est un capteur qui peut mesurer l’angle de rotation. En le connectant à une entrée analogique, le programme peut obtenir une mesure de tension directement proportionnelle à l’angle.

  2. Calcul de l’écart (la différence entre la valeur du capteur et la valeur souhaitée). Le signe de la valeur de l’écart indique de quel côté de la valeur cible le poignet se trouve. Par exemple, des valeurs négatives peuvent indiquer que l’angle de poignet mesuré est supérieur à l’angle de poignet souhaité. L’ampleur de l’écart est la différence entre l’angle du poignet mesuré et l’angle réel du poignet. Si l’écart est nul, l’angle mesuré correspond exactement à l’angle souhaité. L’écart peut être utilisé comme entrée de l’algorithme PID pour calculer la vitesse d’un moteur.

  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 a une classe PIDController qui supporte l’algorithme PID et accepte des constantes correspondant aux valeurs Kp, Ki et Kd. L’algorithme PID a trois composants qui contribuent au calcul de la vitesse du moteur à partir de l’écart.

  1. P (proportionnel) - c’est un terme qui, multiplié par une constante (Kp), générera une vitesse du moteur qui aidera à déplacer le moteur dans la bonne direction et à la bonne vitesse.

  2. I (intégrale) - ce terme est la somme des écarts successifs. Plus l’écart persiste, plus la contribution intégrale sera importante. Il s’agit simplement de la somme de tous les écarts dans le temps. Si le poignet n’atteint pas tout à fait la valeur cible en raison d’une grande charge qu’il essaie de déplacer, le terme intégral continuera d’augmenter (somme des écarts) jusqu’à ce qu’il contribue suffisamment à la vitesse du moteur pour le faire passer au point cible. La somme des écarts est multipliée par une constante (Ki) pour mettre à l’échelle le terme intégral du système.

  3. D (différentiel) - cette valeur est le taux de variation des écarts. Elle est utilisée pour ralentir la vitesse du moteur s’il se déplace trop vite. Elle est calculée en prenant la différence entre la valeur d’écart actuelle et la valeur d’écart précédente. Elle est également multipliée par une constante (Kd) pour la mettre à l’échelle afin qu’elle corresponde au reste du système.

Réglage du contrôleur 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).

Couvre chaque section du widget Sous-système PIDController.

Il s’agit de l’image du mode Test d’un sous-système baptisé wrist qui représente un poignet articulé et qui a un potentiomètre comme capteur (pot) et un contrôleur de moteur connecté au moteur. Il a un certain nombre de champs qui correspondent au PIDSubsystem.

  1. La valeur de la tension d’entrée analogique du potentiomètre. Il s’agit de la valeur d’entrée du capteur.

  2. Un curseur qui déplace le moteur du poignet dans les deux sens avec 0 à l’arrêt. Les valeurs positives et négatives correspondent à un déplacement vers le haut et vers le bas.

  3. Les constantes PID telles que décrites ci-dessus (F est une valeur à action directe utilisée pour les boucles PID de vitesse)

  4. La valeur cible qui correspond à la valeur du pot lorsque le poignet a atteint la valeur souhaitée

  5. Active le contrôleur PID - Ne fonctionne plus, voir ci-dessous.

Essayez différents gains PID pour obtenir les performances moteur souhaitées. Vous pouvez regarder la vidéo liée au début de cet article ou d’autres sources sur Internet pour obtenir les performances souhaitées.

Important

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.

Activer la fonctionnalité dans le nouveau PIDController

L’exemple suivant montre comment créer un bouton sur votre tableau de bord qui activera / désactivera le PIDController.

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))