Çizgi izleyen sanal robot yarışması başladı.

Başlatan z, 11 Ekim 2015, 02:55:17

z

Arkadaşlardan örnek dll göndermelerini istedik ilgilenen çıkar herhalde.

Linüx türevi şimdilik yok.

Bu arada ilk verdiğim linkten güncel simülatörü indirebilirsiniz. (http://www.cncdesigner.com/wordpress/wp-content/uploads/Robot.zip)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ByTEK

hocam ilk mesajdaki örnek kodu derleyince yeni versiyonda çalışmadı ? acaba neyi değiştirdiniz ?

z

Şu negatif motor voltajı meselesinden dolayı. PbyteArray yerine PIntegerArray yazdım.

Bir de sensör her bir renkten etkilenirken eskiden  (Renk AND 1) XOR 1 işlemi yapıyordu ve bu siyah harici çift sayılı değere sahip renklerde de çizgi varmış gibi davranabilirdi.

Şimdi değişti.   If renk=Siyah then Sensor=1 else Sensor=0; şeklinde bir algoritma kullanıyor. (16 sensör için ayrı ayrı)


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

exjra

Merhabalar, çok eğlenceli ve eğitici bir proje. Geliştirme size ait sanırım z. Projenin linux versiyonu için geliştirici desteği sağlayabilirim.

z

Yeni robot programı daha derli toplu oldu.

Artık hata dışında kurcalamak istemiyorum. Programa entegre edilmiş 9 pistten  bazıları piste özel algoritma yazımı gerektiriyor.

Acemi 1 pistinde yarışma başlamıştır. Öncelikle son versiyonu indirmek gerekiyor.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ozanselte

Böyle dll şeklinde değil de mesela bir terminal üzerinde çalışan bir program yazsak. Yarışma programı o programa stdio ile veri gönderip alsa daha kolay olmaz mı? Örnek kod vs uğraşmayız hiç. Linux desteği de kolay olur.

bbs2006

merhaba
Bu  yarışmayla ilgili değil ama çizgi izleyen robotta qtr-8a sensörünün olasılıkları hakkına yardımcı olabilirseniz sevinirim.
8 sensörlü kitte olabilecek kombinasyonlar hakkında  yararlanabilecgim bir site var mı?.
Örnek.
beyaz zemin   üzerine siyah çizgi için


00000001 karşılıklarını nasıl buluyoruz. bunun değerini 10 kabul edilebilir mi.
00000011    20
00000010    30
00000110    40
00000100    50
00001100    60
00001000    70
00011000    80
00010000   -10
00110000   -20     
00100000   -30
01100000   -40
01000000   -50
11000000   -60
10000000   -70
00000000   -80

bu şekilde kullanılabilir mi. kombinasyonlar. 90 derece köşelerde sol dönüş için sol 6 sensör siyah geldiği zaman ki kombinasyonda yani 11111000 konum değerine  ne değeri atamamız gerekiyor. (aynı şekilde  saga 90 derce dönüş için) veya üç sensör veya 4 sensör  beraber gördüğü zaman ne değeri atamamız gerekiyor. bu konuda ne yapabilirim. öneriniz nedir. 

z

dll olmasaydı iyi olurdu eleştirilerine katılıyorum fakat Oynamayı bilmeyen gelin yerim dar dermiş sözünü de hatırlatmak isterim.

Gerçek robotla algoritma testi yapacak olsanız yapmanız gereken işlemler.

1 ) Bataryayı şarj et.
2 ) Büyükçe pist alanı hazırla.
3 ) Pistte çizgi çiz
4 ) İşlemcinin IDE'sine gir
5 ) Algoritmayı yaz
6 ) Derle
7 ) Kodları çipe yükle
8 ) Yarışa başla
9 ) sorun olursa robot peşinde koştur robotu yakala piste koy.

Şimdi soruyorum bu mu kolay yoksa

1 ) Kullandığınız visual dile ait IDE'yi çalıştır.
2 ) Algoritmayı yaz
3 ) Derle
4 ) Yarışa başla

mi kolay?

Yerim dar diyenler için dar alanda oynama yöntemleri

https://www.youtube.com/watch?v=V4fw-0DbWdM
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

vsalma

Elinize saglik. Ben de linux kullaniyorum ama son mesajinizdan sonra sanal makina windows kurup deneyecegim.

z

Çizgi izleyen yarışmacıları, sensör bilgilerini array içinde değilde porttan bir çırpıda okunuyormuş gibi  olmasını talep ettiler.

Bu yüzden bu kısım haliyle de örnek algoritma değiştirildi.

Robotların teker çapları, robot boyları ve redüktörleri de aynı yapıldı.

Robotların dinamiklerindeki farklar robotun davranışını belirliyor. Bu da kimi robotun kontrolunu oldukça zorlaştırıyor.

İddialı olmayan iki rekor denemesi: http://www.cncdesigner.com/wordpress/wp-content/uploads/Rekorlar.zip
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

vsalma

Selamlar. Delphi haricinde bir dilde(tercihen c) dll i basarili uretip calistirabilen oldu mu? Linux altinda mingw ile windows icin c kodunu cross compile ederek dll yapmayi denedim. Wine programla sunulan dll i calsitiriyor ama benim urettigim dll i koydugumda exe acilmiyor.   Windows altinda borland c compiler in (delphi ile uyumlu olmasi acisindan) urettigi dll icin uygulama "Algo7 yordamina ulasilamiyor"  mesaji veriyor.  Kisacasi calisitirmayi beceremedim. Ayni vc compilerin farkli versiyonlarinda bile uyumsuzluk oluyor. Mesela bir kutuphaneyi vc 8 ile derleyip dll leri urettiniz. Bu dll leri vc10 ile yazdigininz program icinden cagirmak bile sikinti olabiliyor. Tabi uzun uzun buna ugrasilsa arastirilsa bir cozumu vardir belki ama bence program tcp/ip den mesaj dinlese gonderse veya bir arkadasin dedigi gibi stdio dan okuyup yazsa bence platform ve dil bagimsizligi saglanir. Yarismaya su anki haliyle katilamiyorum. Bastan elendim.

z

Bu proje'de gördümki çizgi izleyende  olay çizgi sensörün solunda ise şunu yap sağında ise şunu yapın çok ötesinde.

Bu mantıkla ancak ve ancak belli şekillerdeki yollar takip edilebilir.

Çok az sayıda sensörle her türlü pistte bitiş noktasına ulaşacak robotun ilerlerken sensör bilgilerini de saklaması ve herhangi bir ikilemde geçmiş bilgilerle bir sonuca ulaşması gerekebiliyor.

İşin içine dinamizm de girince işler çok karmaşıklaşıyor. Siz motorların enerjisini kesseniz bile  robot kütlesinden dolayı bir miktar daha ilerliyor.

Algoritma yazmayı deneyin. Çok da kolay olmadığını göreceksiniz.

@vsalma delphide yazdığım dll'i delphiden de kullanamamıştım Sonradan farkettim ki stdcall ibaresini yazmamışım.

Kesinlikle pes etme.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

exjra

#42
Basit bir algoritma ile Qt Framework, C++ ile yazılmış dll örneğim. Umarım faydalı olur.

http://dosya.co/0oar1nw692c1/MyAlgo.zip.html
http://dosya.co/32ep6yb2stng/MyAlgo-kod.zip.html

bluekid

C++ örneği için bir şey sormak istiyorum @exjra

1)

function Algo(P: PIntegerArray):boolean; Stdcall;


dan
bool Algo1(unsigned short S, unsigned short L, unsigned short R, char* VL, char* VR)


buna nasıl ulaştınız anlamadım.

2) yolladığınız dll de bir başka dll istiyor eksik olduğundan deneyemedim

Similatör içinde bir  sorum var  @z

Eğer sağlıklı bir algoritma için tek başına sensör bilgisi yetersiz değilmi ?
mesela konum bilgiside lazım değilmi
bu sayede motorlara verdiğimiz voltaj bilgisi ile hangi robot ne şekilde hereket ediyor tespit edip ona göre yönetmek gerekmezmi ?




z

Çizgi, sensor dışına çıktığında yani artık sensörler artık hiç çizgi görmüyorsa bu durumda geçmişe yönelik sensör bilgilerinden gidilmesi gereken yön tesbit edilebilir.

Konum bilgisi ne işe yarayacak? Harita hafızada olsaydı işe yarardı ama hafızada harita yok. Daha doğrusu DLL fonksiyon haritaya sahip değil.

Algoritmalarının açık kaynak kodlarını yayınlayan arkadaşlar buraya eklerse çok iyi olur.  Exjra açık kaynak yazmış. Algoritması aşağıda.

// exjra

#include "myalgo.h"

bool Algo1(unsigned short S, unsigned short L, unsigned short R, char* VL, char* VR)
{
    SonHata = HataHesapla(S);

    if(SonHata <= -1)
    {
        *VR = 50 + 10 * abs(SonHata);
        *VL = 50 - 10 * abs(SonHata);
    }
    else if(SonHata >= 1)
    {
        *VR = 50 - 10 * abs(SonHata);
        *VL = 50 + 10 * abs(SonHata);
    }
    else
    {
        *VR = 50;
        *VL = 50;
    }

    if(*VR > 127)
        *VR = 127;
    else if(*VR < 0)
        *VR = 0;

    if(*VL > 127)
        *VL = 127;
    else if(*VL < 0)
        *VL = 0;

    return true;
}

bool Algo2(unsigned short S, unsigned short L, unsigned short R, char* VL, char* VR)
{
    return Algo1(S, L, R, VL, VR);
}

bool Algo3(unsigned short S, unsigned short L, unsigned short R, char* VL, char* VR)
{
    return Algo1(S, L, R, VL, VR);
}

bool Algo4(unsigned short S, unsigned short L, unsigned short R, char* VL, char* VR)
{
    return Algo1(S, L, R, VL, VR);
}

bool Algo5(unsigned short S, unsigned short L, unsigned short R, char* VL, char* VR)
{
    return Algo1(S, L, R, VL, VR);
}

bool Algo6(unsigned short S, unsigned short L, unsigned short R, char* VL, char* VR)
{
    return Algo1(S, L, R, VL, VR);
}

bool Algo7(unsigned short S, unsigned short L, unsigned short R, char* VL, char* VR)
{
    return Algo1(S, L, R, VL, VR);
}

float HataHesapla(unsigned short okunandata)
{
    //sadece tek cizgi varmis gibi hesaplanir
    int baslangic = 0;
    int bitis = 0;

    bool cizgiUzerinde = false;

    bool sens[15];

    float ortaNokta = 0.0f;
    float Hata = 0.0f;

    for(int t = 0; t<15; t++)
        sens[t] = (okunandata & (1 << t)) > 0 ? true : false;

    if(okunandata != 0)
    {
        for(int t = 0; t<15; t++)
        {
            if(sens[t])
            {
                if(!cizgiUzerinde)
                {
                    baslangic = t;

                    cizgiUzerinde = true;
                }
            }
            else
            {
                if(cizgiUzerinde || t == 14)
                {
                    bitis = t;

                    cizgiUzerinde = false;

                    break; //bir cizgi bulursa aramayi bitirir
                }
            }
        }

        if(cizgiUzerinde)
        {
            bitis = 14;
        }

        ortaNokta = baslangic + (bitis - baslangic) * 0.5f;

        Hata = 7.0f - ortaNokta;
    }
    else
        Hata = SonHata;

    return Hata;
}

#ifndef MYALGO_H
#define MYALGO_H

#include <math.h>

extern "C" __declspec(dllexport) bool Algo1(unsigned short S, unsigned short L, unsigned short R,  char* VL, char* VR);
extern "C" __declspec(dllexport) bool Algo2(unsigned short S, unsigned short L, unsigned short R,  char* VL, char* VR);
extern "C" __declspec(dllexport) bool Algo3(unsigned short S, unsigned short L, unsigned short R,  char* VL, char* VR);
extern "C" __declspec(dllexport) bool Algo4(unsigned short S, unsigned short L, unsigned short R,  char* VL, char* VR);
extern "C" __declspec(dllexport) bool Algo5(unsigned short S, unsigned short L, unsigned short R,  char* VL, char* VR);
extern "C" __declspec(dllexport) bool Algo6(unsigned short S, unsigned short L, unsigned short R,  char* VL, char* VR);
extern "C" __declspec(dllexport) bool Algo7(unsigned short S, unsigned short L, unsigned short R,  char* VL, char* VR);

float HataHesapla(unsigned short okunandata);

static float SonHata = 0.0f;

#endif // MYALGO_H


Alıntı yapılan: bluekid - 16 Ekim 2015, 14:08:13
C++ örneği için bir şey sormak istiyorum @exjra

1)

function Algo(P: PIntegerArray):boolean; Stdcall;


dan
bool Algo1(unsigned short S, unsigned short L, unsigned short R, char* VL, char* VR)


buna nasıl ulaştınız anlamadım.

Simülatörün ilk versiyonunda fonksiyon   function Algo(P: PIntegerArray):boolean; Stdcall    böyle idi.

Sonra değiştirildi. Simülatörün yeni versiyonunda help menüsü var. Orda açıklamalar mevcut.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com