Bu yazıda ne yapacağız?
- PID'in üç parçasını (P, I, D) tek bir şemada göreceğiz.
- Katsayıları doğru sırayla ayarlayacağız: önce P, sonra D, gerekirse en son I.
- Kaydırıcılarla kendiniz deneyeceksiniz.
- 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.
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, 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ı)
- P işin çoğunu yapar: hata büyükse çok güç, küçükse az.
- D fren gibidir: hızla yaklaşırken gücü keser, aşmayı azaltır.
- I inatçı küçük hatayı biriktirip gücü yavaşça artırır.
Sensör şart: sürüşte enkoder, yön için IMU, kolda enkoder ya da açı sensörü.
Başlamadan önce
- Ölçtüğünüzü görün: hedef, ölçülen, hata ve güç telemetride olsun.
- Birimi sabitleyin: tick, santim ya da derece. Kp buna göre çok değişir.
- Gücü sınırlayın: ilk denemelerde ±0,5, boş bir alanda.
- Tek seferde tek katsayı: her denemeyi not edin.
Adım adım ayar
1. Yalnız P
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.
- Yavaş gidiyorsa: Kp'yi artırın.
- Hedefin etrafında gidip geliyorsa: Kp fazla, biraz geri çekin.
2. D ile frenleyin
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.
- Hâlâ aşıyorsa: Kd'yi artırın.
- Hedefte titriyorsa: Kd fazla ya da sensör gürültülü, düşürün.
- Ağır ağır yaklaşıyorsa (mavi çizgi): Kd fazla.
3. Gerekirse en son, az I
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
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.
- Kp, Ki, Kd = 0. Kolu yataya getirip bırakın, kG'yi kol yerinde kalana kadar artırın.
- 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
"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);
- Robot hatayı büyütüyorsa
donusişaretini çevirin. - Birkaç santim kala duruyorsa hatanın işaretiyle küçük bir sabit güç (kS) ekleyin: robotun zar zor kımıldadığı güç.
- Gerçek ağırlıkla, yarışma zeminine yakın yüzeyde ayarlayın.
SDK'nın kendi PID'i ne zaman yeter?
- SDK'da hazır hız (
RUN_USING_ENCODER,setVelocity) ve konum (RUN_TO_POSITION) denetimi var. KatsayılarDcMotorEx.setPIDFCoefficients(RunMode, PIDFCoefficients)ile değişir. - Katsayılar port ve kip başınadır, kontrol ünitesi kapanınca kalmaz: her OpMode başında yazın.
- Tekerlek hızına yeter. Kol gibi ileri besleme isteyen işlerde kendi PID'inizi yazın.
En sık 6 hata
- Başka takımın sayılarını kopyalamak: katsayılar birime, dişliye, ağırlığa bağlı.
- Üç katsayıyı birden değiştirmek: sıra P, D, gerekirse I.
- Her sorunu I ile çözmek: yer çekimi ve sürtünmeye ileri besleme; I'yı sınırlayın.
dtkullanmamak: döngü süresi değişir, integral ve türevdtister.- Yön hatasını sarmamak: robot kısa yol yerine tam tur döner.
- Motor tam güçteyken Kp ile oynamak: çıkış ±1'deyse Kp bir şey değiştirmez.
Kaynaklar
Erişim: 17 Ekim 2026
- Game Manual 0, Control Loops: ayar sırası, I terimi, kolda cos ileri beslemesi.
- FTC Docs, Changing PIDF Coefficients: katsayıların port ve kip başına olması, kalıcı olmaması.
- WPILib, Tuning a Vertical Arm Position Controller: önce kG, sonra PID.
- WPILib, Common Control Loop Tuning Issues: integral birikmesi, voltaj düşüşü, doyma.