Makale Özeti

Bulunduğu ortama uyum sağlayabilen otonom makinalar, daha önceden bilmediği bir ortamda hareket edebilme yeteneği olan ve ayrıca bu yeni ortamda yapması gereken görevler tanımlanmış sistemlerdir. Bu sistemler, bir insan gibi hareket ederek güncel hayatta bize zor gelen işleri kolaylıkla yapabilmek üzere programlanmışlardır. Bu zor, sıkıcı ve tekrarlayan işlerden en kolay akılmıza geleni ev işleridir. Bize ev işlerinde yardımcı olan, evin temizliğinin yapılmasını sağlayan ortama uyum sağlayan otonom cihazlardan biri de akıllı süpürgelerdir. Akıllı süpürgeler ev icinde sensörleri yardımıyla temizlik güzargahını belirler, temizlenmemiş alanın kalıp kalmadığını kontrol eder ve daha onceden temizlemis olduğu alanları tekrar tekrar ziyaret etmemeye çalışır. Bu makalede anlatılan konu, akıllı süpürgelerin temizlik yapacağı ortamda izlediği yolun bulunması sırasında karşılaşılan problemler, çozümleri ve kullandığı iki farklı algoritmanın performans açısından karşılaştırması

Makale

Akıllı Süpürge - Bulunduğu Ortama Uyum Sağlayabilen Otonom Makinalar

by Yıldırım Koçdağ

 

Bulunduğu ortama uyum sağlayabilen otonom makinalar, daha önceden bilmediği bir ortamda hareket edebilme yeteneği olan ve ayrıca bu yeni ortamda yapması gereken görevler tanımlanmış sistemlerdir. Bu sistemler, bir insan gibi hareket ederek güncel hayatta bize zor gelen işleri kolaylıkla yapabilmek üzere programlanmışlardır. Bu zor, sıkıcı ve tekrarlayan işlerden en kolay akılmıza geleni ev işleridir. Bize ev işlerinde yardımcı olan, evin temizliğinin yapılmasını sağlayan ortama uyum sağlayan otonom cihazlardan biri de akıllı süpürgelerdir. Akıllı süpürgeler ev icinde sensörleri yardımıyla temizlik güzargahını belirler, temizlenmemiş alanın kalıp kalmadığını kontrol eder ve daha onceden temizlemis olduğu alanları tekrar tekrar ziyaret etmemeye çalışır. Bu makalede anlatılan konu, akıllı süpürgelerin temizlik yapacağı ortamda izlediği yolun bulunması sırasında karşılaşılan problemler, çozümleri ve kullandığı iki farklı algoritmanın performans açısından karşılaştırması.

Akıllı süpürge projesini hazırlarken karşılaşılan zorlukları şu şekilde sıralayabiliriz,

1. Bir engel ile karşılaşıldığında nasıl hareket edeceği,
2. Bulunduğu anlık alanı tekrar tekrar ziyaret edilmemesinin nasıl sağlanabileceği,
3. Bir sonraki adımını hangi kriteleri göz önüne alıp belirleyeceği.

Projenin en önemli adımlarından biri ev temizlenirken bir engel (dolap,koltuk,yatak v.s.) ile karşılaşınca sistemin nasıl davranacağıydı. Öncelikle sistemin hiç bir şekilde durmaması ve engel ile karşılaştığında engele rağmen kolaylıkla bir sonraki adıma geçebilmesi gerekliydi . Dolayısıyla sistem, cihazın sensörleri engelleri tanımlayabilecek şekilde programlanmalıydı.

Sistemin çalışmasını direk etkileyecek bir başka problem, temizlenen bir alanın asgari ziyaret edilmesiydi. Bunun için ziyaret edilen noktanın komşularının her ziyaret sonrasi hesaplanarak bulunan değerleri dikkate alınırak, ziyaret edilen nokta için yeni bir değer oluşturulur. Bu oluşturulan özel değer için projede iki farklı algoritma referans alınmıştır. Bunlar Eight Neighbor Kernel Laplace, diğeri Four Neighbour Kernel Laplace algoritmalarıdır. Birinin diğerinden farkı yeni değerler hesaplanırken dikkate alacağı komşu değer sayısıdır. Tabi kullanılacak algoritmaya göre sensör sayısıda azalacağından hem maaliyet olarak kazanç sağlanacak, hemde performans + veya - yonde değişecektir.

Sistemi oluştururken karşılaşabileceğimiz son problem, cihazın bir yeri temizledikten sonra, bir sonraki temizleyeceği alana nasıl karar verebileceğiydi. Bunun için komşu değerler içinde asgari olan herhangi bir tanesi seçilerek, sistemin duraksamasının engellenmesi belki de en uygun metoddu.

Akıllı süpürge sistemleri aslında basit bir ortama uyum sağlayabilen otonom makina örneği olsada, bu makinaların çalışması hakkında bize temel bilgi verir.

 

Birazda projenin kodundan bahsedelim,

Proje basit bir inherit edilmiş buton kontrol ve bir windows formdan oluşmaktadır. İlk çalıştırıldığında, her birini bir m2 olarak kabul edebileceğimiz kontrollerden oluşan, 10*10(100 m2) luk evi veya herhangi bir odayı temsil eden bir matris oluşturur. Bu matris üzerindeki 100 m2 lik alanda, her bir m2 aslında bizim bir butondan türettiğimiz yeni form kontrollerimizdir.

Oluşturduğumuz yeni kontrollere ulaşmak için her seferinde form üzerinde dönmek yerine, bu kontrollerin referanslarını bir datatable'a eklemeyi uygun gördüm. Özelikle generic base formların oluşturulmasında kullanılan bu metod, form üzerinde dönerken harcadığımız  gereksiz zamanı ortadan kaldırmakta ve ayrıca dilediğimiz kontrol e dilediğimiz kriterleri vererek dataviewlar aracılığıyla ulaşmamızı sağlar.

 

private void frmSmartBroom_Load(object sender, System.EventArgs e)
     {

       DataRow drv;
       dt.Columns.Add("ID",Type.GetType("System.Int16")); // datatable'ın kolonları tanımlanıyor.
       dt.Columns.Add("X",Type.GetType("System.Int16"));
       dt.Columns.Add("Y",Type.GetType("System.Int16"));
       dt.Columns.Add("V",Type.GetType("System.Int16"));
       dt.Columns.Add("OBJ",Type.GetType("System.Object"));
       int i,j,x,y;
       for (i=0;i<10;i++){
              for (j=0;j<10;j++){ // 10*10 luk matris oluşturuluyor.
                     ExtButton bt=new ExtButton(); // Yeni kontrolumuz oluşturuluyor.
                     bt.Width=65;
                     bt.Height=65;
                     x=(65*j)+30; // Form üzerindeki yeri hesaplanıyor.
                     y=(65*i)+30;
                     bt.X=j;      
                     bt.Y=i;
                     this.Controls.Add(bt);
                     bt.Location=new Point(x,y); // Form üzerindeki yeri set ediliyor.
                     bt.BackColor= Color.White;
                     bt.ImageList=this.imageList1;
                     bt.ImageIndex=2;
                     bt.ImageAlign=System.Drawing.ContentAlignment.TopCenter;
                     bt.Text="0";
                     bt.TextAlign=System.Drawing.ContentAlignment.BottomCenter;
                     bt.Click += new System.EventHandler(this.bt_Click);
                     drv = dt.NewRow();
                     drv["ID"]=(i*20)+j; // datatable üzerindeki özellikleri tanımlanıyor.
                     drv["X"]=i;
                     drv["Y"]=j;
                     drv["V"]=0;
                     drv["OBJ"]=bt;
                     dt.Rows.Add(drv); // datatable'a ekleniyor.
                     }
              }
  }

Form yüklendikten sonra, matris üzerinde herhangi bir alana tıklayarak sisteme engeller konulur. Ardından herhangi bir algoritma seçilerek, proje çalıştırılır. Örnek olarak Eight Kernel Laplace algoritmasının seçildiğini farzedelim.

 

private void BtnLapKernelEight_Click(object sender, System.EventArgs e)
{
       int nextNodeX=0,nextNodeY=0,Minnvalue=0;
       curX=0;
       curY=0;
       if (AnyNonVisited())
              {
              int total=0;
              int consNeig=0;
              int nvalue;
              int i,j;
              int avg=0;
              Minnvalue=100;
              for (i=-1;i<2;i++) // Komşu değerlere bakılarak bu alan için yeni değer bulunuyor.
                     {
                     for (j=-1;j<2;j++)
                            {
                            if (!((i==0) && (j==0)))
                                   {
                                   nvalue=FindValue(curX+i,curY+j);   // Komşu değerlere bakılıyor.
                                   if (nvalue!=-1) // Herhangi bir engel yoksa bu alanın değeri hesaba katılıyor.
                                          {
                                          if (Minnvalue>nvalue) {
                                                 Minnvalue=nvalue; // Bir sonraki adım için en küçük değer tutulması gerek  .
                                                 nextNodeX=curX+i;
                                                 nextNodeY=curY+j;
                                                 }
                                          total+=nvalue;
                                          consNeig++;
                                          }
                                   }
                     }
              }
              avg=(total/consNeig) + 1; // 8 Komşu değerin ortalaması alınıyor ve yeni değer oluşturuluyor.
              addNewValue(curX,curY,avg); // Bu yeni değer geçilen noktanın yeni değeri olarak sisteme ekleniyor.
              markTheNode(curX,curY,false); // Eski noktanın resmi değiştiriliyor 
              curX=nextNodeX;
              curY=nextNodeY;
              markTheNode(nextNodeX,nextNodeY,true); // Yeni nokta set ediliyor 
              }
       this.timer1.Enabled=true; // Timer çalıştırılarak, AnyNonVisited fonksiyonundan itibaren yapılan işlemler
       this.timer1.Start();             // temizlenmemiş alan kalmayıncaya kadar tekrar ediliyor.
}

Eight Kernel Laplace algoritmasını kodlarken kullanılan fonksiyonlar,

       1 - AnyNonVisited : Temizlenmeyen alan kontrolü.
       2 - FindValue : Koordinatları verilen gözün değerini döndürür.
       3 - AddNewValue : Hesaplanan değeri verilen koordinatlara set eder.
       4 - markTheNode : Verilen koordinatları işaretler.


Projenin indirilebilir kodunda, c# ile yazılmış örnek uygulamayı göreceksiniz.




 

 

Ornek Uygulama