Indholdsfortegnelse:

Sådan laver du en autonom basketballspil robot ved hjælp af en IRobot Opret som en base: 7 trin (med billeder)
Sådan laver du en autonom basketballspil robot ved hjælp af en IRobot Opret som en base: 7 trin (med billeder)

Video: Sådan laver du en autonom basketballspil robot ved hjælp af en IRobot Opret som en base: 7 trin (med billeder)

Video: Sådan laver du en autonom basketballspil robot ved hjælp af en IRobot Opret som en base: 7 trin (med billeder)
Video: LANDASAN PERNIKAHAN KRISTEN 2024, Juli
Anonim
Sådan laver du en autonom basketballspil robot ved hjælp af en IRobot Opret som en base
Sådan laver du en autonom basketballspil robot ved hjælp af en IRobot Opret som en base

Dette er min post til iRobot Create -udfordringen. Den sværeste del af hele denne proces for mig var at beslutte, hvad robotten skulle gøre. Jeg ville demonstrere de fede funktioner i Create, samtidig med at jeg tilføjede noget robo -flair. Alle mine ideer syntes enten at falde i kategorien kedeligt, men nyttigt, eller sejt og upraktisk. Til sidst vandt sejt og upraktisk, og den basketballspillende robot blev født. Efter lidt overvejelse indså jeg, at det kunne være praktisk. Antag, at du bruger orange papir, og at alle dine skraldespande har grønne bagplader …

Trin 1: Anskaff dele

På grund af konkurrencens tidsbegrænsning var de fleste af de dele, jeg brugte, "fra hylden". "Stock" anvendte robotdele: Opret (x1)-fra iRobot www.irobot.comXBC V.3.0 (x1)-fra Botball www.botball.orgCreate-Roomba-kabel (x1)-fra Botball www.botball.orgServo (x2)-fra Botball www.botball.orgSharp afstandsmåler (x1)-fra Botball www.botball.orgAssorterede LEGO klodser-fra LEGO www.lego.com6-32 maskinskruer (x4)-fra McMaster www.mcmaster.com "Oprettede" anvendte robotdele: 3/8 "tyk ekstruderet PVC -ark - disse ting er fantastiske, men jeg kan ikke huske, hvor jeg fik det fra, men det er ligesom disse ting https://www.lynxmotion.com/Category.aspx? CategoryID = 62Andre dele: Orange "POOF" bold - fra WalMartBasketball målrettet skraldespand - fra LowesGreen "bagplade" - ekstra PVC malet lysegrøn

Trin 2: Opret den unikke del

Opret den unikke del
Opret den unikke del

Den eneste del, jeg var nødt til at fremstille, var en plade, der boltede sig til Create og tilbød LEGO -afstand. Afstanden mellem LEGO mursten er 8 mm fra hinanden, men jeg lavede en dobbelt afstand for at spare tid. Ekstruderet PVC er en leg at arbejde med. Den kan skæres med en kniv, men er stiv og stærk. Jeg henter ofte robotten ved denne plade, og jeg har ikke haft et problem endnu.

Trin 1: Skær arket til 3,5 "x 9,5", du kan skære dette med en kniv. Trin 2: Bor hullerne til skruerne. Opret skruerne laver en kasse, der er 2 og 5/8 "x 8 og 5/8". Trin 3: Bor huller i LEGO -mursten. Brug et 3/16 "bor, og jeg lagde hullerne 16 mm fra hinanden. Tip: Jeg lagde arket i et CAD -program, printede det ud i fuld størrelse og tapede det på arket. Derefter brugte jeg dette som en vejledning til skæring og boring.

Trin 3: Montering af robotten

Montering af robotten
Montering af robotten
Montering af robotten
Montering af robotten
Montering af robotten
Montering af robotten

Jeg nyder at bygge ting så enkelt som muligt, på den måde, når de hopper ud af bordet, behøver du ikke genopbygge så meget!

1. Skru den nydannede plade til toppen af Create 2. Byg en arm for at få fat i bolden 3. Byg en arm til at holde kameraet 4. Byg en holder til afstandsmåleren 5. Monter XBC og tilslut alle kablerne

Trin 4: Programmering af robotten

Jeg besluttede at bruge XBC som min controller hovedsagelig på grund af dens indbyggede farvesporing. Fordi jeg besluttede at med XBC som hjernen i operationen programmerede jeg min robot i Interactive C, eller som jeg kalder det IC. IC er gratis at bruge og kan downloades på www.botball.org. IC ligner meget C ++, men har flere indbyggede biblioteker. Som det viser sig, har David Miller fra University of Oklahoma skrevet et bibliotek til Create, som kan downloades fra hans side på https://i-borg.engr.ou.edu/~dmiller/create/. Med disse ressourcer og manualerne til oprettelsen var jeg klar til at programmere. Men den næste store udfordring var, hvad ville jeg have den skulle gøre? Jeg ville have en robot, der kunne hente orange bolde og score dem i en kurv. Mit mål lød enkelt og kunne sandsynligvis have været simpelt, men jo mere jeg kom ind på, hvad Oprette kunne gøre, jo mere ville jeg have det til at gøre. Min sidste liste så sådan ud: 1. Find orange bold2. Hent orange bold 3. Find kurv 4. Læg bolden i kurven Mens 1. Undgåelse af objekter 2. Ikke falde af noget (som et bord) 3. Registrering af batteriets opladning og docking med hjemmebasen, når det er lavt Åh, og alt dette er helt autonomt, hvilket betyder, at det hele er forprogrammeret.

Trin 5: Kode

Det kan være rodet, men det virker.#Brug "createlib.ic" #use "xbccamlib.ic" #define cam 0 // kameraservo port#definere arm 3 // arm servo port#definere et (analog (0)) // et port/*Oprettelseskablet skal også sættes i. Strømstikket, det 3 -stikede stik i port 8 og det ene mærket UX til JP 28 (ved siden af USB -porten) med U'en mod kameraet*/ #define c_down 5 // kameraservo ned#definere a_down 17 // arm servo ned#definere hold 50 // servo holde bold#definere fanget 27 // arm servoposition for at undgå at blive fanget på bordet#definere skyde 150 // servo kaste bold#definere spor_c 25 // kameraservospor tæt position#definere spor_f 45 // kameraservospor langt position#definere center 120 // centrum for kamerasyn#definere inrange 30 // spor_y koordinere når bolden er i klo#definere bold 0 // kanal med orange bold#definer bold_x (spor_x (bold, 0)) // x koordinat af bold#definer bold_y (spor_y (bold, 0)) // y koordinat af bold#definer langsom 100 // hastighed af langsom motor#definere hurtig 175 // hastighed for hurtig motor#definere klare 0,2 // s leep for at vende tilbage fra forhindringer#definere tid 0.5 //1.0 er en 90 graders højresving#definere hvile 0.05 // tid til at sove, mens sporing af klatter#definere hastigheda 175 // hastighed for at undgå drej#definere back_s -200 // hastighed til tilbage fra det stødte objekt#definer lige 32767 // kør i en lige linje#definer backb 2 // kanal i bagplade hovedfarve#definer kvadrat 1 // kanal med bagplade accent farve#definer track_d 250 // kameraposition til sporing af mål# definere track_find 70 // kameraposition for lang tracking#definere reverse 2.25 // sleep time for a 180#define back_f -150 // back fast speed#define back_sl -125 // back slow speed#define center_x 178 // true x center af cam#definere center_y 146 // true y center for camint pida; // undgå processint pidb; // track processint pidc; // score processint have_ball = 0; // fortæller hvilken funktion vi er ugyldige main () {long ch; enable_servos (); // aktiver servos init_camera (); // start kamera cconnect (); // opret forbindelse for at oprette med fuld kontrol start_a (); // start undgå funktion start_b (); // start ball_tracking -funktion, mens (1) {if (r_button () || gc_ldrop || gc_rdrop) {// hvis den hentes eller r skulderknappedrab (pida); dræbe (pidb); dræbe (pidc); deaktiver_servos (); koble fra(); break;} create_battery_charge (); display_clear (); printf ("charge = %l / n", gc_battery_charge); hvis (gc_battery_charge <1200l || b_button ()) {kill (pida); dræbe (pidb); dræbe (pidc); kaste(); have_bold = 0; create_demo (1); mens (b_knap ()); mens (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("charge = %l / n", gc_battery_charge); sove (1.0);} cconnect (); tilbage(); søvn (2,0); start_a (); start_b ();}}} void avoid () {while (1) {// repeat forever create_sensor_update (); // opdater alle sensorværdier // create_drive (speeda, straight); hvis (gc_lbump == 1) {// venstre bump undgå_højre ();} // drejer til højre for at undgå andet hvis (gc_rbump == 1) {// højre bump avoid_left ();} // drejer til venstre for at undgå andet hvis (gc_lfcliff == 1) {// venstre forreste klippe undgå_højre ();} ellers hvis (gc_rfcliff == 1) {// højre forreste klippe undgå_længe ();} ellers hvis (gc_lcliff == 1) {// venstre klippe undgå_højre ();} ellers hvis (gc_rcliff == 1) {// right cliff avoid_left ();}}} ugyldig track_ball () {kill (pidc); mens (! have_ball) {// gentag indtil få bold track_update (); langt (); // sætter kameraet klar (); // indstiller armen, mens (et <255) {// indtil maksimal værdi sker, når bolden fanges track_update (); // opdater kamerabillede hvis (ball_x <= (center-5)) {// hvis bolden efterlades track_update (); create_drive_direct (langsom, hurtig); // drej til venstre søvn (hvile);} ellers hvis (ball_x> = (center+5)) {// hvis bolden er den rigtige track_update (); create_drive_direct (hurtig, langsom); // drej til søvn til højre (hvile);} ellers hvis (ball_x (center-5)) {// hvis bolden er centreret track_update (); create_drive_straight (hurtig); // gå lige i dvale (hvil);}} grab (); // tag bolden i bip (); // lav støj (); // stop med at køre have_ball = 1; // noter, at Jeg har bold} start_c (); // find kurven søvn (1.0); // sover, så jeg ikke gør noget, når jeg bliver dræbt} void find_basket () {kill (pidb); // kill ball tracking process find (); // sæt kamera op track_set_minarea (1000); // bagpladen er stor, så kig kun efter store klatter, mens (have_ball) {// mens jeg har bolden track_update (); while (track_x (backb, 0) = (center_x+20)) {// mens den ikke er centreret track_update (); hvis (track_x (backb, 0)> = (center_x+20)) {// hvis bagpladen efterlades track_update (); create_spin_CCW (100);} // drej til venstre ellers hvis (track_x (backb, 0) <= (center_x-20)) {// hvis bagpladen er til højre track_update (); create_spin_CW (300-center_x);} // drej til højre langsommere, når midten nærmer sig} stop (); mens (track_size (backb, 0) <= (6000)) {// mens målet er mindre end 6000 pixels i størrelse track_update (); hvis (track_x (backb, 0) <= (center_x-5)) {// hvis målet efterlades track_update (); create_drive_direct (langsom, hurtig); // drej til venstre søvn (hvile);} ellers hvis (track_x (backb, 0)> = (center_x+5)) {// hvis målet er det rigtige track_update (); create_drive_direct (hurtig, langsom); // drej til søvn til højre (hvile);} ellers hvis (track_x (backb, 0) (center_x-5)) {// hvis målet er centreret track_update (); create_drive_straight (hurtig); // gå direkte i dvale (hvile);}} stop (); // create_drive_straight (hurtig); // kom lidt tættere //sleep(1.0); //hold op(); søvn (1,0); create_spin_CW (speeda); // spin højre søvn (omvendt); // sov længe nok til et stop på 180 omdrejninger (); ned (); // sætte kameraet ned for at spore bagbordssøvn (1.0); track_set_minarea (200); // brug en mindre min. størrelse, da vi er peget på den og kommer tættere på mens (track_y (backb, 0)> = (center_y-140)) {// mens målet er mindre end y koordinere track_update (); hvis (track_x (backb, 0) <= (center_x-5)) {// hvis målet efterlades track_update (); back_right (); // drej til venstre for sleep (rest);} ellers hvis (track_x (backb, 0)> = (center_x+5)) {// hvis målet er det rigtige track_update (); back_left (); // drej til søvn til højre (rest);} ellers hvis (track_x (backb, 0) (center_x-5)) {// hvis målet er centreret track_update (); tilbage (); // gå direkte i søvn (hvile);}} stop (); bip (); kaste (); // skyde søvn (1.0); have_ball = 0; // påmindelse jeg kastede bolden og har den ikke} start_b (); // tilbage til boldsporingssøvn (1.0); // gør ikke noget, før denne proces dør} void cconnect () {create_connect (); create_full (); // for fuld kontrol af afsidesensorer create_power_led (0, 255);} // green power ledvoid disconnect () {stop (); // stop moving move_disconnect ();} void back_away () {back (); søvn (klar); stop ();} void rotate_l () {create_spin_CCW (speeda); sengetid); stop ();} ugid rotate_r () {create_spin_CW (speeda); sengetid); 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 afsats () {set_servo_position (arm, fanget);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// gør dig klar set_servo_position (arm, a);} set_servo_position (arm, skyde);} void grab () {int a; for (a = 0; a <= hold; a+= 1) {// løft armen jævnt set_servo_position (arm, a);}} void down () {set_servo_position (cam, track_d);} void find () {set_servo_position (cam, track_find);} ugyldig start_a () {pida = start_process (undgå ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // vent på, at den nuværende oprettelsesproces er færdig, og tag prioritet kill_process (pid); CREATE_FREE; // jeg er færdig stop ();} void avoid_left () {kill (pidb); // stop alt andet kill (pidc); afsats (); // afhentning af klo, så den ikke bliver fanget på bordet back_away (); // tilbage rotate_l (); // roter væk fra forhindringsklar (); // læg klo igen, hvis (have_ball) {// hvis jeg har bolden start_c ();} // start målsporing ellers hvis (! have_ball) {// hvis jeg ikke har bolden start_b ();} // start boldsporing} void avoid_right () {dræbe (pidb); dræbe (pidc); klippeafsats(); gå væk(); rotate_r (); parat(); if (have_ball) {start_c ();} ellers 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);}

Trin 6: Var det det værd?

Omkostningerne var: Opret + batteri + doc = $ 260XBC startsæt (xbc, cam, LEGO klodser, sensorer) = $ 579PVC + maling + skruer = omkring $ 20 Samlet pris = $ 859 Jeg havde allerede XBC startsættet fra Botball, så prisen for mig var prisen på Create. Jeg tror, at det var det værd, og det bedste er, at alle de dele, jeg brugte, kan genbruges, hvis jeg kunne få mig selv til at dele denne bot ud. Denne video viser undgå -rutinen, på en bordplade. Denne video viser robotten, der scorer 5 orange bolde i et mål. Jeg hjalp kun med at fremskynde processen, den ville til sidst have fundet bolden 5 på egen hånd.

Trin 7: Konklusion

Det endelige resultat er en robot, der kan hente og score orange bolde i et mål helt alene.

Jeg elskede at arbejde med dette projekt. Jo mere jeg arbejdede på denne robot, jo mere knyttet blev jeg til den. Jeg taler nu til det som om det var et kæledyr. Jeg håber, at dette har hjulpet dig på dit næste projekt. Der er mange mennesker, jeg skal takke, men der er for mange. Ligesom Bernard af Chartres så elegant udtalte: "vi er som dværge på skuldrene af giganter, så vi kan se mere end dem, og tingene på en større afstand, ikke i kraft af nogen skarphed på synet fra vores side eller nogen fysisk sondring, men fordi vi bæres højt og hævet af deres kæmpe størrelse."

Anbefalede: