Inhaltsverzeichnis:

Wie man einen autonomen Basketball-Spielroboter mit einem IRobot als Basis erstellt – wikiHow
Wie man einen autonomen Basketball-Spielroboter mit einem IRobot als Basis erstellt – wikiHow

Video: Wie man einen autonomen Basketball-Spielroboter mit einem IRobot als Basis erstellt – wikiHow

Video: Wie man einen autonomen Basketball-Spielroboter mit einem IRobot als Basis erstellt – wikiHow
Video: SPL: B-Human – Nao-Team HTWK (Final) [RoboCup German Open 2017] 2024, Juli
Anonim
Wie man einen autonomen Basketball-Spielroboter mit einem IRobot als Basis erstellt
Wie man einen autonomen Basketball-Spielroboter mit einem IRobot als Basis erstellt

Dies ist mein Beitrag für die iRobot Create-Challenge. Der schwierigste Teil dieses ganzen Prozesses war für mich zu entscheiden, was der Roboter tun würde. Ich wollte die coolen Funktionen des Create demonstrieren und gleichzeitig etwas Robo-Flair hinzufügen. Alle meine Ideen schienen entweder in die Kategorie langweilig, aber nützlich oder cool und unpraktisch zu fallen. Am Ende setzte sich cool und unpraktisch durch und der Basketball spielende Roboter war geboren. Nach einigem Nachdenken wurde mir klar, dass das praktisch sein könnte. Angenommen, Sie verwenden orangefarbenes Papier und alle Ihre Mülleimer haben grüne Rückwände…

Schritt 1: Teile erwerben

Wegen des Zeitlimits des Wettbewerbs waren die meisten Teile, die ich verwendet habe, "von der Stange". Verwendete "Stock" Roboterteile:Create (x1) -- von iRobot www.irobot.comXBC V.3.0 (x1) -- von Botball www.botball.orgCreate-Roomba Kabel (x1) -- von Botball www.botball.orgServo (x2) -- von Botball www.botball.orgScharfer Entfernungsmesser (x1) -- von Botball www.botball.orgVerschiedene LEGO Steine -- von LEGO www.lego.com6-32 Maschinenschrauben (x4) -- von McMaster www.mcmaster.com"Erstellte" Roboterteile verwendet: 3/8" dicke extrudierte PVC-Platte - dieses Zeug ist großartig, aber ich kann mich nicht erinnern, woher ich es habe, aber es ist genau wie dieses Zeug https://www.lynxmotion.com/Category.aspx?CategoryID=62Andere Teile:Orange "POOF" Ball -- von WalMartBasketball Tor aussehender Mülleimer -- von LowesGreen "Rückwand" -- extra PVC hellgrün lackiert

Schritt 2: Erstellen Sie das einzigartige Teil

Erstellen Sie das einzigartige Teil
Erstellen Sie das einzigartige Teil

Das einzige Teil, das ich herstellen musste, war eine Platte, die mit dem Create verschraubt wurde und LEGO-Abstände bot. Der Abstand der LEGO-Steinlöcher beträgt 8 mm, aber ich habe einen doppelten Abstand gemacht, um Zeit zu sparen. Das extrudierte PVC ist ein Kinderspiel. Es kann mit einem Cuttermesser geschnitten werden, ist aber steif und stark. Ich nehme den Roboter oft an dieser Platte auf und ich hatte noch kein Problem.

Schritt 1: Schneiden Sie das Blatt auf 3,5 "x 9,5" zu. Sie können dies mit einem Cuttermesser schneiden. Schritt 2: Bohren Sie die Löcher für die Create-Schrauben. Die Create-Schrauben bilden eine Box, die 2 und 5/8 "x 8 und 5/8" groß ist. Schritt 3: Bohren Sie die LEGO-Stein-Abstandslöcher. Verwenden Sie einen 3/16" Bohrer und ich habe die Löcher 16 mm voneinander entfernt. Tipp: Ich habe das Blatt in einem CAD-Programm ausgelegt, in voller Größe ausgedruckt und auf das Blatt geklebt. Dann habe ich dies als Anleitung zum Schneiden verwendet und Bohren.

Schritt 3: Zusammenbau des Roboters

Zusammenbau des Roboters
Zusammenbau des Roboters
Zusammenbau des Roboters
Zusammenbau des Roboters
Zusammenbau des Roboters
Zusammenbau des Roboters

Es macht mir Spaß, Dinge so einfach wie möglich zu bauen, damit man, wenn sie vom Tisch springen, nicht so viel umbauen muss!

1. Schrauben Sie die neu gestaltete Platte auf die Oberseite des Create 2. Bauen Sie einen Arm, um den Ball zu greifen 3. Bauen Sie einen Arm, um die Kamera zu halten 4. Bauen Sie eine Halterung für den Entfernungsmesser 5. Montieren Sie den XBC und schließen Sie alle Kabel an

Schritt 4: Programmierung des Roboters

Ich habe mich hauptsächlich wegen der eingebauten Farbverfolgung für den XBC als Controller entschieden. Da ich mich für den XBC als Gehirn der Operation entschieden habe, habe ich meinen Roboter in Interactive C, oder wie ich es nenne, IC programmiert. Die Nutzung von IC ist kostenlos und kann unter www.botball.org heruntergeladen werden. IC ist C++ sehr ähnlich, verfügt jedoch über mehrere eingebaute Bibliotheken. Wie sich herausstellte, hat David Miller von der University of Oklahoma eine Bibliothek für das Create geschrieben, die von seiner Seite unter https://i-borg.engr.ou.edu/~dmiller/create/ heruntergeladen werden kann. Mit diesen Ressourcen und den Handbüchern zum Erstellen war ich bereit zu programmieren. Aber die nächste große Herausforderung war, was ich wollte? Ich wollte einen Roboter, der orangefarbene Kugeln aufsammeln und in einen Korb werfen kann. Mein Ziel klang einfach und hätte wahrscheinlich auch einfach sein können, aber je mehr ich mich mit dem beschäftigt habe, was das Create tun kann, desto mehr wollte ich es tun. Meine letzte Liste sah so aus: 1. Finden Sie orange ball2. Heben Sie orange ball3 auf. Suchen Sie den Korb4. Ball in den Korb legenWährend1. Vermeidung von Objekten2. Nicht herunterfallen (wie ein Tisch)3. Den Ladezustand des Akkus erkennen und bei LowOh an die Home Base andocken, und das alles völlig autonom, d.h. alles vorprogrammiert.

Schritt 5: Code

Es mag chaotisch sein, aber es funktioniert. //et port/*Das Create-Kabel muss auch eingesteckt werden. Die Strombuchse, der 3-polige Stecker in Port 8 und der mit UX beschriftete in JP 28 (neben dem USB-Port) mit dem U in Richtung Kamera*/ #define c_down 5//Kameraservo unten#define a_down 17//Armservo unten#define Hold 50//Servoball halten#define gefangen 27//Armservoposition, um zu verhindern, dass sie auf dem Tisch hängen bleibt#define Shoot 150//Servo Ball werfen#define track_c 25//Position der Kamera-Servospur schließen#define track_f 45//Fernposition der Kamera-Servospur#Define Center 120//Center of Camera Vision#Define Inrange 30//Track_y-Koordinate, wenn sich der Ball in der Klaue befindet#Define Ball 1 motor#define fast 175//Geschwindigkeit des schnellen Motors#define clear 0.2//s leep, um sich von Hindernissen zu entfernen#Define time 0.5 //1.0 ist eine 90-Grad-Rechtskurve#Define rest 0.05//Schlafzeit während der Verfolgung von Blobs#define speeda 175//speed of vermeide turn#define back_s -200//speed to Zurück weg von gestoßenem Objekt#Define Straight 32767//Fahre in einer geraden Linie#Define Backb 2//Kanal der Hauptfarbe der Backboard#Define Quadrat 1//Kanal der Backboard Akzentfarbe#Define track_d 250//Kameraposition für die Zielverfolgung# definiere track_find 70//Kameraposition für langes Tracking#define reverse 2.25//Sleep time for a 180#define back_f -150//back Fast speed#define back_sl -125//back slow speed#define 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;//sagt, welche Funktion wir haben invoid main(){ long ch; enable_servos(); // Servos aktivieren init_camera (); // Kamera starten cconnect (); // Verbindung herstellen, um mit voller Kontrolle zu erstellen start_a (); // Funktion vermeiden starten start_b (); // ball_tracking-Funktion starten while (1) { if(r_button()||gc_ldrop||gc_rdrop){//wenn abgeholt oder r Schultertaste kill(pida); töten (pidb); töten (pidc); disable_servos(); trennen(); Pause;} create_battery_charge(); display_clear(); printf("charge = %l\n", gc_battery_charge); if(gc_battery_charge<1200l||b_button()){ kill(pida); töten (pidb); töten (pidc); Wurf(); have_ball=0; create_demo(1); while(b_button()); while(gc_battery_charge<2800l&&!b_button()){ create_battery_charge(); display_clear(); printf("charge = %l\n", gc_battery_charge); sleep(1.0);} cconnect(); zurück(); Schlaf (2,0); starte ein(); start_b();} }}void Avoid(){ while(1){//repeat forever create_sensor_update();//alle Sensorwerte aktualisieren //create_drive (speeda, straight); if(gc_lbump==1){//linker Stoß Avoid_right();}//dreht sich nach rechts um else if(gc_rbump==1){//rechter Stoß Avoid_left();}//dreht nach links um sonst zu vermeiden if(gc_lfcliff==1){//linke vordere Klippe Avoid_right();} else if(gc_rfcliff==1){//rechte vordere Klippe Avoid_left();} else if(gc_lcliff==1){//linke Klippe Avoid_right();} else if(gc_rcliff==1){//right cliff Avoid_left();}}}}void track_ball(){ kill(pidc); while(!have_ball){//wiederholen, bis Ball track_update(); far();//setzt die Kamera bereit();//setzt den Arm while(et<255){//bis der maximale Wert passiert wenn der Ball gefangen wird track_update();//Kamerabild aktualisieren if(ball_x<=(center-5)) {//wenn der Ball links ist track_update(); create_drive_direct (langsam, schnell); // links schlafen (Ruhe);} else if (ball_x>=(center+5)){//wenn der Ball rechts ist track_update(); create_drive_direct (schnell, langsam); // rechts abbiegen sleep (rest);} else if (ball_x (center-5)) {// wenn der Ball zentriert ist track_update (); create_drive_straight (fast); // geradeaus schlafen (rest);} } grab(); // grab ball beep (); // Lärm stoppen (); // aufhören zu fahren have_ball = 1; // notiere, dass Ich habe Ball } start_c(); // finde den Korb sleep (1.0); // Schlaf, damit ich nichts tue, wenn ich getötet werde}void find_basket () { kill (pidb); // kill ball tracking process find(); // Kamera aufsetzen track_set_minarea(1000); // das Backboard ist groß, also suche nur nach großen Blobs while (have_ball){//währe ich den Ball track_update(); while(track_x(backb, 0)=(center_x+20)){//während nicht zentriert track_update(); if(track_x(backb, 0)>=(center_x+20)){//wenn das Backboard links ist track_update(); create_spin_CCW(100);}//links abbiegen else if(track_x(backb, 0)<=(center_x-20)){//wenn das Backboard rechts ist track_update(); create_spin_CW(300-center_x);} // rechts abbiegen und langsamer werden, wenn sich das Zentrum nähert } stop(); while(track_size(backb, 0)<=(6000)){//während das Ziel weniger als 6000 Pixel groß ist track_update(); if(track_x(backb, 0)<=(center_x-5)){//wenn das Ziel verlassen wird track_update(); create_drive_direct (langsam, schnell); // links schlafen (Ruhe);} else if (track_x (backb, 0)> = (center_x + 5)) {//wenn das Ziel rechts ist track_update (); create_drive_direct (schnell, langsam); // rechts abbiegen sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// wenn das Ziel zentriert ist track_update (); create_drive_straight (schnell); // geradeaus schlafen (Ruhe);} } stop (); //create_drive_straight(fast); // ein bisschen näher kommen //sleep(1.0); //halt(); Schlaf (1,0); create_spin_CW (speeda); // Rechtsdrehung (Reverse); // Schlaf lang genug für einen Stopp um 180 Umdrehungen (); down(); // Kamera nach unten legen, um den Backboard-Schlaf zu verfolgen (1.0); track_set_minarea(200); // Verwenden Sie eine kleinere Mindestgröße, da wir darauf zeigen und näher kommen werden while(track_y(backb, 0)>=(center_y-140)){//während das Ziel kleiner ist als die y-Koordinate track_update(); if(track_x(backb, 0)<=(center_x-5)){//wenn das Ziel verlassen wird track_update(); back_right (); // links schlafen (Ruhe);} else if (track_x (backb, 0)> = (center_x + 5)) {//wenn das Ziel rechts ist track_update (); back_left (); // rechts abbiegen sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// wenn das Ziel zentriert ist track_update (); zurück (); // geradeaus schlafen (Ruhe);} } stop (); Signalton(); werfen (); // Schlaf schießen (1.0); have_ball=0;//erinnerung ich habe den Ball geworfen und habe ihn nicht } start_b();//zurück zum Balltracking sleep(1.0);//mache nichts, bis dieser Prozess stirbt}void cconnect(){ create_connect (); create_full(); // für die volle Kontrolle der Ledge-Sensoren create_power_led(0, 255);}//green power ledvoid Disconnect(){ stop();//stop move create_disconnect();}void back_away(){ back(); schlafen (klar); stop();}void rotation_l(){ create_spin_CCW (speeda); Schlafenszeit); stop();}void rotation_r(){ create_spin_CW (speeda); Schlafenszeit); stop();}void stop(){ create_drive(0, gerade);}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, gefangen);}void throw(){ int a; for(a=50; a>=30; a-=1){//mach dich bereit set_servo_position(arm, a);} set_servo_position(arm, shoot);}void grab(){ int a; for(a=0; a<=hold; a+=1){//den Arm sanft anheben 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; //warten, bis der aktuelle Erstellungsprozess beendet ist, und Priorität nehmen kill_process(pid); CREATE_FREE; // ich bin fertig stop ();}void Avoid_left () { kill (pidb); // alles andere stoppen kill (pidc); ledge(); // Klaue aufheben, damit sie sich nicht auf dem Tisch verfängt back_away(); // zurück weg rotate_l(); // vom Hindernis wegdrehen ready (); // Klaue wieder nach unten legen if (have_ball) {//wenn ich den Ball habe start_c();}//starte die Torverfolgung else if(!have_ball){//wenn ich nicht den Ball habe start_b();}//starte die Ballverfolgung}void Avoid_right() { töten (pidb); töten (pidc); Leiste(); zurückweichen(); rotieren_r(); bereit(); 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);}

Schritt 6: War es das wert?

Die Kosten waren: Erstellen + Batterie + Dokumentation = $260XBC-Starter-Kit (xbc, Cam, LEGO-Steine, Sensoren) = $579PVC + Farbe + Schrauben = ca. $20Gesamtkosten = $859Ich hatte bereits das XBC-Starter-Kit von Botball, also die Kosten Für mich waren die Kosten für das Erstellen. Ich denke, dass es sich gelohnt hat, und das Beste daran ist, dass alle Teile, die ich verwendet habe, wiederverwendbar sind, wenn ich mich dazu bringen könnte, diesen Bot zu trennen. Dieses Video zeigt die Unterroutine „Vermeiden“, auf einer Tischplatte. Dieses Video zeigt, wie der Roboter 5 orangefarbene Bälle in ein Tor schießt. Ich habe nur geholfen, den Prozess zu beschleunigen, er hätte Ball 5 irgendwann von selbst gefunden.

Schritt 7: Fazit

Das Endergebnis ist ein Roboter, der ganz allein orangefarbene Bälle aufnehmen und in ein Tor schießen kann.

Ich habe es geliebt, an diesem Projekt zu arbeiten. Je mehr ich an diesem Roboter arbeitete, desto mehr wurde ich ihm verbunden. Ich rede jetzt mit ihm, als wäre es ein Haustier. Ich hoffe, dass Ihnen das bei Ihrem nächsten Projekt geholfen hat. Es gibt viele Menschen, denen ich danken muss, aber es sind zu viele. Wie Bernhard von Chartres so elegant gesagt hat: "Wir sind wie Zwerge auf den Schultern von Riesen, damit wir mehr sehen können als sie und Dinge in größerer Entfernung, nicht aufgrund unserer Sichtschärfe oder einer physischen" Unterscheidung, sondern weil wir von ihrer riesigen Größe hoch getragen und emporgehoben werden."

Empfohlen: