PID Döngülerinin Test Edilmesi ve Ayarlanması

One challenge in using sensors to control mechanisms is to have a good algorithm to drive the motors to the proper position or speed. The most commonly used control algorithm is called PID control. There is a good set of videos that explain the control algorithms described here. The PID algorithm converts sensor values into motor speeds by:

  1. Robotun veya mekanizmanın istenen ayar noktasından ne kadar uzakta olduğunu belirlemek için sensör değerlerininin okunması. Ayar noktası, beklenen hedefe karşılık gelen sensör değeridir. Örneğin, bilek eklemli bir robot kol, belirlenmiş bir açıya çok hızlı bir şekilde hareket edebilmeli ve bir sensörle gösterildiği gibi bu açıda durabilmelidir. Potansiyometre, dönme açısı ölçümü yapabilen bir sensördür. Analog bir girişe bağlanmasıyla birlikte program açı ile doğru orantılı bir voltaj ölçümü alabilmektedir.

  2. Hatanın (sensör değeri ile istenen değer arasındaki fark) hesaplanması. Hata değerinin işareti, bileğin ayar noktasının hangi tarafında olduğunu göstermektedir. Örneğin negatif değerler, ölçülen bilek açısının istenen bilek açısından daha büyük olduğunu ortaya koyabilmektedir. Hatanın büyüklüğü, ölçülen bilek açısının gerçek bilek açısından ne kadar uzakta olduğudur. Hata sıfır ise, ölçülen açı istenen açı ile tam olarak eşleşir. Hata, bir motorun hızını hesaplamak için PID algoritmasında bir giriş olarak kullanılabilir.

  3. Elde edilen motor hızı, bu hesabı takiben, umuyoruz ki ayar noktasını aşmadan (noktanın ötesinde geçmeden), ayar noktasına olabildiğince hızlı bir şekilde ulaşması için motoru doğru yönde ve hızda sürmek için kullanılacaktır.

WPILib, PID algoritmasını uygulayan ve Kp, Ki ve Kd değerlerine karşılık gelen sabitleri kabul eden bir PIDController sınıfına sahiptir. PID algoritmasının, hatadan yola çıkarak motor hızının hesaplanmasına katkıda bulunan üç bileşeni vardır.

  1. P (proportional - orantılı) - bu, bir sabit (Kp) ile çarpıldığında, motoru doğru yönde ve hızda hareket ettirmeye yardımcı olacak, motor hızı oluşturan bir terimdir.

  2. I (integral) - bu terim ardışık hataların toplamıdır. Hatanın varlığı ne kadar uzun süreliğine devam ediyorsa, integral katkısı o kadar büyük olacaktır. Bu bileşen en temelinde zaman içindeki tüm hataların toplamıdır. Bilek hareket ettirmeye çalıştığı büyük bir yük nedeniyle ayar noktasına tam olarak ulaşamıyorsa, integral terimi, motor hızına ayar noktasına varması için yeterli katkıda bulunana kadar (hataların toplamı) artmaya devam edecektir. İntegral terimini sistem için ölçeklendirmek için hataların toplamı bir sabit (Ki) ile çarpılmaktadır.

  3. D (diferansiyel) - bu değer, hataların değişim oranıdır. Motor çok hızlı hareket ediyorsa motor hızını yavaşlatmak için kullanılmaktadır. Bu bileşen anlık hata değeri ile önceki hata değeri arasındaki farkın alınmasıyla hesaplanmaktadır. Sistemin geri kalanıyla eşleşecek şekilde ölçeklendirmesi içinse bir sabit (kd) ile çarpılmaktadır.

PID Kontrolörünün Ayarlanması

PID kontrolörünün ayarlanması, daha isabetli sonuçlar için sabitlerin ayarlanmasından oluşmaktadır. Shuffleboard bu sürece sabit değerlerin belirlenmesini ve belirlenen değerlerin ne kadar iyi çalıştığının test edilmesini sağlayan bir kullanıcı arayüzü ile PID alt sistemlerine dair detayları görüntüleyerek yardımcı olmaktadır. Bütün bunlar robot (driver station - sürücü istasyonunda “Test” seçeneğinin seçilmesiyle) test modunda çalışırken görüntülenmektedir.

PIDController Subsystem aracının her bir kısmını içermektedir.

Yukarıdaki, sensör (pot) olarak bir potansiyometre ve motora bağlı bir motor kontrol cihazı içeren bir bilek alt sisteminin test modu resmidir. PIDSystem’a karşılık gelen bir dizi alana sahiptir.

  1. Potansiyometrenin analog girdi voltajı değeri. Bu, sensör girdi değeridir.

  2. 0 değeri durduğunu gösterecek şekilde wrist-bilek motorunu her iki yönde hareket ettiren bir kaydırıcı. Pozitif ve negatif değerler yukarı veya aşağı harekete denk düşmektedir.

  3. Yukarıda belirtildiği üzere PID sabitleri (F, hız PID döngüleri için kullanılan ileri besleme değeridir)

  4. Bilek istenen değere ulaştığında pot değerine karşılık gelen ayar noktası değeri

  5. PID denetleyicisini etkinleştirmektedir - Artık çalışmamakta, daha fazla bilgi için aşağıya bakınız.

İstenen motor performansını elde etmek için çeşitli PID kazançlarını deneyin. İstenilen performansı elde etmek için bu makalenin başında verilen bağlantılı videoya veya internetteki diğer kaynaklara başvurabilirsiniz.

Önemli

The enable option does not affect the PIDController introduced in 2020, as the controller is updated every robot loop. See the example below on how to retain this functionality.

Yeni PIDController’de İşlevselliğin Etkinleştirilmesi

Aşağıdaki örnek, gösterge panelinizde PIDController’ı etkinleştirecek/devre dışı bırakacak düğmenin nasıl oluşturulacağını göstermektedir.

ShuffleboardTab tab = Shuffleboard.getTab("Shooter");
GenericEntry shooterEnable = tab.add("Shooter Enable", false).getEntry();
// Command Example assumed to be in a PIDSubsystem
new NetworkButton(shooterEnable).onTrue(new InstantCommand(m_shooter::enable));
// Timed Robot Example
if (shooterEnable.getBoolean()) {
  // Calculates the output of the PID algorithm based on the sensor reading
  // and sends it to a motor
  motor.set(pid.calculate(encoder.getDistance(), setpoint));
}
frc::ShuffleboardTab& tab = frc::Shuffleboard::GetTab("Shooter");
nt::GenericEntry& shooterEnable = *tab.Add("Shooter Enable", false).GetEntry();
// Command-based assumed to be in a PIDSubsystem
frc2::NetworkButton(shooterEnable).OnTrue(frc2::InstantCommand([&] { m_shooter.Enable(); }));
// Timed Robot Example
if (shooterEnable.GetBoolean()) {
  // Calculates the output of the PID algorithm based on the sensor reading
  // and sends it to a motor
  motor.Set(pid.Calculate(encoder.GetDistance(), setpoint));
}
from wpilib.shuffleboard import Shuffleboard
tab = Shuffleboard.getTab("Shooter")
shooterEnable = tab.add("Shooter Enable", false).getEntry()
# Command Example assumed to be in a PIDSubsystem
NetworkButton(shooterEnable).onTrue(InstantCommand(m_shooter.enable()))
# Timed Robot Example
if (shooterEnable.getBoolean()):
  # Calculates the output of the PID algorithm based on the sensor reading
  # and sends it to a motor
  motor.set(pid.calculate(encoder.getDistance(), setpoint))