Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

6. hafta / 14

Geri beslemeli kontrol ve PID

Araçlar: Python, bu platform

Bu haftanın sonunda

  • Her PID teriminin etkisini açıklamak
  • Integral doyumu önlemeli (anti-windup) ayrık bir PID denetleyici uygulamak
  • Basamak yanıtını gözlemleyerek bir denetleyiciyi ayarlamak

Ders notları

Açık döngü (open-loop) kontrolde bir komut gönderir ve umut edersiniz. Kapalı döngü (closed-loop), yani geri beslemeli (feedback) kontrolde sonucu ölçer, referans ile ölçüm arasındaki e = r − y hatasını hesaplar ve sürekli olarak düzeltirsiniz.

u(t) = Kp e(t) + Ki ∫ e(t) dt + Kd de(t)/dt
ArtırılanYükselme süresiAşımKalıcı durum hatası
Kpkısalırartarazalır
Kikısalırartarortadan kalkar
Kdaz değişirazalıretkisi yok

Önemli uygulama ayrıntıları

  • Ayrık zaman: integral, birikimli bir toplama I += e·Δt dönüşür; türev ise Δt'ye bölünen bir farka. Sabit bir döngü periyodu kullanın.
  • Ölçüm üzerinden türev: de/dt yerine −dy/dt kullanın; böylece referans değerdeki (setpoint) bir sıçrama devasa bir sivri tepe ("türev tekmesi", derivative kick) oluşturmaz.
  • İntegral doyumu (windup): eyleyici doyuma ulaştığında integral büyümeye devam eder ve daha sonra büyük bir aşıma yol açar. Doyumdayken integral almayı durdurun.
  • Filtreleme: türev gürültüyü büyütür, bu yüzden onu filtreleyin (4. hafta).

Ayarlama

Elle ayarlama: Kp'yi salınım başlayana kadar artırın, sönümlemek için Kd ekleyin, ardından kalan hata için biraz Ki ekleyin. Ziegler–Nichols: salınımın Tu periyoduyla sürdüğü Ku kazancını bulun, sonra Kp = 0.6Ku, Ti = Tu/2, Td = Tu/8 olarak ayarlayın.

Çizgi izleyiciye dönüş

Beş sensörlü bir dizide hata, çizgiyi gören sensörlerin ağırlıklı ortalama konumudur (−2 ile +2 arası). Bu hata üzerinde çalışan bir PD denetleyici, zikzak çizmek yerine yumuşak bir şekilde yön verir.

Derinlemesine

Çözümlü örnek: yalnız P neyi yapabilir, neyi yapamaz?

Bir tekerleğin hızını birinci dereceden bir sistem (plant) olarak modelleyelim: giriş geriliminde bir basamak, hızı τ zaman sabitiyle o gerilimin K katına doğru götürür. K = 2 ve τ = 0,3 s alalım. u = Kp e oransal kontrolüyle kapalı döngü yine birinci derecedendir:

ess = 1 / (1 + K Kp)     τcl = τ / (1 + K Kp)

Kp = 4 ile ess = 1 / 9 = %11 ve τcl = 0,3 / 9 = 33 ms olur. Kp'yi artırmak hatayı küçültür ama asla yok etmez; üstelik ilk komut u = Kp r, sürücü doyuma ulaşana kadar büyür. Sabit bir yükte ess'yi sıfıra yalnızca integral terimi götürür. Kullanışlı bir kural: kapalı döngü zaman sabitinden en az on kat hızlı örnekleyin; burada Δt ≤ 3,3 ms, yani yaklaşık 300 Hz.

Çözümlü örnek: sayılarla Ziegler–Nichols

Yalnız P kontrolünün Ku = 2,0'da, Tu = 0,5 s periyotla sürekli salınmaya başladığını varsayalım. Klasik kural Kp = 0,6 × 2,0 = 1,2, Ti = 0,25 s ve Td = 0,0625 s verir. Kodda kullanılan paralel biçimde:

Ki = Kp / Ti = 4.8 s⁻¹     Kd = Kp · Td = 0.075 s

Ziegler–Nichols hızlı bozucu bastırmayı hedefler ve tipik olarak %25 ile %50 arası aşım verir; bu yüzden onu bir başlangıç noktası olarak görün ve aşım önemliyse Kp ile Ki'yi düşürün.

Aşımı sönüm olarak okumak

Ayarlanmış birçok döngü, sönüm oranı ζ olan ikinci dereceden bir sistem gibi davranır. Aşım şudur:

Mp = exp(−ζπ / √(1 − ζ²))

Dolayısıyla laboratuvardaki "aşım %10'un altında" hedefi ζ ≥ 0,59 demektir. Basamak yanıtı birkaç kez salınıyorsa ζ 0,5'in epey altındadır: Kd ekleyin veya Kp'yi düşürün.

Davranışı değiştiren iki uygulama ayrıntısı

  • Filtrelenmiş türev: D = β Dprev − (1 − β) Kd (yk − yk−1) / Δt ifadesini β yaklaşık 0,8 ile hesaplayın. Enkoder hızı nicemlenmiştir (quantised) ve ham türev motoru vızıldatır.
  • Geri hesaplamalı (back-calculation) integral doyma önleme: integrali yalnızca dondurmak yerine doyma hatasını geri besleyin, I += (Ki e + (usat − u) / Tt) Δt, burada Tt Ti'ye yakındır. Eyleyici doyumdan çıkar çıkmaz integral yumuşakça boşalır.
  • Darbesiz geçiş (bumpless transfer): elle kontrolden otomatiğe geçerken integrali, ilk PID çıktısı mevcut komuta eşit olacak şekilde önceden ayarlayın; yoksa robot sarsılır.

Simülasyonlar

PID basamak yanıtı

Sürtünmeli bir ray üzerinde araba. Hedef değer her 5 saniyede 0 ile 1 arasında değişir. Yalnız P ile başla, aşımı sönümlemek için D ekle, sonra bozucu kuvvet ver ve kalıcı durum hatasını I ile gider.

Çizgi izleyen robot

Yansıma sensörlü iki tekerlekli robot. İki sensörlü aç-kapa (bang-bang) denetleyiciyi beş sensörlü PD denetleyiciyle karşılaştır.

Kod

Python: ölçüm üzerinden türevli ve integral doyumu önlemeli PID
class PID:
    def __init__(self, kp, ki, kd, u_min=-255, u_max=255):
        self.kp, self.ki, self.kd = kp, ki, kd
        self.u_min, self.u_max = u_min, u_max
        self.i = 0.0
        self.prev_y = None

    def update(self, setpoint, y, dt):
        e = setpoint - y
        d = 0.0 if self.prev_y is None else -(y - self.prev_y) / dt
        self.prev_y = y
        u = self.kp * e + self.ki * (self.i + e * dt) + self.kd * d
        if self.u_min < u < self.u_max:    # yalnızca doyumda değilken integral al
            self.i += e * dt
        return max(self.u_min, min(self.u_max, u))

Sık yapılan hatalar

  • Kazançları bir döngü hızında ayarlayıp sonra döngü periyodunu değiştirmek ya da integrali Δt ile çarpmayı unutmak.
  • Ölçümün değil hatanın türevini almak; her referans sıçraması motoru tekmeler.
  • İntegral doyma önlemeyi (anti-windup) atlamak ve motor doyumdan çıktıktan sonra devasa aşım görmek.
  • Önce K_i eklemek ve yanıtın neden yavaşça salındığını merak etmek; önce P ve D'yi ayarlayın.
  • Nicemlenmiş enkoder hızında filtresiz türev kullanmak; motor vızıldar.
  • Modlar arasında integrali sıfırlamadan veya önceden ayarlamadan geçmek; robot sarsılır.

Yazılım mühendisliği bağlantısı

Bir kontrol döngüsü gerçek zamanlı bir görevdir: gereksinimleri yalnızca "doğru çıktı" değil, aynı zamanda periyot, son tarih (deadline) ve titreşimdir (jitter). Ölçülen döngü periyodunu kaydedin ve kaçırılan bir son tarihi, başarısız bir assert gibi bir hata olarak ele alın.

  • Kazançlar kod değil yapılandırmadır: onları bir parametre dosyasında veya ROS 2 parametrelerinde tutun; böylece ayar yapmak yeniden derleme gerektirmez ve her ayar değişikliği sürüm geçmişinde görünür.
  • Bir kapalı döngü regresyon testi yazın: testte birinci dereceden bir sistemi simüle edin, bir basamak uygulayın ve aşım < %10, yerleşme süresi < 0,5 s olduğunu doğrulayın. Denetleyiciyi sessizce bozan bir yeniden düzenleme (refactor) böylece CI'da başarısız olur.
  • PID sınıfını donanım çağrılarından arındırın; böylece aynı kod testte, Webots'ta ve kartta çalışır.

Dönem projesi uygulaması: projenizdeki her denetleyici için, sayısal eşikleri kabul kriterlerinizden alınmış bir basamak yanıtı testi ekleyin.

Laboratuvar görevi

PID simülatörü: (1) Yalnızca P ile salınımın başladığı Kp değerini bulun. (2) Aşım %10'un altına inene kadar Kd ekleyin. (3) Bozucuyu (disturbance) 4'e ayarlayın ve hatayı gidermek için Ki ekleyin. (4) Integral doyumu önlemeyi (anti-windup) kapatıp karşılaştırın. Ardından çizgi izleyiciyi PD moduna alın ve en hızlı kararlı hızı bulun.

Kendini sına

  1. Bir döngü K_u = 4'te T_u = 0,8 s periyotla sürekli salınıyor. Ziegler–Nichols PID kurallarıyla paralel biçimdeki K_i nedir?

  2. DC kazancı 3 olan bir sistem K_p = 2 ile P kontrolü altında. Birim basamaktan sonraki kalıcı durum hatası nedir?

  3. Bir basamak yanıtının yükselme süresi kabul edilebilir ama %40 aşım yapıyor ve salınıyor. Önce neyi değiştirmelisiniz?

  4. Türev neden hata yerine ölçüm üzerinden hesaplanır?

Ödev

Farklı kazançlarla elde edilmiş dört basamak yanıtının ekran görüntülerini, her biri için kısa bir açıklamayla birlikte teslim edin. Çizgi izleyici için en iyi kazançlarınızı ve ulaştığınız hızı da ekleyin.

Bu haftanın donanımı (Hyvex)

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • TestlerimMini testler ve puanlarSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç