Obsah:

Jak vytvořit autonomního robota hrajícího basketbal pomocí IRobota Vytvořit jako základ: 7 kroků (s obrázky)
Jak vytvořit autonomního robota hrajícího basketbal pomocí IRobota Vytvořit jako základ: 7 kroků (s obrázky)

Video: Jak vytvořit autonomního robota hrajícího basketbal pomocí IRobota Vytvořit jako základ: 7 kroků (s obrázky)

Video: Jak vytvořit autonomního robota hrajícího basketbal pomocí IRobota Vytvořit jako základ: 7 kroků (s obrázky)
Video: Robot Zedník / Robotický zdicí systém (ČVUT, FSv + DEK) 2024, Červenec
Anonim
Jak vytvořit autonomního robota hrajícího basketbal pomocí IRobota Vytvořit jako základ
Jak vytvořit autonomního robota hrajícího basketbal pomocí IRobota Vytvořit jako základ

Toto je můj příspěvek k výzvě iRobot Create. Nejtěžší na celém tomto procesu pro mě bylo rozhodnout, co bude robot dělat. Chtěl jsem předvést skvělé funkce Create a zároveň přidat trochu robo vkusu. Zdálo se, že všechny mé nápady buď spadají do kategorie nudných, ale užitečných, nebo chladných a nepraktických. Nakonec zvítězilo chladné a nepraktické a narodil se robot na hraní basketbalu. Po nějaké úvaze jsem si uvědomil, že by to mohlo být praktické. Předpokládejme, že používáte oranžový papír a že všechny vaše popelnice mají zelené zadní desky…

Krok 1: Díly Aquire

Vzhledem k časovému limitu soutěže byla většina dílů, které jsem použil, „mimo regál“. Použité části „zásoby“robota: Vytvořit (x1)-z iRobot www.irobot.comXBC V.3.0 (x1)-z Botball www.botball.orgVytvořit kabel Roomba (x1)-z Botball www.botball.orgServo (x2)-od společnosti Botball www.botball.org Sharp rangefinder (x1)-od Botball www.botball.org Rozmanité kostky LEGO-od LEGO www.lego.com6-32 šrouby stroje (x4)-od McMaster www.mcmaster.com Použité díly robota "vytvořené": extrudovaný PVC plech o tloušťce 3/8 " - tyhle věci jsou úžasné, ale nevzpomínám si, odkud jsem je vzal, ale jsou stejné jako tyhle věci https://www.lynxmotion.com/Category.aspx? CategoryID = 62Ostatní díly: Oranžový míč „POOF“- od koše na koš WalMartBasketball - ze „zadní desky“LowesGreen - extra PVC natřené jasně zelenou barvou

Krok 2: Vytvořte jedinečnou část

Vytvořte jedinečnou část
Vytvořte jedinečnou část

Jediná část, kterou jsem musel vyrobit, byla deska, která byla přišroubována k Create a nabídla rozestupy LEGO. Rozteč otvorů v kostkách LEGO je od sebe vzdálena 8 mm, ale pro úsporu času jsem udělal dvojité rozteče. Extrudované PVC je hračka pro práci. Lze jej řezat nožem, ale je pevný a pevný. U této desky často vyzvedávám robota a zatím jsem neměl problém.

Krok 1: Odřízněte list na 3,5 "x 9,5", můžete jej rozříznout nástrojovým nožem. Krok 2: Vyvrtejte otvory pro šrouby pro vytvoření. Vytvořené šrouby vytvoří krabici o rozměrech 2 a 5/8 "o 8 a 5/8". Krok 3: Vyvrtejte díry od sebe od LEGO kostek. Použijte vrták 3/16 "a otvory jsem rozmístil 16 mm od sebe. Tip: List jsem rozložil do programu CAD, vytiskl jej v plné velikosti a nalepil na pásku. Pak jsem to použil jako vodítko pro řezání a vrtání.

Krok 3: Sestavení robota

Sestavení robota
Sestavení robota
Sestavení robota
Sestavení robota
Sestavení robota
Sestavení robota

Baví mě stavět věci co nejjednodušeji, takže když seskočí ze stolu, nemusíte tolik přestavovat!

1. Přišroubujte nově vytvořenou desku k horní části přístroje Create 2. Postavte rameno, abyste chytili míč 3. Postavte rameno pro držení fotoaparátu 4. Vytvořte držák pro dálkoměr 5. Namontujte XBC a připojte všechny kabely

Krok 4: Programování robota

Rozhodl jsem se použít XBC jako svůj ovladač hlavně kvůli jeho vestavěnému sledování barev. Protože jsem se rozhodl s XBC jako mozkem operace, naprogramoval jsem svého robota v Interactive C, nebo jak tomu říkám IC. IC je zdarma k použití a lze jej stáhnout na www.botball.org. IC je velmi podobný C ++, ale má několik vestavěných knihoven. Jak se ukázalo, David Miller z University of Oklahoma napsal knihovnu pro Create, kterou lze stáhnout z jeho stránky na adrese https://i-borg.engr.ou.edu/~dmiller/create/. S těmito prostředky a manuály pro vytvoření jsem byl připraven k programování. Ale další velkou výzvou bylo, co jsem chtěl, aby to udělalo? Chtěl jsem robota, který by mohl jít a sebrat oranžové koule a dát je do koše. Můj cíl zněl jednoduše a pravděpodobně mohl být jednoduchý, ale čím víc jsem se zabýval tím, co stvoření dokázalo, tím víc jsem to chtěl dělat. Můj konečný seznam vypadal takto: 1. Najděte oranžovou kouli 2. Seberte oranžovou kouli 3. Najděte koš 4. Vložte míč do koše, zatímco 1. Vyhýbání se předmětům 2. Nespadnout z ničeho (jako ze stolu) 3. Detekce nabití baterie a dokování s domácí základnou, když je nízká, a to vše je zcela autonomní, což znamená, že je vše předprogramováno.

Krok 5: Kód

