PID Kontrol Nedir? Çizgi İzleyen Robotta Kp, Ki, Kd Ayarı
PID kontrolün mantığı, Kp, Ki ve Kd terimlerinin robot davranışına etkisi, adım adım ayar sırası ve sık görülen sorunların çözümü.
Kısaca: PID, bir sistemi hedef değerde tutmak için hatayı üç yoldan düzelten bir kontrol yöntemidir: P hatanın büyüklüğüne, I birikmiş hataya, D hatanın değişim hızına bakar. Çizgi izleyen robotta hata, çizginin sensör dizisinin ortasından ne kadar uzakta olduğudur. Ayara önce düşük hızda Kp ile başlanır, salınım Kd ile frenlenir; Ki çoğu robotta sıfır kalır.
Arabadaki hız sabitleyiciyi düşünün. Yokuş başlayınca araç yavaşlar, sistem farkı görür ve gazı açar. Ne kadar açacağına üç şeye bakarak karar verir: hedef hızın ne kadar altında kalındığına, bu farkın ne zamandır sürdüğüne ve farkın ne kadar hızlı büyüdüğüne. PID kontrolün yaptığı tam olarak budur. Kombinin oda sıcaklığını tutması, drone'un havada dengede durması ve 3D yazıcı nozulunun 210 derecede sabit kalması da aynı mantıkla çalışır.
Bu yazıda PID'i bir çizgi izleyen robot üzerinden anlatıyoruz, çünkü üç terimin etkisi en kolay orada görülüyor: robot ya çizgide akıp gidiyor ya da yılan gibi sallanıyor. Malzeme seçimi ve tam bir Arduino programı için Çizgi İzleyen Robot Malzemeleri ve Yapımı Rehberi yazımıza bakabilirsiniz; burada ayarın kendisine odaklanıyoruz.
Rapid V2: öndeki sensör dizisi çizginin konumunu okur, Arduino Nano PID ile iki motorun hızını ayarlar. Görsel: Robotzade
PID kontrol nedir?
Her kontrol döngüsünde önce hata hesaplanır: istenen değer ile ölçülen değer arasındaki fark. Çizgi izleyen robotta istenen, çizginin sensör dizisinin tam ortasında olmasıdır. 8 sensörlü bir QTR dizisi çizginin konumunu 0 ile 7000 arasında verir, orta nokta 3500'dür. Çizgi tam ortadaysa hata 0, en soldaki sensörün altındaysa -3500 olur.
Kontrolcü bu hatadan bir düzeltme değeri üretir:
Düzeltme iki motora ters yönde eklenir: bir taraf hızlanır, öbürü yavaşlar ve robot çizgiye doğru döner. Robotun düz yoldaki hızını belirleyen taban hız ise ayrı bir değerdir. Destek kayıtlarımızda en sık karşılaştığımız yanlış anlama bu: Kp ve Kd'yi artırmak robotu hızlandırmaz, yalnız ne kadar sert döneceğini değiştirir. Hız taban hızdan ve motordan gelir.
Hızlı çizgi izleyen robotlarda kullanılan mikro redüktörlü motor; düz yoldaki hızı motorun devri ve tekerlek çapı belirler. Görsel: Robotzade
Grafikler nasıl çizildi? Aşağıdaki üç grafiği basit bir robot modeliyle kendimiz hesapladık: robot saniyede 60 cm hızla gidiyor, sensör dizisi tekerlek aksının 6 cm önünde, sensör okuma ve döngü gecikmesi toplam 12 ms, motorlar komuta yaklaşık 60 ms'de yetişiyor. Robot çizgiden 12 mm kaymış hâlde başlıyor. Değerler sizin robotunuza birebir uymaz; amaç her terimin davranışı nasıl değiştirdiğini göstermek.
Kp: robot ne kadar sert dönüyor?
P terimi hatayla orantılıdır. Çizgi uzaklaştıkça düzeltme büyür. Kp robotun "refleksidir" ve ayarın en çok etkileyen parçasıdır.
Yalnız P kullanılan üç robot. Gri: Kp düşük, siyah: orta, kırmızı: yüksek.
- Kp düşükken (gri) robot çizgiye geç tepki verir; geniş ve yavaş kavisler çizerek ilerler. Virajlarda dışa savrulur, keskin dönüşlerde çizgiyi kaybeder.
- Kp orta değerdeyken (siyah) robot çizgiye çabuk döner ama karşı tarafa taşar. Salınım her turda küçülür, yine de birkaç saniye sürer.
- Kp yüksekken (kırmızı) robot her küçük hataya sert tepki verir. Gecikme yüzünden düzeltme hep biraz geç kalır ve robot çizginin iki yanında hızlı, sönmeyen bir titreşime girer. Bu titreşim yüksek hızda robotu pistten atar.
Yalnız P ile kusursuz bir değer bulunamamasının sebebi gecikmedir: sensör okunur, hesap yapılır, motor hızlanır; bu sürede robot yoluna devam eder. Bu boşluğu dolduran D terimidir.
Kd: salınımı frenleyen terim
D terimi hatanın ne kadar hızlı değiştiğine bakar. Robot çizgiye hızla yaklaşırken hata hızla küçülür; D bunu görür ve düzeltmeyi erkenden azaltır. Böylece robot çizgiyi geçip karşı tarafa taşmaz. Kısacası P "nereye dönmeliyim", D "ne kadar hızlı yaklaşıyorum" sorusunu cevaplar.
Aynı Kp ile yalnız P (gri) ve P + D (kırmızı).
D eklenince ilk taşma yarıya iner ve robot bir saniye içinde çizgiye oturur. Hızlı çizgi izleyenlerde Kd çoğu zaman Kp'den büyük bir sayıdır; bunun sebebi hatadaki değişimin döngüden döngüye çok küçük olmasıdır, terimin önemsiz olması değil.
Kd'nin de bir sınırı var. Fazla yüksek Kd sensör gürültüsünü büyütür: robot düz yolda bile "tıkırdar", motorlardan cızırtılı bir ses gelir. Bu sesi duyduğunuzda Kd'yi biraz geri alın.
Ki: çoğu robotta neden sıfır?
I terimi hataları toplar. Hata küçük ama hep aynı yöndeyse toplam büyür ve düzeltme sonunda bu kaymayı siler. Çizgi izleyen robotta hata çok hızlı yön değiştirdiği için toplam genellikle sıfır civarında kalır; Ki'nin yapacak işi yoktur. Üstelik yanlış ayarlanmış bir Ki virajdan çıkışta robotu yavaşça karşı tarafa iter.
Ki'nin işe yaradığı bir durum var: iki motor aynı PWM değerinde aynı hızda dönmüyorsa. Destek kayıtlarımızda "robot aynı PWM ile düz gitmiyor, bir yana sapıyor" sorusu düzenli geliyor. Motorların ve sürücü transistörlerinin iç direnci birbirinden biraz farklıdır, bu normaldir ve arıza değildir. Böyle bir robot PD ile çizgiyi takip eder ama hep çizginin bir yanından gider.
Bir motoru diğerinden %6 zayıf robot. Gri: P + D, çizgiden yaklaşık 2 mm kaymış hâlde gidiyor. Kırmızı: küçük bir Ki eklenince kayma iki saniyede siliniyor.
Ki kullanacaksanız toplamı mutlaka bir sınırda tutun. Robot çizgiyi kaybedip birkaç saniye arar ya da elle tutulursa toplam şişer ve robot bırakıldığında uzun süre tek tarafa çeker. Bu duruma kontrol literatüründe "integral doyması" (windup) denir.
Adım adım PID ayarı
Ayarı her zaman bitmiş pistte ya da ona çok benzeyen bir zeminde yapın. Bize gelen "robot pistten çıkıyor" sorularının büyük kısmı ayardan değil zeminden ve kalibrasyondan kaynaklanıyor.
- Zemin ve sensör: Mat bir zemin kullanın; parlak boya, parke, fayans ve branda sensörü yanıltır. QTR-8 dizisinin zemine en iyi okuma mesafesi 3 mm, üreticinin önerdiği en fazla mesafe 9,5 mm. Sensör yüksekte kalıyorsa gövdeyle arasına bir M3 aralayıcı koymak çoğu zaman sorunu çözer.
- Kalibrasyon: Robot yerdeyken, çizginin üzerinde sağa sola gezdirerek kalibre edin. Her açılışta tekrarlayın; kalibrasyonda robotu yerden kaldırmayın.
- Başlangıç değerleri: Ki = 0, Kd = 0, taban hızı en yüksek hızın üçte biri civarında tutun.
- Kp: Robot çizgiyi kaybetmeden ilk virajı alana kadar Kp'yi adım adım artırın. Hızlı titreşim başladığı anda bir önceki değerin biraz altına dönün.
- Kd: Salınım kaybolana kadar Kd'yi artırın. Motorlardan cızırtı geliyorsa fazla oldu.
- Hız: Taban hızı adım adım yükseltin. Her artışta salınım geri gelirse önce Kd'yi, sonra Kp'yi yeniden kontrol edin.
- Ki (gerekirse): Robot hep çizginin bir yanından gidiyorsa çok küçük bir Ki ile başlayın.
Ayarı dolu pille yapın. Pil gerilimi düştükçe motorlar yavaşlar ve aynı değerler farklı davranır; dolu pille bulduğunuz ayar yarı dolu pille hafif kalabilir. Tekerleklerin tozlu olması da benzer etki yapar: lastik kaydığında hiçbir ayar robotu çizgide tutamaz.
Robot ne yapıyor, neye dokunmalı?
| Robotun davranışı | Muhtemel sebep | Ne yapın |
|---|---|---|
| Düz yolda geniş, yavaş kavislerle ilerliyor | Kp düşük | Kp'yi küçük adımlarla artırın |
| Çizginin iki yanında hızlı ve sönmeyen titreşim | Kp yüksek ya da Kd yetersiz | Kp'yi biraz düşürün, Kd ekleyin |
| Düz yolda tıkırdıyor, motorlardan cızırtı geliyor | Kd yüksek | Kd'yi azaltın |
| Virajda dışa savruluyor | Taban hız viraja göre yüksek | Taban hızı düşürün ya da virajda yavaşlatan kod ekleyin |
| 90 derecelik dönüşleri kaçırıyor | PID keskin köşe için tasarlanmamıştır | Çizgi kaybolduğunda hız düşüren ya da son görülen yöne yerinde döndüren bir kod bloğu ekleyin |
| Hep çizginin bir yanından gidiyor | Motorlar eşit değil | Küçük bir Ki ekleyin ya da zayıf motora sabit bir pay verin |
| Kp ve Kd'yi değiştirdim ama hızlanmadı | PID hızı değil dönüşü belirler | Taban hızı artırın; yetmiyorsa motor değişikliği gerekir |
| Ara sıra çizgiyi tamamen kaybediyor | Kalibrasyon, sensör yüksekliği ya da parlak zemin | Kalibrasyonu yerde tekrarlayın, sensörü 3-9 mm aralığına getirin, mat zemin kullanın |
Motor seçimi konusunda da sık soru geliyor. Hızlı çizgi izleyende en yüksek devirli motor her zaman en iyisi değil: 6000 RPM'lik motorda tork düşer, ağır bir robotu virajda taşıyamayabilir. Virajlı pistlerde 4000 RPM civarı daha kolay ayarlanır.
Döngü süresi ve sensör seçimi
D terimi "hatadaki değişim"e bakar ve bu değişim iki döngü arasındaki farktır. Döngü süresi bir an 2 ms, bir an 6 ms olursa aynı hareket için D farklı değerler üretir ve robot düzensiz davranır. İki kural işe yarar:
- Döngüyü sabit aralıkta çalıştırın. Aşağıdaki örnekteki gibi
micros()ile her 2 ms'de bir hesap yapmak, D'yi öngörülebilir kılar. - Döngüde Serial.print kullanmayın. Seri porta yazmak döngüyü milisaniyelerce uzatır; ayar yaparken gördüğünüz davranış, yazdırmayı kapatınca değişir.
Sensörün okuma süresi de döngüye eklenir. QTR-8RC her sensörde bir kapasitörün boşalma süresini ölçer; kütüphanenin varsayılan zaman aşımı 2,5 ms'dir ve siyah zeminde okuma bu süreye yaklaşır. QTR-8A analog çıkış verir; Arduino Uno ve Nano'da bir analog okuma yaklaşık 0,1 ms sürer, sekiz sensör toplam 1 ms'nin altında okunur. Çok hızlı robotlarda bu fark hissedilir; temel seviye bir robotta ikisi de yeterlidir.
QTR-8RC: 8 kızılötesi sensör yan yana dizilir, çizginin hangi sensörün altında olduğu konumu verir. Görsel: Pololu
PID hesabı için örnek kod
Aşağıdaki parça yalnız PID hesabını ve sabit döngü süresini gösterir. Sensör okuma (qtr, s), motor() işlevi ve tabanHiz çizgi izleyen rehberimizdeki tam programdan gelir.
float Kp = 0.06, Ki = 0.0, Kd = 0.5;
long toplamHata = 0;
int sonHata = 0;
const unsigned long DONGU_US = 2000;
unsigned long sonDongu = 0;
int duzeltmeHesapla(int hata) {
toplamHata = constrain(toplamHata + hata, -20000, 20000);
int degisim = hata - sonHata;
sonHata = hata;
return Kp * hata + Ki * toplamHata + Kd * degisim;
}
void loop() {
if (micros() - sonDongu < DONGU_US) return;
sonDongu += DONGU_US;
int hata = (int)qtr.readLineWhite(s) - 3500;
int duzeltme = duzeltmeHesapla(hata);
motor(tabanHiz + duzeltme, tabanHiz - duzeltme);
}
Değerler 8 sensörlü bir dizi ve 0-255 PWM aralığı içindir; başlangıç noktası olarak kullanın. Ki kullanmaya karar verirseniz 0,0005 gibi çok küçük bir değerle başlayın. Toplamı sınırlayan constrain satırı integral doymasını önler. Robot çizgiden ters yöne kaçıyorsa düzeltmenin işaretini çevirin ya da motor kablolarının yerini değiştirin.
PID'in daha ayrıntılı bir yazılım anlatımı için Brett Beauregard'ın Arduino PID kütüphanesini yazarken tuttuğu Improving the Beginner's PID yazı dizisi iyi bir kaynak; integral doyması ve türevin ani sıçraması gibi sorunları adım adım çözüyor. QTR sensörlerin kalibrasyon ve okuma işlevleri Pololu QTRSensors kütüphanesinin belgelerinde, sensör ölçüleri QTR-8RC ürün sayfasında yer alıyor.
Hazır kitlerde PID
Hızlı çizgi izleyen kitlerimizin programları PID ile yazılmıştır; Çita gibi kitler gönderilmeden önce ofisimizdeki pistte denenir. Kp ve Kd değerleri robotun boyutuna, ağırlığına ve tekerlek çapına göre seçildiği için çoğu kullanıcının bunlara dokunması gerekmez. Kendi pistiniz farklıysa ya da motoru değiştirdiyseniz yukarıdaki sırayla yeniden ayarlayabilirsiniz; değiştirmeden önce orijinal değerleri bir kenara yazın.
Çita hızlı çizgi izleyen robot kiti: PID değerleri robot çalışırken uzaktan değiştirilebiliyor. Görsel: Robotzade
Hazır kitlere bir örnek, Çita hızlı çizgi izleyen robot kitinin pistteki sürüşü:
Sık sorulan sorular
PID kontrol ne demek?
PID, İngilizce Proportional-Integral-Derivative (oransal-integral-türev) sözcüklerinin kısaltmasıdır. Bir sistemi hedef değerde tutmak için hatanın büyüklüğüne, birikimine ve değişim hızına göre düzeltme yapan kontrol yöntemidir.
Kp, Ki ve Kd neyi değiştirir?
Kp hataya ne kadar sert tepki verileceğini, Kd bu tepkinin ne kadar frenleneceğini, Ki ise uzun süren küçük kaymaların ne kadar düzeltileceğini belirler. Çizgi izleyen robotlarda çoğu zaman yalnız Kp ve Kd kullanılır.
Kp'yi artırınca robot hızlanır mı?
Hayır. Kp ve Kd robotun ne kadar sert döneceğini belirler. Robotun hızı programdaki taban hız değerinden ve motordan gelir.
Çizgi izleyen robotta Ki kullanmalı mıyım?
Çoğu robotta gerekmez, sıfır bırakılır. Robot hep çizginin bir yanından gidiyorsa, yani motorlar eşit güçte değilse çok küçük bir Ki ve toplamı sınırlayan bir kod satırıyla kullanılabilir.
Robotum 90 derecelik dönüşlerde neden çizgiyi kaybediyor?
PID yumuşak virajlar için idealdir; keskin köşede çizgi bir anda sensörlerin dışına çıkar. Çizgi kaybolduğunda hızı düşüren ya da robotu son görülen yöne döndüren ek bir kod bloğu gerekir.
İlgili: Çizgi izleyen robot malzemeleri ve yapımı · Çizgi İzleyen Robot kategorisi · TB6612FNG motor sürücü



