Python ile PID Kontrol Örneği

PID Nedir?

kaynak
  • 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.

Python Uygulaması

Açısal ivme — yer değiştirme ilişkisi.
  • Ö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ç:

--

--

--

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Ahmet Ataşoğlu

Ahmet Ataşoğlu

More from Medium

THE POWER OF WORDS

Plugging My Ears and Crying in a Corner: Radiohead’s Unlistenable “Street Spirit”

Thy kingdom come

Jesus standing before Pilate

Welcome to the Year of the Tiger