Bu yarışmaya katılmak için öncelikle aşağıdaki dosyayı indirip kurmanız gerekiyor. Umarım Win7 dışındaki işletim sistemlerinde sorun çıkartmaz.
http://www.cncdesigner.com/wordpress/wp-content/uploads/Robot.zip (http://www.cncdesigner.com/wordpress/wp-content/uploads/Robot.zip)
Bu yarışma için motordu, redüktördü, robot şasesiydi, motor sürücüydü hiç bir şeye ihtiyacınız yok. Bedava bir robot.
Yarışmaya katılmak için sadece MyAlgo.Dll dosyası hazırlamanız gerekiyor.
MyAlgo.Dll nedir?
Hani robot mekaniğini yaptıktan sonra Pic vs MCU üzerine sensörden gelen bilgilere göre motorları döndüren bir program yazıyorsunuz ya. İşte o programı VB, C, C++, C#, Delphi vs dillerden dilediğiniz birisi ile yazıp fonksiyon adına Algo1 diyecek ve bu fonksiyonu MyAlgo.dll olarak kaydedeceksiniz.
(Algo1, Algo2....Algo7 olmak üzere 7 fonksiyonu myAlgo.Dll içine yerleştireceksiniz.)
Yarışmaya katılanların hepsinde aynı robot olmasına rağmen kontrol algoritması size özel olmuş oluyor.
Sonuçta yarışmacılardan birisi en büyük rekoru elde edecek.
Algo fonksiyonu nasıl bir şey derseniz aşağıda Delphi için deneme amaçlı yazdığım bir örnek var.
library MyAlgo;
uses
SysUtils,
Classes;
{$R *.res}
{ Robotun onunde soldan saga dogru 16 adet sensor dizilidir.
En soldaki sensor P[0], en sagdaki sensor P[15] icindedir.
Sol motora uygulayacaginiz voltaji P[16] icine yaziniz
Sag motora uygulayacaginiz voltaji P[17] icine yaziniz
Motor voltaji -127 ... + 127 araligindadir.
}
function Algo1(P: PIntegerArray):boolean; Stdcall;
var SL,SR, Error:integer;
begin
SL:=P[0]*128;
SL:=SL+P[1]*64;
SL:=SL+P[2]*32;
SL:=SL+P[3]*16;
SL:=SL+P[4]*8;
SL:=SL+P[5]*4;
SL:=SL+P[6]*2;
SL:=SL+P[7];
SR:= P[8];
SR:=SR+P[9]*2;
SR:=SR+P[10]*4;
SR:=SR+P[11]*8;
SR:=SR+P[12]*16;
SR:=SR+P[13]*32;
SR:=SR+P[14]*64;
SR:=SR+P[15]*128;
Error:=(SL-SR);
if Error>0 then
begin
P[16]:=0;
P[17]:=127;
end;
if Error<0 then
begin
P[16]:=127;
P[17]:=0;
end;
if Error=0 then
begin
if (SL<>0) or (SR<>0) then
begin
P[16]:=127;
P[17]:=127;
end;
end;
Result:=true;
end;
exports Algo1;
begin
end.
Yeni özellikler
Yarışma esnasında algoritmanızın motorlara uyguladığı voltajlar (Pwm değerleri) sonuclar.txt dosyasına yazılıyor.
Döngü süreniz scorboardda ilan edilen döngü süresinden daha kısa çıktı ise bu durumda rekor kırdınız demektir.
Sonuclar dosyanızın adını Rekor.txt olarak değiştirip internette bir yere yükleyip linkini buraya yazın.
(Rekor dosyasındaki rekoru geçerseniz program size yardımcı olur.)
Böylece artık geçmemiz gereken rekor sizin rekorunuz olacaktır.
Bizler sizin robotunuzu izlemek için verdiğiniz linkten Rekor.txt dosyasını indirip Robot programının bulunduğu klasöre kopyalayacağız.
Programda Izle butonuna bastığımızda sizin robotunuzu izliyor olacağız.
Hep aynı robot ve pistde mi yarışacağız?
Hayır. Robotun ölçüleri (teker çapı, tekerler arası mesafe, sensörün tekerlerden uzaklığı) ve dinamiği (sürtünmesi ve kütlesi) belirlenebiliyor. Daha farklı pistler belirlenebiliyor. Farklı bir yarışma için küçük bir Robot dosyası vereceğim.
Bir iki versiyondan sonra program iyice oturmuş olacak. Boreas'ın yazacağı eklenti ile programın görselliği çok artacak.
Rekor kırarsam MyAlgo.Dll Dosyamı gönderecekmiyim?
Hayır. Bizlere dll dosyasını ya da algorirmanızın içeriğini göndermeniz gerekmiyor. Bu sizin sırrınız olacak.
Mevcut Rekor 1657 dongu ile demo programa aittir.
Buradaki döngü değerinin anlamı nedir?
Demo algoritması bu pisti bitirmek için 1657 kez çalışmak zorunda kalmış demektir.
Pist.Bmp dosyasını değiştirebilirmiyim?
Verdiğim pist.bmp dosyasındaki renklere sadık kalarak kendinize farklı pistler tasarlayabilirsiniz. Ancak kendi pistinizde elde edeceğiniz döngü süresi biz yarışmacılar için bir şey ifade etmeyecektir. Fakat bir başka başlık altında hazırlamış olduğunuz pist için yeni yarışlar düzenleyebilirsiniz.
mesaj birleştirme:: 11 Ekim 2015, 05:07:03
Örnek verdiğim MyAlgo.dll kötü bir algoritma barındırıyor.
Yazacağınız bir algoritma ile 1657 rekorunu kesinlikle geçebilirsiniz.
Diğer diller için de örnek olması açısından basit de olsa bir MyAlgo.Dll yazıp yayınlamanızı isterim.
VB, C ve C# örnekleri iyi olur.
Bir ara kafa yoracağım bu işe.
WinXP ile çalıştı Win10 ile çalışmadı.
Peki biz linux kullananlar nasıl katılacağız :D WINE kullanmak istemeyenler olarak
Yarış esnasında resette sayaç resetlenmiyor.
Program otursun o zaman Lazarus'da linux içinde denenir. Ama içimden bir ses bu işin robot simülasyonuna kadar gidebileceğini söylüyor :)
C ya da c# için örnek olsa daha rahat olacak
Hocam Merhaba
bir dahaki versiyonda programda bir bölüm yapsanız ve dll yazmak yerine runtime esnasında kod yazılsa ve kod çalıştırılsa ?
pascal script için bileşenler vardı diğer diller içinde vardır diye düşünüyorum ?
http://www.pp4s.co.uk/static/pp4s/images/tut-trans/PascalScript1.jpg (http://www.pp4s.co.uk/static/pp4s/images/tut-trans/PascalScript1.jpg)
Bayağı yetenekli olması ve yük getirmemesi gerekir.
Örnek algoritma mantıksal kontrol yapıyor. Öyle algoritmalar yarışacakki safi matematik olacak. script bunların üstesinden gelebilirmi?
yetenekli bir bileşen bulmak gerek. neyse delphi yüklü değil lazarus ile deneme yapayım dedim örnek kodlarınızı dll oluşturmak için hazırladım fakat aşağıdaki gibi sıkıntı ile karşılaştım.
(http://i.hizliresim.com/68Z0zP.jpg) (http://hizliresim.com/68Z0zP)
nasıl aşabilirim bilemedim açıkçası
Pointer ile ulaşmayı dene.
Delphi için konuşursak;
Run parametresine, dll'i koşturacak exenin adını verirseniz dll'inizi delphi içinden adım adım koşturabilir debug edebilirsiniz.
Muhtemelen diğer dillerde bu şekilde davranıyordur.
Proje\Proje Seçenekleri\ Compiler Options\Parsing -- > Delphi (-Mdelphi) seçip onaylarsan sorun çıkmayacaktır.
Alıntı yapılan: SercanTEK - 11 Ekim 2015, 19:05:24
Hocam Merhaba
bir dahaki versiyonda programda bir bölüm yapsanız ve dll yazmak yerine runtime esnasında kod yazılsa ve kod çalıştırılsa ?
pascal script için bileşenler vardı diğer diller içinde vardır diye düşünüyorum ?
http://www.pp4s.co.uk/static/pp4s/images/tut-trans/PascalScript1.jpg (http://www.pp4s.co.uk/static/pp4s/images/tut-trans/PascalScript1.jpg)
Benim bu proje için düşündüğüm olaylardan biri bu. Gayet başarılı olur.
Alıntı yapılan: boreas - 11 Ekim 2015, 20:15:53
Proje\Proje Seçenekleri\ Compiler Options\Parsing -- > Delphi (-Mdelphi) seçip onaylarsan sorun çıkmayacaktır.
hocam denedim ama olmadı.
P[16] ya değer aktarırken şuan sadece bu hatayı alıyorum.
MyAlgo.lpr(23,16) Error: Incompatible types: got "TByteArray" expected "LongInt"
Öncelikle yukarıdaki kodu direk derleyip sorun olmadığını göre ondan sonra kendi kodunu geliştir derim. Şuanda ki hatan anladığım kadarıyla p16'a attığın değerle ilgili
hocam kod aynı kod değiştirmedim.
http://dosya.co/lw08khp79cfc/robot_dll_uyuygulama.rar.html (http://dosya.co/lw08khp79cfc/robot_dll_uyuygulama.rar.html)
buyrun birde siz deneyin hocam.
{$mode objfpc}{$H+}
{$IFDEF WINDOWS}{$R MyAlgo.rc}{$ENDIF}
satırlarını silersen derleyecektir.
Alıntı yapılan: boreas - 11 Ekim 2015, 20:48:59
{$mode objfpc}{$H+}
{$IFDEF WINDOWS}{$R MyAlgo.rc}{$ENDIF}
satırlarını silersen derleyecektir.
lazarusa yeni başladım sayılır. teşekkür ederim.
Lazarus candır :)
Alıntı yapılan: boreas - 11 Ekim 2015, 20:52:02
Lazarus candır :)
bazı uygulamalar geliştirmiştim. güzel birşey. alışınca rahat oluyor.
@SercanTEKDosyada Artemis!CD35524AD8AE diye bir virüs var.
Alıntı yapılan: z - 11 Ekim 2015, 21:00:59
@SercanTEK
Dosyada Artemis!CD35524AD8AE diye bir virüs var.
eset nod32 kullanıyorum birşey söylemedi ? yüklediğim yerde sıkıntı olabilir mi ?
https://www.virustotal.com/tr/file/23a75417477b07d5a1046c542a99e7b2b0a7c5cb5d425b65fdeeff2d15c468e2/analysis/1444586710/ (https://www.virustotal.com/tr/file/23a75417477b07d5a1046c542a99e7b2b0a7c5cb5d425b65fdeeff2d15c468e2/analysis/1444586710/)
Alıntı yapılan: z - 11 Ekim 2015, 21:00:59
@SercanTEK
Dosyada Artemis!CD35524AD8AE diye bir virüs var.
RAR dosyasında mı virüs var?
Simülatörün döngüsü aşağıda.
VL sol motora uygulanan voltaj (Pwm)
VR sağ motora uygulanan voltaj (Pwm)
Motor(); Elektrik motorlarını, robot mekaniğini ve sensörleri simüle eden fonksiyon
Algo(); Sizin yazdığınız kontrol algoritması
Grafik(); Robotun konumu ekrana çizen fonksiyon
VL:=0; VR:=0; T:=0; n:=0; Bitir:=False; Faul:=False;
Dongu:
Motor(); n:=n+1; // Robotun fizik motorunu isletelim
Algo(Addr(Sensor)); // Sizin kontrol algoritmaniz
Grafik(); // Robotun ekrandaki pozisyonu degistir
VL:=Sensor[16];
VR:=Sensor[17];
if Bitir then Goto Bitti; // Sensorlerden herhangi birisi Kirmisi bolgeyi yakalarsa yaris tamamlanir
if Faul then Goto Kaybettiniz; // Sensorlerden herhangi birisi Yesil bolgeyi yakalarsa yarisi kaybedersiniz
Dongu_.Caption:='Dongu '+IntToStr(T);
if n=10 then begin n:=0; Application.ProcessMessages; end;
if Cik then exit;
goto Dongu;
Bitti:
Evet RAR dosyasını indiriyorum virüs tarayıcı uyarıyı veriyor. Daha içine bile bakamadım.
Simülatöre 3 özellik daha ekledim.
Kaygan zemin Robot sensörleri gri lekeli alanları sens ederse belli bir mantıkla tekerleri kaydırıyor ve robot savruluyor.
Gitmesi zor zemin Robot sensörleri kahverengi alanları sens ederse belli bir mantıkla tekerler yavaşlıyor ve robot savruluyor.
Yasak Zemin Robot sensörleri yeşil alanları sens ederse yarışı kaybediyorsunuz.
Sensörlerin sol yanı ve sağ yanı pistin kaygan vs kısmını algıladığında sistem buna ilk tepkiyi veriyor. Kontrol algoritmanız buna tepki veremez.
Algoritmamız neden tepki veremez?
Sensor sinyalleri bize 1 yada 0 olarak geliyor.
Siyah zemin 1 üretirken diğer tüm renkler 0 üretiyor. Dolayısı ile zemin kayganlığı ile bilgiye hiç birimiz sahip değiliz.
Aşağıdaki pistte kahverengi alan henüz yok.
(http://i.hizliresim.com/YJvXmA.jpg) (http://hizliresim.com/YJvXmA)
Simülatörün son halini yüklemedim.
Sanırım sponsor download linklerine tıklıyorsunuz. Çünkü dosyada sadece sizin robot.exe var. Diğerleri kod dosyaları. Gerçek link en aşağıda ufacık.
(http://i.hizliresim.com/jj4lvJ.jpg) (http://hizliresim.com/jj4lvJ)
yazılım hatası var ? program çalışırken başla butonuna basınca döngü değeri sıfırlanıyor. böylece çok küçük çıkabiliyor.
Retüşlerle düzeliyor o hatalar.
Bu arada robot çok yavaş vs demeyin. Farklı yarışlar için farklı robot parametreleri yükleniyor.
Öyle zor robotlar varki. Gaza basınca hemen hızlanmayan frene basınca hemen durmayan yada gaza basınca fırlayıp giden...
Şu anda orta karar bir robotla karşı karşıyayız.
Motor voltaji -127 ... + 127 araligindadir.
demişsiniz. sanki 0 ile 127 arasında gibi geldi bana?
Haklısın.
DLL fonksiyon başlığını şu şekilde yapmamız gerekiyor. function Algo(P: PIntegerArray):boolean; Stdcall;
Simülatörde de düzeltiyorum.
Diğer diller için örnek kod ya da simülatörün linux sürümü paylaşılacak mı?
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 (http://www.cncdesigner.com/wordpress/wp-content/uploads/Robot.zip))
hocam ilk mesajdaki örnek kodu derleyince yeni versiyonda çalışmadı ? acaba neyi değiştirdiniz ?
Ş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ı)
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.
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.
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.
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.
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 (https://www.youtube.com/watch?v=V4fw-0DbWdM)
Elinize saglik. Ben de linux kullaniyorum ama son mesajinizdan sonra sanal makina windows kurup deneyecegim.
Ç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 (http://www.cncdesigner.com/wordpress/wp-content/uploads/Rekorlar.zip)
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.
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.
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/0oar1nw692c1/MyAlgo.zip.html)
http://dosya.co/32ep6yb2stng/MyAlgo-kod.zip.html (http://dosya.co/32ep6yb2stng/MyAlgo-kod.zip.html)
C++ örneği için bir şey sormak istiyorum
@exjra1)
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
@zEğ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 ?
Ç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.
https://www.youtube.com/watch?v=YwIWV1wti-Y&feature=youtu.be&t=103 (https://www.youtube.com/watch?v=YwIWV1wti-Y&feature=youtu.be&t=103)
V1.4 çıktı. Test sürüşünde saniyedeki frame sayısı düşürüldü ve robotun pisti daha kısa izlenme süresinde bitirmesi sağlandı.
Bu robotun hızlandığı anlamına gelmiyor. Gene fizik denklemleri zamanda ardışıl işliyor. Sadece ekranda gösterilen kareler aralardan seyrek şekilde seçiliyor.
Buna karşılık Yarış ve Rakip İzleme modunda frame sayısı yüksek. Bu da robotun sanki yavaş ilerlediği izlenimini veriyor fakat çok daha fazla detay görebiliyorsunuz.
Robot menüsüne bir de sensörleri tekerleklerle aynı hizada olan yeni bir robot eklendi. Kontrol etmesi oldukça zor bir robot.
Daha önce yazdığınız fonksiyonlara bir de Init değişkeni eklemeniz gerekiyor.
Init=1 olarak geldiyse
Herhangi bir hesap yapmayıp sadece değişkenlerinize ilk değer yüklemelisiniz. İstemiyorsanız kullanmayabilirsiniz. Bu özellikle PID algoritması gibi geçmişe yönelik bilgileri depolayan integratörleri sıfırlamak için eklenmiştir.
-----------------
Çizgi sağda kaldıysa sol motoru hızlandır sağ motoru yavaşlat mantığı için motorlara uygulanacak voltajları önceden belirlemek algoritmanın sadece tasarlandığı pistte verimli olmasına neden oluyor.
En azından Acemi1, Acemi2 ve Acemi3 pistlerinin üçünde de başarılı olacak algoritma çalışması yapan ya da PID denemesi yapan varmı?
V1.4 de Algo2 PD algoritmasıdır.
@bluekid sorunuzu z cevaplamis sanirim yeterlidir. Bagimli oldugu dll icin haklisiniz benim sistemimde Qt yuklu oldugu icin gozumden kacmis. Su an pc yakininda değilim ancak yanlis hatirlamiyorsam Qt 5.5 qtcore dll dosyasini istiyor olmasi lazim. Ayni dizine koyarsaniz sorunsuz calisacaktir.
@exjra evet cevabımı aldım Algo fonksiyonunun kullanımı değişmiş
hatta siz yazdıktan sonra yine değişmiş
İstenen dll Qt değil mingw dll 'i - bu dll için statik olarak derleyebilirseniz ihtiyaç duymayacaktır. -
burdada benim çalışmamı görebilirsiniz.
http://derindelimavi.blogspot.com.tr/2015/10/dll-cehennemi.html (http://derindelimavi.blogspot.com.tr/2015/10/dll-cehennemi.html)
Algoritma olarak pek bir iddiam yok
Eline sağlık.
Yazmış olduğun Dll'i henüz denemedim.
Robot menüsünde en alt sıradaki robota çizgiyi takip ettirebildin mi?
algoritma olarak iddiam yok dedim
zaten çoğu boş sayılır
4 numaralı algoritmayı deneyin
bahsettiğiniz robot için hızı azalttığımda çalışıyor.
Araçların matematiksel modelleri ile ilgili de biraz bilgi edinsek güzel olabilir.
C++ derleme için CMakeFile şu şekilde kullanabilirsiniz.
cmake_minimum_required(VERSION 3.5)
project(MyAlgo)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_SHARED_LIBRARY_PREFIX "")
set(SOURCE_FILES MyAlgo.cpp MyAlgo.h)
add_library(MyAlgo SHARED ${SOURCE_FILES})
İlk fırsatta kullandığım modelleri yayınlayayım.
Simülatörde gelişme var mı?
1.4'ten sonra sanki bir versiyon daha çıkmıştı fakat onu tekrar bulamıyorum.
Yanılıyor muyum?
http://www.cncdesigner.com'da bundan fazla bahsetmemişsiniz.