Kazalo:

Kako narediti avtonomnega robota za igranje košarke z uporabo IRobota Ustvari kot osnovo: 7 korakov (s slikami)
Kako narediti avtonomnega robota za igranje košarke z uporabo IRobota Ustvari kot osnovo: 7 korakov (s slikami)

Video: Kako narediti avtonomnega robota za igranje košarke z uporabo IRobota Ustvari kot osnovo: 7 korakov (s slikami)

Video: Kako narediti avtonomnega robota za igranje košarke z uporabo IRobota Ustvari kot osnovo: 7 korakov (s slikami)
Video: КАКИМ БУДЕТ PORTAL 3 2024, November
Anonim
Kako z uporabo IRobota ustvariti samostojnega robota za igranje košarke
Kako z uporabo IRobota ustvariti samostojnega robota za igranje košarke

To je moj vnos za izziv iRobot Create. Najtežji del tega celotnega procesa se mi je odločil, kaj bo robot počel. Želel sem pokazati kul lastnosti ustvarjanja, hkrati pa dodati nekaj robovskega pridiha. Zdelo se je, da vse moje ideje sodijo v kategorijo dolgočasnih, a uporabnih ali pa kul in nepraktičnih. Na koncu je zmagal kul in nepraktičen in rojen je bil košarkarski robot. Po premisleku sem ugotovil, da je to lahko praktično. Predpostavimo, da uporabljate oranžni papir in da imajo vsi vaši koši za smeti zelene plošče …

Korak: Pridobite dele

Zaradi časovne omejitve natečaja je večina delov, ki sem jih uporabil, "izven police". Uporabljeni deli robotov "Stock": Ustvarite (x1)-iz iRobot www.irobot.com XBC V.3.0 (x1)-iz Botballa www.botball.orgUstvarite-Roomba kabel (x1)-iz Botballa www.botball.orgServo (x2)-od Botball www.botball.org Sharp daljinomer (x1)-od Botball www.botball.org Razvrščene LEGO kocke-od LEGO www.lego.com 6-32 strojni vijaki (x4)-od McMaster www.mcmaster.com "Ustvarjeni" uporabljeni robotski deli: 3/8 "debela ekstrudirana PVC folija - te stvari so super, vendar se ne spomnim, od kod sem jih dobil, je pa takole https://www.lynxmotion.com/Category.aspx? CategoryID = 62Drugi deli: Oranžna žoga "POOF" - iz WalMart -a Košarkarski koš za gledanje gola - iz LowesGreen "table" - dodatno pobarvan s svetlo zeleno barvo iz PVC -ja

2. korak: Ustvarite edinstven del

Ustvarite edinstven del
Ustvarite edinstven del

Edini del, ki sem ga moral izdelati, je bila plošča, ki je pritrjena na Create in ponudila razmik LEGO. Razmik lukenj LEGO opeke je 8 mm narazen, vendar sem naredil dvojni razmik, da prihranim čas. Z ekstrudiranim PVC je enostavno delati. Lahko ga režemo s pomožnim nožem, vendar je tog in močan. Robota pogosto poberem za to ploščo in še nisem imel težav.

1. korak: List razrežite na 3,5 "x 9,5", to lahko razrežete z nožem. Korak: Izvrtajte luknje za vijake za ustvarjanje. Ustvarjalni vijaki naredijo škatlo velikosti 2 in 5/8 "za 8 in 5/8". 3. korak: Izvrtajte luknje, razporejene z opeko LEGO. Uporabite sveder 3/16 "in luknje sem razmaknil 16 mm narazen. Nasvet: list sem položil v program CAD, ga natisnil v polni velikosti in ga prilepil na list. Nato sem to uporabil kot vodilo za rezanje in vrtanje.

3. korak: Sestavljanje robota

Sestavljanje robota
Sestavljanje robota
Sestavljanje robota
Sestavljanje robota
Sestavljanje robota
Sestavljanje robota

Uživam v gradnji stvari čim bolj preprosto, tako da vam, ko skočijo z mize, ni treba toliko obnavljati!

1. Novo oblikovano ploščo privijte na vrh Create 2. Sestavite roko, da zgrabite žogo 3. Sestavite roko za držanje kamere 4. Sestavite nosilec za daljinomer 5. Montirajte XBC in povežite vse kable

4. korak: Programiranje robota

Za uporabo krmilnika XBC sem se odločil predvsem zaradi vgrajenega sledenja barvam. Ker sem se odločil za XBC kot možgane operacije, sem svojega robota programiral v Interactive C ali, kot mu pravim IC. IC je brezplačen za uporabo in ga lahko prenesete s spletnega mesta www.botball.org. IC je zelo podoben C ++, vendar ima več vgrajenih knjižnic. Izkazalo se je, da je David Miller z univerze v Oklahomi napisal knjižnico za Create, ki jo lahko prenesete s svoje strani na https://i-borg.engr.ou.edu/~dmiller/create/. S temi viri in priročniki za ustvarjanje sem bil pripravljen programirati. Naslednji velik izziv pa je bil, kaj sem hotel narediti? Hotel sem robota, ki bi lahko pobral oranžne kroglice in jih zabil v koš. Moj cilj se je zdel preprost in verjetno bi lahko bil tudi preprost, a bolj ko sem se lotil tega, kar bi lahko naredil Create, bolj sem si želel, da bi to naredil. Moj zadnji seznam je izgledal takole: 1. Poiščite oranžno kroglico 2. Poberi oranžno kroglico 3. Poiščite košarico 4. Dajte žogo v koš Medtem ko 1. Izogibanje predmetom 2. Nič ne pade (kot miza) 3. Zaznavanje napolnjenosti akumulatorja in priklop na domačo bazo, ko je lowOh, in vse to je popolnoma avtonomno, kar pomeni, da je vse vnaprej programirano.

5. korak: Koda

Morda je grdo, vendar deluje.#Use "createlib.ic" #use "xbccamlib.ic" #define cam 0 // vrata za servo kamere#definirajte roko 3 // vrata za servo roko#define et (analogno (0)) // et port/*Priključiti je treba tudi kabel za ustvarjanje. Priključek za napajanje, 3 -kračni vtič v vrata 8 in tisti z oznako UX v JP 28 (poleg vrat USB) z U proti kameri*/ #define c_down 5 // servo kamere navzdol#define a_down 17 // servo roke navzdol#define hold 50 // servo hold ball#definiraj ulovljeno 27 // arm servo položaj, da se ne ujamejo na mizo#define shoot 150 // servo metanje žoge#definiranje track_c 25 // zapiranje položaja servo kamere za kamero#definiranje track_f 45 // oddaljeno pozicijo za servo kamero#definiranje središča 120 // središče vida kamere#definiranje inrange 30 // koordinata skladbe_y, ko je žoga v kremplju#definiraj žogo 0 // kanal oranžne žoge#define ball_x (track_x (ball, 0)) // x koordinata žoge#define ball_y (track_y (žoga, 0)) // y koordinata žoge#definiraj počasi 100 // hitrost počasi motor#definiraj hitro 175 // hitrost hitrega motorja#definiraj jasno 0,2 // s skok za odmik od ovir#definiraj čas 0,5 //1,0 je zavoj za 90 stopinj desno#določi počitek 0,05 // čas za spanje med sledenjem pikicam#določi speeda 175 // hitrost izogibanja zavoju#definiraj back_s -200 // hitrost do nazaj od udarnega predmeta#definiraj naravnost 32767 // vozi po ravni liniji#določi backb 2 // kanal glavne barve plošče#določi kvadrat 1 // kanal barve poudarka na hrbtni plošči#določi track_d 250 // položaj kamere za sledenje cilju# define track_find 70 // položaj kamere za dolgo sledenje#definiranje vzvratne 2,25 // čas spanja za 180#opredelitev back_f -150 // hitra hitrost#definiranje back_sl -125 // počasna hitrost#definiranje center_x 178 // pravi x center od cam#define center_y 146 // pravi y center camint pida; // izogibanje processint pidb; // sledenje processint pidc; // rezultat processint have_ball = 0; // pove, za katero funkcijo smo invoid main () {long ch; enable_servos (); // omogoči servomotorje init_camera (); // zažene kamero cconnect (); // se poveže za ustvarjanje s polnim nadzorom start_a (); // začni izogibati funkciji start_b (); // zaženi funkcijo sledenja žogici medtem ko (1) {if (r_button () || gc_ldrop || gc_rdrop) {// če se dvigne ali gumb r rame ubije (pida); ubiti (pidb); kill (pidc); disable_servos (); odklopi (); break;} create_battery_charge (); display_clear (); printf ("naboj = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); ubiti (pidb); kill (pidc); vrzi (); have_ball = 0; create_demo (1); medtem ko (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("naboj = %l / n", gc_battery_charge); sleep (1.0);} cconnect (); nazaj (); spanje (2,0); start_a (); start_b ();}}} void escape () {while (1) {// za vedno ponavljaj create_sensor_update (); // posodobi vse vrednosti senzorja // create_drive (speeda, naravnost); if (gc_lbump == 1) {// levi udarec escape_right ();} // zavije v desno, da bi se izognil else if (gc_rbump == 1) {// desni udar v izogib else_left ();} // zavije levo, da bi se izognil else if ((gc_lfcliff == 1) {// leva sprednja pečina escape_right ();} else if (gc_rfcliff == 1) {// desna sprednja pečina izogibanje_left ();} else if (gc_lcliff == 1) {// leva pečina escape_right ();} else if (gc_rcliff == 1) {// desna pečina escape_left ();}}} void track_ball () {kill (pidc); while (! have_ball) {// ponavljajte, dokler ne dobite ball track_update (); far (); // nastavi kamero ready (); // nastavi roko, medtem ko (et <255) {// dokler se ne zgodi največja vrednost, ko je žoga ujeta track_update (); // posodobi sliko kamere, če (ball_x <= (center-5)) {// če je žogica leva track_update (); create_drive_direct (počasi, hitro); // zavijte levo (počitek);} else if (ball_x> = (center+5)) {// če je žoga na desni track_update (); create_drive_direct (hitro, počasi); // zavijte desno spanje (počitek);} else if (ball_x (center-5)) {// če je žoga centrirana track_update (); create_drive_straight (hitro); // pojdi naravnost v počitek (počitek);}} grab (); // zgrabi pisk žoge (); // naredi hrup stop (); // prenehaj voziti have_ball = 1; // zapiši, da Imam žogo} start_c (); // poišči spanje košarice (1.0); // spim, da ne bom storil ničesar, ko me ubijejo} void find_basket () {kill (pidb); // postopek sledenja žogici find (); // postavi kamero track_set_minarea (1000); // hrbtna plošča je velika, zato poiščite le velike blobe while (have_ball) {// medtem ko imam žogo track_update (); while (track_x (backb, 0) = (center_x+20)) {// medtem ko ni centrirano track_update (); if (track_x (backb, 0)> = (center_x+20)) {// če je plošča leva track_update (); create_spin_CCW (100);} // zavijte levo else if (track_x (backb, 0) <= (center_x-20)) {// če je deska desna track_update (); create_spin_CW (300-center_x);} // pri približevanju središča zavijte desno} stop (); while (track_size (backb, 0) <= (6000)) {// medtem ko je cilj manjši od 6000 slikovnih pik track_update (); if (track_x (backb, 0) <= (center_x-5)) {// če je cilj levo track_update (); create_drive_direct (počasi, hitro); // zavijte levo (sleep);} else if (track_x (backb, 0)> = (center_x+5)) {// če je cilj desna track_update (); create_drive_direct (hitro, počasi); // zavijte desno spanje (počitek);} drugače če (track_x (backb, 0) (center_x-5)) {// če je cilj centriran track_update (); create_drive_straight (hitro); // pojdite naravnost v počitek (počitek);}} stop (); // create_drive_straight (hitro); // se malo približamo //sleep(1.0); // stop (); spanje (1,0); create_spin_CW (speeda); // spanje v desno (obratno); // spanje dovolj dolgo za zaustavitev 180 obratov (); down (); // kamero spustite za sledenje spanju na hrbtni plošči (1.0); track_set_minarea (200); // uporabite manjšo velikost min, saj smo nanjo usmerjeni in se bomo približali while (track_y (backb, 0)> = (center_y-140)) {// medtem ko je cilj manjši od y koordinate track_update (); if (track_x (backb, 0) <= (center_x-5)) {// če je cilj levo track_update (); back_right (); // zavijte levo sleep (rest);} else if (track_x (backb, 0)> = (center_x+5)) {// če je cilj desna track_update (); back_left (); // zavijte desno sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// če je cilj centriran track_update (); back (); // pojdi naravnost spat (počitek);}} stop (); pisk (); throw (); // ustreli spanje (1.0); have_ball = 0; // opomnik, da sem vrgel žogo in je nimam (); create_full (); // za popoln nadzor senzorjev za izbokbe create_power_led (0, 255);} // zelena napaja ledvoid disconnect () {stop (); // ustavitev premikanja create_disconnect ();} void back_away () {back (); spanje (jasno); stop ();} void rotate_l () {create_spin_CCW (speeda); čas spanja); stop ();} void rotate_r () {create_spin_CW (speeda); čas spanja); stop ();} void stop () {create_drive (0, naravnost);} void back () {create_drive (back_s, naravnost);} 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 police () {set_servo_position (roka, ujeto);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// pripravite se set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a+= 1) {// gladko dvignite roko 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 (izogni se ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // počakajte, da se trenutni postopek ustvarjanja konča, in vzemite prednost kill_process (pid); CREATE_FREE; // končal sem stop ();} void escape_left () {kill (pidb); // ustavim vse ostalo kill (pidc); polica (); // dvignite kremplje, da se ne ujame na mizo back_away (); // nazaj stran rotate_l (); // zavrtite stran od ovire ready (); // postavite kremplj nazaj navzdol, če (have_ball) {// če imam žogo start_c ();} // začni slediti golu else if (! have_ball) {// če nimam žogice start_b ();} // začni slediti žogi} void escape_right () {kill (pidb); kill (pidc); polica (); odmakni se(); rotate_r (); pripravljen (); 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);}

Korak 6: Je bilo vredno?

Stroški so bili: Ustvari + baterija + doc = 260 USD začetni komplet (xbc, odmik, LEGO kocke, senzorji) = 579 USD PVC + barva + vijaki = približno 20 USD Skupni stroški = 859 USD Že sem imel začetni komplet XBC iz Botballa, zato so bili stroški meni so bili stroški ustvarjanja. Mislim, da se je splačalo, najboljši del pa je, da so vsi deli, ki sem jih uporabil, za večkratno uporabo, če bi se lahko lotil tega bota. Ta video prikazuje izogibanje rutini, na mizi. Ta videoposnetek prikazuje robota, ki je v gol zadel 5 oranžnih kroglic. Pomagal sem le pospešiti proces, žogico 5 bi na koncu našel sam.

7. korak: Zaključek

Končni rezultat je robot, ki lahko sam pobere in zabije oranžne žoge v gol.

Všeč mi je bilo delati na tem projektu. Bolj ko sem delal na tem robotu, bolj sem bil nanj navezan. Zdaj se z njim pogovarjam, kot da je hišni ljubljenček. Upam, da vam je to pomagalo pri naslednjem projektu. Moram se zahvaliti veliko ljudem, vendar jih je preveč. Tako kot je Bernard Chartres tako elegantno izjavil: "mi smo kot palčki na plečih velikanov, tako da lahko vidimo več kot oni in stvari na večji razdalji, ne zaradi kakršne koli ostrine na naši strani ali kakršne koli fizične razliko, ampak zato, ker nas nosi velika in dvigne njihova velikanska velikost."

Priporočena: