Sisällysluettelo:

Autonomisen koripallon pelaaminen robottia käyttäen IRobotin luominen pohjaksi: 7 vaihetta (kuvilla)
Autonomisen koripallon pelaaminen robottia käyttäen IRobotin luominen pohjaksi: 7 vaihetta (kuvilla)

Video: Autonomisen koripallon pelaaminen robottia käyttäen IRobotin luominen pohjaksi: 7 vaihetta (kuvilla)

Video: Autonomisen koripallon pelaaminen robottia käyttäen IRobotin luominen pohjaksi: 7 vaihetta (kuvilla)
Video: Koripallon perustaidot 2024, Marraskuu
Anonim
Kuinka tehdä itsenäinen koripalloa pelaava robotti käyttämällä IRobot -luomista pohjana
Kuinka tehdä itsenäinen koripalloa pelaava robotti käyttämällä IRobot -luomista pohjana

Tämä on kirjoitukseni iRobot Create -haasteeseen. Vaikein osa koko prosessia minulle oli päättää, mitä robotti aikoo tehdä. Halusin esitellä Createin hienoja ominaisuuksia ja lisätä siihen myös robo -tunnelmaa. Kaikki ajatukseni tuntuivat joko kuuluvan tylsän mutta hyödyllisen luokkaan tai viileään ja epäkäytännölliseen. Lopulta viileä ja epäkäytännöllinen voitti ja koripalloa pelaava robotti syntyi. Hetken mietittyäni tajusin, että se voisi olla käytännöllistä. Oletetaan, että käytät oranssia paperia ja että kaikissa roskakorissasi on vihreät takalevyt…

Vaihe 1: Aquire -osat

Kilpailun määräajan vuoksi suurin osa käyttämistäni osista oli "hyllyltä". Käytetyt "varastot" -robotin osat: Luo (x1)-iRobotista www.irobot.comXBC V.3.0 (x1)-Botballista www.botball.orgLuo Roomba-kaapeli (x1)-Botballista www.botball.orgServo (x2)-Botballista www.botball.orgSharp-etäisyysmittari (x1)-Botballista www.botball.orgLEGO-palikat-LEGO-sivustolta www.lego.com.com "Luotut" käytetyt robottiosat: 3/8 "paksu pursotettu PVC -arkki - tämä tavara on mahtavaa, mutta en muista mistä sain sen, mutta se on aivan kuten tämä juttu https://www.lynxmotion.com/Category.aspx? CategoryID = 62Muut osat: Oranssi "POOF" pallo - WalMartilta

Vaihe 2: Luo ainutlaatuinen osa

Luo ainutlaatuinen osa
Luo ainutlaatuinen osa

Ainoa osa, joka minun piti valmistaa, oli levy, joka pultattiin Luo -asentoon ja tarjosi LEGO -välilyöntejä. LEGO -tiilireikien etäisyys on 8 mm, mutta tein kaksinkertaisen välimatkan säästääksesi aikaa. Suulakepuristettu PVC on helppoa työskennellä. Se voidaan leikata apuvälineellä, mutta on jäykkä ja vahva. Nostan robotin usein tämän levyn takaa, eikä minulla ole vielä ollut ongelmia.

Vaihe 1: Leikkaa arkki 3,5 "x 9,5": n kokoiseksi, voit leikata sen apuvälineellä. Vaihe 2: Poraa luovien ruuvien reiät. Luontiruuvit muodostavat laatikon, joka on 2 ja 5/8 "8 ja 5/8". Vaihe 3: Poraa LEGO -palikoista erotetut reiät. Käytä 3/16 tuuman poranterää ja asetin reiät 16 mm: n päähän toisistaan. Vihje: Laitoin arkin CAD -ohjelmaan, tulostin sen täysikokoisena ja teipasin sen arkkiin. Sitten käytin tätä oppaana leikkaamiseen ja poraus.

Vaihe 3: Robotin kokoaminen

Robotin kokoaminen
Robotin kokoaminen
Robotin kokoaminen
Robotin kokoaminen
Robotin kokoaminen
Robotin kokoaminen

Nautin rakentaa asioita mahdollisimman yksinkertaisesti, joten kun ne hyppäävät pöydältä, sinun ei tarvitse rakentaa niin paljon!

1. Kierrä vastikään muotoiltu levy levyn yläosaan 2. Rakenna käsivarsi pallon tarttumiseen 3. Rakenna käsivarsi kameran pitämiseksi 4. Rakenna etäisyysmittarin kiinnike 5. Asenna XBC ja liitä kaikki kaapelit

Vaihe 4: Robotin ohjelmointi

Päätin käyttää XBC: tä ohjaimena lähinnä sen sisäänrakennetun väriseurannan vuoksi. Koska päätin käyttää XBC: tä operaation aivoina, ohjelmoin robotin Interactive C: hen tai kutsun sitä IC: ksi. IC on ilmainen ja sen voi ladata osoitteesta www.botball.org. IC on hyvin samanlainen kuin C ++, mutta siinä on useita sisäänrakennettuja kirjastoja. Kuten käy ilmi, David Miller Oklahoman yliopistosta on kirjoittanut Create-kirjaston, jonka voi ladata hänen sivultansa osoitteesta https://i-borg.engr.ou.edu/~dmiller/create/. Näiden resurssien ja luomisoppaiden avulla olin valmis ohjelmoimaan. Mutta seuraava suuri haaste oli, mitä halusin sen tekevän? Halusin robotin, joka voisi noutaa appelsiinipalloja ja pistää ne koriin. Tavoitteeni kuulosti yksinkertaiselta, ja se olisi luultavasti voinut olla yksinkertainen, mutta mitä enemmän olen perehtynyt siihen, mitä Luo voi tehdä, sitä enemmän halusin sen tekevän. Lopullinen listani näytti tältä: 1. Etsi oranssi pallo 2. Nosta oranssi pallo 3. Etsi kori 4. Laita pallo koriin Esineiden välttäminen 2. Älä pudota mitään (kuten pöytä) 3. Akun varauksen havaitseminen ja telakointi kotitukiaseman ollessa alhainen, ja kaikki tämä on täysin itsenäistä, mikä tarkoittaa, että kaikki on esiohjelmoitu.

Vaihe 5: Koodi

Se voi olla sotkuista, mutta se toimii.#Käytä "createlib.ic" #use "xbccamlib.ic" #define cam 0 // kameran servoportti#define arm 3 // arm servo port#define et (analoginen (0)) // et port/*Luo kaapeli on myös kytkettävä pistorasiaan. Virtaliitäntä, 3 -haarainen pistoke porttiin 8 ja UX -merkintä JP 28: een (USB -portin vieressä) U -suuntaan kohti kameraa*/ #define c_down 5 // kameran servo alas#define a_down 17 // käsivarren servo alas#määrittele pito 50 // servopidike pallo#määritä kiinni 27 // käsivarren servoasento, jotta et jää kiinni pöydälle#määritä ampua 150 // servo heittää pallo#määritä raita_c 25 // kameran servoraita sulje asento#määritä raita_f 45 // kameran servoraita kaukana sijainti#määritä keskusta 120 // kameran näön keskipiste#määritä inrange 30 // raita_y -koordinaatti, kun pallo on kynsissä#määrittele pallo 0 // oranssin pallon kanava#define ball_x (track_x (pallo, 0)) // x pallon koordinaatti#define ball_y (track_y (pallo, 0)) // y pallon koordinaatti#määrittele hidas 100 // hidas nopeus moottori#määritä nopea 175 // nopean moottorin nopeus#määritä selkeä 0,2 // s hyppää taaksepäin esteistä#määritä aika 0.5 //1.0 on 90 asteen oikea käännös#määrittele lepo 0.05 // nukkumisaika seurattaessa möykkyjä#määrittele speeda 175 // vältä käännöksen nopeus#määritä takaisin_s -200 // nopeus taaksepäin törmäyskohteesta#määritä suora 32767 // aja suoraviivaisesti#määritä backb 2 // takalevyn päävärikanava#määritä neliö 1 // takalevyn aksentin värin kanava#määritä raita_d 250 // kameran sijainti seurantatavoitetta varten# define track_find 70 // kameran sijainti pitkässä seurannassa#define reverse 2.25 // uniaika 180: lle#define back_f -150 // takaisin nopea nopeus#define back_sl -125 // takaisin hidas nopeus#define center_x 178 // true x center of cam#define center_y 146 // true y center of camint pida; // vältä processint pidb; // track processint pidc; // score processint have_ball = 0; // kertoo mikä funktio olemme laskut main () {long ch; enable_servos (); // enable servos init_camera (); // start camera cconnect (); // connect to create with full control start_a (); // start vältä toiminto start_b (); // käynnistä ball_tracking -toiminto, kun (1) {if (r_button () || gc_ldrop || gc_rdrop) {// jos poimitaan tai r olkapäänappi tappaa (pida); tappaa (pidb); tappaa (pidc); disable_servos (); katkaista(); break;} create_battery_charge (); display_clear (); printf ("maksu = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); tappaa (pidb); tappaa (pidc); heittää(); have_ball = 0; create_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("maksu = %l / n", gc_battery_charge); lepotila (1.0);} cconnect (); takaisin(); nukkua (2,0); Aloita(); start_b ();}}} void välttä () {while (1) {// toista ikuisesti create_sensor_update (); // päivitä kaikki anturin arvot // create_drive (speeda, straight); if (gc_lbump == 1) {// vasen kolahdus vältettävä_oikea ();} // kääntyy oikealle välttääkseen muut, jos (gc_rbump == 1) {// oikea kolahdus välty_vasen ();} // kääntyy vasemmalle välttääkseen muut, jos (gc_lfcliff == 1) {// vasen etukalli vältettävä_oikea ();} muu jos (gc_rfcliff == 1) {// oikea etukalli vältettävä_vasen ();} muu jos (gc_lcliff == 1) {// vasen kallio vältettävä_oikea ();} else if (gc_rcliff == 1) {// oikea kallio vältettävä_vasen ();}}}} void track_ball () {kill (pidc); while (! have_ball) {// toista kunnes saat pallon track_update (); far (); // asettaa kameran valmiiksi (); // asettaa käsivarren ollessa (et <255) {// kunnes maksimiarvo tapahtuu, kun pallo on kiinni track_update (); // päivitä kameran kuva jos (ball_x <= (center-5)) {// jos pallo jätetään track_update (); create_drive_direct (hidas, nopea); // käänny vasemmalle nukkumaan (lepo);} else if (ball_x> = (keskellä+5)) {// jos pallo on oikea track_update (); create_drive_direct (nopea, hidas); // käänny oikealle lepotilaan (lepo);} else if (ball_x (center-5)) {// jos pallo on keskitetty track_update (); create_drive_straight (nopea); // mene suoraan nukkumaan (lepo);}} tartu (); // nappaa palloääni (); // tee melu stop (); // lopeta ajaminen have_ball = 1; // merkitse muistiin, että Minulla on pallo} start_c (); // löytää korin lepotila (1.0); // nukkua niin, etten tee mitään, kun minut tapetaan} void find_basket () {kill (pidb); // tappaa pallon seurantaprosessi find (); // laita kamera ylös track_set_minarea (1000); // taustalevy on suuri, joten etsi vain suuria möykkyjä, kun (have_ball) {// minulla on pallo track_update (); while (track_x (backb, 0) = (center_x+20)) {// kun ei ole keskitetty track_update (); if (track_x (backb, 0)> = (center_x+20)) {// jos taustalevy jätetään track_update (); create_spin_CCW (100);} // käänny vasemmalle muuten if (track_x (backb, 0) <= (center_x-20)) {// jos takalauta on oikea track_update (); create_spin_CW (300-center_x);} // käänny oikealle hitaasti, kun keskikohta lähestyy} stop (); while (track_size (backb, 0) <= (6000)) {// kun tavoite on alle 6000 pikseliä koko track_update (); if (track_x (backb, 0) <= (center_x-5)) {// jos kohde jätetään track_update (); create_drive_direct (hidas, nopea); // käänny vasemmalle uneen (lepo);} else if (track_x (backb, 0)> = (center_x+5)) {// jos kohde on oikea track_update (); create_drive_direct (nopea, hidas); // käänny oikealle lepotilaan (lepo);} else if (track_x (backb, 0) (center_x-5)) {// jos kohde on keskitetty track_update (); create_drive_straight (nopea); // mene suoraan nukkumaan (lepo);}} stop (); // create_drive_straight (nopea); // mene vähän lähemmäs // unta (1.0); //lopettaa(); nukkua (1,0); create_spin_CW (speeda); // pyöritä oikeaa unta (käänteinen); // nukku tarpeeksi kauan 180 kierroksen pysäytykseen (); alas (); // aseta kamera alas, jotta voit seurata takalevyn nukkumista (1.0); track_set_minarea (200); // käytä pienempää minikokoa, koska osoitamme sitä ja tulemme lähemmäksi, kun (track_y (backb, 0)> = (center_y-140)) {// kun tavoite on pienempi kuin y koordinaatti track_update (); if (track_x (backb, 0) <= (center_x-5)) {// jos kohde jätetään track_update (); back_right (); // käänny vasemmalle uneen (lepo);} else if (track_x (backb, 0)> = (center_x+5)) {// jos kohde on oikea track_update (); back_left (); // käänny oikealle lepotilaan (lepo);} else if (track_x (backb, 0) (center_x-5)) {// jos kohde on keskitetty track_update (); takaisin (); // mene suoraan nukkumaan (lepo);}} stop (); piippaus(); heittää (); // ampua uni (1.0); have_ball = 0; // muistutus heitin pallon eikä minulla ole sitä} start_b (); // takaisin pallon seurannan uneen (1.0); // älä tee mitään ennen kuin tämä prosessi kuolee} void cconnect () {create_connect (); create_full (); // reuna -antureiden täyden hallinnan luomiseksi create_power_led (0, 255);} // vihreä virta ledvoid katkaise () {stop (); // lopeta liikkuminen create_disconnect ();} void back_away () {back (); nukkua (kirkas); stop ();} void rotate_l () {create_spin_CCW (speeda); Nukkumaanmenoaika); stop ();} void rotate_r () {create_spin_CW (speeda); Nukkumaanmenoaika); 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 (nokka, raita_c);} void far () {set_servo_position (cam, track_f);} void ledge () {set_servo_position (käsivarsi, kiinni);} void heitto () {int a; for (a = 50; a> = 30; a- = 1) {// valmistaudu set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a+= 1) {// nosta käsi tasaisesti 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älttä ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // odota, että nykyinen luomisprosessi päättyy, ja ota prioriteetti kill_process (pid); CREATE_FREE; // olen valmis stop ();} void vältyä_vasen () {tappaa (pidb); // lopeta kaikki muu tappaa (pidc); ledge (); // poimi kynsi, jotta se ei jää kiinni pöydälle back_away (); // taaksepäin rotate_l (); // kierrä pois esteestä valmis (); // aseta kynsi takaisin alas, jos (have_ball) {// jos minulla on pallo start_c ();} // aloita maalinseuranta muuten if (! have_ball) {// jos minulla ei ole palloa start_b ();} // aloita pallon seuranta} void välttämis_oikea () {tappaa (pidb); tappaa (pidc); reunus (); Perääntyä(); 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);}

Vaihe 6: Oliko se sen arvoista?

Kustannukset olivat: Luo + akku + asiakirja = 260 dollaria XBC -aloituspaketti (xbc, nokka, LEGO -palikat, anturit) = 579 dollaria PVC + maali + ruuvit = noin 20 dollaria Kokonaiskustannukset = 859 dollaria Minulla oli jo Botballin XBC -aloituspaketti Mielestäni se oli sen arvoista, ja paras osa on, että kaikki käyttämäni osat ovat uudelleenkäytettäviä, jos voisin tuoda itseni eroon tästä botista., pöytälevylle. Tässä videossa robotti tekee 5 oranssia palloa maalissa. Autoin vain nopeuttamaan prosessia, se olisi löytänyt pallon 5 lopulta itsestään.

Vaihe 7: Johtopäätös

Lopputuloksena on robotti, joka voi poimia ja lyödä oranssia palloja maaliin yksinään.

Tykkäsin työskennellä tämän projektin parissa. Mitä enemmän työskentelin tämän robotin parissa, sitä enemmän kiintyin siihen. Nyt puhun sille kuin se olisi lemmikki. Toivottavasti tämä on auttanut sinua seuraavassa projektissasi. On monia ihmisiä, joita minun on kiitettävä, mutta heitä on liikaa. Kuten Bernard of Chartres niin tyylikkäästi totesi: "Olemme kuin kääpiöt jättiläisten harteilla, jotta voimme nähdä enemmän kuin he ja asiat kauemmas, emme näkökyvyn tai fyysisten syiden vuoksi. eroa, vaan siksi, että meitä kuljetetaan korkealla ja nostetaan niiden jättimäisen koon mukaan."

Suositeltava: