Python ile PID Kontrol Örneği

Ahmet Ataşoğlu
5 min readApr 23, 2020

Bu yazıda Python kullanılarak basit bir PID kontrol simülasyonu gerçekleştirilmiştir. Uygulamanın kaynak kodlarına buradan ulaşabilirsiniz.

PID Nedir?

PID (Proportional Integral Derivative — Oransal İntegral Türev); endüstriyel, mekatronik, robotik vb. sistemlerde kullanılan bir kontrol yöntemidir. Uygulanması ve modellenmesi görece kolay olduğu için yaygın olarak kullanılmaktadır.

PID kontrolün temel amacı: Bir giriş olarak referans değerini, kontrol edilecek sistemin değişkenlerinde meydana getirebilmektir. Referans değerini, sistemde kontrol etmek istediğiniz değişkenin bir temsili gibi düşünebilirsiniz. Örneğin; sisteminiz bir yolcu uçağı ve kontrol etmek istediğiniz değişkeni de uçağın irtifası olsun. Yolcu uçakları, yaklaşık 30–35 bin feet irtifada seyretmektedir. Bu durumda referans girişiniz, 30 bin veya 35 bin feet olacaktır.

PID kontrolün nasıl çalıştığını, aşağıdaki blok diyagramı üzerinden anlamaya çalışalım:

kaynak

Oklar sinyalleri, yani sayısal büyüklükleri göstermektedir. Soldan sağa sırasıyla sinyaller: r(t) referans, e(t) hata (kontrol girişi), u(t) kontrol çıkışı ve y(t) de sistem çıkışı sinyalidir. Kontrol sisteminin işletildiği her bir çevrimde; sistem çıkışı sinyalı olan y(t), referans sinyali olan r(t)’den çıkarılarak aradaki fark (yani hata sinyali e(t)) hesaplanır. Bu işleme geribesleme denilmektedir. Geribesleme devam ettikçe, hata sinyali ne kadar sıfıra yakınsarsa, kontrol sisteminin başarısından da o kadar bahsedilebilir.

PID kontrol sisteminin asıl çalıştığı yer, e(t) ve u(t) sinyalleri arasında kalan kısımdır. PID, adında da geçtiği gibi (oransal, integral ve türev), gelen hata sinyaline üç farklı matematiksel işlem uygular:

  • Oransal: hatanın Kp sabiti ile çarpılmasıdır.
  • İntegral: hatanın geçen zamana göre integralinin alınması ve Ki sabiti ile çarpılmasıdır.
  • Türev: önceki hata ile şimdiki hatanın, aradaki zamana göre türevinin alınması ve Kd sabiti ile çarpılmasıdır.

İşlemler yapıldıktan sonra toplamları alınır ve u(t) çıkış sinyali olarak kontrol edilecek sisteme verilir. Kp, Ki ve Kd sabitleri, bu üç işlemin kontrol sistemindeki ağırlıklarını belirtmektedir. Dolayısıyla optimum değerleri, kontrol edilecek sisteme göre veya kontrol sisteminden beklentilere göre değişmektedir.

Kontrol sistemini bu şekilde oluşturduktan sonra; u(t) sinyali olarak üretilen kontrol çıkış değerini, kontrol edilecek sistemin giriş değeri olarak kullanabilirsiniz. Sistemin giriş değeri, yukarıdaki uçak örneğinden devam edersek, uçağın düşey pozisyonunu belirleleyen flapların kumandasında kullanılacak bir değer olabilir. Tabii sistemi simüle etmek istersek, kontrol edilecek sistemin kendisi yerine matematiksel modelini de kullanmamız mümkün.

Özetlersek: Uçağımızı istediğimiz bir irtifada tutmak istiyoruz (referans girişi). PID kontrolcüsüne bu irtifayı veriyoruz ve bunu sağlayacak en uygun flap parametrelerini (kontrol çıkışı) üretmesini istiyoruz. Uçak bu parametrelere göre yer değiştirdikçe, PID kontrolcüsüne uçağın mevcut irtifasını söylüyoruz (geribesleme). İşlemleri bu şekilde sürekli çevrim haline getirdiğimizde; hatayı sıfırlayacak, yani uçağı istediğimiz irtifaya getirecek PID kontrolünü sağlamış oluyoruz.

Python Uygulaması

