İçindekiler:

Temel Olarak Oluşturulan Bir IRobot Kullanarak Otonom Basketbol Oynayan Robot Nasıl Yapılır: 7 Adım (Resimlerle)
Temel Olarak Oluşturulan Bir IRobot Kullanarak Otonom Basketbol Oynayan Robot Nasıl Yapılır: 7 Adım (Resimlerle)

Video: Temel Olarak Oluşturulan Bir IRobot Kullanarak Otonom Basketbol Oynayan Robot Nasıl Yapılır: 7 Adım (Resimlerle)

Video: Temel Olarak Oluşturulan Bir IRobot Kullanarak Otonom Basketbol Oynayan Robot Nasıl Yapılır: 7 Adım (Resimlerle)
Video: Tolga ilk saniyelerde üstünü düzelt diyor #kismetseolur#aytol#aybüke#tolga#kısmetseolur 2024, Kasım
Anonim
Temel Olarak Oluşturulan Bir IRobot Kullanarak Otonom Basketbol Oynayan Robot Nasıl Yapılır?
Temel Olarak Oluşturulan Bir IRobot Kullanarak Otonom Basketbol Oynayan Robot Nasıl Yapılır?

Bu, iRobot Create meydan okuması için benim girişim. Tüm bu sürecin benim için en zor kısmı robotun ne yapacağına karar vermekti. Biraz robo yetenek eklerken, Yarat'ın harika özelliklerini göstermek istedim. Tüm fikirlerim ya sıkıcı ama kullanışlı ya da havalı ve pratik olmayan kategorisine giriyor gibiydi. Sonunda havalı ve pratik olmayan galip geldi ve basketbol oynayan robot doğdu. Biraz düşündükten sonra bunun pratik olabileceğini anladım. Turuncu kağıt kullandığınızı ve tüm çöp kutularınızın yeşil arkalıklara sahip olduğunu varsayalım…

Adım 1: Parçaları Edinin

Yarışmanın zaman sınırı nedeniyle, kullandığım parçaların çoğu "kullanıma hazır" idi. Kullanılan "Stok" Robot Parçaları:Create (x1) -- iRobot'tan www.irobot.comXBC V.3.0 (x1) -- Botball'dan www.botball.orgCreate-Roomba kablosu (x1) -- Botball'dan www.botball.orgServo (x2) -- Botball'dan www.botball.orgSharp telemetre (x1) -- Botball'dan www.botball.orgÇeşitli LEGO yapım parçaları -- LEGO'dan www.lego.com6-32 makine vidaları (x4) -- McMaster www.mcmaster'dan.com "Oluşturulan" Robot Parçaları Kullanılan:3/8" kalınlığında ekstrüde PVC levha -- bu şey harika, ama nereden aldığımı hatırlayamıyorum, ama tıpkı bu şeye benziyor https://www.lynxmotion.com/Category.aspx?CategoryID=62Diğer parçalar:Turuncu "POOF" top -- WalMartBasketball'dan kale görünümlü çöp tenekesinden -- LowesGreen "arka tahtasından" -- ekstra PVC parlak yeşil boyalı

2. Adım: Benzersiz Parçayı Oluşturun

Eşsiz Parçayı Yaratın
Eşsiz Parçayı Yaratın

Yapmam gereken tek parça, Oluştur'a vidalanan ve LEGO aralığı sunan bir plakaydı. LEGO tuğla deliklerinin aralıkları 8 mm'dir, ancak zamandan tasarruf etmek için çift boşluk bıraktım. Ekstrüde PVC ile çalışmak çocuk oyuncağıdır. Bir maket bıçağıyla kesilebilir, ancak sert ve güçlüdür. Robotu sık sık bu plakadan alıyorum ve henüz bir problem yaşamadım.

Adım 1: Sayfayı 3,5" x 9,5" boyutunda kesin, bunu maket bıçağıyla kesebilirsiniz. Adım 2: Oluşturma vidaları için delikler açın. Oluşturma vidaları, 2 ve 5/8" x 8 ve 5/8" boyutlarında bir kutu oluşturur. Adım 3: LEGO tuğla aralıklı delikler açın. 3/16" matkap ucu kullanın ve delikleri 16 mm aralıklarla yerleştirdim. İpucu: Sayfayı bir CAD programında yerleştirdim, tam boyutta yazdırdım ve kağıda bantladım. Sonra bunu kesme ve kesme için bir kılavuz olarak kullandım ve sondaj.

Adım 3: Robotu Birleştirme

Robotun Montajı
Robotun Montajı
Robotun Montajı
Robotun Montajı
Robotun Montajı
Robotun Montajı

Bir şeyleri olabildiğince basit bir şekilde inşa etmekten zevk alıyorum, bu şekilde masadan atladıklarında yeniden inşa etmenize gerek kalmıyor!

1. Yeni biçimlendirilmiş plakayı Create'in üstüne vidalayın 2. Topu tutmak için bir kol oluşturun 3. Kamerayı tutmak için bir kol oluşturun 4. Telemetre için bir montaj parçası oluşturun 5. XBC'yi monte edin ve tüm kabloları bağlayın

Adım 4: Robotun Programlanması

Temel olarak yerleşik renk takibi nedeniyle XBC'yi denetleyicim olarak kullanmaya karar verdim. XBC'yi operasyonun beyni olarak kullanmaya karar verdiğim için robotumu Interactive C veya IC olarak adlandırdığım programda programladım. IC'nin kullanımı ücretsizdir ve www.botball.org adresinden indirilebilir. IC, C++'a çok benzer, ancak birkaç yerleşik kitaplığa sahiptir. Görünen o ki, Oklahoma Üniversitesi'nden David Miller, Create için https://i-borg.engr.ou.edu/~dmiller/create/ adresinden indirilebilen bir kütüphane yazdı. Bu kaynaklar ve oluşturma kılavuzları ile programlamaya hazırdım. Ama bir sonraki büyük zorluk, onun ne yapmasını istiyordum? Turuncu topları alıp sepete atabilecek bir robot istedim. Amacım kulağa basit geliyordu ve muhtemelen basit olabilirdi, ancak Create'in neler yapabileceğine ne kadar çok girdiysem, o kadar çok yapmasını istedim. Son listem şöyle görünüyordu: 1. Turuncu top2 bulun. Turuncu topu al3. basket4'ü bulun. Topu sepete koy1. Nesnelerden kaçınma2. Hiçbir şeyden düşmemek (masa gibi) 3. Pilin şarjını algılama ve düşük Oh olduğunda ana üs ile bağlantı kurma ve bunların tümü tamamen özerktir, yani hepsi önceden programlanmıştır.

Adım 5: Kod

Dağınık olabilir ama işe yarıyor.#"createlib.ic"#use "xbccamlib.ic"#define kam 0//camera servo port#define arm 3//arm servo port#define et (analog(0)) //et bağlantı noktası/*Oluşturma kablosunun da takılması gerekir. Güç jakı, 3 uçlu fiş bağlantı noktası 8'e ve UX etiketli fiş JP 28'e (USB bağlantı noktasının yanında) U ile kameraya doğru*/ #define c_down 5//camera servo down#define a_down 17//servo kolu aşağı#define tut 50//servo topu tut#yakalanmayı tanımla 27//masaya yakalanmamak için servo kolunu kolla#define ateş 150//servo topu fırlat#izi tanımla_c 25//kamera servo yakın konumu izle#iz_f 45//kamera servo uzak konumu izle#merkezi tanımla 120//kamera görüşünün merkezi#aralık tanımla 30//top pençedeyken iz_y koordinatı#topu tanımla 0//turuncu topun kanalı#top_x tanımla (iz_x(top, 0)//x top koordinatı#tanım top_y (iz_y(top, 0))//y topun koordinatı#yavaş tanımla 100//yavaş hızı motor#hızlı tanımla 175//hızlı motor hızı#tanımla temizle 0,2//sn engellerden uzaklaşmak için zıpla#zaman tanımla 0,5 //1.0 90 derecelik bir sağa dönüştür#dinlenmeyi tanımla 0.05//blobları takip ederken uyku zamanı çarpılan nesneden geri git#düz tanımla 32767//düz bir çizgide sür#arkayı tanımlab 2//arka panel kanalı ana rengi#kareyi tanımla 1//arka panel kanalı vurgu rengi#track_d 250//hedef izleme için kamera konumunu tanımla# uzun izleme için track_bul 70//kamera konumunu tanımla#geri tanımla 2,25//180 için uyku zamanı of cam#define center_y 146//camint pida'nın gerçek y merkezi;//processint pidb'den kaçın;//track processint pidc;//score processint have_ball = 0;//hangi fonksiyonun geçersiz olduğunu söyler main(){ long ch; enable_servos();//servoları etkinleştir init_camera();//start camera cconnect();//tam kontrolle oluşturmak için bağlan start_a();//start kaçınma işlevi start_b();//ball_tracking işlevini başlat while(1) { if(r_button()||gc_ldrop||gc_rdrop){//eğer alınırsa veya r omuz düğmesi kill(pida); öldür(pidb); öldür(pidc); devre dışı_servos(); bağlantıyı kes(); break;} create_battery_charge(); display_clear(); printf("şarj = %l\n", gc_battery_charge); if(gc_battery_charge<1200l||b_button()){ kill(pida); öldür(pidb); öldür(pidc); atmak(); have_ball=0; create_demo(1); while(b_button()); while(gc_battery_charge<2800l&&!b_button()){ create_battery_charge(); display_clear(); printf("şarj = %l\n", gc_battery_charge); uyku(1.0);} bağlantı(); geri(); uyku(2.0); başla bir(); start_b();} }}void kaçınma(){ while(1){//sonsuza kadar tekrarla create_sensor_update();//tüm sensör değerlerini güncelle //create_drive (speeda, düz); if(gc_lbump==1){//left bump kaçınma_right();}//else'den kaçınmak için sağa döner if(gc_rbump==1){//right bump kaçınma_left();}//else'den kaçınmak için sola döner if(gc_lfcliff==1){//left front cliff kaçının_right();} else if(gc_rfcliff==1){//right front cliff kaçının_left();} else if(gc_lcliff==1){//left cliff kaçının_right();} else if(gc_rcliff==1){//right cliff escape_left();} }}void track_ball(){ kill(pidc); while(!have_ball){//topu alana kadar tekrarla track_update(); far();//kamerayı hazırlar();//kolu ayarlar while(et<255){//top yakalandığında maksimum değer olana kadar track_update();//kamera resmini güncelle if(ball_x<=(center-5)){//top sol ise track_update(); create_drive_direct(yavaş, hızlı);//sola dön uyku(dinlenme);} else if(ball_x>=(merkez+5)){//top doğruysa track_update(); create_drive_direct(hızlı, yavaş);// sağa dön sleep(rest);} else if(ball_x(merkez-5)){// top ortalanmışsa track_update(); create_drive_straight(hızlı);//düz uykuya dalın(dinlenme);} } kapmak();//ball bip();//gürültüyü durdur();//sürmeyi durdur have_ball=1;//bir not al Topum var } start_c();//sepeti bul sleep(1.0);//sleep böylece öldüğümde hiçbir şey yapmıyorum}void find_basket(){ kill(pidb);//top takip işlemini öldür find();//kamerayı koy track_set_minarea(1000);//arkalık büyük, bu yüzden sadece büyük lekelere bak while (have_ball){//top bendeyken track_update(); while(track_x(backb, 0)=(center_x+20)){// merkezlenmemişken track_update(); if(track_x(backb, 0)>=(center_x+20)){//arkalık bırakılmışsa track_update(); create_spin_CCW(100);}//else sola dönün if(track_x(backb, 0)<=(center_x-20)){//arka panel doğruysa track_update(); create_spin_CW(300-center_x);}// merkeze yaklaşırken yavaşlayarak sağa dönün } stop(); while(track_size(backb, 0)<=(6000)){//hedef boyutu 6000 pikselden küçükken track_update(); if(track_x(backb, 0)<=(center_x-5)){//hedef sol ise track_update(); create_drive_direct(yavaş, hızlı);//sol sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//hedef sağ ise track_update(); create_drive_direct(hızlı, yavaş);// sağa dön sleep(rest);} else if(track_x(backb, 0)(center_x-5)){// hedef ortalanmışsa track_update(); create_drive_straight(hızlı);//düz uykuya dal(dinlenme);} } stop(); //create_drive_straight(hızlı);// biraz daha yakınlaşın //uyku(1.0); //Dur(); uyku(1.0); create_spin_CW(speeda);//spin right sleep(reverse);//180 dönüş durdurmaya yetecek kadar uzun uyku(); down();//arkalığın uykusunu izlemek için kamerayı indir(1.0); track_set_minarea(200);//daha küçük bir minimum boyut kullanın, çünkü biz ona dönüküz ve daha yakına gideceğiz while(track_y(backb, 0)>=(center_y-140){//hedef hedeften küçükken y koordinatı track_update(); if(track_x(backb, 0)<=(center_x-5)){//hedef sol ise track_update(); back_right();//sol sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//hedef sağ ise track_update(); back_left();// sağa dön sleep(rest);} else if(track_x(backb, 0)(center_x-5)){// hedef ortalanmışsa track_update(); geri();//düz uyku(dinlenme);} } stop(); bip(); fırlat();//uykuyu çek(1.0); have_ball=0;//reminder Topu attım ve elimde değil } start_b();//topa geri izleme sleep(1.0);//bu işlem bitene kadar hiçbir şey yapma}void cconnect(){ create_connect (); create_full();//çıkıntı sensörlerinin tam kontrolü için create_power_led(0, 255);}//green power ledvoid connect(){ stop();//stop move create_disconnect();}void back_away(){ back(); uyku(açık); stop();}void döndürme_l(){ create_spin_CCW(hıza); uyku zamanı); stop();}void döndürme_r(){ create_spin_CW(hıza); uyku zamanı); stop();}void stop(){ create_drive(0, düz);}void back(){ create_drive(back_s, düz);}void hazır(){ set_servo_position(arm, a_down);}void check(){ set_servo_position (cam, track_c);}void far(){ set_servo_position(cam, track_f);}void çıkıntı(){ set_servo_position(arm, yakalandı);}void throw(){ int a; for(a=50; a>=30; a-=1){//hazır olun set_servo_position(arm, a);} set_servo_position(arm, shoot);}void grab(){ int a; for(a=0; a<=hold; a+=1){//kolu düzgün bir şekilde kaldırın set_servo_position(arm, a);}}void down(){ set_servo_position(cam, track_d);}void find(){ set_servo_position (cam, track_find);}void start_a(){ pida = start_process(avoid());}void start_b(){ pidb = start_process(track_ball());}void start_c(){ pidc = start_process(find_basket());}void kill(int pid){ CREATE_BUSY;//geçerli oluşturma işleminin bitmesini bekleyin ve önceliği alın kill_process(pid); CREATE_FREE;//bitirdim stop();}void kaçınma_left(){ kill(pidb);//diğer her şeyi durdur kill(pidc); çıkıntı();//pençeyi masaya yakalanmamak için al back_away();//geri geri dön rotary_l();//engelden uzağa dön {//eğer topum varsa start_c();}//gol takibini başlat else if(!have_ball){//top bende yoksa start_b();}//top takibini başlat}void kaçınma_right() { öldür(pidb); öldür(pidc); çıkıntı(); Geri çekil(); döndürme_r(); hazır(); if(have_ball){ start_c();} else if(!have_ball){ start_b();}}void back_left(){ create_drive_direct(back_f, back_sl);}void back_right(){ create_drive_direct(back_sl, back_f);}

Adım 6: Buna Değer miydi?

Maliyetler şunlardı: Oluştur + pil + belge = 260XBC başlangıç seti (xbc, kamera, LEGO yapım parçaları, sensörler) = 579$PVC + boya + vidalar = yaklaşık 20$Toplam maliyet = 859$Botball'dan XBC başlangıç kitine zaten sahiptim, yani maliyet benim için Create'in maliyetiydi. Bence buna değdi ve en iyi yanı, eğer kendimi bu bottan ayırabilirsem, kullandığım tüm parçaların yeniden kullanılabilir olması. Bu video, kaçınma alt rutinini gösteriyor, bir masa üstünde. Bu video, robotun bir kaleye 5 turuncu top attığını gösteriyor. Ben sadece süreci hızlandırmak için yardım ettim, sonunda kendi başına 5. topu bulacaktı.

7. Adım: Sonuç

Nihai sonuç, tek başına turuncu topları toplayıp gol atabilen bir robottur.

Bu proje üzerinde çalışmayı çok sevdim. Bu robot üzerinde çalıştıkça ona daha çok bağlandım. Şimdi onunla bir evcil hayvanmış gibi konuşuyorum. Umarım bu, bir sonraki projenizde size yardımcı olmuştur. Teşekkür etmem gereken çok insan var ama çok fazla insan var. Chartres'lı Bernard'ın çok zarif bir şekilde belirttiği gibi: "Devlerin omuzlarındaki cüceler gibiyiz, böylece onlardan daha fazlasını ve daha uzaktaki şeyleri görebilelim, bizim açımızdan herhangi bir keskinlik ya da herhangi bir fiziksel güç sayesinde değil. değil, onların dev boyutlarıyla yükseğe taşındığımız ve büyütüldüğümüz için."

Önerilen: