WPILib’de Feedforward Kontrolü

Şimdiye kadar, referans izleme için geri besleme kontrolü kullandık (sistemin çıktısının istenen bir referans sinyalini takip etmesini sağladık). Bu etkili olmakla birlikte, tepki verici bir önlemdir; sistem zaten geride kalana kadar sisteme kontrol uygulamaya başlamaz. Denetleyiciye istenen hareketi ve gerekli girdiyi önceden söyleyebilseydik, sistem daha hızlı tepki verebilir ve geri bildirim denetleyicisi daha az iş yapabilirdi. Bilgiyi sisteme bu şekilde besleyen bir kontrolör, feedforward-ileri beslemeli kontrolör olarak adlandırılır.

Feedforward bir denetleyici, sistemin dinamikleri (matematiksel bir modelin yaptığı gibi) veya amaçlanan hareket hakkında bilgi verir. Feedforward, bir sistemin bir referansı takip etmesi için uygulanması gerektiğini bildiğimiz kontrol eylemlerinin bazı kısımlarını ele alır, ardından geri bildirim, sistemin çalışma zamanında davranışı hakkında bilmediğimiz veya bilemediğimiz şeyleri telafi eder.

İki tür feedforward vardır: model tabanlı feedforward ve modellenmemiş dinamikler için feedforward. Birincisi, istenen hızları ve ivmeleri karşılamak için gerekli girdiler için sistemin matematiksel bir modelini çözer. İkincisi, modellenmemiş güçleri veya davranışları doğrudan telafi eder, böylece geri besleme kontrolörünün bunu yapmasına gerek kalmaz. Her iki tür de daha basit geri besleme denetleyicilerinden yararlanabilir. Aşağıda birkaç örneği ele alacağız.

Not

WPILib feedforward sınıfları, aşağıdaki mevcut mekanizma karakterizasyon araçlarıyla yakından eşleşir frc-characterization toolsuite - karakterizasyon araç takımı, her bir feedforward türü için doğru kazançları hızlı ve etkili bir şekilde belirlemek için kullanılabilir. Araç takımı, kazançların her biri için uygun birimleri gösterecektir.

WPILib, kullanıcıların mekanizmaları için doğru ileri besleme kontrolü uygulamalarına yardımcı olmak için bir dizi sınıf sağlar. Birçok yönden, doğru bir ileri besleme, bir mekanizmanın etkili kontrolü için geri bildirimden daha önemlidir. Çoğu FRC ® mekanizmalar, iyi anlaşılmış sistem denklemlerine yakından uyar, doğru bir ileri beslemeyle başlamak, doğru ve sağlam mekanizma kontrolü için hem kolay hem de büyük ölçüde faydalıdır.

WPILib şu anda feedforward denetimi için aşağıdaki üç yardımcı sınıfı sağlar:

SimpleMotorFeedforward

Not

C ++ ‘da, SimpleMotorFeedforward sınıfı, açısal veya doğrusal olabilen mesafe ölçümleri için kullanılan birim türüne göre şablonlanır. Kabul edilen kazançlar, mesafe birimleriyle tutarlı birimlere sahip olmalıdır, yoksa bir derleme zamanı hatası alınır. kS birimleri volt, kV birimleri volt * saniye / mesafe ve kA'' birimleri ``volt * saniye^2 / mesafe olmalıdır. C ++ birimleri hakkında daha fazla bilgi için bkz C ++ Ünite Kitaplığı.

Not

Java feedforward bileşenleri, çıktıları, kullanıcı tarafından sağlanan feedforward kazançlarının birimleri cinsinden hesaplar. WPILibJ’in güvenli-tip bir unit sistemi olmadığı için kullanıcılar unitleri tutarlı tutmaya özen göstermelidir.

SimpleMotorFeedforward sınıfı, dönen tekerlekler ve robot sürücüler gibi sürtünme ve atalet dışında hiçbir harici yüke sahip olmayan sabit mıknatıslı DC motorlardan oluşan mekanizmalar için ileri beslemeyi hesaplar.

Bir SimpleMotorFeedforward oluşturmak için, basitçe gerekli kazançları kullanın:

Not

kA kazancı ihmal edilebilir ve eğer öyleyse, varsayılan olarak sıfır değerine ayarlanır. Bu pek çok mekanizma için, özellikle az eylemsizliği olanlar için gerekli değildir.

// Create a new SimpleMotorFeedforward with gains kS, kV, and kA
SimpleMotorFeedforward feedforward = new SimpleMotorFeedforward(kS, kV, kA);

Feedforward hesaplamak için, istenen motor hızı ve ivmesiyle calculate() yöntemini çağırmanız yeterlidir:

Not

İvme argümanı calculate() çağrısından çıkarılabilir ve eğer öyleyse, varsayılan olarak sıfır değerine ayarlanır. Bu, açıkça tanımlanmış bir ivmelenme ayar noktası olmadığında yapılmalıdır.

// Calculates the feedforward for a velocity of 10 units/second and an acceleration of 20 units/second^2
// Units are determined by the units of the gains passed in at construction.
feedforward.calculate(10, 20);

ArmFeedforward

Not

C ++ ‘da, ArmFeedforward sınıfı mesafelerin doğrusal değil açısal olduğunu varsayar. İletilen kazançlar, açısal birim ile tutarlı birimlere sahip olmalıdır, aksi takdirde bir derleme zamanı hatası atılır. kS ve kCos birimleri volt, kV birimleri volt * saniye / radyan ve kA birimleri `` volt * saniye^2 / radyan``. C ++ birimleri hakkında daha fazla bilgi için bkz C ++ Ünite Kitaplığı.

Not

Java feedforward bileşenleri, çıktıları, kullanıcı tarafından sağlanan feedforward kazançlarının birimleri cinsinden hesaplar. WPILibJ’in güvenli-tip bir unit sistemi olmadığı için kullanıcılar unitleri tutarlı tutmaya özen göstermelidir.

ArmFeedforward sınıfı, doğrudan kalıcı mıknatıslı bir DC motor tarafından kontrol edilen kollar için sürtünme, atalet ve kol kütlesinin harici yüklemesi ile ileri beslemeyi hesaplar. Bu, FRC’deki çoğu kol için doğru bir modelidir.

Bir ArmFeedforward oluşturmak için, onu gerekli kazançlarla ayarlamanız yeterlidir:

Not

kA kazancı ihmal edilebilir ve eğer öyleyse, varsayılan olarak sıfır değerine ayarlanır. Bu pek çok mekanizma için, özellikle az eylemsizliği olanlar için gerekli değildir.

// Create a new ArmFeedforward with gains kS, kCos, kV, and kA
ArmFeedforward feedforward = new ArmFeedforward(kS, kCos, kV, kA);

Feedforward hesaplamak için, istenen kol konumu, hızı ve ivmeyle calculate() yöntemini çağırmanız yeterlidir:

Not

İvme argümanı calculate() çağrısından çıkarılabilir ve eğer öyleyse, varsayılan olarak sıfır değerine ayarlanır. Bu, açıkça tanımlanmış bir ivmelenme ayar noktası olmadığında yapılmalıdır.

// Calculates the feedforward for a position of 1 units, a velocity of 2 units/second, and
// an acceleration of 3 units/second^2
// Units are determined by the units of the gains passed in at construction.
feedforward.calculate(1, 2, 3);

ElevatorFeedforward

Not

C ++ ‘da, ElevatorFeedforward sınıfı, açısal veya doğrusal olabilen mesafe ölçümleri için kullanılan birim türüne göre şablonlanır. Kabul edilen kazançlar, mesafe birimleriyle tutarlı birimlere sahip olmalıdır, yoksa bir derleme zamanı hatası atılır. kS ve kG birimleri volt, kV birimleri volt * saniye / mesafe ve kA birimleri volt * saniye^ 2 / mesafe. C ++ birimleri hakkında daha fazla bilgi için bkz C ++ Ünite Kitaplığı

Not

Java feedforward bileşenleri, çıktıları, kullanıcı tarafından sağlanan feedforward kazançlarının birimleri cinsinden hesaplar. WPILibJ’in güvenli-tip bir unit sistemi olmadığı için kullanıcılar unitleri tutarlı tutmaya özen göstermelidir.

ElevatorFeedforward sınıfı, sürtünme, atalet ve asansör kütlesi ile yüklenen sabit mıknatıslı DC motorlardan oluşan asansörler için feedforward hesaplar. Bu, FRC’deki çoğu asansörün uygun bir modelidir.

ElevatorFeedforward oluşturmak için, onu gerekli kazançlarla yapılandırmanız yeterlidir:

Not

kA kazancı ihmal edilebilir ve eğer öyleyse, varsayılan olarak sıfır değerine ayarlanır. Bu pek çok mekanizma için, özellikle az eylemsizliği olanlar için gerekli değildir.

// Create a new ElevatorFeedforward with gains kS, kG, kV, and kA
ElevatorFeedforward feedforward = new ElevatorFeedforward(kS, kG, kV, kA);

Feedforward hesaplamak için, istenen motor hızı ve ivmesiyle calculate() yöntemini çağırmanız yeterlidir:

Not

İvme argümanı calculate() çağrısından çıkarılabilir ve eğer öyleyse, varsayılan olarak sıfır değerine ayarlanır. Bu, açıkça tanımlanmış bir ivmelenme ayar noktası olmadığında yapılmalıdır.

// Calculates the feedforward for a position of 10 units, velocity of 20 units/second,
// and an acceleration of 30 units/second^2
// Units are determined by the units of the gains passed in at construction.
feedforward.calculate(10, 20, 30);

Kontrol Mekanizmaları için Feedforward Kullanma

Not

İleri besleme gerilimleri fiziksel olarak anlamlı olduğundan, pilden gelen “voltage sag-gerilim düşüşünü” telafi etmek için motorlara uygularken en iyisi setVoltage() (Java <https://first.wpi.edu/wpilib/allwpilib/docs/release/java/edu/wpi/first/wpilibj/SpeedController.html#setVoltage(double)> ‘’ __, C ++ <https://first.wpi.edu/wpilib/allwpilib/docs/release/cpp/classfrc_1_1SpeedController.html#a8252b1dbd027218c7966b15d0f9faff7>``) yöntemini kullanmaktır.

Feedforward kontrolü, bir geri bildirim denetleyicisi olmadan tamamen kendi başına kullanılabilir. Bu, “açık döngü” kontrolü olarak bilinir ve birçok mekanizma için (özellikle robot sürücüler) mükemmel şekilde tatmin edici olabilir. Bir robot sürücüsünü aşağıdaki şekilde kontrol etmek için bir SimpleMotorFeedforward kullanılabilir:

public void tankDriveWithFeedforward(double leftVelocity, double rightVelocity) {
  leftMotor.setVoltage(feedforward.calculate(leftVelocity));
  rightMotor.setVoltage(feedForward.calculate(rightVelocity));
}