Basit bir kontrol problemiyle, PID kontrolü Python üzerinde uygulamayı deneyelim. Uçak örneğine benzer olarak, bu kez bir helikopterin irtifasını kontrol etmeye çalışalım. Aşağıdaki grafikte, helikopter pervanesinin ivmesine göre yerden yüksekliğindeki değişim görülmektedir. Bu grafiği sistemimizin matematiksel modeli olarak kabul edelim.

Açısal ivme — yer değiştirme ilişkisi.

Grafikteki eğrinin denklemi ise:

Sistemi temsil edecek bir model de elimizde olduğuna göre, artık Python ile kontrol sistemimizi simüle etmeye geçebiliriz.

  • Öncelikle kontrol sistemini basit bir sınıf olarak oluşturalım.
  • Parametre olarak sırasıyla: Referans değerini, örnekleme zamanını (yani kontrolün kaç saniyede bir gerçekleşeceği) ve PID sabitlerini alsın. Aşağısındaki fonksiyonları, kendi çalışmalarında kullanmak isteyenler için, sınıf değişkenlerine atama yapan ve tuttuğu değerleri geri döndüren get-set fonksiyonları şeklinde tanımladım. Çok temel işlemler yaptıkları için detaylarına girmiyorum. Fakat clear fonksiyonuna göz atarsak:
  • A değişkeni, oluşan hatanın zamana göre integralini tutacaktır. Bunu hesaplamak içinse, şimdiki hata ile önceki hatayı yamuğun alanı formülüne işleyeceğiz. Çünkü bildiğiniz gibi, integral aslında bir eğrinin veya doğrunun altında kalan alanı verir. Dolayısıyla yaptığımız geometrik alan hesabı, aslında şimdiki ile önceki hatanın geçen zamana göre integralidir. Her çevrimde bu işlemi yapıp, sonucunu da A değişkeninde biriktirerek, sonuçta hatanın toplam çalışma zamanına göre integralini elde etmiş oluruz. last_err ise, son çevrimdeki hata değerini tutacaktır. clear fonksiyonunu, kontrol sistemini yeniden çalıştırmak istediğimizde kullanabiliriz.
  • Son olarak, kontrol çıkışını ve sistem cevabını üretecek fonksiyonu one_shot adı ile oluşturalım:
  • Fonksiyon, geribesleme sinyali olan fb_value ile her çalıştırıldığında kontrol çıkışını üretecektir. PID kontrolünü uyguladıktan sonra, last_err değişkenine şimdiki hatayı atayacaktır. Son olarak, sistem modelini temsil eden fonksiyona, kontrol çıkışını girdi olarak verecektir. Artık sistem çıkışı, fonksiyondan geri döndürülen değer olacaktır.
  • Kontrol sınıfını oluşturduk. Şimdi problemimizi çözümlemeye geçebiliriz. Öncelikle parametrelerimizi oluşturalım.
  • Referans değerimiz (ref), yani istenilen irtifamız 50 m olsun. PID parametreleri, Kpid listesine şekildeki gibi girilmiştir. dt örnekleme zamanı, h0 helikopterin ilk yüksekliği ve step ise toplam çevrim sayısıdır. Sistem modeli ise, bir fonksiyon olarak sys_model değişkeninde tutulmaktadır (lambda komutu, Python’da tek satırda fonksiyon oluşturmaya yarayan bir komuttur).
  • Yukarıda oluşturduğumuz sınıftan ctrl adında bir nesne türettik. Ardından sistem modelini de ilgili fonksiyonla nesneye aktardık. output listesi, helikopterin PID kontrol sonrasındaki konum değerlerini tutacaktır. Belirlenen çevrim sayısı kadar dönecek bir döngü içinde, şekildeki gibi kontrol sistemimizi uyguluyoruz. x değişkeni, her çevrimde sistem cevabını, yani helikopterin ne kadar yer değiştirdiğini tutuyor ve bunu, önceki konumuna ekleyerek output listesine aktarıyor.
  • Elde edilen sonuç:

Görüldüğü gibi sistem çıkışı olan helikopter irtifası, zaman geçtikçe belirlediğimiz referans değere yaklaşmaktadır. Yani helikopteri, belirlediğimiz süre içinde istediğimiz irtifaya çıkaramadık ama en azından ona yaklaştırabildik.

Kontrolün geliştirilmesi, referans değere daha kısa sürede ulaşması gibi şeyler ayrı bir incelik. Umarım PID kontrolün temel mantığını aktarabilmişimdir.

Bir başka yazıda görüşmek dileğiyle.

--

--