Dokümanlar · ← Blog yazıları

Robotik

PID ayarı nasıl yapılır? Robot için adım adım Kp, Kd, Ki (FTC örnekli)

Probot Studio

Bu yazıda ne yapacağız?

  1. PID'in üç parçasını (P, I, D) tek bir şemada göreceğiz.
  2. Katsayıları doğru sırayla ayarlayacağız: önce P, sonra D, gerekirse en son I.
  3. Kaydırıcılarla kendiniz deneyeceksiniz.
  4. FTC'de kol ve sürüş için kısa Java örnekleri göreceğiz.

Neden işe yarar? İyi ayarlanmış PID ile robot hedefe sallanmadan gider, hedefin iki santim gerisinde durup kalmaz ve otonomda her seferinde aynı yere varır.

Üç kızak 60 cm ötedeki hedefe gidiyor: az P ile yavaş, çok P ile hedefin etrafında sallanarak, P artı D ile hızlı ve yumuşak

Grafikler basit bir modelin simülasyonu: 60 cm ileri giden bir kızak. Sizin sayılarınız farklı olur, davranışlar aynıdır.

PID bir bakışta

PID akış şeması: hata P, I ve D terimlerine gider, toplamları motor gücüdür, sensör yeni konumu ölçer ve döngü tekrarlanır

PID, hedef ile ölçülen arasındaki farka (hata) bakıp her döngüde motor gücünü hesaplar. Katsayıları bulma işine İngilizce kaynaklarda PID tuning denir:

güç = Kp × hata + Ki × (hatanın toplamı) + Kd × (hatanın değişim hızı)

Sensör şart: sürüşte enkoder, yön için IMU, kolda enkoder ya da açı sensörü.

Başlamadan önce

Adım adım ayar

1. Yalnız P

Konum zaman grafiği: Kp az iken kızak hedefe varamıyor, Kp orta iken biraz aşıp oturuyor, Kp çok iken hedefin etrafında gidip geliyor

Ki ve Kd sıfır. Kp'yi küçük başlatın (en büyük hatada 0,1-0,2 güç verecek kadar) ve adım adım artırın. Aradığınız: hızlı varıp bir iki kez hafif aşarak oturan robot.

2. D ile frenleyin

Konum zaman grafiği: Kd sıfırken salınım var, Kd orta iken kızak hızlı ve aşmadan oturuyor, Kd çok iken hedefe ağır ağır yaklaşıyor

Kp sabitken Kd'yi küçük adımlarla artırın; aşma azalır. Sonra Kp'yi biraz daha yükseltebilirsiniz, birkaç tur dönüşümlü ayar normaldir.

3. Gerekirse en son, az I

Sabit yük varken konum zaman grafiği: P ve PD hedefin 5 cm gerisinde kalıyor, PID biraz aşıp hedefe oturuyor

Robot hep aynı küçük farkla geride duruyorsa (kalıcı hata), çok küçük bir Ki ekleyip yavaşça artırın. I biraz aşma getirebilir.

Çoğu mekanizmada I gerekmez; FTC topluluk rehberi Game Manual 0 da onu FTC için en az önemli terim sayar. Sebep yer çekimi ya da sürtünmeyse önce ileri besleme deneyin (kol örneği). I eklerseniz integrali sınırlayın.

Kendiniz deneyin

Burada Kp, Ki ve Kd kaydırıcılı bir deneme alanı var; JavaScript ile çalışır. Açılmadıysa yukarıdaki üç grafik aynı denemeleri gösteriyor.

Sıra: Yalnız P ile başlayın, salınımı Kd ile bastırın. Sonra Sabit yük ekle ile kızağın geride kaldığını görün ve küçük bir Ki ekleyin.

Belirtiye göre ne yapmalı?

Gördüğünüz Sebep Ne yapın
Hedefin etrafında gidip geliyor Kp yüksek, Kd düşük Kp'yi düşürün ya da Kd'yi artırın
Çok yavaş gidiyor Kp düşük Kp'yi artırın
Kp'yi artırdım, hız değişmiyor Motor zaten tam güçte Gücün ±1'e dayandığına bakın
Hedefin biraz gerisinde kalıyor Yer çekimi, sürtünme İleri besleme (kS, kolda kG), sonra küçük Ki
Hedefte titriyor Kd yüksek, sensör gürültülü Kd'yi düşürün, tolerans bandı koyun
Büyük hedef değişiminde çok aşıyor Integral birikmesi Integrali sınırlayın, hedef değişince sıfırlayın
Maç sonunda farklı davranıyor Pil voltajı düşüyor Orta doluluktaki pille ayarlayın

FTC: kolu bir açıda tutmak

Kol yataydan dik konuma kalkıyor; yanındaki çubuk ve kosinüs grafiği, kolu tutmak için gereken gücün yatayda en çok, dikte sıfır olduğunu gösteriyor

Yer çekimi kolu hep aşağı çeker. Yalnız PID ile kol önce biraz sarkar ki hata oluşsun. Bu yüzden önce yer çekimi ileri beslemesi ayarlanır, PID onun üstüne kurulur.

  1. Kp, Ki, Kd = 0. Kolu yataya getirip bırakın, kG'yi kol yerinde kalana kadar artırın.
  2. Sonra P, D, gerekirse I. İleri besleme doğruysa çoğu zaman I gerekmez.
// Her döngüde. DcMotorEx kol (RUN_WITHOUT_ENCODER), ElapsedTime zaman.
// Katsayılar 0'dan başlar, siz ayarlarsınız. Başta: oncekiAci = ilk ölçüm, integral = 0.
double dt = zaman.seconds(); zaman.reset();
double aci = (kol.getCurrentPosition() - YATAY_TICK) / TICK_DERECE;  // yataydan derece
double hata = hedefAci - aci;

integral += hata * dt;
if (kI > 0) integral = Range.clip(integral, -0.2 / kI, 0.2 / kI);  // integral sınırı
double turev = dt > 0 ? -(aci - oncekiAci) / dt : 0;  // ölçülenden: hedef değişince sert vuruş olmaz
oncekiAci = aci;

double ileri = kG * Math.cos(Math.toRadians(aci));  // yer çekimi ileri beslemesi
double guc = ileri + kP * hata + kI * integral + kD * turev;
kol.setPower(Range.clip(guc, -1, 1));

Hedef açı değişince integral = 0 yapın. Motor RUN_WITHOUT_ENCODER kipinde, SDK'nın hız denetimiyle çakışmasın diye; enkoder yine okunur.

FTC: düz sürüş ve yön

Robot 179 derecede, hedef -179 derece. Hata sarılmazsa -358 derece çıkar ve robot neredeyse tam tur döner; sarılırsa 2 derece döner

"60 cm ileri git" iki PID'dir: mesafe PID'i iki taraf enkoderinin ortalamasından ileri gücü, yön PID'i (çoğunlukla yalnız P) IMU açısından dönüşü verir.

cm_başına_tick = (tur başına sayım × dişli oranı) / (π × tekerlek çapı_cm)
double yonHatasi(double hedef, double olculen) {
    double h = hedef - olculen;
    while (h > 180) h -= 360;    // -180..180 aralığına sar
    while (h <= -180) h += 360;
    return h;
}
// Döngüde:
double yon = imu.getRobotYawPitchRollAngles().getYaw(AngleUnit.DEGREES);
double donus = kPyon * yonHatasi(hedefYon, yon);
sol.setPower(ileriGuc + donus);
sag.setPower(ileriGuc - donus);

SDK'nın kendi PID'i ne zaman yeter?

En sık 6 hata

  1. Başka takımın sayılarını kopyalamak: katsayılar birime, dişliye, ağırlığa bağlı.
  2. Üç katsayıyı birden değiştirmek: sıra P, D, gerekirse I.
  3. Her sorunu I ile çözmek: yer çekimi ve sürtünmeye ileri besleme; I'yı sınırlayın.
  4. dt kullanmamak: döngü süresi değişir, integral ve türev dt ister.
  5. Yön hatasını sarmamak: robot kısa yol yerine tam tur döner.
  6. Motor tam güçteyken Kp ile oynamak: çıkış ±1'deyse Kp bir şey değiştirmez.

Kaynaklar

Erişim: 17 Ekim 2026