LEGO (Mindstorms) uzerinde Avuc-ici bilgisayarlarinin kullanimi:

Danseden robotlar projesi

Giriş

2004 yaz stajımızı ODTU-Bilgisayar Muhendisliği KOVAN Araştırma Laboratuvarında tamamladık. KOVAN'daki çalışmalar özellikle "Oğul Robotik" alanında yoğunlaşıyor. Stajımız boyunca, biz de, robotlar inşa edip proglamlayarak, ileride KOVAN'da yapılacak çalışmalarda kullanılacak bir model oluşturmaya çalıştık.

KOVAN'la ilgili daha ayrıntılı bilgi için internet sitesine bakabilirsiniz.

Amaç

Çalışmamızda amacımız birbirlerini arayıp bulacak iki robot inşa etmek ve bunları programlamaktı. Elbette, bu robotların birbirleriyle iletişim içinde olmaları gerekiyordu. Biz bu iletişim için kızılötesi kullandık, ancak ileride bluetooth veya wireless iletişim de kullanılabilir. Robotların yapımı için elimizde olanlar şunlardı:
  • iki adet LEGO MINDSTORMS RIS seti
  • iki adet HP JORNADA Avuç-içi Bilgisayar
Bunların yanısıra iki adet ara kabloyu da kendimiz yaptık.

Temel Yapı

Robotlarımızın temelini LEGO MINDSTORMS setleri oluşturuyor, ve onların üzerine JORNADA Avuç-içi bilgisayarlar(AİB) oturtuluyor. Burada MINDSTROMSlar 'köle' olurken, biz onları AİBler aracılığıyla kontrol ediyoruz.


LEGO MINDSTORMS Genel Tanıtımı

LEGO MINDSTORMS RIS robot yapmak için kullanılan bir set. Bu set RCX olarak adlandırılan (Hitachi H8/3292 mikroişlemcili) programlanabilir bir parça, ve TECHNICS olarak adlandıılan diğer alışılmış LEGO parçalarından oluşuyor.

RCX üzerinde 3 giriş, 3 çıkış ve bir kızıl-ötesi alıcı/verici bulunuyor. Girişlere bir takım alıcılar bağlayarak, RCX'inizin dış dünyadan haberdar olmasını sağlayabiliyorsunuz. LEGO tarafından sunulan pek çok çeşit alıcı mevcut, ancak RIS paketiyle birlikte bunlardan ikisi geliyor. Diğer alıcılardan kullanmak istiyorsanız bunları ayrıca satın almanız gerekiyor. Paketle birlikte gelen alıcılar iki adet dokunma alıcısı ve bir adet ışık alıcısı. RCX üzerindeki 3 çıkışı da motorlara bağlayarak, robotunuzun hareket etmesini sağlayabiliyorsunuz.

TECHNICS parçaları ise robotun geri kalanının inşası, ve RCX'in alıcılara, motorlara, tekerlere bağlanmasında kullanılıyor. Robotun inşası için setle birlikte gelen kılavuzda çeşitli örnekler gösteriliyor, ancak yaratıcılığınızı kullanarak çok sayıda değişik tasarım inşa edebilirsiniz. İnternette de pek çok farklı tasarım örneği mevcut.

RCX programlanabilir bir LEGO parçasıdır. RCX'i programlamak için paketle birlikte gelen CD'deki resmi yazılımı kullanabilirsiniz. Burada, görsel bir platformda LEGO parçası görünümündeki şekilleri sürükleyip bırakarak bir akış şeması oluşturuyorsunuz. Ancak bu daha çok çocukların kullanabilmesine yönelik olarak hazırlanmış bir program olduğundan, deneyimli programcılar memnun kalmayabilirler. Neyse ki, pek çok başka alternatif de var. Scheme'den Java'ya, popüler olan neredeyse bütün programlama dilleri için derleyiciler ve bunların kullanımını sağlayan bellenimler(firmware) mevcut. Bu derleyicileri geliştirenler LEGO değil, dünyanın çeşitli yerlerindeki MINDSTORM kullanıcıları, ki ileride bu konudan daha fazla sözedeceğiz. İster resmi yazılımı kullanın, ister diğerlerini, yazdığınız programları çalıştırmak için RCX'inize yüklemeniz gerekiyor. Bunu kızıl-ötesi (KÖ) kuleyi kullanarak yapıyorsunuz. KÖ kule masaüstü bilgisayarınıza seri kapıdan (RS232) bağlanıyor (Yeni RIS paketlerinde kuleler, USB'den de bağlanabiliyor). Programı yüklemek için kuleyi RCX'in KÖ alıcısının önüne yerleştirmeniz gerekiyor.

Söylediğimiz gibi, LEGO MINDTORMS resmi bir yazılım geliştirme paketi ve resmi bir bellenimle geliyor. RCX'e herhangi bir program yüklemeden önce bu bellenimi yüklemeniz gerekiyor. Eğer RCX'in pillerini çıkarırsanız bellenimle birlikte yüklenmiş programlar da silinecektir. Bu durumda yine herhangi bir programdan önce bellenimi yüklemelisiniz. Bunlar aynı şekilde resmi olmayan bellenimler için de geçerli. Resmi olmayan bellenimlerin nasıl yükleneceğini öğrenmek için kullanmayı düşündüğünüz derleyici-bellenim çiftinin belgelerine bakmalısınız.

LEGO MINDSTORMS'un çıkışıyla beraber, çocukların yanı sıra, tüm dünyadan robotik hayranları da ilgilerini bu ürüne yönelttiler ama bu kişiler resmi yazılımın onlara sunduğuyla yetinmek istemiyorlardı. Kekoa Proudfoot'un RCX'lere ters mühendislik uygulayarak alt yapılarını ortaya çıkartması, pek çok yeni yazılımın da yolunu açmış oldu. Artık internet MINDSTORMS'lar hakkında sayfalarla dolu. Bunlardan sadece birkaçı:

http://graphics.stanford.edu/~kekoa/rcx/ Kekoa Proudfoot’un RCX detayları hakkındaki sayfası
http://www.crynwr.com/lego-robotics/ Faydalı bilgilere ve pek çok bağlantıya sahip bir sayfa
http://lejos.sourceforge.net Java tabanlı mindstorms belleniminin sayfası
http://www.lugnet.com/robotics/rcx/ Faydalı bilgiler bulabileceğiniz haber grupları
http://www.legomindstorms.com/ Resmi LEGO Mindstorms sayfası

HP JORNADA 548 Avuç-İçi Bilgisayar Genel Tanıtımı

HP JORNADA 548, robotlarımızın 'beyni' olarak kullandığımız avuç-içi bilgisayarlar. İşletim sistemi olarak Windows CE (Windows'un AİB'lerde çalışmak üzere üretilen versiyonu) kullanan JORNADA'ların mikroişlemcileri Hitachi SH3 ve 32MB RAM'e sahipler. Girdi/Çıktı için varsayılan olarak irDA kullanan bir KÖ kapısı, bir RS232 seri kapı ve CompactFlash Tür 1 kart slotuna sahipler. JORNADA, hem pilleri şarj etmek hem de veri yüklemek için kullanılan bir kızağa sahip. Bu kızağı masaüstü bilgisayarınıza USB aracılığıyla bağlayabiliyorsunuz.

Yazılım geliştirmek için Embedded Visual C++, Embedded Visual Basic, veya SuperWaba (Java programcıları için) gibi farklı yazılım geliştirme paketlerini kullanabilirsiniz. Biz Embedded Visual C++ kullandık.

Daha fazla bilgi için HP JORNADA'nın resmi sitesine bakabilirsiniz.


Tasarım Fikirleri

Birbirlerini bulan ve iletişim kurabilen robotlar yapma amacımıza ulaşabilmek için çeşitli tasarım fikirlerini değerlendirdik. Yapmamız gereken, AİB'lerin robotun ana donanımını oluşturan LEGO MINDSTORMS'a  komut gönderebildiği, aynı zamanda diğer robotlarla iletişim kurabildiği bir sistem tasarlamaktı.

İlk tasarım fikrimiz hem alttaki MINDSTORM'u kontrol etmek için hem de diğer robotla iletişim kurmak için AİB'lerin üzerindeki KÖ kapılarını kullanmaktı. Bir ayna yardımıyla, KÖ ışınlarının alta veya karşıya gitmesi sağlanacaktı. Ayna, RCX'in seri kapısından kontrol edilen bir motor aracılığıyla hareket ettirilecekti. "yukarı" ve "aşağı" olarak iki durumda bulunabilecek ayna, yukarıdayken AİB'den gelen KÖ sinyal aynadan yansıyacak ve alttaki RCX'e ulaşacaktı. Bu durumda KÖ, robotun üst(AİB) ve alt(MINDSTORMS) parçaları arasındaki iletişim için kullanılacaktı. Ayna aşağıda olduğunda KÖ sinyal engellenmeden etrafa yayılacak ve, eğer varsa, etraftaki diğer robotun AİB'sinin üzerindeki KÖ kapısına ulaşacaktı. Bu durumda KÖ iki robotun iletişimi için kullanılmış olacaktı.

Bu tasarımda KÖ kapı, hem robotlar arasındaki iletişim için, hem de robotun kendi donanımına komut vermek için kullanılıyordu. Ancak aşağıdaki dezavantajlara sahipti:
  • Aynanın hareket ettirilmesi, bir motor ve karmaşık bir mekanik sistem gerektirecekti.
  • Aynanın oynatılması nispeten yavaş olacağından bütün iletişim sisteminin hızını önemli ölçüde azaltacaktı. Robotun alttaki donanıma komut göndermesiyle karşıdaki robota mesaj göndermesi arasında bir bekleme süresi olacaktı.
  • Motoru hareket ettirecek enerji kaynağı robota fazladan bir yük getirecekti. Ya da, RCX'in pillerinin kullanılması durmunda, robotun pil ömrünü kısaltacaktı.

İkinci tasarım RCX'e, üzerindeki girdi kapıları aracılığıyla mesaj yollamaktı. Bu girdi kapılarına komutlar, bit dizileri şeklinde yollanacaktı. Bu tasarımda fazladan ağırlık ve karmaşık mekanizmalar olmayacağı gibi AİB'nin KÖ kapısı da sadece robotların arasındaki iletişime ayrılmış oluyordu. Bu tasarımın göze çarpan iki sorunu şunlardı:

  • Bu dizilerinin çözümlenmesi, uygulaması zor olan bir yöntemdi.
  • RCX girdi kapısına uyacak bir kabloya ihtiyaç vardı. Bunu yapmak için sadece lehim yetmeyecek, lego parçalarından birini, iletken kabloları tutacak şekilde değişikliğe uğratmak gerekecekti.

Bizim hayata geçirdiğimiz ise üçüncü tasarımımız oldu. Robotumuzun arka kısmına MINDSTORM'un KÖ kulesini, RCX'in KÖ kapısını görecek şekilde bağladık. AİB tarafından gönderilen komutlar aşağıdaki yoldan iletildi:
Seri kapı » KÖ kule » RCX

Bu tasarımı seçmemizin nedenleri şunlardı:

  • Sinyallerin gittiği hedefin kesin olarak bilinmesini sağlıyordu.
  • Büyük donanım eklemelerine gerek bırakmıyordu.
  • Yazılım açısından uygulanması daha kolaydı.

Uygulama

MINDSTORMS Uygulaması

Robotun İnşası

Robotumuzun mekanik kısmını MINDSTORM'la beraber gelen kılavuzdaki örneği takip ederek yaptık. Ancak bunun üzerine bir JORNADA AİB yerleştirmemiz gerekiyordu. Bu nedenle, JORNADA'yı MINDSTORM üzerine yerleştirmemizi sağlayacak ve KÖ kuleyi taşıyacak bir yapıyı da robotumuza ekledik. Daha fazla bilgi ve fotoğraflar için inşa aşamasının ayrıntılarına bakabilirsiniz.

MINDSTORMS Yazılımı

Daha önce de söylediğimiz gibi LEGO MINDSTORMS resmi bir yazılım geliştirme paketiyle geliyor ancak pek çok başka seçenek de mevcut. Biz LeJOs isimli, Java tabanlı bir bellenimi seçtik.
LeJOS'la ilgili bazı bağlantılar:


Şimdi, ilk LeJOS programınızı çalıştırmak için ne yapmanız gerektiğine dair kısa bir bilgi vereceğiz (Açıklamalarımız Windows için geçerli olacak, fakat Linux ve MacOSX için gerekli bilgileri yukarıda bağlantısını verdiğimiz kılavuzda bulabilirsiniz). Öncelikle makinenize LeJOS'u yüklemeniz gerekiyor.
Zip'li LeJOS dosyalarını indirdikten sonra bunları açmanız ve bilgisayarınızın çevre değişkenlerini ayarlamanız gerekiyor. Bunun için LeJOS sayfasındaki talimatları izleyin: "
  1. LeJOS zip dosyasını bilgisayarınıza indirdikten sonra, istediğiniz bir dizine açın. Eğer bir zip aracınız yoksa, açık kaynaklı ve ücretsiz bir yazılım olan 7-Zip'i deneyebilirsiniz.
  2. SDK'nın bin dizinini PATH çevre değişkenine ekleyin.
  3. LEJOS_HOME çevre değişkenini, lejos'u kurduğunuz dizine ayarlayın.
    set LEJOS_HOME=< your lejos dizini >
  4. LeJOS'un bin dizinini PATH çevre değişkeninize ekleyin.
    set PATH=%PATH%;%LEJOS_HOME%\bin
  5. ALeJOS sınıflarını CLASSPATH çevre değişkeninize ekleyin.
    set CLASSPATH=%CLASSPATH%;.;%LEJOS_HOME%/lib/classes.jar;%LEJOS_HOME%/lib/pcrcxcomm.jar
  6. RCXTTY çevre değişkeninizi, kulenizin türüne göre ayarlayın.
    set RCXTTY=COM1 veya set RCXTTY=USB "

Şimdi de RCX'deki bellenimi değiştirmeniz gerekiyor. Bu aşamada KÖ kuleyi kullanmanız gerekecek. Kuleyi bilgisayarınıza bağlayın ve LeJOS sayfasındaki adımları izlemeye devam edin: "

  1. RCX'in KÖ alıcısını, KÖ kulenin önüne yerleştirin.
  2. RCX'i açın
  3. Bir komut satırı açın ve LeJOS kurulumunun bin dizinine geçin.
  4. firmdl.bat dosyasını çalıştırın
  5. Dosya aktarımının durumu komut satırında ve ve RCX ekranında görüntülenecek. Dosya aktarımı bittiğinde RCX iki kez bipleyecek ve ekranında pil gerilimini Volt cinsinden gösterecektir. "

Artık RCX'iniz program yüklenmeye hazır. Örneğin elinizde HelloWorld.java isimli bir dosya varsa, bunu önce derlemelisiniz:
lejosjc.bat HelloWorld.java
Ardından bağlantılandırmak ve yüklemek için:
lejoslink.bat HelloWorld

Artık programınızı RCX'in üzerindeki “RUN” düğmesine basarak çalıştırabilirsiniz.
Eğer programınızı yüklemekte sorunlarla karşılaştıysanız çözüm önerileri için LeJOS'un internet sayfasına bakmanızı öneririz.

MINDSTORMS Programı

MINDSTORMS pekçok görev için programlanabilir. Sadece MINDSTORMS'lar kullanarak pekçok değişik robotik deneyi yapabilirsiniz. Ama biz MINDSTORMS'ları robotlarımızın 'beyni' olarak kullanmadık. Bunun nedenleri şöyle: öncelikle önümüze konulan görev MINDSTORMS'u AİB'den kontrol etmenin yollarını bulmaktı; ayrıca ileride iletişim için Bluetooth kullanmayı planlamamız da bir CF girişe sahip olan AİB'yi kullanmamızı gerekli kıldı. Bu nedenlerden dolayı, MINDSTORMS'u JORNADA için bir 'köle' olarak kullandık ve programladık: MINDSTORMS'un bütün yaptığı JORNADA'yı dinlemek ve ona verilen basit komutları yerine getirmekti.

Tüm program JORNADA'nın KÖ kule aracılığıyla göndereceği paketleri dinleyen bir döngüden ibaret. (Yollanan paketlerin RCX'in iletişim protokolüne uyması gerekiyor, ancak bu paketin oluşturulduğu yer JORNADA'daki program olduğundan bu paket yapısından orada bahsedeceğiz). Eğer MINDSTORMS, AİB'den bir paket alırsa içine bakarak ne tür bir görev yapması istendiğini anlıyor ve bunu yapıyor. Bu görevler:

  • Dur
  • İleri git
  • Geri git
  • Sağa dön
  • Sola dön
  • Hizalan
  • Ses (Esasen robotumuz 3 farklı ses çıkarmakta)

‘Hizala’ dışındaki komutların anlaşılır olduğunu düşünerek sadece bunu açıklayacağız. ‘Hizalamak’ tan kastettiğimiz, robotların dansetmeye başlamadan önce tam olarak yüz yüze olmalarını sağlamak. Robotlar arasındaki esas iletişim AİB'lerin KÖ kapılarından sağlansa da, KÖ iletişim bize robotların tam olarak karşı karşıya mı yoksa 50 derecelik (hatta bazen 90 derecelik) bir açıyla mı durdukları bilgisini veremiyor. KÖ ,iletişim kurulabilse de bu robotların tam olarak karşı karşıya oldukları anlamına gelmiyor. Bu sorunu çözmek için yaptığımız, RCX'e 'düzel' komutunu göndermekti. 'Düzel' komutunu alan RCX ileriye gidiyor, diğer robota dokunma alıcılarıyla çarpıyor ve çarptığı tarafa dönüyor. Bu beş kere ve dönüş açısı her defasında azalır şekilde tekrarlanıyor. Yaptığımız denemelerde bu yöntem en güzel sonucu verendi, ve bu nedenle bu tekniği kullandık. Denediğimiz başka yöntemler (KÖ kullanan, hem KÖ hem dokunma alıcısı kullanan) ise daha kötü sonuçlar verdiler.

RCX'in JORNADA'nın emriyle değil kendi kararıyla yaptığı tek şey var; engellerden kaçınmak. Eğer herhangi bir anda herhangi bir dokunma alıcısı uyarılırsa ('düzel' durumu dışında), robotumuz belli bir süreliğine geriye gidiyor. Bunu yaptığından ise JORNADA'nın haberi olmuyor. Daha sonra JORNADA'dan gelen komutları yerine getirmeye devam ediyor.


Adaptör Kablo

Tasarımımız AİB'nin seri kapısının, KÖ kule üzerindeki seri kapıya bağlanmasını gerektiriyordu. Ancak KÖ kulenin seri kapısı bir girintinin içindeydi ve JORNADA'nın kablosunun ucu buraya sığmıyordu. JORNADA'nın orjinal kablosunu kesip zarar vermek istemediğimizden, başka çözümler aradık. LEGO MINDSTORMS seri kablosu, KÖ kuleye tam olarak oturuyordu, fakat HP JORNADA seri kapısı için kendine özgü ince bir fiş kullanıyordu, bu yüzden LEGO kablosunu AİB'ye bağlayamıyorduk. Adaptör bir kablo kullanmamız gerekiyordu fakat bu amaç için yapılmış hazır adaptörler yoktu. Daha önceden bulunmuş bir çözüme rastlayamayınca kendi kablomuzu yapmaya karar verdik.

Burada iki yol denedik. Birincisi veri aktarım yeteneğini korumak için çaprazlanmış bir adaptör kablosuna iki fiş lehimlemekti. JORNADA seri kablosunu AİB'ye bağladık. LEGO kablosunu KÖ kuleye bağladık. Ve bu kabloların boşta kalan uçlarını adaptör kablosuyla birleştirdik. JORNADA seri kablosunun fişi kuleyi çalıştırmak için uygun sinyal gönderiyordu, fakat LEGO seri kablosu çaprazlanmış bir kabloydu ve veri aktarımına izin vermiyordu. Bu yüzden adaptör kablomuzu çaprazlayarak hazırladık. Bir sinyali iki kez tersine çevirmek işleyişini değiştirmiyordu. Bu şekilde ara bağlantıyı sağlayabildik, ancak elimizdeki kablo çok uzun oluyordu. Bir uzun LEGO kablosu, bir uzun JORNADA kablosu ve bir kısa adaptör kablo.

İkinci olarak, bir kabloyu aradan çıkartarak işleri kolaylaştırmayı denedik. KÖ kuleye bağlantıyı, LEGO kablosu yerine, kuleye kolayca takılabilen eski seri fare kabloları kullanarak yaptık. Kablonun diğer ucuna bir seri fiş lehimledik. Sonra JORNADA seri kablosunu bu yeni adaptör kablosuna bağladık. JORNADA seri kablosunun çıkışları kuleyi çalıştırmaya yeterli olduğu için, yaptığımız kabloda çaprazlamaya gerek yoktu. Bu tasarım birincisiyle temelde aynıydı, fakat bir uzun kabloyu aradan çıkartmıştık. Her iki kablo kombinasyonunun fotoğraflarını da aşağıda görebilirsiniz.

Jornada Seri Kablosu Normal seri adaptör kablo
(fare kablosu kullanarak)
Jornada kablosu +
normal adaptör kablo
 
Null-modem(çaprazlanmış)
adaptör kablo
Lego kablosu +
null-modem adaptör kablosu +
Jornada kablosu

JORNADA Uygulaması

COM Bağlantı Noktaları

COM bağlantı noktalarındaki okuma/yazma işlemi için WinAPI kullanılabilir. Fakat Shibu K.V. tarafından yazılan SerialPort sınıfını , com iletişimi için çok pratik bulduk ve onu kullandık.

Daha önce belirttiğimiz gibi, uygulamamızda iki seri kapı kullandı. Bunlar, ayrıntılarını aşağıya yazdığımız com1 ve com4 kapıları.

Seri Kapı

RCX'e komut göndermek için kullandığımız kapı Com1. Kapıyı açtıktan sonra, komutu göndermek için her bayt seri kapıya yazılmalı. KÖ kuleye gönderilen komutlar RCX'e aktarılır ve bu komutlar belli bir biçime uymalıdır.

RCX'in ters mühendisliği sırasında keşfedildiği gibi, her komut paketi "0x55 0xff 0x00" bayt dizisiyle başlamalıdır. Bu bir tür başlıktır ve bir komutun geleceğini belirtir. Ayrıca bu bayt dizisinde eşit sayıda 1 ve 0 vardır. Bunun nedeni, kulenin ve RCX'in kızılötesi alıcı/vericilerinin, bir değere doğru sapmasını önlemektir.

Başlıktan sonra, komutun kendisi gönderilmektedir. RCX'in hazır bir komut seti var, fakat biz RCX ile AİB arasında kendi belirlediğimiz bir protokolü kullandık. Her komutu tek bir bayt ile ifade ettik. Komutun bitlerinin ters çevrilmiş hali de komuttan sonra yollanır. Bunun sebebi de yukarıdakiyle aynıdır, KÖ kulenin vericilerinin bir değere alışmasını önlemek.

Eğer komutun bir parametresi varsa, komuttan sonra gönderilir ve tersi de onu takip eder.

Komut paketinin son parçası olarak, aktarılan baytların(komut ve parametrelerin) toplamı, ve bu değerin tersi pakete eklenir. Biz komutlarımızda parametre kullanmadığımız için, toplam değeri olarak komutu tekrar ettik.
Örneğin, RCX'e , bizim protokolümüzde ‘İleri git’ anlamına gelen, 0x10 değerini göndermek için yapmamız gereken, com1'e aşağıdaki bayt dizisini yazmaktı:
0x55 0xff 0x00 0x10 0xef 0x10 0xef

Kızılötesi kapı

Kızılötesi arayüzü de seri iletişim içindir, ve WINDOWS CE'de sıradan bir seri kapı gibi işlem görür. Bizim elimizdeki AİB'lerde Com4 kızılötesini temsil ediyordu. Com4 kapısına yazılan veriler kızılötesi aracılığıyla gönderilirler.

Kızılötesi iletişim için yaygın kullanılan bir standart, IrDA standardı vardır. Fakat bu standartta, bir AİB sunucu , diğeri ise istemci olmak zorunda. Bu durum, oğul robotikte önemli bir prensip olan, oğul içindeki her robotun aynı olması fikrine ters düşüyordu. Ayrıca, hangi robotun sunucu olacağına karar vermemiz gerekiyordu. İki robot için sorun çıkartmayacak olsa bile, daha fazla sayıda robot kullanıldığında, bütün oğulun tek bir sunucuya bağlı olması ve bu sunucuda bir aksaklık olduğunda bütün oğulun kullanılamaz hale gelmesi riski vardı. Ayrıca iki istemci robotun iletişim kurması mümkün değildi. Bu nedenle seri kapıda yaptığımız gibi, kızılötesi kapı için de kenti protokolümüzü belirledik. KÖ alıcı/vericilerin sapmasını önlemek için bu protokolün de eşit sayıda 1 ve 0 kullanmasını sağladık.

Kızılötesi ile yaptığımız en önemli iş, çevreye 'ping' paketleri göndermek, ve etraftaki başka bir robotun varlığını algılamak için diğer robotların pinglerini 'dinlemek'ti. Bir robot pinge cevap olarak, pingi algıladığını belirten bir sinyal gönderir. Ve pingi gönderen robot, iletişimin kurulduğunu belirten bir onay sinyali gönderir.

Daha sonra robotlar rasgele sayılar üretirler ve birbirlerine bu sayıları söylerler. Böylelikle danslarındaki yönler belirlenmiş olur; hangisinin ileri gideceği, hangisinin sağa döneceği gibi kararları vermiş olurlar.

Resimler

AİB, robotların üstünde yer alır ve ekranı yukarıya bakar. Ekranda komik yüz resimleri görüntüleyerek robotlara kişilik kazandırmaya çalıştık.

Programın başlangıcında, tüm resimleri belleğe yükleyerek resimler arasındaki geçişi hızlandırdık. Daha sonra davranış şemasına göre seçilen bir resmi ekranda gösterdik. Bitmap resim dosyalarını görüntülemek için WindowsCE API'lerini kullandık.

Kullandığımız resimlerden bazıları:


Robotların Davranışı

Robotların davranışı aşağıdaki şemada görülebilir.

Başlangıç Durumu

Robotlar bu durumdayken beklerler. JORNADA ekranındaki düğmeye tıklamak, ‘İleriyi Ara’ durumuna geçişi tetikler.

İleriyi Ara Durumu

Robotlar, çevreyi pingleyip dinleyerek ileriye doğru giderler. Eğer robot ping sinyali alırsa, ‘ iletişim kur ’ durumuna geçerler. Eğer robot pingleyip dinlerken hiç sinyal alamazsa, 20 denemeden sonra ‘ Etrafı Ara ’ durumuna geçerler. Kızılötesi kapısının okuma zaman aşımını 200 milisaniye olarak ayarladık. Eğer robot, 20 döngü boyunca hiçbir şey okuyamazsa yaklaşık 4 saniye ileri gittikten sonra ‘ Etrafı Ara ’ durumuna geçiyor.

Etrafı Ara Durumu

Robotlar dururlar ve rasgele bir yöne doğru 5-8 saniye boyunca dönerler. Bu 300-400 derece aralığındaki bir dönüşe karşılık gelir. Bunu nedeni, tam karşıda bir engel varsa, 360 derece dönmenin robotu bu engelden kurtarmamasıdır. Eğer sabit bir dönüş süresi kullansak, robot pil durumuna göre tam 360 derece dönebilecekti.

Dönüş sırasında robotlar çevreyi pinglemeye ve dinlemeye devam ederler. Eğer ping dışındaki bir KÖ sinyali tespit edilirse, robotlar sinyalin konumunu başlangıç açısı olarak kaydederler ve sinyali kaybedene kadar dönmeye devam ederler. Bu konumu da bitiş açısı olarak kaydeden robot, durur ve yönünü, başlangıç-bitiş açılarının ortasına bakacak şekilde çevirir. Eğer temiz bir ping sinyali alırsa, robotlar beklemeksizin ‘İletişim Kur’ durumuna geçerler. Eğer hiç sinyal alınmamışsa, ‘İleriyi Ara’ durumuna geçerler.

İletişim Kur Durumu

Bu durumdaki robotlar, iletişim kurabildiklerini varsayarlar ve onay sinyalleri gönderirler. Eğer birbirlerinin onay paketlerini alırlarsa, veri aktarımı için hazırdırlar ve ‘Hizala’ durumuna geçerler. Eğer onay sinyalini alamazlarsa, ‘Etrafı Ara’ durumuna geçerler.

Hizala Durumu

Bu kipte, robotlar birbirlerine çarpıp, tamponlardan gelen sinyalleri yorumlayarak, yüz yüze bakmaya çalışırlar. Örneğin, sol tamponda bir sinyal varsa, diğer robot o tarafta olmalıdır ve robot bir miktar sola döner. Bu 5 kez tekrarlanır ve her seferinde dönüş açısı azaltılır. Bu işlem tamamlandığında robotlar yüz yüze bakmaktadır. Daha sonra robotlar ‘Anlaşma’ durumuna geçerler.

Anlaşma Durumu

Bu durumda, robotlar rasgele sayılar üretirler ve sayılarını birbirlerine aktarırlar. Daha sonra hangisinin sayısının büyük olduğuna bakarlar. Bu bilgi dans esnasındaki hareketlerin yönünü belirlemekte kullanılır, ancak robotların amaçlarının farklı olması durumunda başka bilgiler aktarmak da mümkündür. Sonrasında robotlar ‘Dans Et’ durumuna geçerler.

Dans Et Durumu

Robotlar eşzamanlı olarak neşeli bir biçimde dans ederler. Hareket edip dönerler ve birisi ileri giderken diğeri geri gider, böylelikte aynı yöne doğru birlikte giderler. Dönüş de benzer şekilde yapılır, birisi sola dönerken diğeri sağa döner, böylelikle KÖ arayüzleri dans esnasında birbirlerini görecek şekilde kalır. Eğer gerekirse fazladan bilgi aktarımı yapılabilir. Robotların aynı sayıyı ürettikleri nadir durumlarda, tekrar sayı üretmezler ama birbirlerini taklit ederler.

Bitiş Durumu

Dans bittiğinde, robotlar bir kez birbirlerine çarparlar, 200 ms boyunca geri giderler ve gözlüklerini takarlar. Tabii ki bunu ekranlarındaki resimlerle yaparlar. :-)

Engelden Kaçınma Durumu

Robot bir engele çarptığında, 750 milisaniye boyunca geri giderler. Engel, bir duvar ya da başka bir robot olabilir. Eğer karşı karşıya durmuyorlarsa robotlar birbirlerini ayırt edemezler, çünkü KÖ arayüzleri sadece ön taraftadır ve birbirlerini tanımak için başka bir araçları yoktur. Bu durumdan donra, robotlar doğrudan ‘Etrafı Ara’ drumuna geçerler.


ODTÜ Fuarı

Her yıl temmuz ayında ODTÜ'de tanıtım fuarı yapılır. Bölümler bu fuarda açtıkları standlarda, aday öğrencilere bölümleriyle ilgili bilgi verirler.

Bu yılın fuarında, biz de robotlarımızla birlikte furadaydık. Gün boyunca robotlarımız gösterilerini sundular. 1x1 m boyutundaki bir arenada birbirlerini bulmaya ve dans etmeye çalıştılar. Dansları bitince birbirlerinden uzaklaştırıldılar ve en baştan başladılar.

Bu gösteri pek çok kişinin dikkatini çekti. ODTÜ'nün bölümlerini görmeye gelen öğrenciler, gösterimizden etkilendiler. Çalışmamız hakkında sorular sordular, biz de bu soruları cevaplandırmaktan mutluluk duyduk. Onların, Bilgisayar Mühendisliği bölümünü seçeceklerini umuyoruz.

Robotlarımız aynı zamanda basının da ilgisini çekti. Yerel bir televizyon kanalında röportajımız yayınlandı. Ve iki ulusal gazetede çalışmamızı konu alan birer haber basıldı. Ancak bölümümüzü yanlış yazmışlardı! Fuarda çekilen bazı fotoğraflar ve bir video için Onur Tolga Sehitoglu'nun web sayfasına bakabilirsiniz.

Çalışmamızın taktir edilmesi bize şevk verdi ve şimdi robotik alanında daha fazla çalışma yapmak için sabırsızlanıyoruz.


ODTÜ Fuarı Gazete Haberi

Daha fazla bilgi

  • Robotlarin mekanik yapimi ile ilgili adim adim resimlenmis aciklamalar burada.
  • Projenin nihai raporunu  (Ingilizce)  pdf ve ps bicemlerinde okuyabilirsiniz.

Bu proje KOVAN'da 2004 yazinda  Gokdeniz Karadag ve Mehmet Remzi Dogar'in staji cercevesinde gerceklesmistir.