Teknofest Robotik Fetih 1453 Yarışması Robotu
Herkese merhaba. Ben Vedat ÖZLÜ. 2019-2020 yılları arasında Teknofest yarışmasının Robotik Fetih 1453 kategorisine arkadaşımla beraber takım olarak başvurduk. Ön elemeleri ve Raporlama aşamalarını geçtiğimiz takdirde Eylül ayında İstanbul’a gidip robotu parkur üzerinde yarıştıracağız. Robotun elektronik ve mekanik aksanıyla daha çok takım arkadaşım ilgilenirken robota kodlanacak yazılımın oluşturulması ile de ben ilgilenmekteyim. Elfatek Elektronik’te yaptığım staj süresi boyunca robotun yazılım algoritmasının oluşturulması ve test edilmesi ile alakalı çalışmalar yaptım. Bugün, yaptığım çalışmalar hakkında faydalı olabileceğini düşündüğüm bazı bilgileri sizinle paylaşacağım.
Öncelikle Teknofest yarışması, yarışmacı olarak katıldığımız Robotik Fetih 1453 kategorisi ve robotumuzun mekanik sistemi hakkında biraz bilgi vermek istiyorum.
TEKNOFEST İSTANBUL Havacılık, Uzay ve Teknoloji Festivali; Ocak 2017 tarihinde hayata geçen ve Türkiye’nin millî teknoloji hamlesini gerçekleştirmesi ve teknoloji üreten bir topluma dönüşmesini temel hedefi olarak benimseyen Türkiye Teknoloji Takımı Vakfı (T3 Vakfı) ve T.C. Sanayi ve Teknoloji Bakanlığı öncülüğünde, Türkiye’nin önemli kurum ve firmalarının destekleriyle düzenlenen bir yarışmadır.
Robotik Fetih 1453 kategorisinin amacı Fatih Sultan Mehmed’in gemileri karadan yürütme olayına itafen belirli görevleri tam otonom olarak yapacak robotların tasarlanıp yarıştırılmasıdır.
Robotun tamamlaması gereken görevler aşağıdaki gibidir.
Birinci bölgedeki başlangıç noktasına bırakılan robotun su üzerinde yeşil ve kırmızı renkte bulunan maket gemilerin her defasında bir gemi almak şartı ile yeşil gemileri alıp iki mavi kule arasında bulunan hareketli band üzerine bu gemileri tek tek bırakılması ve gemilerin ikinci bölgeye bu şekilde taşınması istenmektedir. Bütün yeşil gemilerin ikinci bölgeye taşınması zorunlu değildir; en az bir yeşil geminin ikinci bölgeye hareketli band vasıtasıyla taşınması gerekmektedir.
Gemi taşıma işleminden sonra robotun hareketli band üzerine çıkıp band vasıtasıyla ikinci bölgeye geçiş yapılması istenmektedir.
Daha önce robotta tasarlanan atış sistemi ile 3cm çapında ve maksimum 100 gr olabilecek küre formunda nesnelerin gülle olarak kullanılıp ikinci bölgede bulunan 40 cm yüksekliğe 100 cm genişliğe sahip kırmızı renkteki maket tuğlalardan yapılan surun en az bir tane tuğlasının devrilmesi istenmektedir.
Tüm bu görevler tam otonom olarak yapılacak olup yarışmacının uzaktan kumanda sistemi kullanması yasaktır.
Şimdi bu yarışmada kullanacağımız robotun mekanik tasarımı hakkında bilgi vermek istiyorum. Öncelikle robotun su üzerinde yüzebiliyor olması gerekmektedir. Bu sebeple genelde gemi formunda pervane-dümen kontrollü robot tasarımı tercih edilmektedir.
Biz ise gemi formunda değilde paletli tank tarzında bir robot yapmaya karar verdik. Robotun su üzerinde durabilmesi için palet olarak içi hava dolu bisiklet iç lastiği kullanmayı uygun gördük. Palet hareket edince suya karşı itki kuvveti oluştursun diye de palet üzerine stoperler yapacağız. Gülleleri fırlatmada kullanılacak atış mekanizmasında ise lastikli sapan sistemini kullanacağız. Robotun bilgisayar ortamındaki çizimi aşağıdaki gibidir.
Yeşil renkteki gemileri toplaması için robotun alt tarafında dc motor yardımı ile ileri-geri yönde hareket edebilen bir band sistemi tasarladık.
Evet. Şimdi de yazılım aşamasına geçelim.
Sizin de tahmin ettiğiniz gibi bu robotta görüntü işleme tekniklerini çok fazla kullanacağız. Robot için oluşturduğum algoritmanın mantığını anlatmadan önce robotun başlangıçta yapmasını istediğim stratejik bir hareketi sizinle paylaşmak istiyorum.
Robotun yeşil gemileri alıp iki mavi kule arasındaki hareketli band üzerine bu gemileri düzgün bir şekilde bırakabilmesi için şu şekilde bir yol izleyeceğim. Su üzerinde durabilecek küre formunda hafif bir nesneyi birinci bölgede kuleleri tam karşıdan gören bir noktaya referans noktası olsun diye robot yardımı ile bırakmayı planlıyorum. Aklınıza hemen şu soru gelebilir :
“Peki ya bu nesne su üzerinde bıraktığın noktadan farklı bir noktaya hareket ederse ne olacak ?”
Bunun önüne geçmek için gemilerde kullanılan demir atma sistemine benzer bir sistem kullanacağım. Suyun derinliği 20cm. Eğer bir ucu nesneye diğer ucu bir ağırlığa bağlı 18-20cm civarında bir ip kullanırsam nesnenin, suya bıraktığım noktanın dışına hareket etmesi engellenecektir.
Toparlayacak olursak robot start aldığında robotun ilk olarak yeşil gemilere değilde mavi kuleleri tam karşıdan gören bir nokta hareket etmesini sağlayacağım. Uygun noktaya gelen robot, üzerinde bulunan referans nesnesini bağlı olduğu ağırlıkla beraber suya bırakacak. Bu noktadan sonra robot yeşil gemiyi alıp tekrar bu referans nesnesinin yanına gelecek ve oradan da hareketli bandın üzerine gidip bu band üzerine yeşil gemiyi bırakacak. Gemi bırakma işleminden sonra robot tekrar referans nesnesine gidip oradanda gemi alma işlemine devam edecek. Bu işlemler band üzerine ikinci yeşil gemi bırakılıncaya kadar devam edecek.
Daha önce de belirttiğim gibi robotumuzun hareket algoritmasında opencv görüntü işleme kütüphanesinin çok fazla kullanacağız. İlk olarak, robotun start alması ile kuleleri tam karşıdan gören noktayı bulmasını sağlayan algoritmanın mantığını anlatalım. Yarışma parkurundaki mavi kulelerin ölçüleri verildiğinden ben de mukavva ile aynı ölçülerde iki tane kule yapıp farklı açılardan bu kulelerin fotoğrafını çektim ve bu fotoğraflardaki farklılıkları inceledim.
Yukarıda mavi kulelerin sol, orta ve sağdan çekilmiş fotoğraflara bakıldığında;
# Kulelere sol taraftan bakıldığında sol kulenin görüntüdeki yüksekliği sağ kulenin yüksekliğinden daha fazla
# Kulelere sağ taraftan bakıldığında sağ kulenin görüntüdeki yüksekliği sol kuleninkinden daha fazla
# Kulelere karşıdan bakıldığında ise sağ ve sol kulenin görüntüdeki yükseklikleri birbirine eşit gibi görünüyor.
Bu farklılığı kullanarak robot üzerindeki kameranın kuleleri görmesi durumunda robotun kulelere göre konumunu bulması mümkün olacaktır. Ben kodlamayı python dilinde yaptım. Burda kodları paylaşmak yerine kodlamanın mantığını anlatacağım. Siz de aynı mantığı farklı programlama dillerinde kullanabilirsiniz. Tabi aşağıda anlatacağım mantığı uygulayabilmeniz için daha önceden görüntü işleme hakkında bilginizin olması gerekmektedir.
Kuleler mavi renkte olduğundan kulelerin ikisi görüntüye girene kadar robotun kendi etrafında döndüğünü ve kameradan görüntü aldığını farz edelim. Mavi kuleler görüntüye girdikten sonra robot hangi kulenin sol tarafta hangisinin sağ tarafta olduğunu şu şekilde belirleyecektir.
Robotun aldığı görüntüdeki piksellerin koordinatı sol üst köşeden başlamaktadır. Yani sol üst nokta (0,0) noktasıdır.
Görüntüye giren mavi kulelerin x eksenindeki değeri küçük olan sol tarafta büyük olan ise sağ tarafta olmuş olur.
Sağ ve sol kuleler belirlendikten sonra şimdi ise robotun kuleleri tam karşıdan gören noktaya nasıl geleceğine bakalım.
Eğer sol kulenin yüksekliği sağ kulenin yüksekliğinden büyükse; robot kulelerin sol tarafındadır ve sağa doğru ilerlemelidir.
Eğer sağ kulenin yüksekliği sol kulenin yüksekliğinden büyükse; robot sağ taraftadır ve sola doğru hareket etmelidir.
Bundan sonrasına dikkat. Eğer iki kulenin yüksekliği eşitse robot karşıdadır diye bir hataya düşmeyin. Çünkü bu şekilde bir kodlama neticesinde iki kuleninde görüntüdeki yüksekliklerinin piksel piksel birbirine eşit olması gerekir ki robot kulelerin tam karşı noktasına geldiğini bilebilsin. Bu da oldukça çok zor bir ihtimaldir. Onun yerine şöyle bir yol izlemeyi uygun gördüm.
Eğer yüksekliği büyük olan kulenin yükseklik değeri ile yüksekliği küçük olan kulenin yükseklik değeri farkı, büyük olan kulenin yükseklik değerinin otuzda birine eşitse robot artık kulelerin karşısına geçmiştir.
Böyle bir kodlama ile robot, kulelerden farklı uzaklıklarda olsa bile hesaplama, o an görüntüde algılanan kulelerin yüksekliğine göre yapılacağından herhangi bir problem oluşmayacaktır.
Bu şekilde robot, kuleleri tam karşıdan gören noktaya geldiğinde üzerindeki referans topunu suya bırakacaktır. Bundan sonra da robot kamerası ile yeşil gemilerin bulunması ve bu gemilerin hareketli band üzerine indirilme işlemi yapılacaktır.
Yeşil gemileri kamera ile algılarken, o an robota en yakın yeşil gemiye kamerayı odaklayacağız. Bunu şu şekilde yapabiliriz.
Yeşil gemilerin ölçüleri standart ve aynı olduğundan görüntüde o an alanı en büyük görünen gemi robot kamerasına en yakın olan mesafedeki gemidir. Bir değişken içerisinde en büyük alana sahip geminin koordinatlarını sakladıktan sonra bu gemiyi x ekseninde kamerada ortalıyoruz. X ekseninde ortalama işini robotun sağ ve sol tarafa hareketleri ile yapıyoruz.
Ortalama işleminden sonra robot geminin üzerine doğru ilerliyor. Robot içerisinde bulunan renk sensörü ile içeriye gemi alındı mı ? alınan gemi yeşil mi ? gibi sorguları kolayca yapabiliyoruz. Gemi alma işleminden sonra robot kendi etrafında dönüp daha önce suya bıraktığımız referans topunu bulma işlemini gerçekleştirecek. Biz topun rengini beyaz olarak belirledik. İlerki zamanlarda daha iyi sonuç verebilmesi için başka bir renk tercihide yapabiliriz. Biz beyaz üzerinden anlatalım. Yeşil gemiyi bulup yönelme işlemini nasıl yaptıysak aynı işlemi beyaz referans topu için de yapıyoruz. Referans topuna ulaştıktan sonra robot mavi kuleleri bulup kulelerin ortasında bulunan hareketli banda içerisindeki yeşil gemiyi bırakıyor. İkinci yeşil gemi de hareketli band üzerine bırakıldıktan sonra robot hareketli band üzerine çıkacak ve bu bandın vasıtasıyla robot ikinci bölgeye inecektir. İkinci bölgede robot kamerası ile kırmızı renkteki surun bulunması için robot etrafında dönmeye başlar. Akıllara şu soru gelebilir.
“Peki robot kırmızı sur yerine kırmızı gemilere odaklanırsa ne olacak ? “
Bu problemi aşmak için kırmızı rengi filtrelerken belirli bir alan değerinin altındaki kırmızı nesneleri görüntü içerisine almayacağız. Örneğin “alanı 200 den küçük olan kırmızı nesneleri görüntüye alma!” gibi bir kodlama yapıldığında çok büyük boyutta olan surun dışındaki kırmızı gemileri kamera görmeyecektir. Görüntüye giren surun x ekseninde kamerada ortalama işlemi yapıldıktan sonra sura doğru 1 metre kadar hareket edilir. Bundan sonra atış sistemi ile bir atış yapılır. Her atıştan sonra surun orta noktasına kamera ile ortalama işlemi tekrarlanır. Tüm atışlar yapıldıktan sonra robot kendini kapatır.
Evet arkadaşlar, umarım bu yazımda anlattıklarım sizin için faydalı olmuştur. Herkese iyi çalışmalar …