TurtleSim ile PID Kontrolü

Projenin GitLab Repo

Özet

Move Turtle, ROS’un TurtleSim’inde kaplumbağayı belirli koordinatlara (noktalar) hareket ettiren basit bir ROS python betiğidir. Bu proje, Colorado School of Mines (CSOM) CSCI473 dersi için bir sınıf projesi olarak başladı ve daha sonra kapalı döngü sistemlerinin nasıl oluşturulabileceğini öğrenmeme yardımcı olan bir projeye dönüştü; bu bilgi, CSOM’un İnsan Merkezli Robotik (HCR) Laboratuvarındaki çalışmalarımda bana yardımcı oldu.

Bağlam

Biraz arka plan vermek gerekirse, ROS Robot İşletim Sistemleri anlamına gelir. ROS, genellikle Ubuntu işletim sistemi ile eşleştirilen açık kaynaklı bir robotik ara yazılımdır ve bir robotik sistemin yazılım bileşenlerini/küme yönetimini daha iyi hale getirmek için kullanılır. ROS’u nasıl kullanacağınızı öğrenmek için ROS’un resmi wiki sayfasına göz atabilirsiniz. ROS’ta yazdığınız kod ya C++ ya da Python’dadır.

TurtleSim, ROS’un yeni kullanıcılarına ROS ve ROS paketlerine bir giriş olarak kullanılan basit bir 2D robot simülatörüdür. TurtleSim’in yaptığı tek şey, bir kaplumbağa ile basit bir 2D ekran açmaktır. O kaplumbağa “robot” olarak hareket eder ve o “robota” hareket etmesi ve/veya dönmesi için mesajlar gönderebilirsiniz. Kaplumbağa hareket ederken, TurtleSim basit bir şekilde gerçek dünya fiziğini simüle etmek için bazı rastgele hatalar üretir.

ROS ve TurtleSim’in ne olduğunu bildiğime göre, neden bunları kullanıyordum? 2020 Baharında, Colorado School of Mines’te “İnsan Merkezli Robotik” adında bir ders alıyordum. Bu ders, lisans bilgisayar bilimi ders yükümün bir parçasıydı. Ders, Dr. Hao Zhang tarafından veriliyordu. Ders üç projeden oluşuyordu ve ilk proje, ROS’u kurmak, ROS’u nasıl kullanacağınızı öğrenmek ve TurtleSim’deki kaplumbağanın bir M çizmesini sağlayacak bir açık döngü veya kapalı döngü algoritması uygulamaktan oluşuyordu. Orijinal proje tanımını BURADA görebilirsiniz.

Ders alırken, bu projeyi açık döngü algoritması uygulayarak tamamladım. Bu çözüm çalıştı ama gerçekten kötüydü ve “yeterince iyi” olan bir A çizdi ama “harika” olan bir şey değildi. Projeyi 2020 Şubat ortalarında teslim ettikten sonra, 2021 Şubatında bir yıl sonra kadar unuttum.

Zorluk

Şubat 2021’de, Colorado School of Mines’teki İnsan Merkezli Robotik (HCR) Laboratuvarında Araştırma Asistanı olarak işe alındım ve Dr. Hao Zhang’ın altında çalıştım. Laboratuvarın amacı, “uzun süre boyunca robotların çalışmasını ve uyum sağlamasını sağlamak” amacıyla “öğrenme süresince işbirlikçi özerklik” üzerine araştırma yapmaktır. 9-1-2022 (1 Eylül 2022) itibarıyla laboratuvar, Colorado School of Mines’ten Massachusetts Amherst Üniversitesi’ne taşındı. Ancak, orada çalıştığımda hala Colorado’daydılar.

HCR Laboratuvarında, Triton projesinde çalışmam istendi. Triton projesi, Triton adı verilen bir dizi robotu içeriyordu. Tritonlar, şu şekilde görünen üçgen omni tekerlek zemin robotlarıydı:

Tritonlar ile birlikte, OptiTrack tarafından yerleştirilen sekiz IR Kamerası vardı ve bunlar yerden birkaç feet yukarıda “sekizgen düzen” şeklinde yerleştirilmişti. Bu kameraları, Optitrack’ın Motive yazılımını, Windows 10 çalıştıran bir PC’yi ve ROS’u kullanarak, 2 metre x 2 metre x 2 metre (x, y, z) bir alan oluşturulmuştu; burada hareket yakalama işaretleyicilerine sahip nesnelerin gerçek dünya konumları belirlenebiliyordu.

Triton projesindeki ilk görevim, Triton robotunun belirli bir gerçek dünya konumuna hareket etmesini sağlayan betikler yazmaktı. O zamanlar bunu nasıl başaracağımı bilmiyordum ama CSCI473’te kapalı döngü sisteminin tanıtıldığı ilk projeyi hatırlıyordum, bu yüzden kapalı döngü sistemleri ve dolayısıyla geri bildirim sistemleri üzerine gerçekten araştırma yapmaya başladım.

Araştırma

Araştırmalarım sırasında, AerospaceControlsLab tarafından hazırlanan harika bir video keşfettim:

Bu videoda, bir PID sisteminin fikri gösterildi ve açıklandı. PID sistemi, gerçek dünyadan gelen verilere dayalı olarak belirli çıktı(lar) üreten bir kapalı döngü kontrol döngüsü sistemidir. Temel terimlerle, istenen değer ile ölçülen değer arasındaki farkı temel alarak çıktısını ayarlayan bir geri bildirim sistemidir. İşte bir PID kontrolörü için formül:

