Commande Tout ou Rien en abrégé TOR avec contrôleur BangBang

La commande « Bang-bang » ou « Tout ou rien » est une stratégie de contrôle qui n’utilise que deux états: activé (lorsque la mesure est inférieure au point de consigne) et désactivé (dans le cas contraire). Ceci est à peu près équivalent à une boucle proportionnelle avec un gain infini.

Cette approche peut sembler au départ être une mauvaise stratégie de contrôle, car les boucles PID ont la réputation de devenir instables à mesure que les gains deviennent importants - et en effet, c’est une très mauvaise idée d’utiliser un contrôleur bang-bang sur tout système autre que le contrôle de la vitesse d’un mécanisme à haute inertie.

Cependant, lors du contrôle de la vitesse des mécanismes à haute inertie sous des charges variables (comme le volant d’inertie d’un tireur), un contrôleur bang-bang peut offrir un temps de récupération plus rapide et donc de meilleures performances/plus cohérentes qu’un contrôleur proportionnel. Contrairement à une boucle P ordinaire, un contrôleur bang-bang est asymétrique - c’est-à-dire que le contrôleur est activé lorsque la variable du procédé est en dessous du point de consigne et ne fait rien d’autre. Cela permet de rendre l’effort du contrôle anticipé aussi important que possible sans risque de produire des oscillations destructrices lorsque la boucle de contrôle tenterait de corriger un dépassement résultant.

Asymmetric bang-bang control is provided in WPILib by the BangBangController class (Java, C++, Python).

Construction d’un objet BangBangController

Étant donné qu’un contrôleur bang-bang n’a aucun gain, il n’a pas besoin de constructeur avec argument (on peut éventuellement spécifier la tolérance du contrôleur utilisé par le paramètre atSetpoint, mais ce n’est pas obligatoire).

// Creates a BangBangController
BangBangController controller = new BangBangController();
// Creates a BangBangController
frc::BangBangController controller;
from wpimath.controller import BangBangController

# Creates a BangBangController
controller = BangBangController()

Utilisation d’un objet BangBangController

Avertissement

La commande Bang-bang utilise un algorithme extrêmement agressif qui repose sur l’asymétrie de réponse pour assurer la stabilité du système. Assurez-vous que vos contrôleurs de moteurs ont été configurés en « coast mode » avant d’essayer de les commander avec un contrôleur bang-bang, sinon le freinage résultant du mode « break » combattra le contrôleur et provoquera une oscillation potentiellement destructrice pour le système.

L’utilisation d’un contrôleur bang-bang est facile:

// Controls a motor with the output of the BangBang controller
motor.set(controller.calculate(encoder.getRate(), setpoint));
// Controls a motor with the output of the BangBang controller
motor.Set(controller.Calculate(encoder.GetRate(), setpoint));
# Controls a motor with the output of the BangBang controller
motor.set(controller.calculate(encoder.getRate(), setpoint))

Combinaison de la commande Bang Bang et de la commande par anticipation

Comme dans le cas d’un commande PID, les meilleurs résultats sont obtenus en conjonction avec une commande prédictive qui fournit la tension nécessaire pour maintenir la sortie du système à la vitesse souhaitée, de sorte que le contrôleur bang-bang n’est responsable que de l’élimination des perturbations. Étant donné que le contrôleur bang-bang ne peut que corriger dans la commande prédictive, il serait sûrement préférable d’utiliser une estimation légèrement conservatrice de la commande prédictive pour s’assurer que le tireur ne dépasse pas la vitesse souhaitée.

// Controls a motor with the output of the BangBang controller and a feedforward
// Shrinks the feedforward slightly to avoid overspeeding the shooter
motor.setVoltage(controller.calculate(encoder.getRate(), setpoint) * 12.0 + 0.9 * feedforward.calculate(setpoint));
// Controls a motor with the output of the BangBang controller and a feedforward
// Shrinks the feedforward slightly to avoid overspeeding the shooter
motor.SetVoltage(controller.Calculate(encoder.GetRate(), setpoint) * 12.0 + 0.9 * feedforward.Calculate(setpoint));
# Controls a motor with the output of the BangBang controller and a feedforward
motor.setVoltage(controller.calculate(encoder.getRate(), setpoint) * 12.0 + 0.9 * feedforward.calculate(setpoint))