Mobot#
Makale: Cosku Acay, Edwin Cho, Kenneth Li ve Nishant Pol. PDF.
Proje Açıklaması#
Carnegie Mellon’un Mobot yarışmasında, robotlar bir açık hava kaldırımındaki 255 fitlik kavisli beyaz bir çizgi üzerine yerleştirilmiş 14 kapıdan oluşan bir diziden geçmelidir. Parkur, iki dik rampa ve robotun 14 kapıdan sıralı olarak geçmek için doğru rotayı seçmesi gereken bir karar noktası alanı içerir. Çizgi açık havada ve Pittsburgh’un hava koşulları altında olduğundan, robot çeşitli koşullarda çalışmalıdır. Bu yıl yarışma günü yağmurlu ve rüzgarlıydı. Daha fazla bilgi http://www.cs.cmu.edu/mobot/mobot.html adresinde bulunabilir


CMUcam4 ile Çözüm#
Çizgi takibi görevine CMUcam4 kullanarak yaklaşmayı seçtik çünkü minimum donanım gerektiriyordu ve bir çizgiyi izlemek için çok uygun bir arayüze sahipti.

CMUcam4, çizginin bir görüntüsünü saniyede 30 kare hızında yakalar ve renk izleme görüntüsünü üç Seri hattından biri aracılığıyla Arduino Mega’ya besler. Arduino Mega daha sonra bu görüntüyü işler (lütfen aşağıdaki Yazılım Açıklamasına bakın) ve başka bir Seri hat aracılığıyla PID kontrolcüsüne motor hızı ve dönüş komutları sağlar. PID kontrolcüsü karşılığında Arduino Mega’ya hem sağ hem de sol tekerlekler için enkoder sayımlarını sağlar, bu da 0 numaralı kapıya göre konumumuzu ve yönümüzü takip etmemize olanak tanır.
PID kontrolcüsü (MD-25), Birleşik Krallık’taki Robot-Electronics tarafından üretilmektedir. Motor mili manyetik enkoderlerine sahip iki dişli DC fırçalı motoru sürer. LCD ekran, hata ayıklama amaçlıdır. İki güç rayımız vardı, motorlar için 12V ve mantık için 5V, aynı toprağı paylaşan ve her ikisi de tek bir 12V şarj edilebilir pilden beslenen.
Başlangıçta, bizi hızlıca programlama aşamasına sokmak için ahşap bir tabandan bir prototip yapmayı, ardından bir RC araba gibi daha hızlı, daha güvenilir bir taban üzerinde çalışmayı planlamıştık. Ancak, prototipin çok güvenilir ve çalışması kolay olduğunu gördük, bu yüzden onu son tasarım için sakladık. Gövde için su geçirmezlik, bir paketleme bandı katmanının altında bir selofan sargı katmanından oluşuyordu. Ancak yağmur paketleme bandından sızdı ama neyse ki selofan sargıdan sızmadı. Kamera, bir Ziploc torbadan bir kare plastikle kaplandı çünkü “filtrenin” kameranın, kameraya arka plan betonu gibi görünen çizginin küçük parçalarını görmezden gelme yeteneğini iyileştirdiğini gördük.
Algoritma Açıklaması#
Arka Plan#
CMUcam4’ü YUV modu etkinken renk izleme modunda kullanıyoruz, bu da bize çizginin ikili görüntü temsilini verir. Kamera yazılımı, beyaz olmayan her şeyi (yani arka planı) filtreleyip çıkarır ve bir çizginin olduğu yere (beyaz olan yere) bir “açık” piksel koyar. Renk izlemenin ışığın yoğunluğuna duyarsız olması için YUV modunu kullanıyoruz, böylece robotumuz iç ve dış mekan dahil çok çeşitli koşullar altında çalışabilir.
Çizgi Takibi#
CMUcam4, Arduino çipimize 80’e 60’lık bir ikili görüntü sağlar. Görüntüden eşit aralıklı 10 piksel satırı örnekleriz ve “açık” piksellerin ağırlık merkezini hesaplarız (buraya bakın: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Ardından çizginin ağırlık merkezi üzerinde olduğunu varsayarız. Bunu görüntüdeki 10 farklı satırda yaparak, noktaları birleştirerek çizginin iyi bir yaklaşımını elde ederiz. Daha sonra çizgi üzerindeki her noktanın görüntünün merkezinde bulunan dikey çizgiden ne kadar uzakta olduğunu bularak çizginin ne kadar kavisli olduğunu temsil eden bir değer elde etmek için bu verileri kullanabiliriz. Bu, teğet çizgi ile bir eğri arasındaki alanı bulmak ve ne kadar dönmemiz gerektiğini belirlemek için o alanı kullanmak gibi bir şey olarak görülebilir. İşaret, dönüşün sola mı yoksa sağa mı olduğunu belirlerken, büyüklük çizgiyi takip etmek için ne kadar dönmemiz gerektiğini belirler. Beklediğiniz gibi, sıfır alan ölçtüysek, çizgi doğrudan robotun önündedir ve düz bir çizgidir. Alanın büyüklüğü büyükse, robotun bu alanın büyüklüğünü en aza indirmeye çalışmayı sürdürmek için dönmesi gerekir.
Karar Noktaları#
Robotun bir karar noktasında olup olmadığını belirlemek için, kameranın çizgi takibinden topladığı verileri alırız ve siyah alanda kaç ortalama merkez noktasının göründüğünü kontrol ederiz. Bu, iki çizgi arasındaki ortalama noktanın, çizgiler aynı çizgi olmadıkça, çizgilerin hiçbirinde olmaması gerektiği varsayımına dayanarak çalışır. Robot siyah alanda birden fazla ortalama nokta algılarsa, burada iki çizgi olması gerektiği sonucuna varabilir. Ardından uygun dönüşü seçer ve yalnızca bir çizgi görene kadar dönüşünü o yöne doğru eğilimlendirir.
Kodumuzun basitleştirilmiş bir sürümünü görmek için lütfen https://github.com/cacay/Mobot adresine gidin veya yerel bir kopya için buraya gidin.

