Sommario:

Come Realizzare un Robot Autonomo che Gioca a Basket Usando un IRobot Creato come Base: 7 Passaggi (con Immagini)
Come Realizzare un Robot Autonomo che Gioca a Basket Usando un IRobot Creato come Base: 7 Passaggi (con Immagini)

Video: Come Realizzare un Robot Autonomo che Gioca a Basket Usando un IRobot Creato come Base: 7 Passaggi (con Immagini)

Video: Come Realizzare un Robot Autonomo che Gioca a Basket Usando un IRobot Creato come Base: 7 Passaggi (con Immagini)
Video: ERICK SI È FATTO MALE TOGLIENDO UNA PELLICINA… 💀#shorts 2024, Settembre
Anonim
Come creare un robot autonomo che gioca a basket usando un IRobot Crea come base
Come creare un robot autonomo che gioca a basket usando un IRobot Crea come base

Questa è la mia voce per la sfida iRobot Create. La parte più difficile di tutto questo processo per me è stata decidere cosa avrebbe fatto il robot. Volevo dimostrare le fantastiche funzionalità di Create, aggiungendo anche un tocco di robo. Tutte le mie idee sembravano rientrare nella categoria di noiose ma utili, o fredde e poco pratiche. Alla fine ha vinto il cool e il poco pratico ed è nato il robot che gioca a basket. Dopo un po' di riflessione ho capito che poteva essere pratico. Supponi di usare carta arancione e che tutti i tuoi bidoni della spazzatura abbiano un tabellone verde…

Passaggio 1: acquisire parti

A causa del limite di tempo del concorso, la maggior parte delle parti che ho usato erano "pronti allo scaffale". Parti del robot "stock" utilizzate: Crea (x1) -- da iRobot www.irobot.comXBC V.3.0 (x1) -- da Botball www.botball.org Cavo Crea-Roomba (x1) -- da Botball www.botball.orgServo (x2) -- da Botball www.botball.orgTelemetro Sharp (x1) -- da Botball www.botball.org Mattoncini LEGO assortiti -- da LEGO www.lego.com6-32 viti a macchina (x4) -- da McMaster www.mcmaster.com Parti del robot "create" utilizzate: foglio di PVC estruso spesso 3/8" -- questa roba è fantastica, ma non ricordo da dove l'ho presa, ma è proprio come questa roba https://www.lynxmotion.com/Category.aspx?CategoryID=62Altre parti: palla "POOF" arancione - da WalMart cestino della spazzatura dall'aspetto di un obiettivo da basket - da "tabellone" LowesGreen - PVC extra verniciato verde brillante

Passaggio 2: crea la parte unica

Crea la parte unica
Crea la parte unica

L'unica parte che dovevo fabbricare era una piastra che si fissava al Create e offriva la spaziatura LEGO. La distanza tra i fori dei mattoncini LEGO è di 8 mm, ma ho fatto una doppia spaziatura per risparmiare tempo. Il PVC estruso è un gioco da ragazzi con cui lavorare. Può essere tagliato con un taglierino, ma è rigido e resistente. Prendo spesso il robot da questo piatto e non ho ancora avuto problemi.

Passaggio 1: taglia il foglio a 3,5 "x 9,5", puoi tagliarlo con un taglierino. Passaggio 2: praticare i fori per le viti di creazione. Le viti create creano una scatola di 2 e 5/8" per 8 e 5/8". Passaggio 3: praticare i fori distanziati dei mattoncini LEGO. Usa una punta da trapano da 3/16" e ho distanziato i fori di 16 mm. Suggerimento: ho steso il foglio in un programma CAD, l'ho stampato a grandezza naturale e l'ho attaccato al foglio. Quindi l'ho usato come guida per il taglio e perforazione.

Passaggio 3: assemblaggio del robot

Assemblaggio del Robot
Assemblaggio del Robot
Assemblaggio del Robot
Assemblaggio del Robot
Assemblaggio del Robot
Assemblaggio del Robot

Mi piace costruire le cose nel modo più semplice possibile, in questo modo quando saltano giù dal tavolo non devi ricostruire più di tanto!

1. Avvitare la nuova piastra sulla parte superiore del Create 2. Creare un braccio per afferrare la palla 3. Creare un braccio per tenere la fotocamera 4. Creare un supporto per il telemetro 5. Montare l'XBC e collegare tutti i cavi

Passaggio 4: programmazione del robot

Ho deciso di utilizzare l'XBC come controller principalmente per il tracciamento del colore integrato. Poiché ho deciso di utilizzare l'XBC come cervello dell'operazione, ho programmato il mio robot in Interactive C, o come lo chiamo io IC. IC è gratuito e può essere scaricato da www.botball.org. IC è molto simile al C++, ma ha diverse librerie integrate. A quanto pare, David Miller dell'Università dell'Oklahoma ha scritto una libreria per Create che può essere scaricata dalla sua pagina all'indirizzo https://i-borg.engr.ou.edu/~dmiller/create/. Con quelle risorse ei manuali per la creazione ero pronto per programmare. Ma la prossima grande sfida era cosa volevo che facesse? Volevo un robot che potesse andare a raccogliere palline d'arancia e segnarle in un canestro. Il mio obiettivo sembrava semplice, e probabilmente avrebbe potuto essere semplice, ma più mi sono interessato a ciò che Create poteva fare, più volevo che facesse. La mia lista finale sembrava così: 1. Trova la pallina arancione2. Raccogliete la pallina arancione3. Trova cestino4. Mettere la palla nel canestroMentre1. Evitare gli oggetti2. Non cadere nulla (come un tavolo) 3. Rilevamento della carica della batteria e aggancio con la base di casa quando è bassoOh, e tutto questo è completamente autonomo, nel senso che è tutto preprogrammato.

Passaggio 5: codice

Potrebbe essere disordinato, ma funziona.#use "createlib.ic"#use "xbccamlib.ic"#define cam 0//camera servo port#define arm 3//arm servo port#define et (analog(0)) //et port/*Deve essere collegato anche il cavo di creazione. Il jack di alimentazione, la spina a 3 poli nella porta 8 e quella etichettata UX in JP 28 (accanto alla porta USB) con la U verso la fotocamera*/ #define c_down 5//camera servo down#define a_down 17//arm servo down#define hold 50//servo hold ball#define catturato 27//arm servo position per evitare di essere catturati sul tavolo#define shoot 150//servo lancio della palla#define track_c 25//camera servo track close position#define track_f 45//camera servo track posizione lontana#define center 120//center of camera vision#define inrange 30//track_y coordinata quando la palla è in claw#define ball 0//canale della pallina arancione#define ball_x (track_x(ball, 0))//x coordinata della ball#define ball_y (track_y(ball, 0))//y coordinata della ball#define slow 100//velocità di slow motore#definisci veloce 175//velocità del motore veloce#definisci cancella 0.2//s salta per indietreggiare dagli ostacoli#definire il tempo 0,5 //1.0 è una svolta a destra di 90 gradi#definire il riposo 0,05//tempo per dormire durante il monitoraggio dei blob#definire velocitàa 175//velocità di evitare la svolta#definire indietro_s -200//velocità a allontanarsi dall'oggetto urtato#definire dritto 32767//guida in linea retta#definire backb 2//canale del colore principale del tabellone#definire quadrato 1//canale del colore dell'accento del tabellone#definire track_d 250//posizione della telecamera per il monitoraggio dell'obiettivo# define track_find 70//posizione della telecamera per tracking lungo#define reverse 2.25//sleep time per 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;//evita l'elaborazione pidb;//track processint pidc;//score processint have_ball = 0;//dice quale funzione non abbiamo main(){ long ch; enable_servos();//enable servos init_camera();//start camera cconnect();//connect to create with full control start_a();//start Avoid function start_b();//start ball_tracking function while(1) { if(r_button()||gc_ldrop||gc_rdrop){//if preso o r pulsante sulla spalla kill(pida); kill(pidb); kill(pidc); disable_servos(); disconnettere(); break;} create_battery_charge(); display_clear(); printf("carica = %l\n", gc_batteria_carica); if(gc_battery_charge<1200l||b_button()){ kill(pida); kill(pidb); kill(pidc); gettare(); avere_palla=0; create_demo(1); while(b_button()); while(gc_battery_charge<2800l&&!b_button()){ create_battery_charge(); display_clear(); printf("carica = %l\n", gc_batteria_carica); sleep(1.0);} cconnect(); Indietro(); dormire (2.0); inizia un(); start_b();} }}void evita(){ while(1){//ripeti per sempre create_sensor_update();//aggiorna tutti i valori del sensore //create_drive (speeda, straight); if(gc_lbump==1){//salto a sinistra evitare_destra();}//gira a destra per evitare else if(gc_rbump==1){//urto a destra evitare_sinistra();}//gira a sinistra per evitare else if(gc_lfcliff==1){//rovescio anteriore sinistro evitare_right();} else if(gc_rfcliff==1){//scoglio anteriore destro evitare_sinistra();} else if(gc_lcliff==1){//scoglio sinistro evitare_destro();} else if(gc_rcliff==1){//right cliff avoid_left();} }}void track_ball(){ kill(pidc); while(!have_ball){//ripeti fino a ottenere ball track_update(); far();//prepara la telecamera();//prepara il braccio while(et<255){//finché non si verifica il valore massimo quando la palla viene catturata track_update();//aggiorna l'immagine della telecamera if(ball_x<=(center-5)){//se la palla viene lasciata track_update(); create_drive_direct(slow, fast);//gira a sinistra sleep(rest);} else if(ball_x>=(center+5)){//se la palla è a destra track_update(); create_drive_direct(fast, slow);// gira a destra sleep(rest);} else if(ball_x(center-5)){// se la palla è centrata track_update(); create_drive_straight(fast);//go straight sleep(rest);} } grab();//grab ball beep();//make noise stop();//smetti di guidare have_ball=1;//prende nota che Ho la palla } start_c();//trova il cestino sleep(1.0);//dormi in modo che non stia facendo nulla quando vengo ucciso}void find_basket(){ kill(pidb);//kill processo di tracciamento della palla find();//metti la fotocamera in alto track_set_minarea(1000);//il tabellone è grande, quindi cerca solo macchie grandi mentre (have_ball){//mentre ho la palla track_update(); while(track_x(backb, 0)=(center_x+20)){//while non centrato track_update(); if(track_x(backb, 0)>=(center_x+20)){//if il tabellone è lasciato track_update(); create_spin_CCW(100);}//gira a sinistra else if(track_x(backb, 0)<=(center_x-20)){//se il tabellone è a destra track_update(); create_spin_CW(300-center_x);}// gira a destra rallentando mentre il centro si avvicina } stop(); while(track_size(backb, 0)<=(6000)){//while la dimensione del target è inferiore a 6000 pixel track_update(); if(track_x(backb, 0)<=(center_x-5)){//if il target è lasciato track_update(); create_drive_direct(lento, veloce);//gira a sinistra sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//se il target è giusto track_update(); create_drive_direct(fast, slow);// gira a destra sleep(rest);} else if(track_x(backb, 0)(center_x-5)){// se il target è centrato track_update(); create_drive_straight(veloce);//vai dritto a dormire(riposo);} } stop(); //create_drive_straight(fast);// avvicinati un po' //sleep(1.0); //fermare(); sonno(1.0); create_spin_CW(speeda);//spin right sleep(reverse);//dormi abbastanza a lungo per un arresto di 180 turni(); down();//abbassa la fotocamera per monitorare il sonno del tabellone (1.0); track_set_minarea(200);//usa una dimensione minima più piccola, poiché siamo puntati su di essa e ci avvicineremo while(track_y(backb, 0)>=(center_y-140)){//mentre il target è inferiore al y coordinate track_update(); if(track_x(backb, 0)<=(center_x-5)){//if il target è lasciato track_update(); back_right();//turn left sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//se il target è giusto track_update(); back_left();// gira a destra sleep(rest);} else if(track_x(backb, 0)(center_x-5)){// se il target è centrato track_update(); back();//vai dritto sleep(rest);} } stop(); beep(); throw();//sparare sleep(1.0); have_ball=0;//promemoria ho lanciato la palla e non ce l'ho } start_b();//torna al monitoraggio della palla sleep(1.0);//non fare nulla finché questo processo non muore}void cconnect(){ create_connect (); create_full();//per il pieno controllo dei sensori da sporgenza create_power_led(0, 255);}//green power ledvoid scollega(){ stop();//stop movendo create_disconnect();}void back_away(){ back(); dormire (chiaro); stop();}void rotate_l(){ create_spin_CCW(speeda); ora di dormire); stop();}void rotate_r(){ create_spin_CW(speeda); ora di dormire); 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 lontano(){ set_servo_position(cam, track_f);}void ledge(){ set_servo_position(braccio, catturato);}void throw(){ int a; for(a=50; a>=30; a-=1){//preparati set_servo_position(arm, a);} set_servo_position(arm, shoot);}void grab(){ int a; for(a=0; a<=hold; a+=1){//alza il braccio dolcemente 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(evitare());}void start_b(){ pidb = start_process(track_ball());}void start_c(){ pidc = start_process(find_basket());}void kill(int pid){ CREATE_BUSY;//attendere che il processo di creazione corrente finisca e prendere la priorità kill_process(pid); CREATE_FREE;//ho finito stop();}void evita_left(){ kill(pidb);//ferma tutto il resto kill(pidc); ledge();//raccogli l'artiglio in modo che non rimanga impigliato sul tavolo back_away();//back away rotate_l();//ruota lontano dall'ostacolo ready();//rimetti giù l'artiglio if(have_ball) {//se ho la palla start_c();}//inizia il tracciamento del gol else if(!have_ball){//se non ho la palla start_b();}//inizia il tracciamento della palla}void evita_destra() { kill(pidb); kill(pidc); sporgenza(); indietreggiare(); ruotare_r(); pronto(); 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);}

Passaggio 6: ne è valsa la pena?

I costi erano: Crea + batteria + documento = $ 260 XBC starter kit (xbc, cam, mattoncini LEGO, sensori) = $ 579 PVC + vernice + viti = circa $ 20 Costo totale = $ 859 Avevo già lo starter kit XBC da Botball, quindi il costo per me è stato il costo del Create. Penso che ne sia valsa la pena, e la parte migliore è che tutte le parti che ho usato sono riutilizzabili, se potessi convincermi a separare questo bot. Questo video mostra la routine da evitare, su un tavolo. Questo video mostra il robot che segna 5 palline arancioni in un goal. Ho solo aiutato ad accelerare il processo, alla fine avrebbe trovato la palla 5 da sola.

Passaggio 7: conclusione

Il risultato finale è un robot che da solo può raccogliere e segnare palline arancioni in una porta.

Mi è piaciuto lavorare a questo progetto. Più lavoravo su questo robot, più mi ci attaccavo. Ora gli parlo come se fosse un animale domestico. Spero che questo ti abbia aiutato nel tuo prossimo progetto. Ci sono molte persone che devo ringraziare, ma sono troppe. Come affermò così elegantemente Bernardo di Chartres: "siamo come nani sulle spalle dei giganti, in modo che possiamo vedere più di loro, e le cose a una distanza maggiore, non in virtù di alcuna acutezza visiva da parte nostra, o di alcun fisico distinzione, ma perché siamo portati in alto e sollevati dalle loro dimensioni gigantesche".

Consigliato: