INHOUDSOPGAWE:

Hoe om 'n outonome basketbal te maak wat 'n robot speel deur 'n IRobot te skep: 7 stappe (met foto's)
Hoe om 'n outonome basketbal te maak wat 'n robot speel deur 'n IRobot te skep: 7 stappe (met foto's)

Video: Hoe om 'n outonome basketbal te maak wat 'n robot speel deur 'n IRobot te skep: 7 stappe (met foto's)

Video: Hoe om 'n outonome basketbal te maak wat 'n robot speel deur 'n IRobot te skep: 7 stappe (met foto's)
Video: П.В. Сингер: Военные роботы и будущее войны 2024, Julie
Anonim
Hoe om 'n outonome basketbal te maak wat 'n robot speel deur 'n IRobot te skep as 'n basis
Hoe om 'n outonome basketbal te maak wat 'n robot speel deur 'n IRobot te skep as 'n basis

Dit is my inskrywing vir die iRobot Create -uitdaging. Die moeilikste deel van hierdie hele proses was vir my om te besluit wat die robot gaan doen. Ek wou die cool kenmerke van die Create demonstreer, terwyl ek ook 'n bietjie robo -flair byvoeg. Dit lyk asof al my idees in die kategorie vervelig, maar bruikbaar, of koel en onprakties val. Uiteindelik het koel en onprakties gewen en die basketbal speelende robot is gebore. Na 'n bietjie gedink het ek besef dat dit prakties kan wees. Gestel jy gebruik oranje papier en dat al jou asblikke groen agterplate het …

Stap 1: verkry onderdele

As gevolg van die tydsbeperking van die wedstryd, was die meeste dele wat ek gebruik het "van die rak af". "Stock" gebruikte robotonderdele: skep (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 Skerp afstandsmeter (x1)-van Botball www.botball.org Geassorteerde LEGO-stene-van LEGO www.lego.com 6-32 masjienskroewe (x4)-van McMaster www.mcmaster.com "vervaardigde" gebruikte robotonderdele: 3/8 "dik geëxtrudeerde PVC -vel - hierdie goed is wonderlik, maar ek kan nie onthou waar ek dit vandaan gekry het nie, maar dit is net soos hierdie dinge https://www.lynxmotion.com/Category.aspx? CategoryID = 62 Ander dele: Oranje "POOF" bal - van WalMartBasketball doppiesblik - asblik van LowesGreen - ekstra PVC, heldergroen geverf

Stap 2: Skep die unieke deel

Skep die unieke deel
Skep die unieke deel

Die enigste deel wat ek moes vervaardig, was 'n bord wat aan die Create vasgemaak is en 'n LEGO -afstand bied. Die afstand tussen die LEGO -steengate is 8 mm uitmekaar, maar ek het 'n dubbele afstand gedoen om tyd te bespaar. Die geëxtrudeerde PVC is 'n briesie om mee te werk. Dit kan met 'n mes gesny word, maar is styf en sterk. Ek tel gereeld die robot op hierdie bord op en ek het nog nie 'n probleem gehad nie.

Stap 1: Sny die vel tot 3,5 "x 9,5", u kan dit met 'n mes sny. Stap 2: Boor die gate vir die skepskroewe. Die skepskroewe maak 'n boks van 2 en 5/8 "by 8 en 5/8". Stap 3: Boor die LEGO -bakstene met 'n afstand van mekaar. Gebruik 'n 3/16 "boorpunt en ek het die gate 16 mm van mekaar gespasieer. Wenk: Ek het die laken in 'n CAD -program neergelê, dit in groot grootte gedruk en op die vel vasgeplak. Daarna het ek dit as 'n gids vir sny en boor.

Stap 3: Monteer die robot

Die samestelling van die robot
Die samestelling van die robot
Die samestelling van die robot
Die samestelling van die robot
Die samestelling van die robot
Die samestelling van die robot

Ek geniet dit om dinge so eenvoudig as moontlik te bou, so as jy van die tafel af spring, hoef jy nie soveel te herbou nie!

1. Skroef die nuutgemaakte bord bo -op die Create 2. Bou 'n arm om die bal te gryp 3. Bou 'n arm om die kamera vas te hou 4. Bou 'n houer vir die afstandsmeter 5. Monteer die XBC en verbind al die kabels

Stap 4: Programmering van die robot

Ek het besluit om die XBC hoofsaaklik te gebruik as gevolg van die ingeboude kleuropsporing. Omdat ek besluit het om met die XBC as die brein van die operasie my robot in Interactive C, of soos ek dit IC noem, te programmeer. IC is gratis om te gebruik en kan afgelaai word by www.botball.org. IC is baie soortgelyk aan C ++, maar het verskeie ingeboude biblioteke. Soos dit blyk, het David Miller van die Universiteit van Oklahoma 'n biblioteek vir die Create geskryf wat van sy bladsy afgelaai kan word by https://i-borg.engr.ou.edu/~dmiller/create/. Met die hulpbronne en die handleidings vir die skep was ek gereed om te programmeer. Maar die volgende groot uitdaging was wat wou ek hê moet dit doen? Ek wou 'n robot hê wat oranje balle kon optel en in 'n mandjie kon slaan. My doel klink eenvoudig, en kon waarskynlik eenvoudig gewees het, maar hoe meer ek ingekom het in wat die skep kon doen, hoe meer wou ek dit hê. My laaste lys het so gelyk: 1. Soek oranje bal 2. Tel oranje bal op 3. Soek mandjie4. Gooi bal in mandjie terwyl 1. Voorwerpe vermy 2. Niks val nie (soos 'n tafel) 3. Om die lading van die battery op te spoor en by die tuisbasis aan te sluit as dit laag is Oh, en dit is heeltemal outonoom, wat beteken dat dit alles vooraf geprogrammeer is.

Stap 5: Kode

Dit kan morsig wees, maar dit werk.#Gebruik "createlib.ic" #use "xbccamlib.ic" #define cam 0 // kamera servo poort#definieer arm 3 // arm servo poort#definieer et (analoog (0)) // et -poort/*Die skepkabel moet ook ingeprop word. Die kragaansluiting, die 3 -aansluiting in poort 8 en die een met die naam UX in JP 28 (langs die USB -poort) met die U na die kamera*/ #definieer c_down 5 // kameraservo af#definieer a_down 17 // arm servo af gooi bal#definieer spoor_c 25 // kameraservospoor naby posisie#definieer spoor_f 45 // kameraservospoor ver posisie#definieer middel 120 // middelpunt van kamera visie#definieer onregte 30 // spoor_y koördineer wanneer bal in klou is#definieer bal 0 // kanaal van oranje bal#definieer bal_x (baan_x (bal, 0)) // x koördinaat van bal#definieer bal_y (spoor_y (bal, 0)) // y koördinaat van bal#definieer stadig 100 // snelheid van stadig motor#definieer vinnig 175 // snelheid van vinnige motor#definieer duidelike 0.2 // s sluip om terug te keer van hindernisse#definieer tyd 0.5 //1.0 is 'n 90 grade regs draai#definieer rus 0.05 // tyd om te slaap terwyl blobs dop word#definieer spoeda 175 // spoed van vermy draai#definieer terug_s -200 // spoed na terug van gestampte voorwerp#definieer reguit 32767 // ry in 'n reguit lyn#definieer agterkant 2 // kanaal van hoofbordkleur#definieer vierkant 1 // kanaal van agterkant aksentkleur#definieer spoor_d 250 // kameraposisie vir die opsporing van doel# definieer track_find 70 // kameraposisie vir lang dop van cam#definieer sentrum_y 146 // ware y middelpunt van camint pida; // vermy processint pidb; // track processint pidc; // score processint have_ball = 0; // vertel watter funksie ons invoid main () {long ch; enable_servos (); // aktiveer servos init_camera (); // begin kamera cconnect (); // maak verbinding met skep met volledige beheer start_a (); // begin vermy funksie start_b (); // begin bal_tracking -funksie terwyl (1) {if (r_button () || gc_ldrop || gc_rdrop) {// as opgetel of r skouer knoppie doodmaak (pida); doodmaak (pidb); doodmaak (pidc); deaktiveer_servos (); ontkoppel (); break;} create_battery_charge (); display_clear (); printf ("lading = %l / n", gc_battery_charge); as (gc_battery_charge <1200l || b_button ()) {kill (pida); doodmaak (pidb); doodmaak (pidc); gooi(); have_ball = 0; skep_demo (1); terwyl (b_knoppie ()); terwyl (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("lading = %l / n", gc_battery_charge); slaap (1.0);} cconnect (); agter (); slaap (2,0); begin_a (); start_b ();}}} void avoid () {while (1) {// repeat forever create_sensor_update (); // werk alle sensorwaardes op // create_drive (speeda, straight); if (gc_lbump == 1) {// linker stamp stamp_right ();} // draai regs om anders te vermy as (gc_rbump == 1) {// regter stamp vermy_links ();} // draai links om anders te vermy as (gc_lfcliff == 1) {// linker voorste krans vermy_reg ();} anders as (gc_rfcliff == 1) {// regter voorste krans vermy_links ();} anders as (gc_lcliff == 1) {// linker krans vermy_reg ();} anders as (gc_rcliff == 1) {// regterklip vermy_links ();}}} ongeldig track_ball () {kill (pidc); terwyl (! have_ball) {// herhaal totdat die bal track_update (); ver (); // stel die kamera gereed (); // stel die arm in terwyl (et <255) {// totdat die maksimum waarde gebeur wanneer die bal vasgevang word track_update (); // werk die kamerafoto op as (ball_x <= (middel-5)) {// as die bal track_update () gelaat word; create_drive_direct (stadig, vinnig); // draai links slaap (rus);} anders as (ball_x> = (middel+5)) {// as die bal reg track_update () is; create_drive_direct (vinnig, stadig); // draai regs slaap (rus);} anders as (ball_x (middel-5)) {// as die bal gesentreer is track_update (); create_drive_straight (vinnig); // gaan reguit slaap (rus);}} gryp (); // gryp balpiep (); // maak geraas stop (); // hou op om te ry have_ball = 1; // maak kennis dat Ek het bal} start_c (); // vind die mandjie slaap (1.0); // slaap sodat ek niks doen as ek doodgemaak word nie} void find_basket () {kill (pidb); // kill ball tracking process vind (); // sit kamera op track_set_minarea (1000); // die agterplaas is groot, so soek net groot blobs terwyl (have_ball) {// terwyl ek die bal track_update () het; terwyl (track_x (backb, 0) = (center_x+20)) {// terwyl track_update () nie gesentreer is nie; if (track_x (backb, 0)> = (center_x+20)) {// as die agterbord track_update () gelaat word; create_spin_CCW (100);} // draai links anders as (track_x (backb, 0) <= (center_x-20)) {// as die agterbord reg track_update () is; create_spin_CW (300-center_x);} // draai regs stadiger namate die sentrum nader} stop (); terwyl (track_size (backb, 0) <= (6000)) {// terwyl die teiken minder as 6000 pixels in grootte track_update () is; if (track_x (backb, 0) <= (center_x-5)) {// as die teiken track_update () gelaat word; create_drive_direct (stadig, vinnig); // draai links slaap (rus);} anders as (track_x (backb, 0)> = (center_x+5)) {// as die teiken reg track_update () is; create_drive_direct (vinnig, stadig); // draai regs slaap (rus);} anders as (track_x (backb, 0) (center_x-5)) {// as die teiken gesentreer is track_update (); create_drive_straight (vinnig); // gaan slaap (rus);}} stop (); // create_drive_straight (vinnig); // kom 'n bietjie nader // slaap (1.0); // stop (); slaap (1,0); create_spin_CW (speeda); // draai regs slaap (omgekeerde); // slaap lank genoeg vir 'n stop van 180 draaie (); down (); // sit die kamera neer om die slaapbord van die agterplaas op te spoor (1.0); track_set_minarea (200); // gebruik 'n kleiner min grootte, aangesien ons daarop gewys word en nader sal kom terwyl (track_y (backb, 0)> = (center_y-140)) {// terwyl die teiken minder is as die y koördineer track_update (); if (track_x (backb, 0) <= (center_x-5)) {// as die teiken track_update () gelaat word; back_right (); // draai links slaap (rest);} anders as (track_x (backb, 0)> = (center_x+5)) {// as die teiken reg track_update () is; terug_links (); // draai regs slaap (rus);} anders as (track_x (backb, 0) (center_x-5)) {// as die teiken gesentreer is track_update (); terug (); // gaan slaap (rus);}} stop (); biep(); gooi (); // skiet slaap (1.0); have_ball = 0; // herinnering ek het bal gegooi en het dit nie} start_b (); // terug na bal dop slaap (1.0); // doen niks totdat hierdie proses sterf nie} void cconnect () {create_connect (); create_full (); // vir die volledige beheer van die lyssensors create_power_led (0, 255);} // green power ledvoid disconnect () {stop (); // stop moving move_disconnect ();} void back_away () {back (); slaap (duidelik); stop ();} void rotate_l () {create_spin_CCW (speeda); slaap tyd); stop ();} ongeldig rotate_r () {create_spin_CW (speeda); slaap tyd); 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 ver () {set_servo_position (cam, track_f);} void ledge () {set_servo_position (arm, gevang);} void throw () {int a; vir (a = 50; a> = 30; a- = 1) {// maak gereed set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; vir (a = 0; a <= hou; a+= 1) {// lig die arm glad op 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; // wag totdat die huidige skepproses klaar is, en neem prioriteit kill_process (pid); CREATE_FREE; // ek is klaar stop ();} void avoid_left () {kill (pidb); // stop alles anders kill (pidc); rand (); // tel die klou op sodat dit nie op die tafel vasval nie (); // draai weg rotate_l (); // draai weg van die hindernis gereed (); // sit die klou terug as (het_bal) {// as ek die bal begin_c () het;} // begin doelopsporing anders as (! het_bal) {// as ek nie die bal het nie_b ();} // begin balopsporing} leeg vermy_reg () {doodmaak (pidb); doodmaak (pidc); rand (); beweeg terug(); draai_r (); gereed (); if (have_ball) {start_c ();} anders 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 dit die moeite werd?

Die koste was: Skep + battery + doc = $ 260XBC -aansitstel (xbc, nok, LEGO -stene, sensors) = $ 579PVC + verf + skroewe = ongeveer $ 20 Totale koste = $ 859 Ek het reeds die XBC -aansitstel van Botball gehad, dus die koste vir my was die koste van die Create., op 'n tafelblad. Hierdie video wys hoe die robot 5 oranje balle in 'n doel aanteken. Ek het net gehelp om die proses te bespoedig; dit sou uiteindelik bal 5 op sy eie gevind het.

Stap 7: Gevolgtrekking

Die eindresultaat is 'n robot wat op sy eie oranje balle in 'n doel kan optel en aanteken.

Ek was mal daaroor om aan hierdie projek te werk. Hoe meer ek aan hierdie robot gewerk het, hoe meer geheg het ek daaraan geraak. Ek praat nou daarmee asof dit 'n troeteldier is. Ek hoop dat dit u gehelp het met u volgende projek. Daar is baie mense wat ek moet bedank, maar daar is te veel. Soos Bernard van Chartres so elegant gesê: "ons is soos dwerge op die skouers van reuse, sodat ons meer as hulle kan sien, en dinge op 'n groter afstand, nie op grond van enige skerpte van ons kant of fisiese onderskeiding, maar omdat ons hoog en opgewek word deur hul reuse grootte."

Aanbeveel: