Limiteur de la vitesse de balayage (Slew Rate)

Une utilisation courante pour les filtres en FRC® est d’adoucir le comportement des entrées de contrôle (par exemple, les entrées joystick de vos commandes de pilote). Malheureusement, un simple filtre passe-bas est mal adapté à ce travail; tandis qu’un filtre passe-bas adoucira la réponse d’un flux d’entrée aux changements soudains, il éliminera également les détails pour un contrôle fin et introduira un décalage de phase. Une meilleure solution consiste à limiter directement le taux de changement de l’entrée de contrôle. Ceci est effectué avec un limiteur de la vitesse de balayage - un filtre qui plafonne le taux maximum de changement du signal.

Un limiteur de vitesse de balayage peut être considéré comme une forme primitive de profil de mouvement. En effet, le limiteur de vitesse de balayage est l’équivalent de premier ordre du Profil de mouvement trapézoïdal supporté par WPILib - il est précisément le cas limite du mouvement trapézoïdal lorsque la contrainte d’accélération peut tendre vers l’infini. Par conséquent, le limiteur de vitesse de balayage est un bon choix pour appliquer un profil de mouvement de facto à un flux de données de vitesse (ou voltages, qui s’apparente à la vitesse). Pour les flux d’entrée qui contrôlent les positions, il est généralement préférable d’utiliser un profil trapézoïdal approprié.

Slew rate limiting is supported in WPILib through the SlewRateLimiter class (Java, C++, Python).

Création de SlewRateLimiter

Note

La classe C++ SlewRateLimiter est basée sur le type d’unité de l’entrée. Pour plus d’informations sur les unités C++, voir La librairie d’unités C++.

Note

Étant donné que les filtres ont une «mémoire», chaque flux d’entrée nécessite son propre objet filtre. N’essayez pas d’utiliser le même objet de filtre pour plusieurs flux d’entrée.

La création de SlewRateLimiter est simple:

// Creates a SlewRateLimiter that limits the rate of change of the signal to 0.5 units per second
SlewRateLimiter filter = new SlewRateLimiter(0.5);
// Creates a SlewRateLimiter that limits the rate of change of the signal to 0.5 volts per second
frc::SlewRateLimiter<units::volts> filter{0.5_V / 1_s};
from wpimath.filter import SlewRateLimiter

# Creates a SlewRateLimiter that limits the rate of change of the signal to 0.5 units per second
filter = SlewRateLimiter(0.5)

Utilisation de SlewRateLimiter

Une fois votre filtre créé, son utilisation est simple - il suffit d’appeler la méthode calculate() avec l’entrée la plus récente pour obtenir la sortie filtrée:

// Calculates the next value of the output
filter.calculate(input);
// Calculates the next value of the output
filter.Calculate(input);
# Calculates the next value of the output
filter.calculate(input)

Utilisation de SlewRateLimiter avec la classe DifferentialDrive

Note

The C++ example below templates the filter on units::scalar for use with doubles, since joystick values are typically dimensionless.

Une utilisation typique d’un SlewRateLimiter est de limiter l’accélération de l’entraînement d’un robot. Cela peut être particulièrement pratique pour les robots qui sont très lourds ou qui ont des entraînements très puissants. Pour ce faire, appliquez un SlewRateLimiter à une valeur passée dans votre fonction d’entraînement de robot :

// Ordinary call with no ramping applied
drivetrain.arcadeDrive(forward, turn);

// Slew-rate limits the forward/backward input, limiting forward/backward acceleration
drivetrain.arcadeDrive(filter.calculate(forward), turn);
// Ordinary call with no ramping applied
drivetrain.ArcadeDrive(forward, turn);

// Slew-rate limits the forward/backward input, limiting forward/backward acceleration
drivetrain.ArcadeDrive(filter.Calculate(forward), turn);
# Ordinary call with no ramping applied
drivetrain.arcadeDrive(forward, turn)

# Slew-rate limits the forward/backward input, limiting forward/backward acceleration
drivetrain.arcadeDrive(filter.calculate(forward), turn)