Sürünmeyi Öğrenen Robot

Başlatan Tagli, 15 Ocak 2011, 19:16:03

Tagli

Aldığım bir ders kapsamında bir arkadaşla birlikte yaptığımız dönem ödevi olan projeyi sizlerle paylaşmak istiyorum. Öğrenci mantığı hiç değişmiyor, her zamanki gibi bu da son güne kalmış türden bir projeydi. Neyse ki çok sinirimi bozan "İmdat! Ödevim var yardım edin!" tarzı bir başlığa gerek kalmadan işi bitirdik :) Şaka bir yana, dersten kalmak pahasına da olsa asla böyle bir başlık açmazdım burada. Robotun yapımı yaklaşık 1 hafta sürdü ve son derece derme çatma oldu. Ama amaç zaten sağlam bir şey yapmaktan çok dersi kurtarmaktı.

Projeyi özetlersek, robotun iki eksenli bir kolu var ve bunu kullanarak hareket etmeyi öğrenmesi gerekiyor. Başlangıçta ne yapması gerektiği konusunda hiçbir fikri yok. Arkadaki tekerleğine bir encoder bağlı, ve yaptığı hareketlerin sonuçlarını bunun sayesinde gözlemleyebiliyor. Kolunu ise 2 adet hobi servo ile hareket ettiriyor.

Öğrenme işi Q-Learning olarak bilinen bir algoritma ile yapılıyor. Yaptığımız denemelerde bir türlü ileri gitmeyi öğretemediğimizden biz de geri gitmeyi öğrenecek şekilde yazdık kodunu. Robot geri gittikçe, encoderden gelen değer ödül, aksi durumda ise ceza olarak algılanıyor. Robot deneme yanılma yöntemi ile zaman içinde yapması gereken doğru hareketleri ve sıralarını öğrenerek geri gitme hareketini gerçekleştiriyor.

Son denememizin videosunu da çektik. Çok eğlenceli birşey beklemeyin, muhtemelen sıkıcı da bulacaksınız. Amaç nasıl birşey olduğu konusunda fikir vermek.


Projede PIC18F2550 kullandık. Sebebi ise çok basit: Elimizde o vardı, böylece yeni PIC almamız gerekmedi. Öte yandan derleyici seçenekleri ve yüksek hafıza gereksinimi düşünüldüğünde 16 serisi bir PIC ile bunu yapmak pek de mümkün değil gibi. Mümkünse de uğraşmaya değmez.

Daha önce de belirttiğim üzere zorla yetişen bir ödev olduğundan üzerinde çok fazla çalışma yapmadık. Videoda da gözüktüğü üzere robot çevresindeki değişikliklere uyum sağlayamıyor. Bunun sebebi, "keşif oranı" olarak bilinen katsayının 0'a yaklaşması sebebiyle öğrenmenin ardından farklı yolları aramayı bırakması.

Birilerinin olduğu gibi alıp bir başka yere ödev olarak vermemesi amacıyla kodu paylaşmıyorum. Ancak sorularınız üzerine her türlü ayrıntıyı anlatabilirim. Kod C18'de yazıldı ve aynı zamanda C18'de yazmış olduğum ilk kod olma özelliğini de taşıyor; belki yakın tarihlerde C18 ile ilgili açtığım başlıklar dikkatinizi çekmiştir, ki onlar bu projeye yönelik sorulardı. Normalde assembly ile de bu işe girişirdim, C kullanmamın en belirgin sebebi assembly'de floating point verilerle uğraşmak istememem. Zaten o işe girseydim ödev yetişmeyecek, biz de muhtemelen dersten kalacaktık.
Gökçe Tağlıoğlu

CoşkuN

İlginç bir çalışma olmuş. Hangi ders içindi bu ödev?

LukeSkywalker

Öğrenen yapay zekalara hep büyük bir ilgim olmasına rağmen üzerinde çalışma yapmadım hiç. Temel olarak bu tür bir şeyden başlanabilir zannedersem.

Tagli

#3
Intelligent Systems & Soft Computing. Derste yapay sinir ağları ve bulanık mantık üzerinde durduk. Projede ise soft computing üzerine bir çalışma veya araştırma sunmamız istendi, konu bize bırakıldı. Biz teoriye pek girmeyip, fiziksel dünyada uygulamasını göstermek istedik. Zaten fiziksel çalışma yapan tek grup bizdik. Diğer arkadaşların bir kısmı simülasyon yaparken bir bölümü de makaleler üzerinden araştırma yaparak sunum yaptılar.

Ayrıca, daha önce lisans döneminde bu tür bir çalışma yapmış, Java'da ufak bir oyun, daha doğrusu simülasyon hazırlamıştık. Ancak o programın öğrenme işini yapan "agent" bölümünü değil, geriye kalan kısımlarını ben yazmıştım.

Bu arada, robotta uygulanan Q-Learning'in, ne yapay sinir ağlarıyla ne de bulanık mantıkla bir ilgisi yok. Kendisi "Reinforcement Learning" olarak anılan bir kategoriye giriyor.
Gökçe Tağlıoğlu