Inhoudsopgave:

Hoe maak je een autonome basketbal spelende robot met behulp van een IRobot Create als basis - Ajarnpa
Hoe maak je een autonome basketbal spelende robot met behulp van een IRobot Create als basis - Ajarnpa

Video: Hoe maak je een autonome basketbal spelende robot met behulp van een IRobot Create als basis - Ajarnpa

Video: Hoe maak je een autonome basketbal spelende robot met behulp van een IRobot Create als basis - Ajarnpa
Video: Bijtende hond terug in wijk van slachtoffer 2024, November
Anonim
Hoe maak je een autonome basketbal spelende robot met behulp van een IRobot Create als basis
Hoe maak je een autonome basketbal spelende robot met behulp van een IRobot Create als basis

Dit is mijn inzending voor de iRobot Create-uitdaging. Het moeilijkste deel van dit hele proces voor mij was om te beslissen wat de robot ging doen. Ik wilde de coole functies van de Create demonstreren en tegelijkertijd wat robo-flair toevoegen. Al mijn ideeën leken te vallen in de categorie saai maar nuttig, of cool en onpraktisch. Uiteindelijk won cool en onpraktisch en werd de basketbal spelende robot geboren. Na enig nadenken realiseerde ik me dat dit praktisch zou kunnen zijn. Stel dat u oranje papier gebruikt en dat al uw vuilnisbakken groene achterborden hebben…

Stap 1: Onderdelen verkrijgen

Vanwege de tijdslimiet van de wedstrijd waren de meeste onderdelen die ik gebruikte "van de plank". Gebruikte "voorraad" robotonderdelen: maken (x1) -- van iRobot www.irobot.comXBC V.3.0 (x1) -- van Botball www.botball.orgCreate-Roomba-kabel (x1) -- van Botball www.botball.orgServo (x2) -- van Botball www.botball.org Scherpe afstandsmeter (x1) -- van Botball www.botball.org Diverse LEGO stenen -- van LEGO www.lego.com6-32 machineschroeven (x4) -- van McMaster www.mcmaster.com "Created" Robot Onderdelen Gebruikt: 3/8 "dik geëxtrudeerde PVC-plaat - dit spul is geweldig, maar ik kan me niet herinneren waar ik het vandaan heb, maar het is net als dit spul https://www.lynxmotion.com/Category.aspx?CategoryID=62Overige onderdelen:Oranje "POOF" bal -- van WalMartBasketbal lijkt op vuilnisbak -- van LowesGreen "bord" -- extra PVC felgroen geverfd

Stap 2: Maak het unieke onderdeel

Creëer het unieke onderdeel
Creëer het unieke onderdeel

Het enige onderdeel dat ik moest fabriceren was een plaat die aan de Create was vastgeschroefd en LEGO-afstand bood. De afstand tussen de gaten van de LEGO-stenen is 8 mm uit elkaar, maar ik heb een dubbele afstand gedaan om tijd te besparen. Het geëxtrudeerde PVC is een makkie om mee te werken. Het kan worden gesneden met een mes, maar is stijf en sterk. Ik pak de robot vaak op bij dit bord en ik heb nog geen probleem gehad.

Stap 1: Snijd het vel op 3,5 "x 9,5", je kunt dit snijden met een mes. Stap 2: Boor de gaten voor de gemaakte schroeven. De maakschroeven maken een doos van 2 en 5/8 "bij 8 en 5/8". Stap 3: Boor de gaten in de LEGO-stenen. Gebruik een boor van 3/16" en ik plaatste de gaten 16 mm uit elkaar. Tip: ik legde het vel in een CAD-programma, drukte het op ware grootte af en plakte het op het vel. Daarna gebruikte ik dit als richtlijn voor het snijden en boren.

Stap 3: De robot in elkaar zetten

De robot in elkaar zetten
De robot in elkaar zetten
De robot in elkaar zetten
De robot in elkaar zetten
De robot in elkaar zetten
De robot in elkaar zetten

Ik vind het leuk om dingen zo eenvoudig mogelijk te bouwen, zodat wanneer ze van de tafel springen, je niet zo veel hoeft te herbouwen!

1. Schroef de nieuw gevormde plaat op de bovenkant van de Create 2. Bouw een arm om de bal te grijpen 3. Bouw een arm om de camera vast te houden 4. Bouw een houder voor de afstandsmeter 5. Monteer de XBC en sluit alle kabels aan

Stap 4: Programmeren van de robot

Ik besloot de XBC als mijn controller te gebruiken, voornamelijk vanwege de ingebouwde kleurtracking. Omdat ik besloot om met de XBC als het brein van de operatie te werken, programmeerde ik mijn robot in Interactive C, of zoals ik het IC noem. IC is gratis te gebruiken en kan worden gedownload op www.botball.org. IC lijkt erg op C++, maar heeft verschillende ingebouwde bibliotheken. Het blijkt dat David Miller van de Universiteit van Oklahoma een bibliotheek heeft geschreven voor de Create die kan worden gedownload van zijn pagina op https://i-borg.engr.ou.edu/~dmiller/create/. Met die bronnen en de handleidingen voor de creatie was ik klaar om te programmeren. Maar de volgende grote uitdaging was: wat wilde ik dat het deed? Ik wilde een robot die oranje ballen kon oppakken en in een mandje kon scoren. Mijn doel klonk eenvoudig, en had waarschijnlijk ook simpel kunnen zijn, maar hoe meer ik me verdiepte in wat de Create kon doen, hoe meer ik wilde dat het deed. Mijn definitieve lijst zag er als volgt uit: 1. Vind oranje bal2. Neem oranje ball3 op. Zoek mandje4. Leg de bal in basketWhile1. Voorwerpen vermijden 2. Niet van iets vallen (zoals een tafel) 3. Detectie van de lading van de batterij en docking met de thuisbasis wanneer deze bijna leeg is Oh, en dit alles is volledig autonoom, wat betekent dat het allemaal voorgeprogrammeerd is.

Stap 5: Coderen

Het is misschien rommelig, maar het werkt.#use "createlib.ic"#use "xbccamlib.ic"#define cam 0//camera servo port#define arm 3//arm servo port#define et (analog(0)) //et-poort/*De create-kabel moet ook worden aangesloten. De stroomaansluiting, de 3-polige plug in poort 8 en die met het label UX in JP 28 (naast de USB-poort) met de U naar de camera*/ #define c_down 5//camera servo down#define a_down 17//arm servo down#define hold 50//servo hold ball#definieer gevangen 27//arm servo positie om te voorkomen dat deze op tafel wordt gepakt#define shoot 150//servo bal gooien#define track_c 25//camera servo track close position#define track_f 45//camera servo track far position#define center 120//center of camera vision#define binnenbereik 30//track_y coördinaat wanneer de bal in de klauw is#definieer bal 0//kanaal van oranje bal#define ball_x (track_x(ball, 0))//x coordinate of ball#define ball_y (track_y(ball, 0))//y coordinate of ball#define slow 100//speed of slow motor#definieer snel 175//snelheid van snelle motor#definieer duidelijk 0.2//s leep om achteruit te gaan van obstakels#definieer tijd 0,5 //1,0 is een bocht van 90 graden naar rechts#definieer rust 0,05//tijd om te slapen tijdens het volgen van blobs#definieer snelheida 175//snelheid van vermijden bocht#definieer terug_s -200//snelheid naar achteruit weg van gestoten object#definieer recht 32767//rijd in een rechte lijn#definieer de achtergrondb 2//kanaal van de hoofdkleur van het bord#definieer vierkant 1//kanaal van de kleur van het bordaccent#definieer track_d 250//camerapositie voor het volgen van doel# definieer track_find 70//camerapositie voor lange tracking#definieer achteruit 2.25//slaaptijd voor een 180#define back_f -150//back fast speed#define back_sl -125//back slow speed#define center_x 178//true x center of cam#define center_y 146//true y center of camint pida;//avoid processint pidb;//track processint pidc;//score processint have_ball = 0;//vertelt welke functie we factureren main(){ long ch; enable_servos();//servo's inschakelen init_camera();//start camera cconnect();//connect om te creëren met volledige controle start_a();//start vermijden functie start_b();//start ball_tracking functie while(1) {if(r_button()||gc_ldrop||gc_rdrop){//if opgepikt of r shoulder button kill(pida); doden (pidb); doden (pidc); uitschakelen_servo's(); Loskoppelen(); breken;} create_battery_charge(); display_clear(); printf("charge = %l\n", gc_battery_charge); if(gc_battery_charge<1200l||b_button()){ kill(pida); doden (pidb); doden (pidc); gooien(); have_ball=0; create_demo(1); while(b_button()); while(gc_battery_charge<2800l&&!b_button()){ create_battery_charge(); display_clear(); printf("charge = %l\n", gc_battery_charge); slaap(1.0);} cconnect(); rug(); slaap(2.0); begin een(); start_b();} }}void avoid(){ while(1){//repeat forever create_sensor_update();//update alle sensorwaarden //create_drive (speeda, straight); if(gc_lbump==1){//links bump avoid_right();}//draait naar rechts om else te vermijden if(gc_rbump==1){//right bump avoid_left();}//draait naar links om else te vermijden if(gc_lfcliff==1){//left front cliff avoid_right();} else if(gc_rfcliff==1){//right front cliff avoid_left();} else if(gc_lcliff==1){//left cliff avoid_right();} else if(gc_rcliff==1){//right cliff avoid_left();} }}void track_ball(){ kill(pidc); while(!have_ball){//herhaal tot bal track_update(); far();// zet de camera gereed();// zet de arm while(et<255){//tot de maximale waarde gebeurt wanneer de bal wordt gevangen track_update();//update camerabeeld if(ball_x<=(center-5)){//als de bal links is track_update(); create_drive_direct(langzaam, snel);//naar links slapen (rust);} else if(ball_x>=(center+5)){//if de bal goed is track_update(); create_drive_direct(snel, langzaam);// sla rechtsaf slaap(rust);} else if(ball_x(center-5)){// als de bal gecentreerd is track_update(); create_drive_straight(fast);//go straight sleep(rest);} } grab();//grab ball beep();//make noise stop();//stop rijden have_ball=1;// noteer dat Ik heb bal } start_c();//find the basket sleep(1.0);//slaap zodat ik niets doe als ik vermoord word} ongeldig find_basket(){ kill(pidb);//kill ball tracking proces find();//put camera up track_set_minarea(1000);//het bord is groot, dus zoek alleen naar grote blobs while (have_ball){//while I have the ball track_update(); while(track_x(backb, 0)=(center_x+20)){//while niet gecentreerd track_update(); if(track_x(backb, 0)>=(center_x+20)){//als het bord links is track_update(); create_spin_CCW(100);}// sla linksaf else if(track_x(backb, 0)<=(center_x-20)){//if het bord rechts is track_update(); create_spin_CW(300-center_x);}// sla rechtsaf en vertraag als het centrum nadert } stop(); while(track_size(backb, 0)<=(6000)){//terwijl het doel kleiner is dan 6000 pixels track_update(); if(track_x(backb, 0)<=(center_x-5)){//if het doel is links track_update(); create_drive_direct(langzaam, snel);//naar links slapen (rust);} else if(track_x(backb, 0)>=(center_x+5)){//if het doel rechts is track_update(); create_drive_direct(snel, langzaam);// sla rechtsaf slaap(rust);} else if(track_x(backb, 0)(center_x-5)){// als het doel gecentreerd is track_update(); create_drive_straight(fast);//go straight sleep(rust);} } stop(); //create_drive_straight(fast);// kom een beetje dichterbij //sleep(1.0); //stop(); slaap(1.0); create_spin_CW(speeda);//spin rechts slaap (achteruit);//slaap lang genoeg voor een stop van 180 beurten(); down();// zet de camera neer om de slaap van het bord te volgen (1.0); track_set_minarea(200);//gebruik een kleinere minimale grootte, omdat we erop gericht zijn en dichterbij komen while(track_y(backb, 0)>=(center_y-140)){//terwijl het doel kleiner is dan de y coördinaat track_update(); if(track_x(backb, 0)<=(center_x-5)){//if het doel is links track_update(); back_right();//draai links slaap(rust);} else if(track_x(backb, 0)>=(center_x+5)){//if het doel is rechts track_update(); back_left();// sla rechtsaf sleep(rust);} else if(track_x(backb, 0)(center_x-5)){// als het doel gecentreerd is track_update(); back();//ga rechtdoor slapen (rust);} } stop(); piep(); throw();//shoot sleep(1.0); have_ball=0;//herinnering ik heb de bal gegooid en heb hem niet} start_b();//back to ball tracking sleep(1.0);//doe niets totdat dit proces sterft} void cconnect(){ create_connect (); create_full();//voor volledige controle van richelsensoren create_power_led(0, 255);}//green power ledvoid disconnect(){ stop();//stop bewegen create_disconnect();}void back_away(){ back(); slapen (helder); stop();}void rotary_l(){ create_spin_CCW(speeda); bedtijd); stop();}void rotary_r(){ create_spin_CW(speeda); bedtijd); stop();}void stop(){ create_drive(0, straight);}void back(){ create_drive(back_s, straight);}void ready(){ set_servo_position(arm, a_down);}void check(){ set_servo_position (cam, track_c);}void far(){ set_servo_position(cam, track_f);}void ledge(){ set_servo_position(arm, gevangen);}void throw(){ int a; for(a=50; a>=30; a-=1){//get ready set_servo_position(arm, a);} set_servo_position(arm, shoot);}void grab(){ int a; for(a=0; a<=hold; a+=1){//arm soepel omhoog 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;//wacht tot het huidige aanmaakproces is voltooid, en neem prioriteit kill_process(pid); CREATE_FREE;//ik ben klaar stop();}void avoid_left(){ kill(pidb);//stop al het andere kill(pidc); richel();// pak de klauw op zodat deze niet vast komt te zitten op de tafel back_away();//back away rotary_l();//roteer weg van obstakel klaar();//zet de klauw terug naar beneden if(have_ball) {//if ik heb de bal start_c();}//start goal tracking else if(!have_ball){//if ik heb de bal niet start_b();}//start ball tracking}void avoid_right() { doden (pidb); doden (pidc); richel(); terugdeinzen(); roteer_r(); klaar(); 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);}

Stap 6: Was het het waard?

De kosten waren: Maken + batterij + doc = $ 260XBC-startpakket (xbc, cam, LEGO-stenen, sensoren) = $ 579 PVC + verf + schroeven = ongeveer $ 20 Totale kosten = $ 859 Ik had al de XBC-starterkit van Botball, dus de kosten voor mij waren de kosten van de Create. Ik denk dat het het waard was, en het beste deel is dat alle onderdelen die ik heb gebruikt herbruikbaar zijn, als ik mezelf ertoe kon brengen deze bot uit elkaar te halen. Deze video toont de subroutine 'vermijden', op een tafelblad. Deze video laat zien hoe de robot 5 oranje ballen in een doel scoort. Ik heb alleen geholpen om het proces te versnellen, het zou bal 5 uiteindelijk vanzelf hebben gevonden.

Stap 7: Conclusie

Het eindresultaat is een robot die helemaal alleen oranje ballen kan oppakken en scoren in een doel.

Ik vond het geweldig om aan dit project te werken. Hoe meer ik aan deze robot werkte, hoe meer ik eraan gehecht raakte. Ik praat er nu tegen alsof het een huisdier is. Ik hoop dat dit je heeft geholpen bij je volgende project. Er zijn veel mensen die ik moet bedanken, maar het zijn er te veel. Zoals Bernard van Chartres zo elegant zei: "we zijn als dwergen op de schouders van reuzen, zodat we meer kunnen zien dan zij, en dingen op grotere afstand, niet vanwege enige scherpte van onze kant, of enige fysieke onderscheid, maar omdat we hoog worden gedragen en opgevoed door hun gigantische omvang."

Aanbevolen: