Spisu treści:

Jak zrobić autonomicznego robota grającego w koszykówkę za pomocą IRobota Utwórz jako podstawę: 7 kroków (ze zdjęciami)
Jak zrobić autonomicznego robota grającego w koszykówkę za pomocą IRobota Utwórz jako podstawę: 7 kroków (ze zdjęciami)

Wideo: Jak zrobić autonomicznego robota grającego w koszykówkę za pomocą IRobota Utwórz jako podstawę: 7 kroków (ze zdjęciami)

Wideo: Jak zrobić autonomicznego robota grającego w koszykówkę za pomocą IRobota Utwórz jako podstawę: 7 kroków (ze zdjęciami)
Wideo: Jak zrobić WSAD od DESKI #shorts 2024, Listopad
Anonim
Jak zrobić autonomicznego robota grającego w koszykówkę za pomocą IRobota, który tworzy jako bazę?
Jak zrobić autonomicznego robota grającego w koszykówkę za pomocą IRobota, który tworzy jako bazę?

To jest mój wpis do wyzwania iRobot Create. Najtrudniejszą częścią tego całego procesu było dla mnie podjęcie decyzji, co robot zamierza zrobić. Chciałem zademonstrować fajne funkcje Stwórz, jednocześnie dodając odrobinę stylu robo. Wszystkie moje pomysły wydawały się albo należeć do kategorii nudnych, ale użytecznych, albo fajnych i niepraktycznych. W końcu zwyciężył fajny i niepraktyczny i narodził się robot grający w koszykówkę. Po chwili namysłu zdałem sobie sprawę, że to może być praktyczne. Załóżmy, że używasz pomarańczowego papieru i że wszystkie twoje kosze na śmieci mają zielone tablice…

Krok 1: Kup części

Ze względu na ograniczony czas trwania konkursu większość części, które wykorzystałem była „z półki”. Używane części robota „Stock”: Create (x1) - z iRobot www.irobot.comXBC V.3.0 (x1) - z Botball www.botball.orgCreate-Roomba cable (x1) - z Botball www.botball.orgServo (x2) -- od Botball www.botball.orgSharp dalmierz (x1) -- od Botball www.botball.orgRóżne klocki LEGO -- od LEGO www.lego.com6-32 śruby maszynowe (x4) -- od McMaster www.mcmaster.com"Utworzone" części robota Użyte: wytłaczany arkusz PVC o grubości 3/8 cala - ten materiał jest niesamowity, ale nie pamiętam, skąd go wziąłem, ale jest taki sam https://www.lynxmotion pl

Krok 2: Stwórz unikalną część

Stwórz unikalną część
Stwórz unikalną część

Jedyną częścią, którą musiałem wyprodukować, była płytka przykręcona do Create i oferująca odstępy LEGO. Rozstaw otworów w klockach LEGO jest oddalony od siebie o 8 mm, ale zrobiłem podwójną odległość, aby zaoszczędzić czas. Wytłaczane PCV to pestka w pracy. Można go ciąć nożem użytkowym, ale jest sztywny i mocny. Często podnoszę robota za tę płytkę i jeszcze nie miałem problemu.

Krok 1: Wytnij arkusz na 3,5 "x 9,5", możesz go wyciąć nożem. Krok 2: Wywierć otwory na utworzone śruby. Śruby tworzą pudełko o wymiarach 2 i 5/8" na 8 i 5/8". Krok 3: Wywierć otwory w klockach LEGO. Użyj wiertła 3/16" i rozstawiłem otwory 16mm od siebie. Wskazówka: rozłożyłem arkusz w programie CAD, wydrukowałem go w pełnym rozmiarze i przykleiłem do arkusza. Następnie użyłem tego jako przewodnika do cięcia i wiercenie.

Krok 3: Montaż robota

Montaż robota
Montaż robota
Montaż robota
Montaż robota
Montaż robota
Montaż robota

Lubię budować rzeczy tak prosto, jak to tylko możliwe, w ten sposób, gdy zeskakują ze stołu, nie musisz tak bardzo odbudowywać!

1. Przykręć nowo wymodelowaną płytkę do górnej części Create 2. Zbuduj ramię, aby złapać piłkę 3. Zbuduj ramię do trzymania kamery 4. Zbuduj uchwyt dla dalmierza 5. Zamontuj XBC i podłącz wszystkie kable

Krok 4: Programowanie robota

Zdecydowałem się użyć XBC jako mojego kontrolera głównie ze względu na wbudowane śledzenie kolorów. Ponieważ zdecydowałem się na XBC jako mózg operacji, zaprogramowałem robota w Interactive C, lub jak to nazywam IC. IC jest darmowy i można go pobrać ze strony www.botball.org. IC jest bardzo podobny do C++, ale ma kilka wbudowanych bibliotek. Jak się okazuje, David Miller z University of Oklahoma napisał bibliotekę dla Create, którą można pobrać z jego strony pod adresem https://i-borg.engr.ou.edu/~dmiller/create/. Mając te zasoby i instrukcje tworzenia, byłem gotowy do programowania. Ale następnym wielkim wyzwaniem było to, co chciałem zrobić? Chciałem robota, który mógłby podnosić pomarańczowe piłki i strzelać do kosza. Mój cel wydawał się prosty i prawdopodobnie mógł być prosty, ale im bardziej zagłębiałem się w możliwości tworzenia, tym bardziej chciałem, aby to robiło. Moja ostateczna lista wyglądała tak:1. Znajdź pomarańczową piłkę2. Podnieś pomarańczową piłkę3. Znajdź koszyk4. Włóż piłkę do koszaPodczas1. Unikanie obiektów2. Nie spada niczego (jak stół)3. Wykrywanie naładowania baterii i dokowanie do bazy domowej, gdy jest niski, a wszystko to jest całkowicie autonomiczne, co oznacza, że wszystko jest wstępnie zaprogramowane.

Krok 5: Kod

Może być niechlujny, ale działa.#użyj "createlib.ic"#użyj "xbccamlib.ic"#zdefiniuj port kamery 0//port serwa kamery#zdefiniuj port 3//port serwa ramienia#define et (analog(0)) //et port/*Kabel tworzenia również musi być podłączony. Gniazdo zasilania, wtyczka z 3 bolcami do portu 8 i ta oznaczona UX do JP 28 (obok portu USB) z U w kierunku aparatu*/ #define c_down 5//opuszczanie serwa kamery#define a_down 17//opuszczanie serwa ramienia#definiowanie trzymania 50//zatrzymanie piłki#definiowanie złapania 27//położenia serwa ramienia, aby nie zostać złapanym na stole#definiowanie strzału 150//serwo rzut piłką#zdefiniuj tor_c 25//ścieżka serw kamery blisko pozycji#zdefiniuj tor_f 45//ścieżka serw kamery dalszą pozycję#określ środek 120//środek widzenia kamery#zdefiniuj inrange 30//współrzędna toru_y, gdy piłka jest w szponach#określ piłkę 0//kanał pomarańczowej piłki#define ball_x (track_x(piłka, 0))//x współrzędna piłki#define ball_y (track_y(piłka, 0))//y współrzędna piłki#define wolno 100//prędkość wolnego motor#definiuj szybki 175//prędkość szybkiego silnika#definiuj wyczyść 0.2//s zeskoczyć, aby odsunąć się od przeszkód#określ czas 0,5 //1,0 to skręt w prawo o 90 stopni#określ odpoczynek 0,05//czas snu podczas śledzenia plamek#określ prędkośća 175//prędkość unikania skrętu#określ wstecz_s -200//prędkość do odsuń się od zderzanego obiektu#zdefiniuj prosto 32767//jedź w linii prostej#zdefiniuj tył 2//kanał głównego koloru tablicy#zdefiniuj kwadrat 1//kanał koloru akcentu tablicy#zdefiniuj track_d 250//położenie kamery do śledzenia celu# zdefiniuj track_find 70//pozycję kamery dla długiego śledzenia#zdefiniuj wstecz 2.25//czas uśpienia dla 180#zdefiniuj wstecz_f -150//szybkie wstecz#zdefiniuj wstecz_sl -125//wstecz wolne tempo#zdefiniuj center_x 178//true x center of cam#define center_y 146//true y center of camint pida;//avoid processint pidb;//track processint pidc;//score processint have_ball = 0;//wskazuje, której funkcji nie jesteśmy w stanie main(){ long ch; enable_servos();//włącz serwomechanizmy init_camera();//uruchom kamerę cconnect();//połącz, aby utworzyć z pełną kontrolą start_a();//uruchom funkcję unikania start_b();//uruchom funkcję ball_tracking while(1) { if(r_button()||gc_ldrop||gc_rdrop){//jeśli podniesiony lub r przycisk na ramię kill(pida); zabić(pidb); zabić(pidc); wyłącza_serwa(); rozłączyć się(); przerwa;} create_battery_charge(); display_clear(); printf("ładowanie = %l\n", gc_battery_charge); if(gc_battery_charge<1200l||b_button()){ kill(pida); zabić(pidb); zabić(pidc); rzucić(); have_ball=0; utwórz_demo(1); while(b_button()); while(gc_battery_charge<2800l&&!b_button()){ create_battery_charge(); display_clear(); printf("ładowanie = %l\n", gc_battery_charge); sen(1.0);} cconnect(); plecy(); sen(2.0); start_a(); start_b();} }}void Avoid(){ while(1){//repeat forever create_sensor_update();//aktualizuj wszystkie wartości czujników //create_drive (speeda, straight); if(gc_lbump==1){//lewy wypukłość avoid_right();}//skręt w prawo, aby uniknąć w przeciwnym razie if(gc_rbump==1){//prawy wypukłość unikaj_left();}//skręt w lewo, aby uniknąć w przeciwnym razie if(gc_lfcliff==1){//uniknij lewego klifu z przodu_right();} else if(gc_rfcliff==1){//uniknij lewego klifu z przodu_left();} else if(gc_lcliff==1){//uniknij lewego klifu_right();} else if(gc_rcliff==1){//prawy klif Avoid_left();} }}void track_ball(){ kill(pidc); while(!have_ball){//powtarzaj aż uzyskasz piłkę track_update(); far();//ustawia kamerę na gotowość();//ustawia ramię while(et<255){//dopóki nie zostanie złapana maksymalna wartość track_update();//zaktualizuj obraz z kamery if(ball_x<=(center-5)){//jeśli piłka została pozostawiona track_update(); create_drive_direct(wolno, szybko);//obróć w lewo sen(odpoczynek);} else if(ball_x>=(center+5)){//jeśli piłka jest w prawo track_update(); create_drive_direct(szybko, wolno);// skręć w prawo sleep(odpoczynek);} else if(ball_x(center-5)){// jeśli piłka jest wyśrodkowana track_update(); create_drive_straight(szybko);//idź prosto spać(odpoczynek);} } grab();//grab ball beep();//zrób hałas stop();//przestań jeździć have_ball=1;//zanotuj, że Mam piłkę } start_c();//znajdź koszyk sleep(1.0);//sleep, żebym nic nie robił, gdy zostanę zabity}void find_basket(){ kill(pidb);//proces śledzenia kill ball find();//umieść kamerę track_set_minarea(1000);//tablica jest duża, więc szukaj tylko dużych plamek while (have_ball){//while mam piłkę track_update(); while(track_x(backb, 0)=(center_x+20)){//gdy nie jest wyśrodkowany track_update(); if(track_x(backb, 0)>=(center_x+20)){//jeśli pozostawiono tablicę track_update(); create_spin_CCW(100);}//skręć w lewo w przeciwnym razie if(track_x(backb, 0)<=(center_x-20)){//jeśli tablica jest w prawo track_update(); create_spin_CW(300-center_x);}// skręć w prawo zwalniając w miarę zbliżania się do środka } stop(); while(track_size(backb, 0)<=(6000)){//gdy cel ma mniej niż 6000 pikseli w rozmiarze track_update(); if(track_x(backb, 0)<=(center_x-5)){//jeśli celem jest pozostawienie track_update(); create_drive_direct(wolno, szybko);//skręć w lewo sleep(odpoczynek);} else if(track_x(backb, 0)>=(center_x+5)){//jeśli cel jest prawy track_update(); create_drive_direct(szybko, wolno);// skręć w prawo sleep(odpoczynek);} else if(track_x(backb, 0)(center_x-5)){// jeśli cel jest wyśrodkowany track_update(); create_drive_straight(szybko);//idź prosto spać(odpoczynek);} } stop(); //create_drive_straight(szybko);// trochę bliżej //sleep(1.0); //zatrzymać(); sen(1.0); create_spin_CW(speeda);//obracaj w prawo sleep(reverse);//śpij wystarczająco długo, aby zatrzymać się o 180 obrotów(); down();//odłóż kamerę, aby śledzić uśpienie tablicy (1.0); track_set_minarea(200);//użyj mniejszego rozmiaru min, ponieważ jesteśmy na nim wycelowani i będziemy się zbliżać while(track_y(backb, 0)>=(center_y-140)){//gdy cel jest mniejszy niż y koordynuje track_update(); if(track_x(backb, 0)<=(center_x-5)){//jeśli celem jest pozostawienie track_update(); back_right();//skręć w lewo sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//jeśli cel jest właściwy track_update(); back_left();// skręć w prawo sleep(rest);} else if(track_x(backb, 0)(center_x-5)){// jeśli cel jest wyśrodkowany track_update(); back();//idź prosto spać(odpoczynek);} } stop(); brzęczyk(); rzut();//uśpij(1.0); have_ball=0;//przypomnienie rzuciłem piłkę i jej nie mam } start_b();//powrót do śledzenia piłki sleep(1.0);//nie rób nic dopóki ten proces nie umrze}unieważnij cconnect(){ create_connect (); create_full();//dla pełnej kontroli czujników półki create_power_led(0, 255);}//zielony power ledvoid Disconnect(){ stop();//stop move create_disconnect();}void back_away(){ back(); spać(czysty); stop();}unieważnij rotate_l(){ create_spin_CCW(speeda); czas spania); stop();}unieważnij rotate_r(){ create_spin_CW(speeda); czas spania); stop();}void stop(){ create_drive(0, prosto);}void back(){ create_drive(back_s, prosto);}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(ramię, złapany);}void throw(){ int a; for(a=50; a>=30; a-=1){//przygotuj się set_servo_position(ramię, a);} set_servo_position(ramię, strzał);}unieważnij grab(){ int a; for(a=0; a<=przytrzymaj; a+=1){//płynnie podnieś ramię set_servo_position(ramię, a);}}unieważnij w dół(){ set_servo_position(krzywka, ścieżka_d);}unieważnij znajdź(){ set_servo_position (cam, track_find);}unieważnij start_a(){ pida = start_process(avoid());}unieważnij start_b(){ pidb = start_process(track_ball());}unieważnij start_c(){ pidc = start_process(find_basket());}void kill(int pid){ CREATE_BUSY;//czekaj na zakończenie bieżącego procesu tworzenia i przyjmij priorytet kill_process(pid); CREATE_FREE;//skończyłem stop();}void Avoid_left(){ kill(pidb);//zatrzymaj wszystko inne kill(pidc); ledge();//podnieś pazur, aby nie został złapany na stole back_away();//cofnij rotate_l();//obróć się od przeszkody gotowe();//odłóż pazur if(have_ball) {//jeśli mam piłkę start_c();}//rozpocznij śledzenie goli else if(!have_ball){//jeśli nie mam piłki start_b();}//rozpocznij śledzenie piłki}void Avoid_right() { zabij(pidb); zabić(pidc); półka(); wycofać się(); obróć_r(); gotowy(); if(have_ball){ start_c();} else if(!have_ball){ start_b();}}unieważnij back_left(){ create_drive_direct(back_f, back_sl);}unieważnij back_right(){ create_drive_direct(back_sl, back_f);}

Krok 6: Czy było warto?

Koszty były następujące: Utwórz + bateria + dokument = 260 USD Zestaw startowy XBC (xbc, krzywka, klocki LEGO, czujniki) = 579 USD PVC + farba + śruby = około 20 USD Całkowity koszt = 859 USD Miałem już zestaw startowy XBC od Botball, więc koszt dla mnie był koszt tworzenia. Myślę, że było warto, a najlepsze jest to, że wszystkie części, których użyłem, są wielokrotnego użytku, jeśli mógłbym się zmusić do rozstania tego bota. Ten film pokazuje procedurę unikania, na blacie stołu. Ten film pokazuje robota, który zdobywa 5 pomarańczowych piłek do bramki. Pomogłem tylko przyspieszyć proces, w końcu znalazłby kulkę 5 samodzielnie.

Krok 7: Wniosek

Ostatecznym rezultatem jest robot, który może samodzielnie podnosić i zdobywać pomarańczowe kulki w bramce.

Uwielbiałem pracować nad tym projektem. Im dłużej pracowałem nad tym robotem, tym bardziej się do niego przywiązywałem. Teraz mówię do niego jak do zwierzaka. Mam nadzieję, że pomogło ci to w kolejnym projekcie. Jest wielu ludzi, którym muszę podziękować, ale jest ich zbyt wielu. Jak Bernard z Chartres tak elegancko stwierdził: „jesteśmy jak karły na ramionach olbrzymów, abyśmy mogli widzieć więcej niż oni i rzeczy z większej odległości, nie dzięki żadnej ostrości widzenia z naszej strony lub jakiejkolwiek fizycznej wyróżnienie, ale dlatego, że jesteśmy uniesieni wysoko i wychowani przez ich gigantyczny rozmiar.

Zalecana: