Dönme Hızı Sınırlayıcı

FRC ® içindeki filtreler için yaygın bir kullanım kontrol girişlerinin davranışını yumuşatmak içindir (örneğin, sürücü kontrollerinizden joystick girişleri). Ne yazık ki, basit bir alçak geçiren filtre bu iş için pek uygun değildir; Düşük geçişli bir filtre, bir giriş akışının ani değişikliklere tepkisini yumuşatırken, aynı zamanda ince kontrol detayını temizler ve faz gecikmesine neden olur. Daha iyi bir çözüm, doğrudan kontrol girişinin değişim oranını sınırlamaktır. Bu, bir slew rate limiter-dönüş hızı sınırlayıcı - sinyalin maksimum değişim hızını sınırlayan bir filtre ile gerçekleştirilir.

WPILibWPILibBir dönüş hızı sınırlayıcı, bir tür ilkel hareket profili olarak düşünülebilir. Aslında, dönüş hızı sınırlayıcı, WPILib tarafından desteklenen: Trapezoidal Motion Profile ın birinci dereceden eşdeğeridir - ivme kısıtlamasının sonsuza eğilimli olmasına izin verildiğinde, tam da yamuk hareketin sınırlayıcı durumudur. Buna göre, dönüş hızı sınırlayıcı, bir hız ayar noktası akımına (veya genellikle hız ile yaklaşık olarak orantılı olan voltajlara) fiili bir hareket profili uygulamak için iyi bir seçimdir. Konumları kontrol eden giriş akışları için uygun bir trapezoidal profil kullanmak genellikle daha iyidir.

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

Bir SlewRate Limiter oluşturma

Not

C ++ `` SlewRateLimiter ‘’ sınıfı, girdinin birim türüne göre şablonlanır. C ++ birimleri hakkında daha fazla bilgi için bkz: ref: docs / software / basic-programlama / cpp-units: C ++ Units Library.

Not

Filtrelerin “belleği” olduğundan, her giriş akışı kendi filtre nesnesini gerektirir. Birden çok giriş akışı için aynı filtre nesnesini kullanmaya çalışmayın.

Bir SlewRateLimiter oluşturmak basittir:

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

Bir SlewRateLimiter’ ı kullanma

Filtreniz oluşturulduktan sonra kullanımı kolaydır - filtrelenmiş çıktıyı elde etmek için en son girdiyle `` hesapla ()`` yöntemini çağırmanız yeterlidir:

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

Using a SlewRateLimiter with DifferentialDrive

Not

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

A typical use of a SlewRateLimiter is to limit the acceleration of a robot’s drive. This can be especially handy for robots that are very top-heavy, or that have very powerful drives. To do this, apply a SlewRateLimiter to a value passed into your robot drive function:

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