$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$

  • $u(t)$ kontrol sinyalidir.
  • $K_p$, $K_i$, $K_d$ sırasıyla orantılı, integral ve türev kazançlarıdır.
  • $e(t)$ hata sinyalidir (istenen ve gerçek çıktı arasındaki fark).
  • $\int e(t) dt$ zaman içindeki hatanın integralidir.
  • $\frac{de(t)}{dt}$ hatanın türevidir.

Daha fazla bilgi edinmek için AerospaceControlsLab’ın videosuna veya bu harika wikipedia makalesine göz atabilirsiniz; formül buradan alınmıştır.

Araştırmamı yaptıktan ve akıllı arkadaşlarımdan ve profesörlerimden yardım aldıktan sonra, Triton’un belirli bir koordinata ulaşmasına yardımcı olmak için Orantılı Kontrolör, P Kontrolörü kullanmanın en iyi yol olacağına karar verdim.

Triton bir zemin robotu olduğundan, yalnızca X ve Y koordinatlarıyla ilgilenmem gerekiyordu. Bunu bildiğim için, P Kontrolörü içinde ölçmem ve işlemem gereken istenen değerleri ve ölçülen değerleri belirlemem gerekiyordu. Araştırmamda, ROS wiki’de Hedefe Git adlı harika bir gönderi buldum; burada aşağıdaki hatalara odaklanmışlardı:

  • Mesafe Hatası: İstenen konum (X, Y) ile mevcut konum (X, Y) arasındaki mesafe farkı.
  • Theta Hatası: İstenen yön ile mevcut yön arasındaki fark.

Önerilen Çözüm

Bütün bunları bildiğimde, Triton’un belirli bir gerçek dünya koordinatına hareket etmesini sağlamak için Triton’un mesafe hatası ve hedef koordinat ile Triton’un mevcut koordinatı açısından theta hatası için bir Orantılı Kontrolör kullanmak gerektiği sonucuna vardım. Ancak bunu fiziksel bir sisteme uygulamadan önce, bu fikri bir simülasyonda test etmek istedim ve o zamanlar TurtleSim’i simülasyon olarak kullanmanın en iyi seçim olduğunu düşündüm.

Simülasyonda Test Etme

Teorik çözüm belirlendikten sonra, bunu gerçek dünya senaryosu yerine simülasyon aracılığıyla başlangıçta doğrulamayı tercih ettim. Gerçek dünya genellikle çözümün etkinliğini karmaşık hale getirebilecek gürültü ile doludur ve alakasız sorunlarla başa çıkmaya neden olabilir. Bunu kabul ederek, CSCI473 projemi yeniden gözden geçirdim ve bu teorik çözüm için bir test alanı olarak uyarladım.

Eski kodu ROS Melodic’ten ROS Noetic’e güncelledikten ve bazı yinelemeli iyileştirmeler yaptıktan sonra, önerilen çözümü TurtleSim’de çalıştırmayı başardım. İşlevselliğinin bazı harika hedef koordinat yollarıyla gösterimleri bu blog yazısının sonunda bulunabilir. Bununla ilgili tüm kodu BURADA görebilirsiniz.

Sonuç

Özetle, bu proje sayesinde TurtleSim kaplumbağası, kapalı döngü sistemi kullanarak belirlenen koordinatlara etkili bir şekilde yöneliyor ve 2020’deki ilk açık döngü sistemimden önemli ölçüde daha iyi performans gösteriyor. Başarıyla test edilen bu çözümü Triton robotlarıyla uyguladım. Ancak gerçek dünya gürültüsü beklenmedik sorunlar ortaya çıkardı ve haftalarca hata ayıklama ve gerçek dünya testi gerektirdi. O haftalardan sonra, nihayetinde Triton’u belirli gerçek dünya koordinatlarına ulaştırmayı başardım ve bunu TurtleSim’de test ettiğim çözümü kullanarak gerçekleştirdim. İşte TurtleSim’de test edilen yöntemle belirli gerçek dünya koordinatlarına hareket eden Triton’un bir demosu:

Geçmişe dönüp baktığımda, gerçek dünya fiziğini daha iyi simüle eden bir simülasyon kullansaydım keşke. TurtleSim öğrenmek için harika ama gerçek dünya robotik fikirlerini test etmek için pek iyi değil. O zamanlar, basit kullanım durumum için yeterince iyi olacağını düşündüm ama daha sonra bunun böyle olmadığı kanıtlandı.

Bu blog yazısının ana amacı, TurtleSim’deki kaplumbağanın ve dolayısıyla Triton robotlarının belirli hedef konumlara (X, Y) tam olarak yönelmesini sağlayan bir kapalı döngü sisteminin oluşturulmasını özetlemekti. Bu amacın gerçekleştirildiğine inanıyorum, ancak HCR Laboratuvarındaki çalışmalarımda bazı ilgi çekici noktalar kazanmış olabilir. Bunu bildiğim için, HCR Laboratuvarındaki iş deneyimimle ilgili daha fazla blog yazısı yapmayı planlıyorum…

Hareket Eden Kaplumbağa (TurtleSim) Demoları

Bu video aşağıdaki demoları içermektedir:

  • Cayley Nodal: Basit bir Cayley Nodal tasarımı
  • Daireler: Bir örümcek ağı gibi bir tasarım
  • İç Daireler: “Dairelerin içinde daireler” tasarımı
  • M: Çok basit bir M tasarımı