Բովանդակություն:

Ինչպես կատարել ինքնավար բասկետբոլ խաղացող ռոբոտ ՝ օգտագործելով IRobot- ը: Ստեղծեք հիմք. 7 քայլ (նկարներով)
Ինչպես կատարել ինքնավար բասկետբոլ խաղացող ռոբոտ ՝ օգտագործելով IRobot- ը: Ստեղծեք հիմք. 7 քայլ (նկարներով)

Video: Ինչպես կատարել ինքնավար բասկետբոլ խաղացող ռոբոտ ՝ օգտագործելով IRobot- ը: Ստեղծեք հիմք. 7 քայլ (նկարներով)

Video: Ինչպես կատարել ինքնավար բասկետբոլ խաղացող ռոբոտ ՝ օգտագործելով IRobot- ը: Ստեղծեք հիմք. 7 քայլ (նկարներով)
Video: Learn French While You Sleep - A2 - French Conversation 2024, Դեկտեմբեր
Anonim
Ինչպես դարձնել ինքնավար բասկետբոլ խաղացող ռոբոտ ՝ օգտագործելով IRobot- ը: Ստեղծեք որպես հիմք
Ինչպես դարձնել ինքնավար բասկետբոլ խաղացող ռոբոտ ՝ օգտագործելով IRobot- ը: Ստեղծեք որպես հիմք

Սա իմ մուտքն է iRobot Ստեղծել մարտահրավերի: Ինձ համար այս ամբողջ գործընթացի ամենադժվարը որոշումն էր, թե ինչ է անելու ռոբոտը: Ես ուզում էի ցուցադրել Ստեղծման հիանալի հատկությունները ՝ միաժամանակ ավելացնելով ինչ -որ ռոբոյի տաղանդ: Իմ բոլոր գաղափարները թվում էին կամ ընկնում էին ձանձրալի, բայց օգտակար, կամ սառը և անիրագործելի կատեգորիայի մեջ: Ի վերջո, սառը և անիրագործելի հաղթանակ տարավ, և ծնվեց բասկետբոլ խաղացող ռոբոտը: Որոշակի մտածելուց հետո հասկացա, որ դա կարող է գործնական լինել: Ենթադրենք, որ դուք օգտագործում եք նարնջագույն թուղթ, և որ ձեր բոլոր աղբամաններն ունեն կանաչ երեսպատման տախտակներ…

Քայլ 1: Aquire մասեր

Մրցույթի ժամկետի պատճառով իմ օգտագործած մասերի մեծ մասը «դարակաշարից դուրս» էին: Օգտագործված «Ֆոնդային» ռոբոտի մասեր. Ստեղծել (x1)-iRobot- ից www.irobot.com XBC V.3.0 (x1)-Botball- ից www.botball.org Ստեղծել-Roomba մալուխ (x1)-Botball- ից www.botball.orgServo (x2)-Botball- ից www.botball.org Սուր հեռաչափ (x1)-Botball- ից www.botball.org Տարբեր LEGO աղյուսներ-LEGO- ից www.lego.com 6-32 հաստոցների պտուտակներ (x4)-McMaster- ից www.mcmaster.com «Ստեղծված» ռոբոտի մասեր, որոնք օգտագործվում են. 3/8 »հաստ արտամղված PVC թերթ - այս իրերը հիանալի են, բայց ես չեմ կարող հիշել, թե որտեղից եմ այն ձեռք բերել, բայց դա հենց այս իրի պես է

Քայլ 2: Ստեղծեք եզակի մաս

Ստեղծեք եզակի մաս
Ստեղծեք եզակի մաս

Միակ մասը, որ ես ստիպված էի պատրաստել, ափսե էր, որը ամրացված էր Ստեղծել և առաջարկում էր LEGO տարածություն: LEGO աղյուսի անցքերի միջև ընկած տարածությունը 8 մմ է, բայց ես ժամանակ խնայելու համար կրկնակի տարածություն արեցի: Արտամղված PVC- ն հեշտ աշխատանք է: Այն կարող է կտրվել օգտակար դանակով, բայց կոշտ և ամուր է: Ես հաճախ եմ վերցնում ռոբոտին այս ափսեի մոտ և դեռ խնդիր չեմ ունեցել:

Քայլ 1. Կտրեք թերթիկը 3.5 "x 9.5" չափի, այն կարող եք կտրել օգտակար դանակով: Քայլ 2: Հորատեք պտուտակների համար նախատեսված անցքերը: Ստեղծվող պտուտակները պատրաստում են տուփ, որը 2 և 5/8 դյույմ է 8 և 5/8 դյույմ: Քայլ 3: Հորատեք LEGO աղյուսով բացված անցքերը: Օգտագործեք 3/16 դյույմանոց հորատիչ և ես 16 մմ հեռավորությամբ անցքեր բացեցի: Հուշում. Ես թերթիկը դրել եմ CAD ծրագրում, տպել այն ամբողջ չափով և կպցրել թերթին: Այնուհետև սա օգտագործել եմ որպես կտրելու և ուղղելու ուղեցույց: հորատում:

Քայլ 3. Ռոբոտի հավաքում

Ռոբոտի հավաքում
Ռոբոտի հավաքում
Ռոբոտի հավաքում
Ռոբոտի հավաքում
Ռոբոտի հավաքում
Ռոբոտի հավաքում

Ինձ հաճելի է հնարավորինս պարզ բաներ կառուցել: Այդ կերպ, երբ դրանք սեղանից ցած են թռչում, պետք չէ այդքան շատ կառուցել:

1. Պտուտակեք նորաձև ափսեը Ստեղծման վերևում: Կառուցեք թևը գնդակը բռնելու համար

Քայլ 4: Ռոբոտի ծրագրավորում

Ես որոշեցի օգտագործել XBC- ն որպես իմ վերահսկիչ, հիմնականում դրա ներկված գույնի հետևման պատճառով: Քանի որ ես որոշեցի XBC- ի հետ, որպես գործողության ուղեղ, ես ծրագրավորեցի իմ ռոբոտին Ինտերակտիվ C- ում, կամ ինչպես ես այն անվանում եմ IC: IC- ն անվճար է օգտագործման համար և կարելի է ներբեռնել www.botball.org կայքում: IC- ն շատ նման է C ++ - ին, բայց ունի մի քանի ներկառուցված գրադարաններ: Ինչպես պարզվում է, Օքլահոմայի համալսարանից Դեյվիդ Միլլերը ստեղծել է գրադարան Ստեղծագործի համար, որը կարելի է ներբեռնել նրա էջից ՝ https://i-borg.engr.ou.edu/~dmiller/create/: Այդ ռեսուրսների և ձեռնարկի ձեռնարկների հետ ես պատրաստ էի ծրագրավորել: Բայց հաջորդ մեծ մարտահրավերն այն էր, թե ինչ էի ուզում դա անել: Ես ցանկանում էի ռոբոտ, որը կարող էր գնալ նարնջագույն գնդակներ վերցնել և դրանք զամբյուղի մեջ դնել: Իմ նպատակը պարզ էր թվում, և, հավանաբար, կարող էր լինել պարզ, բայց որքան ավելի շատ էի ընկնում այն, ինչ կարող էր անել Ստեղծագործը, այնքան ավելի շատ էի ուզում դա անել: Իմ վերջնական ցուցակն այսպիսին էր ՝ 1. Գտնել նարնջագույն գնդակը 2. Վերցրեք նարնջագույն գնդակը 3. Տեղադրեք զամբյուղ 4. Գնդակը դնել զամբյուղի մեջ Առարկաներից խուսափելը 2. Ոչ մի բանից չընկնելը (սեղանի նման) 3. Մարտկոցի լիցքը հայտնաբերելը և տնային բազայի հետ միանալը ցածր օդի դեպքում, և այս ամենը լիովին ինքնավար է, այսինքն ՝ այդ ամենը նախապես ծրագրավորված է:

Քայլ 5: Կոդ

Հնարավոր է, որ այն խառնաշփոթ է, բայց աշխատում է: // et port/*Ստեղծման մալուխը նույնպես պետք է միացված լինի: Էլեկտրահաղորդիչը, 3 -փեղկավոր վարդակը 8 -րդ պորտին և UX պիտակով JP 28 (USB պորտի կողքին) U- ի տեսախցիկին*/ #սահմանել c_down 5 // տեսախցիկ servo down#սահմանել a_down 17 // arm servo down#define hold 50 // servo hold ball#define catch 27 // arm servo position to keep not catching on table#define shoot 150 // servo նետել գնդակը#սահմանել track_c 25 // ֆոտոխցիկի servo track փակման դիրքը#սահմանել track_f 45 // ֆոտոխցիկի servo track հեռավոր դիրք#սահմանել կենտրոն 120 // տեսախցիկի տեսողության կենտրոն#սահմանել անօրինական 30 // track_y կոորդինացնել, երբ գնդակը գտնվում է ճանկում#սահմանել գնդակը 0 // նարնջագույն գնդակի ալիք#սահմանել գնդակ_ x (track_x (գնդակ, 0)) // x գնդակի կոորդինատ#սահմանել գնդակ_յ (ուղի_յ (գնդակ, 0)) // y գնդակի կոորդինատ#սահմանել դանդաղ 100 // դանդաղ արագություն շարժիչ#սահմանել արագ 175 // արագ շարժիչի արագություն#սահմանել հստակ 0.2 // վ թռիչք դեպի հետ խոչընդոտներից#սահմանել ժամանակը 0.5 //1.0 90 աստիճանի աջ շրջադարձ է#սահմանել հանգիստը 0.05 // ժամանակն է քնել բլբներին հետևելիս#սահմանել արագությունը 175 ետ շեղված օբյեկտից#սահմանել ուղիղ 32767 // քշել ուղիղ գծով#սահմանել հետնապահ 2 // հիմնական գույնի ալիք#սահմանել քառակուսի 1 // հետնագեղձի շեշտադրման գույնի ալիք#սահմանել track_d 250 // նպատակին հետևելու համար տեսախցիկի դիրքը# սահմանել track_find 70 // երկար հետևելու համար տեսախցիկի դիրքը#սահմանել հակադարձ 2.25 // քնի ժամանակը 180 -ի համար#define back_f -150 // back fast speed#define back_sl -125 // back slow speed#define center_x 178 // true x center cam#define center_y 146 // իսկական y camint pida; // խուսափել processint pidb; // track processint pidc; // score processint have_ball = 0; // պատմում է, թե որ գործառույթն ենք անվավեր main () {long ch; enable_servos (); // միացնել servos init_camera (); // սկսել տեսախցիկի միացում (); // միանալ ՝ ստեղծելու համար ամբողջական controll start_a (); // սկսել խուսափել գործառույթից start_b (); // սկսել ball_tracking գործառույթը մինչ (1) {if (r_button () || gc_ldrop || gc_rdrop) {// եթե վերցված է կամ r ուսի կոճակը սպանում է (pida); սպանել (pidb); սպանել (pidc); disable_servos (); անջատել (); ընդմիջում;} create_battery_charge (); display_clear (); printf ("գանձում = %l / n", gc_battery_charge); եթե (gc_battery_charge <1200l || b_button ()) {kill (pida); սպանել (pidb); սպանել (pidc); նետել (); have_ball = 0; create_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("գանձում = %l / n", gc_battery_charge); քուն (1.0);} միացնել (); ետ (); քուն (2.0); start_a (); start_b ();}}} անվավեր խուսափել () {մինչ (1) {// կրկնել ընդմիշտ create_sensor_update (); // թարմացնել սենսորի բոլոր արժեքները // create_drive (speeda, straight); if (gc_lbump == 1) {// ձախ բախում խուսափել_ից ();} // թեքվում է աջ ՝ այլ բան խուսափելու համար gc_lfcliff == 1) {// ձախ առջևի ժայռից խուսափել_շատ ();} այլ դեպքում, եթե (gc_rfcliff == 1) {// աջ առջևի ժայռից խուսափել_լավ ();} այլ դեպքում, եթե (gc_lcliff == 1) {// ձախ ժայռից խուսափել_միջուկ ();} այլապես եթե (gc_rcliff == 1) {// աջ ժայռից խուսափել_թև ();}}}} անվավեր track_ball () {սպանել (pidc); while (! have_ball) {// կրկնել մինչև ստանալ ball track_update (); հեռու (); // դնում է տեսախցիկը պատրաստ (); // սահմանում է թևը մինչ (et <255) {// մինչև առավելագույն արժեքը տեղի ունենա, երբ գնդակը բռնվի track_update (); // թարմացրեք տեսախցիկի պատկերը, եթե (ball_x <= (կենտրոն -5)) {// եթե գնդակը մնացել է track_update (); create_drive_direct (դանդաղ, արագ); // թեքել ձախ քունը (հանգիստ);} այլ դեպքում, եթե (ball_x> = (կենտրոն +5)) {// եթե գնդակը ճիշտ է track_update (); create_drive_direct (արագ, դանդաղ); // աջ քուն (հանգիստ);} այլապես, եթե (ball_x (կենտրոն -5)) {// եթե գնդակը կենտրոնացած է track_update (); create_drive_straight (արագ); // ուղիղ քնել (հանգստանալ);}} գրավել (); // բռնել գնդակի ազդանշանը (); // աղմուկը կանգնեցնել (); // դադարեցնել մեքենան վարելը have_ball = 1; // գրառում կատարել, որ Ես ունեմ գնդակ} start_c (); // գտնել զամբյուղի քունը (1.0); // քնել այնպես, որ ես ոչինչ չանեմ, երբ սպանվեմ} void find_basket () {kill (pidb); // kill գնդակին հետևելու գործընթաց գտնել (); // դնել տեսախցիկը track_set_minarea (1000); // հետևի տախտակը մեծ է, այնպես որ միայն մեծ բլթակներ փնտրեք մինչ (have_ball) {// մինչ ես ունեմ գնդակը track_update (); while (track_x (backb, 0) = (center_x+20)) {// մինչդեռ կենտրոնացված track_update (); if (track_x (backb, 0)> = (center_x+20)) {// եթե հետևի տախտակը մնացել է track_update (); create_spin_CCW (100);} // թեքվեք այլ ուղղությամբ, եթե (track_x (backb, 0) <= (center_x-20)) {// եթե backboard- ը ճիշտ է track_update (); create_spin_CW (300-center_x);} // թեքել աջ ՝ դանդաղեցնելով, քանի որ կենտրոնը մոտենում է} կանգառ (); while (track_size (backb, 0) <= (6000)) {// մինչ թիրախը track_update () չափի 6000 պիքսելից պակաս է; if (track_x (backb, 0) <= (center_x-5)) {// եթե թիրախը մնացել է track_update (); create_drive_direct (դանդաղ, արագ); // թեքել ձախ քունը (հանգիստ);} այլ դեպքում, եթե (track_x (backb, 0)> = (center_x+5)) {// եթե թիրախը ճիշտ է track_update (); create_drive_direct (արագ, դանդաղ); // աջ քուն (հանգիստ);} այլապես եթե (track_x (backb, 0) (center_x-5)) {// եթե թիրախը կենտրոնացած է track_update (); create_drive_straight (արագ); // ուղիղ քնել (հանգիստ);}} կանգառ (); // create_drive_straight (արագ); // մի փոքր մոտենալ // քնել (1.0); // կանգառ (); քուն (1.0); create_spin_CW (speeda); // պտտել ճիշտ քունը (հակադարձ); // բավական երկար քնել 180 պտույտի կանգառի համար (); ներքև (); // վայր դնել տեսախցիկը `հետևի հետևի քունը հետևելու համար (1.0); track_set_minarea (200); // օգտագործել ավելի փոքր min չափ, քանի որ մենք մատնացույց ենք անում այն և մտադիր ենք մոտենալ, մինչդեռ (track_y (backb, 0)> = (center_y-140)) {// մինչ թիրախը փոքր է y համակարգել track_update (); if (track_x (backb, 0) <= (center_x-5)) {// եթե թիրախը մնացել է track_update (); back_right (); // շրջել ձախ քունը (հանգիստ);} այլ դեպքում, եթե (track_x (backb, 0)> = (center_x+5)) {// եթե թիրախը ճիշտ է track_update (); back_left (); // աջ քուն (հանգիստ);} այլ դեպքում (track_x (backb, 0) (center_x-5)) {// եթե թիրախը կենտրոնացած է track_update (); ետ (); // ուղիղ քնել (հանգիստ);}} կանգառ (); ազդանշան (); նետել (); // կրակել քուն (1.0); have_ball = 0; // հիշեցում Ես գցեցի գնդակը և չունեմ այն} start_b (); // վերադառնալ գնդակին հետևելու քուն (1.0); // ոչինչ մի արա, քանի դեռ այս գործընթացը չի մարել} void cconnect () {create_connect (); create_full (); // լուսանցքի սենսորների լիակատար վերահսկողության համար create_power_led (0, 255);} // green power ledvoid անջատում () {stop (); // դադարեցնել create_disconnect ();} void back_away () {back (); քուն (պարզ); stop ();} void rotate_l () {create_spin_CCW (speeda); քուն (ժամանակ); stop ();} void rotate_r () {create_spin_CW (speeda); քուն (ժամանակ); 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 (տեսախցիկ, track_c);} դատարկ հեռու () {set_servo_position (տեսախցիկ, track_f);} անվավեր եզր () {set_servo_position (ձեռքը, բռնել);} դատարկ նետում () {int a; for (a = 50; a> = 30; a- = 1) {// պատրաստ եղիր set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a+= 1) {// բարձրացնել թևը սահուն 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 (խուսափել ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // սպասեք ընթացիկ ստեղծման գործընթացի ավարտին և առաջնահերթություն վերցրեք kill_process (pid); CREATE_FREE; // ես ավարտել եմ կանգառը ();} void խուսափել_թևից () {սպանել (pidb); // դադարեցնել մնացած ամեն ինչը սպանել (pidc); եզր (); // վերցնել ճանկը, որպեսզի այն չբռնվի սեղանի վրա հետ_շուտ (); // ետ հետ պտտել_լ (); // պտտվել խոչընդոտից պատրաստ (); //, եթե ճանկը հետ է, եթե (ունենա գնդակ) {// եթե ես ունեմ գնդակը start_c ();} // սկսել նպատակին հետևելը այլ կերպ, եթե (! have_ball) {// եթե ես գնդակը չունեմ start_b ();} // սկսել գնդակի հետևում} void խուսափել_շարժվանից () {սպանել (pidb); սպանել (pidc); եզր (); back_away (); պտտել_ռ (); պատրաստ (); if (have_ball) {start_c ();} այլ դեպքում (! 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: Արժե՞ր դա:

Costsախսերն էին. Ինձ համար էր Creat- ի արժեքը: Կարծում եմ, որ դա արժեր, և ամենալավն այն է, որ իմ օգտագործած բոլոր մասերը կրկին օգտագործելի են, եթե կարողանայի ինձ բաժանել այս բոտը: Այս տեսանյութը ցույց է տալիս խուսափել ենթակարգից, սեղանի վերևում: Այս տեսանյութում երևում է, թե ինչպես է ռոբոտը գոլ խփում 5 նարնջագույն գնդակ: Ես միայն օգնեցի արագացնել գործընթացը, այն ի վերջո կհայտնաբերեր 5 -րդ գնդակը ինքնուրույն:

Քայլ 7: Եզրակացություն

Վերջնական արդյունքը ռոբոտ է, որը կարող է ինքնուրույն վերցնել և խփել նարնջագույն գնդակներ դարպասում:

Ես շատ էի սիրում աշխատել այս նախագծի վրա: Որքան շատ էի աշխատում այս ռոբոտի վրա, այնքան ավելի էի կապված դրանով: Ես հիմա նրա հետ խոսում եմ այնպես, ասես ընտանի կենդանի լինի: Հուսով եմ, որ դա ձեզ օգնեց ձեր հաջորդ նախագծում: Կան շատ մարդիկ, որոնց ես պետք է շնորհակալություն հայտնեմ, բայց չափազանց շատ են: Ինչպես Բեռնարդ Շարտրն է այդքան էլեգանտ ասել. «Մենք նման ենք թզուկների հսկաների ուսերին, որպեսզի տեսնենք ավելին, քան նրանք, և իրերը ավելի մեծ հեռավորության վրա, ոչ թե մեր կողմից տեսողության կամ ֆիզիկական որևէ կտրուկության պատճառով: տարբերություն, բայց որովհետև մեզ բարձր է տանում և մեծացնում նրանց հսկա չափը »:

Խորհուրդ ենք տալիս: