27 Mayıs 2008 Salı

Robotunuzda Difransiyel Sürüş ile Köşeleri Almak

Servo ile sürüşten vazgeçmemle birlikte difransiyel sürüş ile ilgilenmem gerekti. Kınematik ve matematik bilgim oldukça temel olmasına rağmen biraz araştırınca difransiyel sürüşü ilgilendiren denklemler konusunda biraz fikir sahibi oldum. Burada gidilen mesafe açısından istenilen açıları dönmek için ne yapmak gerekir buna değineceğim. Zaman, hız ve ivmelenme burada bahsedeceklerim içersinde yer almıyor belki ileride bunlar üzerinde zaman harcama fırsatım olduğunda değinebilirim.


Sorunumuza şöyle bakalım iki tekerlekli bir aracı nasıl istediğimiz açıda döndürebiliriz? Örneğin bir tekerlekli sandalyeyi 90 derece sola döndürmek için hangi tekerleği ne kadar döndürmek gerekir? Bunun gibi basit soruların cevapları robotun hareketi ile ilgili sorularımızın da cevaplarını oluşturuyor olucak.
Konuya pivot noktasından başlayalım örneğin bir köşeyi almak istiyorsunuz ama burada 90 derecelik direk dönüşler yerine ark çizmek işimize gelecektir. O zaman bu ark'ı nereye göre çizeceğiz. Bir sütunun etrafından köşeyi sola doğru alacağımızı hayal edersek sütun bizim pivot noktamız oluyor. "r" sütun ile sol tekerlek arasındaki mesafemiz olarak ve "b" yi de iki tekerleğin merkez noktaları (şaftı) arasındaki mesafe olarak kabul edersek.


"SL" Sol tekerleğin gideceği mesafe "SR" ise Sağ tekerleğin gideceği mesafe oluyor. Böylece "Q" açısında yuvarlak bir dönüş için gerekenleri temel olarak tamamlamış oluyoruz. PID veya PWM motor kontrolü ile birlikte ilk denemelerimi yakında paylaşıyor olurum. Bir sonraki merak konum ise zaman, ivmelenme, hız gibi etkenlerin de dahil olduğu daha az hata payı barındıran modeller nedir?

26 Mayıs 2008 Pazartesi

İsminizi Ay'a Gönderin

isminizi aya gönderin sertifika
Nasa LRO yani "Lunar Reconnaissance Orbiter" uzay aracı ile birlikte isminizi Ay'a göndermek için bir proje düzenlemiş. http://lro.jhuapl.edu/NameToMoon/ adresinden isminiz ve soyisminizi girdiğinizde sağdaki resimde görebileceğiniz bir sertifika basma imkanı da olabiliyor. Bu girilen bilgiler bir veritabanına aktarıldıktan sonra bir mikroçip üzerine gömülecek. 27 Haziran 2008 bu güzel projeye katılım için son gün . Kaynak:http://www.nasa.gov/mission_pages/LRO/main/index.html

25 Mayıs 2008 Pazar

Microsoft Robotics Studio, C#, Servo ve IR Sensör ile Engel Tanıma

En son makalemde açı mesafe arasındaki ilişkiden bahsetmiş rota planlama için nasıl kullanılabileceğine değinmiştim. Basit trigonometriden faydalandığımız bir diğer konuda engel tanıma. Bildiğiniz üzere mesafe ölçümü için sharp ir mesafe sensörleri kullanıyorum. Bu yazımda C# ve Microsoft Robotics Studio ile sabit olarak duran robotun çevredeki engelleri olan algısından bahsedeceğim.
Engel tanıma için bu testimde robot durağan iken etrafındaki engelleri nasıl algılıyor bunu merak ettim. Video da daha iyi görebileceğiniz gibi robotumun üzerinde servo üzerine monte edilmiş 3 adet Sharp IR mesafe sensörü var. Aslında burada basit olarak yaptığım 20 derece lik hareketlerle sensöre ait okumaları alıp bunları bir kartezyen koordinat sisteminde göstermek. "+" işaretleri algıladığı engelleri belirtiyor. Aslında robotun yaptığı işlemler basit ve şu şekilde.
  1. Son dereceye 20 derece ekle ve servoyu hareket ettir.
  2. 500 ms bekle (daha doğru bir okuma için)
  3. Sharp IR sensörden gelen mesafeyi oku.
  4. Mesafe ve açıdan gelen bilgilere göre merkez nokta kendin olmak üzere bunu kartezyen koordinat sitemine çiz.

Bahsi geçen adımlar için bir timerdan faydalanıp son okuma derecesini integer olarak tuttum. Timer tick fonksiyona ise yukarıdaki işlemleri ekledim oldukça basit.

Microsoft Robotics Studio C# ve IR Sensör ile Engel Tanıma Bu tarz bir tarama işleminin en kötü yanı tarama işleminin aldığı süre zira okuma derecesini düşürürseniz tarama çok uzun sürüyor ama aldığınız veriler daha detaylı oluyor. Dereceyi arttırırsanız ise doğal olarak o açı aralığındaki bir nesneyi kaçırma ihtimaliniz oldukça artıyor.
Okumalarda yaşadığım bir diğer sıkıntı ise ortamın ısısı, ışık, parlaklı ve matlık gibi etkenlerin sharp ir mesafe sensörü üzerindeki etkisi. Sharp IR sensörün gönderdiği ışın ve çarptığı yüzeyin açısı sanki algılamada hata payını arttırıyor. Video da izleyeceğiniz gibi eğimi düşük yani ışını daha küçük bir açıyla çarptığı noktalar algılanan mesafede değişimlere sebep oluyor. Geniş açıdan baktığımızda ise turret'ın dönme hareketi ile okumalar arasında bir ilişki olduğunu söyleyebilirim. Duvar gibi düz bir yüzeyi çizgi olarak algılamak yerine eğri olarak algılıyor. Bunun üzerine yoğunlaşmam ve ışının olası çarpma açılarını değerlendirecek bir normalizasyon algoritması üzerinde çalışmam gerekecektir. Yoksa robot olduğunu düşündüğü yerde hiçbir zaman olamayacak ve engel olmadığını düşündüğü yerde bir engel ile karşılaşacaktır. Bunların hepsi ayrı bir dalın uzmanlık alanı bu sebeple ileride odometri ve slam algoritmaları üzerine biraz daha yoğunlaşacağım.

Bir sonraki denememde servoyu sadece gerekli olduğu zamanda kullanarak okuma yapmak ve hareketli olarak yapılan algılamalar üzerinde yoğunlaşacağım. Bu durumda önümde SLAM algoritamaları, odometri gibi kavramlar beni bekliyor olacak. Engellere takılmamanız dileğiyle.

8 Mayıs 2008 Perşembe

Robotik Rota Planlama. Gidilecek Açı ve Mesafe Bilinen Noktanın Koordinatlarını Bulmak.

Otonom hareket işin içine girince ne kadar sevmesemde matematik ile uğraşmak bir zorunluluk halini alıyor. Robotumun hareketlerini kendi başına yapabilmesi için Kartezyen koordinat sistemi üzerinden rotaların(waypoint) hesaplanması temel trigonometri kullanımını mecburi kılıyor. Örneğin robotumun a(0,0) bilinen noktasından Q açısında c mesafe ilerlemesi istendiği zaman b(x,y) varış koordinatı ne olur? Bu soruyu cevaplamak için ezber halinde verilen ama ne işe yaradığını öğrenemediğim matematik bilgilerim üzerinde düşünmem gerekti. Zira keşke üçgenler üzerinde formüller göstermek yerine örnek kullanım alanlarını da lise de bize öğretselerdi.
SinA = a/c formülBu formül çıkış noktamız oluyor. Biz A açısını ve c yani mesafemizi biliyoruz. Böylece a = SinA x c ve b=CosA x c oluyor. Artık x ve y ekseninde kaç birim ekleyeceğimizi bildiğimiz için a(0,0) noktasından b(?,?) noktasına gidiş için a(0+a,0+b) bizim varış noktamızın yani b noktasının koordinatları oluyor. C# math class yardımıyla bu hesaplamaları basit bir kod yazarak yapabiliriz. Örnek olarak aşağıda yazdığım kodun bir bölümünü bulabilirsiniz.

double rada = double.Parse(numDirection.Value.ToString()) * (Math.PI / 180);

double sina = System.Math.Sin(rada);
double da = sina * Double.Parse(numDistance.Value.ToString());

double cosa = System.Math.Cos(rada);
double db = cosa * Double.Parse(numDistance.Value.ToString());

int x = lastx + Convert.ToInt32(da);
int y = lasty - Convert.ToInt32(db);

fncPaintChangePoint(x, y);
fncPaintDrawLine(lastx, lasty, x, y);

start = false;
lastx = x;
lasty = y;
Artık gidilecek noktamızı açı ve mesafe girerek görebildiğimize göre rotamızı planlamaya başlayabiliriz. Yazdığım ufak bir uygulama ile sonucu görebilirsiniz.


Robotik Rota Planlama ve Waypoint

Gidilecek mesafe ve açı verildikten sonra gördüğünüz gibi bu noktalar işaretleniyor. Rotanızdan şaşmamanız dileğiyle.