Může to být nepořádek, ale funguje to.#Použijte "createlib.ic" #use "xbccamlib.ic" #define cam 0 // port servopohonu kamery#definujte rameno 3 // port servopohonu#definujte et (analogový (0)) // et port/*Je také nutné zapojit kabel pro vytvoření. Napájecí konektor, 3kolíkovou zástrčku do portu 8 a zásuvku označenou UX do JP 28 (vedle portu USB) s U směrem k fotoaparátu*/ #define c_down 5 // vypnutí serva kamery#definovat a_down 17 // vypnutí servopohonu#definovat hold 50 // servo hold ball#definovat chycený 27 // poloha servopohonu, aby se nezachytil o stůl#definovat střílet 150 // servo házet míčem#definovat track_c 25 // poloha serva kamery zavřít pozici#definovat track_f 45 // poloha kamery servo sledovat vzdálenou pozici#definovat střed 120 // střed vidění kamery#definovat uspořádání 30 // track_y souřadnice, když je míč v drápu#definovat míč 0 // kanál oranžové koule#definujte ball_x (track_x (ball, 0)) // x souřadnice míče#definujte ball_y (track_y (ball, 0)) // y souřadnice míče#definujte pomalu 100 // rychlost pomalu motor#definujte rychle 175 // rychlost rychlého motoru#definujte vymazání 0,2 // s leep couvnout z překážek#definovat čas 0,5 //1,0 je otočení doprava o 90 stupňů#definovat odpočinek 0,05 // čas spát při sledování blobů#definovat speeda 175 // rychlost vyhýbání se zatáčce#definovat back_s -200 // rychlost couvejte od naraženého objektu#definujte rovně 32767 // jeďte rovně#definujte backb 2 // kanál hlavní barvy backboardu#definujte čtverec 1 // kanál akcentové barvy backboardu#definujte track_d 250 // pozice kamery pro sledování cíle# definovat track_find 70 // pozice kamery pro dlouhé sledování#definovat couvání 2,25 // doba spánku pro 180#definovat back_f -150 // zpět vysokou rychlost#definovat back_sl -125 // zpět pomalou rychlost#definovat center_x 178 // true x center z kamery#definovat center_y 146 // true y centrum camint pida; // vyhnout se processint pidb; // sledovat processint pidc; // skóre processint have_ball = 0; // říká, jaké funkci se vyhýbáme main () {long ch; enable_servos (); // povolit serva init_camera (); // spustit kameru cconnect (); // připojit k vytvoření s plným ovládáním start_a (); // spustit funkci vyhýbání se start_b (); // spustit funkci sledování míče během (1) {if (r_button () || gc_ldrop || gc_rdrop) {// při vyzvednutí nebo r ramenní tlačítko zabít (pida); zabít (pidb); zabít (pidc); disable_servos (); odpojit(); break;} create_battery_charge (); display_clear (); printf ("poplatek = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); zabít (pidb); zabít (pidc); házet(); have_ball = 0; create_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("poplatek = %l / n", gc_battery_charge); spánek (1.0);} cconnect (); zadní(); spánek (2,0); start_a (); start_b ();}}} void avoid () {while (1) {// navždy opakovat create_sensor_update (); // aktualizace všech hodnot senzoru // create_drive (speeda, straight); if (gc_lbump == 1) {// levá nerovnost avoid_right ();} // otočí se doprava, aby se vyhnula else if (gc_rbump == 1) {// pravá boule avoid_left ();}} // // otočí doleva, aby se vyhla jinému, pokud (gc_lfcliff == 1) {// levý přední útes avoid_right ();} else if (gc_rfcliff == 1) {// pravý přední útes avoid_left ();} else if (gc_lcliff == 1) {// levý útes avoid_right ();} else if (gc_rcliff == 1) {// pravý útes avoid_left ();}}}} neplatný track_ball () {kill (pidc); while (! have_ball) {// opakujte, dokud nezískáte míč track_update (); far (); // nastaví kameru připravenou (); // nastaví rameno, zatímco (et <255) {// dokud nedojde k maximální hodnotě, když je míč chycen track_update (); // aktualizace obrázku kamery, pokud (ball_x <= (střed-5)) {// pokud je míč ponechán track_update (); create_drive_direct (pomalý, rychlý); // odbočte doleva do spánku (odpočinek);} else if (ball_x> = (center+5)) {// pokud je míč vpravo track_update (); create_drive_direct (rychlý, pomalý); // odbočit vpravo spánek (odpočinek);} else if (ball_x (center-5)) {// pokud je míč vycentrován track_update (); create_drive_straight (fast); // jděte rovnou spát (odpočinek);}} grab (); // pípnutí míče (); // vypněte hluk (); // zastavte jízdu have_ball = 1; // poznamenejte si, že I have ball} start_c (); // find the basket sleep (1.0); // sleep so that I don't doing nothing when I are asked} void find_basket () {kill (pidb); // kill ball tracking tracking find (); // umístit kameru track_set_minarea (1000); // zadní deska je velká, takže hledejte pouze velké objekty bloby while (have_ball) {// zatímco já mám míč track_update (); while (track_x (backb, 0) = (center_x+20)) {// když není vystředěno track_update (); if (track_x (backb, 0)> = (center_x+20)) {// if the backboard is left track_update (); create_spin_CCW (100);} // odbočte doleva if (track_x (backb, 0) <= (center_x-20)) {// pokud je backboard vpravo track_update (); create_spin_CW (300-center_x);} // odbočení vpravo zpomalení, když se blíží střed} stop (); while (track_size (backb, 0) <= (6000)) {// while the target is less than 6000 pixels in size track_update (); if (track_x (backb, 0) <= (center_x-5)) {// pokud je cíl ponechán track_update (); create_drive_direct (pomalý, rychlý); // odbočte doleva do režimu spánku (odpočinek);} else if (track_x (backb, 0)> = (center_x+5)) {// pokud je cíl správný track_update (); create_drive_direct (rychlý, pomalý); // odbočit vpravo spánek (odpočinek);} else if (track_x (backb, 0) (center_x-5)) {// pokud je cíl vycentrován track_update (); create_drive_straight (fast); // jděte rovnou spát (odpočívat);}} stop (); // create_drive_straight (fast); // trochu se přiblížit //sleep(1.0); //stop(); spánek (1,0); create_spin_CW (speeda); // spánek pravý spánek (zpět); // spánek dostatečně dlouhý na zastavení o 180 otáček (); down (); // odloží kameru, aby sledovala režim spánku (1.0); track_set_minarea (200); // použijte menší min. velikost, protože jsme na ni zaměřeni a přiblížíme se while (track_y (backb, 0)> = (center_y-140)) {// zatímco cíl je menší než y souřadnice track_update (); if (track_x (backb, 0) <= (center_x-5)) {// pokud je cíl ponechán track_update (); back_right (); // odbočit doleva (odpočinek);} else if (track_x (backb, 0)> = (center_x+5)) {// pokud je cíl správný track_update (); back_left (); // odbočit vpravo spánek (odpočinek);} else if (track_x (backb, 0) (center_x-5)) {// pokud je cíl vycentrován track_update (); zpět (); // jít rovnou spát (odpočívat);}} stop (); pípnutí(); throw (); // střílet spánek (1.0); have_ball = 0; // připomenutí Hodil jsem míč a nemám ho} start_b (); // zpět do režimu spánku sledování míče (1.0); // nedělejte nic, dokud tento proces nezemře} neplatné cconnect () {create_connect (); create_full (); // pro plnou kontrolu senzorů římsy create_power_led (0, 255);} // zelená kontrolka napájení vyhnout se odpojení () {stop (); // zastavení pohybu create_disconnect ();} neplatné back_away () {zpět (); spánek (čistý); stop ();} void rotate_l () {create_spin_CCW (speeda); Čas spát); stop ();} void rotate_r () {create_spin_CW (speeda); Čas spát); 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 ledge () {set_servo_position (arm, catch);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// připravte se set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a+= 1) {// zvedněte rameno hladce 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 (avoid ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // počkejte na dokončení aktuálního procesu vytváření a vezměte prioritu kill_process (pid); CREATE_FREE; // jsem hotový stop ();} void avoid_left () {kill (pidb); // zastavit vše ostatní kill (pidc); římsa (); // zvedněte dráp, aby se nezachytil o stůl back_away (); // couvejte rotate_l (); // otočte pryč od překážky ready (); // vložte dráp zpět dolů, pokud (have_ball) {// pokud mám míč start_c ();} // spustit sledování cíle jinak if (! have_ball) {// pokud nemám míč start_b ();} // spustit sledování míče} neplatné avoid_right () {kill (pidb); zabít (pidc); římsa(); vycouvat(); rotate_r (); připraven (); 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);}

Krok 6: Stálo to za to?

Náklady byly: Vytvořit + baterie + dokument = $ 260XBC startovací sada (xbc, kamera, LEGO kostky, senzory) = 579 $ PVC + barva + šrouby = asi 20 $ Celkové náklady = 859 $ Už jsem měl startovací sadu XBC od Botball, takže náklady pro mě byly náklady na Create. Myslím, že to stálo za to, a nejlepší na tom je, že všechny části, které jsem použil, jsou opakovaně použitelné, kdybych se mohl rozloučit s tímto robotem. Toto video ukazuje rutinu vyhýbání se, na desce stolu. Toto video ukazuje robota, který vstřelil 5 oranžových míčků v cíli. Pomohl jsem pouze zrychlit proces, nakonec by našel míč 5 sám.

Krok 7: Závěr

Konečným výsledkem je robot, který dokáže sám sebrat a vstřelit oranžové míče v cíli.

Rád jsem pracoval na tomto projektu. Čím více jsem na tomto robotu pracoval, tím více jsem se k němu připojoval. Teď s tím mluvím, jako by to byl domácí mazlíček. Doufám, že vám to pomohlo při dalším projektu. Je spousta lidí, kterým musím poděkovat, ale je jich příliš mnoho. Stejně jako Bernard z Chartres tak elegantně prohlásil: „Jsme jako trpaslíci na ramenou obrů, abychom viděli více než oni, a věci na větší vzdálenost, a to nikoli z důvodu ostrosti z naší strany, nebo z jakéhokoli fyzického hlediska. rozdíl, ale protože jsme neseni vysoko a zvedáni jejich obří velikostí. “

Doporučuje: