Sisukord:

Kuidas teha autonoomset korvpallimängu robotit kasutades IRobotit, luua alusena: 7 sammu (piltidega)
Kuidas teha autonoomset korvpallimängu robotit kasutades IRobotit, luua alusena: 7 sammu (piltidega)

Video: Kuidas teha autonoomset korvpallimängu robotit kasutades IRobotit, luua alusena: 7 sammu (piltidega)

Video: Kuidas teha autonoomset korvpallimängu robotit kasutades IRobotit, luua alusena: 7 sammu (piltidega)
Video: Работизированная борьба с сорняками. Обзор новостей безгербицидной аграрной техники. 2024, November
Anonim
Kuidas teha baasiks autonoomset korvpalli mängivat robotit IRoboti abil
Kuidas teha baasiks autonoomset korvpalli mängivat robotit IRoboti abil

See on minu sissekanne iRobot Create väljakutsele. Kogu selle protsessi kõige raskem osa oli minu jaoks otsustada, mida robot tegema hakkab. Tahtsin demonstreerida loomise lahedaid funktsioone, lisades samas ka robo elegantsi. Kõik minu ideed tundusid olevat kas igavate, kuid kasulike või lahedate ja ebapraktiliste kategooriate kategooriad. Lõpuks võitis lahe ja ebapraktiline ning sündis korvpalli mängiv robot. Mõne aja pärast mõistsin, et see võib olla praktiline. Oletame, et kasutate oranži paberit ja kõikidel prügikastidel on rohelised tagalauad …

Samm 1: Aquire osad

Võistluse ajapiirangu tõttu oli enamik kasutatud osi "riiulilt väljas". Kasutatavad robotiosad: varu (x1)-saidilt iRobot www.irobot.com (x2)-Botballist www.botball.orgTerav kaugusmõõtja (x1)-Botballist www.botball.orgSorteeritud LEGO klotsid-LEGOlt www.lego.com 6-32 masinakruvi (x4)-McMasterilt www.mcmaster.com "Loodud" kasutatud robotiosad: 3/8 "paksune pressitud PVC -leht - see värk on vinge, aga ma ei mäleta, kust ma selle sain, aga see on täpselt selline asi nagu https://www.lynxmotion.com/Category.aspx? CategoryID = 62Muud osad: oranž "POOF" pall - WalMartilt

Samm: looge ainulaadne osa

Looge ainulaadne osa
Looge ainulaadne osa

Ainus osa, mille ma pidin valmistama, oli plaat, mis keerati kruvidega kinni ja pakkus LEGO vahekaugust. LEGO telliskiviaukude vahekaugus on 8 mm, kuid aja säästmiseks tegin kahekordse vahe. Ekstrudeeritud PVC on imelihtne töötada. Seda saab lõigata kasuliku noaga, kuid see on jäik ja tugev. Võtan roboti sageli selle taldriku juurest kinni ja mul pole veel probleeme olnud.

Samm: lõigake leht 3,5 "x 9,5" suuruseks, saate seda lõigata kasuliku noaga. Samm: puurige avad kruvide loomiseks. Loomiskruvid teevad kasti, mille suurus on 2 ja 5/8 "8 ja 5/8". 3. samm: puurige LEGO tellistest eraldatud augud. Kasutage 3/16 "puurit ja asetasin augud 16 mm kaugusele. Näpunäide: panin lehe CAD -programmis välja, prindisin selle täissuuruses välja ja kleepisin lehele. Seejärel kasutasin seda lõikamis- ja lõikamisjuhisena. puurimine.

Samm: roboti kokkupanek

Roboti kokkupanek
Roboti kokkupanek
Roboti kokkupanek
Roboti kokkupanek
Roboti kokkupanek
Roboti kokkupanek

Mulle meeldib asju võimalikult lihtsalt ehitada, nii et kui nad laualt maha hüppavad, ei pea te nii palju ümber ehitama!

1. Keerake vastvalminud plaat loo ülaossa. 2. Ehitage palli haaramiseks õlavarre. 3. Ehitage kaamera hoidmiseks õlavarre. 4. Ehitage kaugusmõõtja kinnitus. 5. Paigaldage XBC ja ühendage kõik kaablid.

Samm: roboti programmeerimine

Otsustasin kasutada XBC -d oma kontrollerina peamiselt selle sisseehitatud värvide jälgimise tõttu. Kuna ma otsustasin operatsiooni ajuna XBC -ga, programmeerisin oma roboti interaktiivsesse C -sse või nagu ma seda IC -ks nimetan. IC -d on tasuta kasutada ja selle saab alla laadida aadressilt www.botball.org. IC on väga sarnane C ++ -ga, kuid sellel on mitu sisseehitatud raamatukogu. Nagu selgub, on David Miller Oklahoma Ülikoolist loonud raamatukogu, mille saab alla laadida tema lehelt aadressilt https://i-borg.engr.ou.edu/~dmiller/create/. Nende ressursside ja loomise juhendite abil olin valmis programmeerima. Kuid järgmine suur väljakutse oli see, mida ma tahtsin, et see teeks? Ma tahtsin robotit, kes saaks appi võtta oranžid pallid ja need korvi lüüa. Minu eesmärk kõlas lihtsalt ja tõenäoliselt võinuks see olla lihtne, kuid mida rohkem ma selle loomisega hakkama sain, seda rohkem tahtsin seda teha. Minu lõplik nimekiri nägi välja selline: 1. Leidke oranž pall 2. Korja üles oranž pall 3. Otsi korv4. Pange pall korvi Objektide vältimine 2. Mitte midagi maha kukkuda (nagu laud) 3. Aku laetuse tuvastamine ja koduse baasiga dokkimine, kui aku on madal, ja see kõik on täiesti autonoomne, mis tähendab, et see on kõik eelprogrammeeritud.

Samm: kood

See võib olla segane, kuid töötab.#Kasutage "createlib.ic" #use "xbccamlib.ic" #define cam 0 // kaamera servopord#define arm 3 // arm servo port#define et (analoog (0)) // et port/*Loomiskaabel tuleb samuti ühendada. Toitepistik, 3 -osaline pistik pessa 8 ja üks, millel on silt UX, JP 28 -s (USB -pordi kõrval), U on kaamera poole*/ #define c_down 5 // kaamera servo alla#define a_down 17 // käe servo alla#define hoidmine 50 // servo hoidmispall#defineeri tabatud 27 // käe servoasend, et vältida lauale sattumist#define shoot 150 // servo viska pall#define track_c 25 // kaamera servorada sulgemisasend#define track_f 45 // kaamera servorada kauge positsioon#defineeri keskus 120 // kaamera nägemise keskus#define inrange 30 // track_y koordinaat, kui pall on küünis#define ball 0 // oranži palli kanal#define ball_x (track_x (ball, 0)) // palli x koordinaat#define ball_y (track_y (ball, 0)) // palli y y koordinaat#define aeglane 100 // aeglase kiirus mootor#define kiire 175 // kiire mootori kiirus#define selge 0,2 // s hüppama takistustest eemale#defineerima aega 0.5 //1.0 on 90 -kraadine parempööre#defineeri puhkus 0.05 // magama jäämise aeg, kui jälgid plekke#define speeda 175 // vältimiskiirus#define back_s -200 // kiirus tagasi põrkunud objektist#defineerige otse 32767 // sõitke sirgjooneliselt#define backb 2 // tagaplaadi põhivärvi kanal#defineerige ruut 1 // tagaplaadi aktsentvärvi kanal#define track_d 250 // kaamera asukoht jälgimiseesmärgi jaoks# define track_find 70 // kaamera asukoht pika jälgimise jaoks#define reverse 2.25 // uneaeg 180 jaoks#define back_f -150 // back fast speed#define back_sl -125 // tagasi aeglane kiirus#define center_x 178 // true x center of cam#define center_y 146 // true y center of camint pida; // vältima protsessint pidb; // track processint pidc; // score processint have_ball = 0; // ütleb, millist funktsiooni me arve main () {long ch; enable_servos (); // enable servos init_camera (); // start camera cconnect (); // connect to create with full control Start_a (); // start vältima funktsiooni start_b (); // käivita ball_tracking funktsioon samas (1) {if (r_button () || gc_ldrop || gc_rdrop) {// kui võetakse kätte või r õlanupp tapab (pida); tapma (pidb); tapma (pidc); disable_servos (); katkesta ühendus (); break;} create_battery_charge (); display_clear (); printf ("tasu = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); tapma (pidb); tapma (pidc); viska (); have_ball = 0; create_demo (1); samas (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("tasu = %l / n", gc_battery_charge); uni (1.0);} cconnect (); tagasi(); uni (2,0); start_a (); start_b ();}}} void vältida () {while (1) {// korda igavesti create_sensor_update (); // uuenda kõiki anduri väärtusi // create_drive (speeda, straight); if (gc_lbump == 1) {// vasakpoolne löök vältima_parem ();} // pöörab paremale, et vältida teist, kui (gc_rbump == 1) {// parempoolne löök vältima_vasak ();} // pöörab vasakule, et vältida teisiti, kui (gc_lfcliff == 1) {// vasak eesmine kalju vältima_parem ();} else if (gc_rfcliff == 1) {// parempoolne eesmine kalju vältimine_vasak ();} muu, kui (gc_lcliff == 1) {// vasakpoolne kalju vältima_parem ();} else if (gc_rcliff == 1) {// paremkalju vältimine_vasak ();}}} void track_ball () {kill (pidc); while (! have_ball) {// korda, kuni saad palli track_update (); far (); // seab kaamera valmis (); // seab käe samas (et <255) {// kuni maksimaalne väärtus juhtub, kui pall kinni püütakse track_update (); // värskendage kaamera pilti, kui (ball_x <= (keskel-5)) {// kui pall on jäetud track_update (); create_drive_direct (aeglane, kiire); // pööra vasakule unerežiim (puhkus);} else if (ball_x> = (keskel+5)) {// kui pall on õige track_update (); create_drive_direct (kiire, aeglane); // pööra paremale uni (puhkus);} else if (ball_x (center-5)) {// kui pall on tsentreeritud track_update (); create_drive_straight (kiire); // minge otse magama (puhake);}} haarake (); // haarake palli piiks (); // tehke müra stop (); // lõpetage sõitmine have_ball = 1; // märkige, et Mul on pall} start_c (); // leia korvi uni (1.0); // maga nii, et ma ei teeks midagi, kui mind tapetakse} void find_basket () {kill (pidb); // tapa palli jälgimise protsess find (); // pane kaamera üles track_set_minarea (1000); // tagaplaat on suur, seega otsi suuri plekke ainult ajal (have_ball) {// kui mul on ball track_update (); while (track_x (backb, 0) = (center_x+20)) {// kuigi pole tsentreeritud track_update (); if (track_x (backb, 0)> = (center_x+20)) {// kui tagaplaat on jäetud track_update (); create_spin_CCW (100);} // pööra vasakule muidu if (track_x (backb, 0) <= (center_x-20)) {// kui tagaplaat on õige track_update (); create_spin_CW (300-center_x);} // pööra paremale aeglustades keskpunkti lähenedes} stop (); while (track_size (backb, 0) <= (6000)) {// kui sihtmärgi suurus on väiksem kui 6000 pikslit track_update (); if (track_x (backb, 0) <= (center_x-5)) {// kui sihtmärk on jäetud track_update (); create_drive_direct (aeglane, kiire); // pööra vasakule unerežiim (puhkus);} else if (track_x (backb, 0)> = (center_x+5)) {// kui sihtmärk on õige track_update (); create_drive_direct (kiire, aeglane); // pööra paremale uni (puhkus);} else if (track_x (backb, 0) (center_x-5)) {// kui sihtmärk on keskel track_update (); create_drive_straight (kiire); // mine otse magama (puhka);}} stop (); // create_drive_straight (fast); // mine natuke lähemale // uni (1.0); // stop (); uni (1,0); create_spin_CW (speeda); // spin right sleep (reverse); // maga piisavalt kaua 180 -pöördelise peatuse jaoks (); alla (); // pane kaamera maha, et jälgida tagalaua und (1.0); track_set_minarea (200); // kasutage väiksemat minisuurust, kuna oleme sellele suunatud ja läheme lähemale (track_y (backb, 0)> = (center_y-140)) {// kui sihtmärk on väiksem kui y koordinaat track_update (); if (track_x (backb, 0) <= (center_x-5)) {// kui sihtmärk on jäetud track_update (); back_right (); // pööra vasakule uni (puhkus);} else if (track_x (backb, 0)> = (center_x+5)) {// kui sihtmärk on õige track_update (); back_left (); // pööra paremale uni (puhkus);} else if (track_x (backb, 0) (center_x-5)) {// kui sihtmärk on keskel track_update (); tagasi (); // otse magama (puhkama);}} stop (); piiks (); viska (); // tulista uni (1.0); have_ball = 0; // meeldetuletus Ma viskasin palli ja mul pole seda} start_b (); // tagasi palli jälgimise unerežiimi (1.0); // ärge tehke midagi enne, kui see protsess sureb} void cconnect () {create_connect (); create_full (); // riffiandurite täielikuks juhtimiseks create_power_led (0, 255);} // roheline toide ledvoid disconnect () {stop (); // lõpetage liikumine create_disconnect ();} void back_away () {back (); uni (selge); stop ();} void rotate_l () {create_spin_CCW (speeda); uneaeg); stop ();} void rotate_r () {create_spin_CW (speeda); uneaeg); 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 (nukk, raja_c);} void far () {set_servo_position (cam, track_f);} void ledge () {set_servo_position (arm, catched);} void visk () {int a; jaoks (a = 50; a> = 30; a- = 1) {// valmistuge set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; jaoks (a = 0; a <= hoidke; a+= 1) {// tõstke käsi sujuvalt üles 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 (vältima ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // oodake praeguse loomise protsessi lõppu ja eelistage kill_process (pid); CREATE_FREE; // olen lõpetanud stop ();} void vältimine_vasak () {tapma (pidb); // lõpetage kõik muu tapmine (pidc); serv (); // võta küünis üles, et see ei jääks lauale tagasi_away (); // tagurpidi pöörlema_l (); // pööra takistustest eemale valmis (); // pane küünis tagasi alla, kui (have_ball) {// kui mul on pall start_c ();} // alusta värava jälgimist muidu, kui (! have_ball) {// kui mul pole palli start_b ();} // alusta palli jälgimist} void vältima_parem () {tapma (pidb); tapma (pidc); serv (); tagurpidi (); rotate_r (); valmis (); 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);}

6. samm: kas see oli seda väärt?

Kulud olid järgmised: Loo + aku + dokk = 260 dollarit XBC stardikomplekt (xbc, nukk, LEGO klotsid, andurid) = 579 dollarit PVC + värv + kruvid = umbes 20 dollarit Kogukulu = 859 dollarit minu jaoks oli selle loomise maksumus. Ma arvan, et see oli seda väärt ja parim osa on see, et kõik osad, mida ma kasutasin, on korduvkasutatavad, kui ma saaksin sellest robotist osa saada. See video näitab alamrutiini vältimist, lauaplaadil. See video näitab, kuidas robot lööb väravasse 5 oranži palli. Aitasin ainult protsessi kiirendada, see oleks lõpuks palli 5 iseenesest leidnud.

Samm 7: Järeldus

Lõpptulemuseks on robot, kes suudab iseseisvalt väravasse oranžid pallid üles korjata ja lüüa.

Mulle meeldis selle projekti kallal töötada. Mida rohkem ma selle roboti kallal töötasin, seda rohkem ma selle külge kinnitusin. Ma räägin nüüd sellega, nagu oleks see lemmikloom. Loodan, et see on aidanud teid järgmises projektis. On palju inimesi, keda pean tänama, kuid neid on liiga palju. Nagu Bernard of Chartres nii elegantselt ütles: "me oleme nagu kääbused hiiglaste õlgadel, nii et näeme rohkem kui nemad ja asju kaugemal, mitte meie nägemisteravuse ega füüsilise eristus, vaid sellepärast, et meid kannab kõrge ja meid tõstab nende hiiglaslik suurus."

Soovitan: