Feedforward - ileribesleme ve PID Kontrolünü Birleştirme

Not

Bu makale, WPILib’in sağladığı kütüphane sınıfları ile birlikte feedforward/PID kontrolünün kod içi uygulamasını kapsar. İlgili kavramları daha ayrıntılı olarak açıklayan belgeler yakında çıkacaktır.

Feedforward ve geri bildirim denetleyicilerinin her biri ayrı ayrı kullanılabilir, ancak birlikte kullanıldığında en etkilidir. Neyse ki, bu iki kontrol yöntemini birleştirmek son derece basittir - basitçe çıktılarını bir araya getirir.

Feedforward’ı bir PIDController ile kullanma

Eski PIDController sınıfına aşina olan kullanıcılar, yeni denetleyicide herhangi bir feedforward kazancının eksikliğini fark edebilir. Kullanıcıların kontrolör çıkışını kendilerinin kullanması beklendiğinden, feedforward’ ı uygulamak için artık PIDController e ihtiyaç yoktur - kullanıcılar, kontrolör çıkışına istedikleri herhangi bir feedforward’ ı motorlarına göndermeden önce ekleyebilirler:

// Adds a feedforward to the loop output before sending it to the motor
motor.setVoltage(pid.calculate(encoder.getDistance(), setpoint) + feedforward);

Dahası, ileri besleme, tamamen geri bildirimden ayrı bir özelliktir ve bu nedenle, endişelerin ayrılmasını ihlal ettiği için aynı denetleyici nesnesinde ele alınması için bir neden yoktur. WPILib, ortak FRC ® için doğru ileri besleme voltajlarını hesaplamak üzere birkaç yardımcı sınıfla birlikte gelir. mekanizmalar - daha fazla bilgi için bkz : ref: docs / software / advanced-controls / controller / feedforward: Feedforward Control in WPILib.

PID ile Feedforward Bileşenlerini Kullanma

Not

Since feedforward voltages are physically meaningful, it is best to use the setVoltage() (Java, C++) method when applying them to motors to compensate for “voltage sag” from the battery.

Feedforward / PID kontrolünün daha eksiksiz bir örneği neye benzeyebilir? Feedforward sayfasından sürüş örneği dikkate alınız. Geri bildirim kontrolünü dahil etmek için bunu kolayca değiştirebiliriz ( SimpleMotorFeedforward bileşeni ile)

public void tankDriveWithFeedforwardPID(double leftVelocitySetpoint, double rightVelocitySetpoint) {
  leftMotor.setVoltage(feedforward.calculate(leftVelocitySetpoint)
      + leftPID.calculate(leftEncoder.getRate(), leftVelocitySetpoint));
  rightMotor.setVoltage(feedForward.calculate(rightVelocitySetpoint)
      + rightPID.calculate(rightEncoder.getRate(), rightVelocitySetpoint));
}

Diğer mekanizma türleri de benzer şekilde ele alınabilir.