Talaan ng mga Nilalaman:

Paano Gumawa ng isang Autonomous Basketball Playing Robot Paggamit ng isang IRobot Lumikha Bilang Base: 7 Mga Hakbang (na may Mga Larawan)
Paano Gumawa ng isang Autonomous Basketball Playing Robot Paggamit ng isang IRobot Lumikha Bilang Base: 7 Mga Hakbang (na may Mga Larawan)

Video: Paano Gumawa ng isang Autonomous Basketball Playing Robot Paggamit ng isang IRobot Lumikha Bilang Base: 7 Mga Hakbang (na may Mga Larawan)

Video: Paano Gumawa ng isang Autonomous Basketball Playing Robot Paggamit ng isang IRobot Lumikha Bilang Base: 7 Mga Hakbang (na may Mga Larawan)
Video: What is Chat GPT Explained 2024, Setyembre
Anonim
Paano Gumawa ng isang Autonomous Basketball Playing Robot Paggamit ng isang IRobot Lumikha Bilang Isang Batayan
Paano Gumawa ng isang Autonomous Basketball Playing Robot Paggamit ng isang IRobot Lumikha Bilang Isang Batayan

Ito ang aking entry para sa hamon sa iRobot Lumikha. Ang pinakamahirap na bahagi ng buong prosesong ito para sa akin ay ang pagpapasya kung ano ang gagawin ng robot. Nais kong ipakita ang mga cool na tampok ng Lumikha, habang nagdaragdag din sa ilang robo flair. Ang lahat ng aking mga ideya ay tila nahulog sa kategorya ng pagbubutas ngunit kapaki-pakinabang, o cool at hindi praktikal. Sa huli cool at hindi praktikal na napanalunan at ipinanganak ang robot na naglalaro ng basketball. Pagkatapos ng ilang pag-iisip na natanto ko na maaaring maging praktikal. Ipagpalagay na gumagamit ka ng orange na papel, at lahat ng iyong mga basurahan ay may berdeng mga backboard …

Hakbang 1: Mga Bahagi ng Aquire

Dahil sa limitasyon sa oras ng patimpalak, karamihan sa mga ginamit kong bahagi ay "wala sa istante". Ginamit ang Mga "Stock" Robot Bahagi: Lumikha (x1) - mula sa iRobot www.irobot.comXBC V.3.0 (x1) - mula sa Botball www.botball.orgCreate-Roomba cable (x1) - mula sa Botball www.botball.orgServo (x2) - mula sa Botball www.botball.org Shp rangefinder (x1) - mula sa Botball www.botball.org Iba't ibang mga LEGO brick - mula sa LEGO www.lego.com6-32 machine screws (x4) - mula sa McMaster www.mcmaster.com "Nilikha" Mga Bahagi ng Robot Ginamit: 3/8 "makapal na extruded PVC sheet - ang bagay na ito ay kahanga-hanga, ngunit hindi ko matandaan kung saan ko ito nakuha, ngunit ito ay katulad ng bagay na ito https://www.lynxmotion.com / Category.aspx? CategoryID = 62Iba pang mga bahagi: Orange na "POOF" na bola - mula sa layunin ng WalMartBasketball na naghahanap ng basurahan - mula sa LowesGreen na "backboard" - labis na pinturang PVC na pininturahan ng berde

Hakbang 2: Lumikha ng Natatanging Bahagi

Lumikha ng Natatanging Bahagi
Lumikha ng Natatanging Bahagi

Ang nag-iisang bahagi lamang na kailangan kong likhain ay isang plato na bolt sa Lumikha at nag-alok ng LEGO spacing. Ang spacing ng mga butas ng brick ng LEGO ay 8mm ang layo, ngunit gumawa ako ng doble na spacing upang makatipid ng oras. Ang extruded PVC ay isang simoy upang gumana. Maaari itong putulin ng isang kutsilyo ng utility, ngunit matibay at malakas. Madalas kong kukunin ang robot sa pamamagitan ng plate na ito at wala pa akong problema.

Hakbang 1: Gupitin ang sheet sa 3.5 "x 9.5", maaari mo itong i-cut gamit ang isang kutsilyo ng utility. Hakbang 2: Mag-drill ng mga butas para sa mga lumikha ng mga turnilyo. Ang gumawa ng mga turnilyo ay gumawa ng isang kahon na 2 at 5/8 "ng 8 at 5/8". Hakbang 3: Mag-drill ng LEGO brick spaced hole. Gumamit ng isang 3/16 "drill bit at inilagay ko ang mga butas na 16mm ang layo. Tip: Inilatag ko ang sheet sa isang programa ng CAD, na-print ito ng buong sukat at na-tape ito sa sheet. Pagkatapos ay ginamit ko ito bilang isang gabay sa paggupit at pagbabarena

Hakbang 3: Pag-iipon ng Robot

Pag-iipon ng Robot
Pag-iipon ng Robot
Pag-iipon ng Robot
Pag-iipon ng Robot
Pag-iipon ng Robot
Pag-iipon ng Robot

Nasisiyahan ako sa pagbuo ng mga bagay nang simple hangga't maaari, sa ganoong paraan kapag tumalon sila mula sa mesa ay hindi mo na kailangang muling itayo!

1. I-tornilyo ang bagong istilong plato sa tuktok ng Lumikha 2. Bumuo ng isang braso upang makuha ang bola 3. Bumuo ng isang braso upang hawakan ang camera 4. Bumuo ng isang mount para sa rangefinder 5. I-mount ang XBC at ikonekta ang lahat ng mga cable

Hakbang 4: Programming ang Robot

Napagpasyahan kong gamitin ang XBC bilang aking controller pangunahin dahil sa built in na pagsubaybay sa kulay. Dahil napagpasyahan kong gawin ang XBC bilang utak ng operasyon na-program ko ang aking robot sa Interactive C, o kung tawagin ko itong IC. Ang IC ay libre gamitin at maaaring ma-download sa www.botball.org. Ang IC ay halos kapareho sa C ++, ngunit maraming built sa mga aklatan. Tulad ng nangyari, si David Miller mula sa University of Oklahoma ay nagsulat ng isang silid-aklatan para sa Lumikha na maaaring ma-download mula sa kanyang pahina sa https://i-borg.engr.ou.edu/~dmiller/create/. Sa mga mapagkukunang iyon at mga manwal para sa paglikha handa na akong mag-program. Ngunit ang susunod na malaking hamon ay kung ano ang nais kong gawin nito? Nais kong isang robot na maaaring pumunta at kunin ang mga orange na bola at i-iskor ito sa isang basket. Ang aking layunin ay parang simple, at marahil ay maaaring maging simple, ngunit mas napasok ko ang maaaring gawin ng Lumikha, mas gusto kong gawin ito. Ganito ang aking huling listahan: 1. Humanap ng orange na bola2. Kunin ang orange ball3. Hanapin ang basket4. Ilagay ang bola sa basketWal1. Pag-iwas sa mga bagay2. Hindi nahuhulog sa anumang bagay (tulad ng isang mesa) 3. Ang pagtuklas ng singil ng baterya at pag-dock sa home base kapag lowOh, at lahat ng ito ay ganap na nagsasarili, nangangahulugang lahat ng ito ay naka-preprogram.

Hakbang 5: Code

Maaari itong maging magulo, ngunit gumagana ito. // et port / * Kailangan ding mai-plug in ang create cable. Ang power jack, ang 3 pronged plug sa port 8 at ang isa ay may label na UX sa JP 28 (katabi ng USB port) na may U patungo sa camera * / #define c_down 5 // camera servo down # tukuyin ang isang_down 17 // braso servo pababa # tukuyin ang hold 50 // servo hold ball # tukuyin ang nahuli 27 // posisyon ng servo ng braso upang maiwasang mahuli sa mesa # tukuyin ang shoot 150 // servo magtapon ng bola # tukuyin ang track_c 25 // camera servo track malapit na posisyon # tukuyin ang track_f 45 // camera servo track malayo ang posisyon # tukuyin ang sentro 120 // gitna ng paningin ng camera # tukuyin ang inrange 30 // track_y koordinasyon kapag ang bola ay nasa claw # tukuyin ang bola 0 // channel ng orange ball # tukuyin ang ball_x (track_x (bola, 0)) // x coordinate ng bola # tukuyin ang ball_y (track_y (bola, 0)) // y coordinate of ball # tukuyin ang mabagal 100 // bilis ng mabagal motor # tukuyin nang mabilis 175 // bilis ng mabilis na motor # tukuyin ang malinaw na 0.2 // s tumalon pabalik sa malayo sa mga balakid # tukuyin ang oras 0.5 //1.0 ay isang 90 degree kanang pagliko # tukuyin ang pahinga 0.05 // oras sa pagtulog habang sinusubaybayan ang mga patak # tukuyin ang bilis ng 175 // bilis ng pag-iwas # tukuyin ang mga back_s -200 // bilis sa pabalik mula sa nabundol na bagay # tukuyin ang tuwid 32767 // drive sa isang tuwid na linya # tukuyin ang backb 2 // channel ng backboard pangunahing kulay # tukuyin ang parisukat 1 // channel ng backboard accent color # tukuyin ang track_d 250 // posisyon ng camera para sa layunin sa pagsubaybay # tukuyin ang track_find 70 // posisyon ng camera para sa mahabang pagsubaybay # tukuyin ang reverse 2.25 // oras ng pagtulog para sa isang 180 # tukuyin ang back_f -150 // pabalik ng mabilis na bilis # tukuyin ang back_sl -125 // pabalik ng mabagal na bilis # tukuyin ang center_x 178 // true x center ng cam # tukuyin ang center_y 146 // true y center ng camint pida; // iwasan ang processint pidb; // track processint pidc; // score processint have_ball = 0; // nagsasabi kung aling pagpapaandar ang invoid main () {long ch; enable_servos (); // paganahin ang servos init_camera (); // simulan ang camera cconnect (); // kumonekta upang likhain nang buong kontrolin ang start_a (); // simulan iwasan ang pag-andar start_b (); // simulan ang pagpapaandar ng ball_tracking habang (1) {if (r_button () || gc_ldrop || gc_rdrop) {// kung kinuha o r button ng balikat pumatay (pida); pumatay (pidb); pumatay (pidc); huwag paganahin ang_servos (); idiskonekta (); masira;} create_battery_charge (); display_clear (); printf ("singil =% l / n", gc_battery_charge); kung (gc_battery_charge <1200l || b_button ()) {pumatay (pida); pumatay (pidb); pumatay (pidc); magtapon (); have_ball = 0; create_demo (1); habang (b_button ()); habang (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("singil =% l / n", gc_battery_charge); pagtulog (1.0);} magkakonekta (); likod (); pagtulog (2.0); Magsimula ng isang(); start_b ();}}} void iwasan () {habang (1) {// ulitin magpakailanman create_sensor_update (); // i-update ang lahat ng mga halaga ng sensor // create_drive (speeda, straight); kung (gc_lbump == 1) {// left bump iwas_ kanan ();} // lumiliko pakanan upang maiwasan ang iba pa kung (gc_rbump == 1) {// right bump iwanan_left ();} // lumiliko sa kaliwa upang maiwasan ang iba kung (gc_lfcliff == 1) {// left front cliff iwasan_ kanan ();} iba pa kung (gc_rfcliff == 1) {// kanang harap na talampas iwasan_left ();} iba pa kung (gc_lcliff == 1) {// kaliwang talampas iwas_ kanan ();} iba pa kung (gc_rcliff == 1) {// kanang talampas iwasan_left ();}}} void track_ball () {kill (pidc); habang (! have_ball) {// ulitin hanggang makakuha ng ball track_update (); malayo (); // itinakda ang camera na handa (); // itinakda ang braso habang (et <255) {// hanggang sa max na halaga ang mangyari kapag nahuli ang bola sa track_update (); // i-update ang larawan ng camera kung (ball_x <= (center-5)) {// kung ang bola ay naiwan track_update (); create_drive_direct (mabagal, mabilis); // turn left sleep (rest);} iba pa kung (ball_x> = (center + 5)) {// kung ang bola ay tamang track_update (); create_drive_direct (mabilis, mabagal); // turn right sleep (rest);} iba pa kung (ball_x (center-5)) {// kung ang bola ay nakasentro sa track_update (); create_drive_straight (mabilis); // diretso ang pagtulog (pahinga);}} grab (); // grab ball beep (); // make noise stop (); // stop driving have_ball = 1; // gumawa ng isang tala na Mayroon akong bola} start_c (); // hanapin ang pagtulog ng basket (1.0); // pagtulog upang wala akong ginagawa kapag napatay ako} void find_basket () {kill (pidb); // kill ball tracking process hanapin (); // ilagay ang camera sa track_set_minarea (1000); // ang backboard ay malaki, kaya maghanap lamang ng malalaking mga blobs habang (have_ball) {// habang mayroon akong ball track_update (); habang (track_x (backb, 0) = (center_x + 20)) {// habang hindi nakasentro sa track_update (); kung (track_x (backb, 0)> = (center_x + 20)) {// kung ang backboard ay naiwan track_update (); create_spin_CCW (100);} // turn left left if (track_x (backb, 0) <= (center_x-20)) {// kung ang backboard ay tamang track_update (); create_spin_CW (300-center_x);} // lumiko sa kanan na bumabagal habang papalapit ang gitna} huminto (); habang (track_size (backb, 0) <= (6000)) {// habang ang target ay mas mababa sa 6000 pixel sa laki ng track_update (); kung (track_x (backb, 0) <= (center_x-5)) {// kung ang target ay naiwan track_update (); create_drive_direct (mabagal, mabilis); // turn left sleep (rest);} iba pa kung (track_x (backb, 0)> = (center_x + 5)) {// kung ang target ay tamang track_update (); create_drive_direct (mabilis, mabagal); // turn right sleep (rest);} iba pa kung (track_x (backb, 0) (center_x-5)) {// kung ang target ay nakasentro sa track_update (); create_drive_straight (mabilis); // dumiretso sa pagtulog (pahinga);}} huminto (); // create_drive_straight (mabilis); // medyo malapitan //s Sleep(1.0); // stop (); pagtulog (1.0); create_spin_CW (speeda); // spin right sleep (reverse); // matulog nang sapat para sa isang 180 turn stop (); pababa (); // ilagay ang camera upang subaybayan ang pagtulog sa backboard (1.0); track_set_minarea (200); // gumamit ng isang maliit na sukat ng min, dahil nakaturo kami dito at papalapit habang (track_y (backb, 0)> = (center_y-140)) {// habang ang target ay mas mababa sa y coordinate track_update (); kung (track_x (backb, 0) <= (center_x-5)) {// kung ang target ay naiwan track_update (); back_ Right (); // turn left sleep (rest);} iba pa kung (track_x (backb, 0)> = (center_x + 5)) {// kung ang target ay tamang track_update (); back_left (); // turn right sleep (rest);} iba pa kung (track_x (backb, 0) (center_x-5)) {// kung ang target ay nakasentro sa track_update (); pabalik (); // dumiretso sa pagtulog (pahinga);}} huminto (); beep (); magtapon (); // shoot sleep (1.0); have_ball = 0; // paalala binato ko ang bola at wala ito} start_b (); // back to ball tracking sleep (1.0); // huwag gumawa ng anuman hanggang mamatay ang prosesong ito} void cconnect () {create_connect (); create_full (); // para sa ganap na pagkontrol ng mga sensor ng ledge create_power_led (0, 255);} // green power ledvoid disconnect () {stop (); // ihinto ang paggalaw create_disconnect ();} void back_away () {back (); pagtulog (malinaw); ihinto ();} void rotate_l () {create_spin_CCW (speeda); oras ng tulog); ihinto ();} void rotate_r () {create_spin_CW (speeda); oras ng tulog); stop ();} void stop () {create_drive (0, straight);} void back () {create_drive (back_s, straight);} void handa () {set_servo_position (arm, a_down);} void check () {set_servo_position (cam, track_c);} void far () {set_servo_position (cam, track_f);} void ledge () {set_servo_position (braso, nahuli);} void throw () {int a; para sa (a = 50; a> = 30; a- = 1) {// maghanda set_servo_position (braso, a);} set_servo_position (braso, shoot);} void grab () {int a; para sa (a = 0; a <= hold; a + = 1) {// itaas ang braso na maayos na itinakda_servo_position (braso, a);}} void down () {set_servo_position (cam, track_d);} void find () {set_servo_position (cam, track_find);} void start_a () {pida = start_process (iwasan ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // maghintay para matapos ang kasalukuyang proseso ng paglikha, at unahin ang kill_process (pid); CREATE_FREE; // tapos na akong tumigil ();} void iwasan_left () {pumatay (pidb); // itigil ang lahat ng pumatay (pidc); ledge (); // pick up claw upang hindi ito mahuli sa mesa pabalik_away (); // back away rotate_l (); // rotate away from balakid handa (); // ibalik ang claw kung (have_ball) {// kung mayroon akong ball start_c ();} // simulan ang pagsubaybay sa layunin pa rin kung (! have_ball) {// kung wala akong bola start_b ();} // simulan ang pagsubaybay sa bola} void iwasan_kan () {pumatay (pidb); pumatay (pidc); pasaman (); back_away (); paikutin_r (); handa na (); kung (have_ball) {start_c ();} iba pa kung (! have_ball) {start_b ();}} void back_left () {create_drive_direct (back_f, back_sl);} void back_right () {create_drive_direct (back_sl, back_f);}

Hakbang 6: Worth It Ito?

Ang mga gastos ay: Lumikha ng + baterya + doc = $ 260XBC starter kit (xbc, cam, LEGO brick, sensor) = $ 579PVC + pintura + mga tornilyo = halos $ 20 Kabuuang gastos = $ 859 Mayroon na akong XBC starter kit mula sa Botball, kaya ang gastos sa akin ay ang gastos ng Lumikha. Sa palagay ko sulit ito, at ang pinakamagandang bahagi ay ang lahat ng mga bahagi na ginamit ko ay magagamit muli, kung maihahatid ko ang aking sarili upang maibahagi ang bot na ito. Ipinapakita ng video na ito ang maiwasan ang sub na gawain, sa isang tuktok ng mesa. Ipinapakita ng video na ito ang robot na nagmamarka ng 5 mga orange na bola sa isang layunin. Tumulong lang ako upang mapabilis ang proseso, magkakaroon sana ako ng bola 5 sa paglaon sa sarili.

Hakbang 7: Konklusyon

Ang pangwakas na resulta ay isang robot na maaaring kunin at puntos ang mga orange na bola sa isang layunin na mag-isa.

Gustung-gusto kong magtrabaho sa proyektong ito. Ang mas nagtrabaho ako sa robot na ito ay mas nakalakip ako dito. Kinausap ko ito ngayon na para bang alaga. Inaasahan kong nakatulong ito sa iyo sa susunod mong proyekto. Maraming mga tao na kailangan kong pasalamatan, ngunit maraming. Tulad ni Bernard ng Chartres kaya't matikas na sinabi: "Kami ay tulad ng mga dwende sa balikat ng mga higante, upang maaari naming makita ang higit pa sa kanila, at mga bagay sa isang mas malawak na distansya, hindi sa bisa ng anumang talas sa paningin sa aming bahagi, o anumang pisikal na pagkakaiba, ngunit dahil dinadala tayo ng mataas at itinaas ng kanilang higanteng laki."

Inirerekumendang: