תוכן עניינים:

כיצד להכין רובוט כדורסל אוטונומי באמצעות IRobot ליצור כבסיס: 7 שלבים (עם תמונות)
כיצד להכין רובוט כדורסל אוטונומי באמצעות IRobot ליצור כבסיס: 7 שלבים (עם תמונות)

וִידֵאוֹ: כיצד להכין רובוט כדורסל אוטונומי באמצעות IRobot ליצור כבסיס: 7 שלבים (עם תמונות)

וִידֵאוֹ: כיצד להכין רובוט כדורסל אוטונומי באמצעות IRobot ליצור כבסיס: 7 שלבים (עם תמונות)
וִידֵאוֹ: האנשים הכי שמנים בעולם | טופטן 2024, יולי
Anonim
כיצד להכין רובוט כדורסל אוטונומי באמצעות IRobot ליצור כבסיס
כיצד להכין רובוט כדורסל אוטונומי באמצעות IRobot ליצור כבסיס

זהו הערך שלי לאתגר iRobot Create. החלק הכי קשה בכל התהליך הזה בשבילי היה להחליט מה הרובוט עומד לעשות. רציתי להדגים את התכונות המגניבות של ה- Create, תוך הוספה של קצת רובו. נראה היה שכל הרעיונות שלי נכללים בקטגוריה של משעמם אך שימושי, או מגניב ולא מעשי. בסופו של דבר מגניב ולא מעשי ניצח והרובוט משחק כדורסל נולד. לאחר מחשבה הבנתי שזה יכול להיות מעשי. נניח שאתה משתמש בנייר כתום, ולכל פחי האשפה שלך יש לוחות גב ירוקים …

שלב 1: רכישת חלקים

בגלל מגבלת הזמן של התחרות, רוב החלקים בהם השתמשתי היו "מהמדף". חלקי רובוט "מלאי" בשימוש: צור (x1)-מ- iRobot www.irobot.comXBC V.3.0 (x1)-מאת Botball www.botball.orgCreate-Roomba כבל (x1)-מאת Botball www.botball.orgServo (x2)-מאת בוטבול www.botball.org מד טווח חד (x1)-מאת בוטבול www.botball.org לבני LEGO מגוונות-מ- LEGO www.lego.com 6-32 ברגי מכונה (x4)-מ- McMaster www.mcmaster.com "נוצר" חלקי רובוט בשימוש: יריעת PVC extruded בעובי 3/8 " - החומר הזה מדהים, אבל אני לא זוכר מאיפה קיבלתי אותו, אבל הוא ממש כמו הדברים האלה https://www.lynxmotion.com/Category.aspx? CategoryID = 62 חלקים אחרים: כדור כתום "POOF" - מבית WalMartBasketball למראה פח אשפה - מ- "לוח גב" של LowesGreen - תוספת PVC צבועה בירוק בהיר

שלב 2: צור את החלק הייחודי

צור את החלק הייחודי
צור את החלק הייחודי

החלק היחיד שהייתי צריך לייצר היה צלחת שהתברגה ליצירה והציעה מרווח לגו. המרווח בין חורי הלבנים של לגו הוא 8 מ מ זה מזה, אבל עשיתי מרווח כפול כדי לחסוך זמן. ה- PVC שחול הוא משב רוח לעבודה. ניתן לחתוך אותו בעזרת סכין, אך הוא נוקשה וחזק. לעתים קרובות אני מרים את הרובוט ליד הצלחת הזו ועדיין לא הייתה לי בעיה.

שלב 1: חותכים את הסדין לגודל 3.5 "x 9.5", אתה יכול לחתוך אותו בעזרת סכין כלי. שלב 2: מקדחים את החורים לברגי היצירה. ברגי היצירה יוצרים קופסה בגודל 2 ו 5/8 "על 8 ו- 5/8". שלב 3: מקדחים את החורים המרווחים מלבנים. השתמש במקדח בגודל 3/16 אינץ 'והרווחתי את החורים במרחק של 16 מ"מ זה מזה. טיפ: הנחתי את הגיליון בתוכנית CAD, הדפסתי אותו בגודל מלא והדבקתי אותו ליריעה. לאחר מכן השתמשתי בזה כמדריך לחיתוך הִתעַמְלוּת.

שלב 3: הרכבת הרובוט

הרכבת הרובוט
הרכבת הרובוט
הרכבת הרובוט
הרכבת הרובוט
הרכבת הרובוט
הרכבת הרובוט

אני נהנה לבנות דברים בצורה פשוטה ככל האפשר, כך שכאשר הם קופצים מהשולחן לא צריך לבנות מחדש כל כך הרבה!

1. הברג את הלוח החדש שעוצב לחלק העליון של ה- Create 2. בנה זרוע לתפוס את הכדור 3. בנה זרוע להחזיק את המצלמה 4. בנה הר עבור מד הטווח 5. הר את ה- XBC וחבר את כל הכבלים.

שלב 4: תכנות הרובוט

החלטתי להשתמש ב- XBC כבקר שלי בעיקר בגלל מעקב הצבעים שלו. מכיוון שהחלטתי עם ה- XBC כמוחות הפעולה תיכננתי את הרובוט שלי ב- Interactive C, או כפי שאני קורא לזה IC. IC הוא ללא תשלום וניתן להוריד אותו באתר www.botball.org. IC דומה מאוד ל- C ++, אך יש בו מספר ספריות מובנות. כפי שמתברר, דיוויד מילר מאוניברסיטת אוקלהומה כתב ספרייה ל- Create שאפשר להוריד מהעמוד שלו בכתובת https://i-borg.engr.ou.edu/~dmiller/create/. עם משאבים אלה ומדריכי היצירה הייתי מוכן לתכנת. אבל האתגר הגדול הבא היה מה רציתי שזה יעשה? רציתי רובוט שיכול ללכת לאסוף כדורים כתומים ולהבקיע אותם בסל. המטרה שלי נשמעה פשוטה, וכנראה שהייתה יכולה להיות פשוטה, אבל ככל שנכנסתי למה שהקריא יכול לעשות, כך רציתי שזה יעשה. הרשימה האחרונה שלי נראתה כך: 1. מצא כדור כתום 2. להרים כדור כתום 3. אתר סל 4. שים את הכדור בסל תוך 1. הימנעות מאובייקטים 2. לא ליפול מכלום (כמו שולחן) 3. זיהוי הטעינה של הסוללה ועגינה לבסיס הבית כשהוא נמוך או כל זה אוטונומי לחלוטין, כלומר הכול מתוכנת מראש.

שלב 5: קוד

זה אולי מבולגן, אבל זה עובד.#השתמש ב "createlib.ic" #use "xbccamlib.ic"#הגדר מצלמה 0 // יציאת סרוו מצלמה#הגדר זרוע 3 // יציאת סרוו זרוע#הגדרת et (אנלוגי (0)) // et port/*יש לחבר גם את כבל היצירה. שקע החשמל, התקע 3 המחודד ליציאה 8 וסימון ה- UX ל- JP 28 (ליד יציאת ה- USB) כאשר ה- U לכיוון המצלמה*/ #הגדר c_down 5 // סרוו מצלמה למטה#הגדר a_down 17 // סרוו זרוע למטה#הגדר אחיזה 50 // סרוו אחיזת כדור#הגדר נתפס 27 // מיקום סרוו זרוע כדי לא להיתפס על השולחן#הגדר יורה 150 // סרוו לזרוק כדור#להגדיר מסלול_c 25 // מסלול סרוו מסלול מיקום סגור#הגדר מסלול_פ 45 // מצלמת סרוו מסלול רחוק מיקום#הגדר מרכז 120 // מרכז ראיית המצלמה#הגדר חוסר טווח 30 // מסלול_תאם כאשר הכדור בטופר#הגדר כדור 0 // ערוץ הכדור הכתום#הגדר את הכדור_קס (מסלול_אקס (כדור, 0)) // x קואורדינטת הכדור מנוע#הגדר מהיר 175 // מהירות המנוע המהיר#הגדר 0.2 // שניות ברורות לצלול להתרחק ממכשולים#להגדיר זמן 0.5 //1.0 הוא סיבוב של 90 מעלות ימינה#הגדר מנוחה 0.05 // זמן לישון בזמן מעקב אחר כתמים#הגדר מהירות 175 // מהירות הימנעות מפנה#הגדר back_s -200 // מהירות עד התרחקו מאובייקט שנפגע#הגדירו ישר 32767 // סעו בקו ישר#הגדירו גב 2 // ערוץ של הצבע הראשי של לוח האחורי#הגדירו ריבוע 1 // ערוץ של צבע המבטא לוחית#הגדירו track_d 250 // מיקום המצלמה למעקב אחר יעד# הגדר track_find 70 // מיקום מצלמה למעקב ארוך#הגדר 2.25 הפוך // זמן שינה עבור 180#הגדר back_f -150 // מהירות גב אחורה#הגדר back_sl -125 // מהירות אחורה איטית#הגדר מרכז_x 178 // אמת x מרכז של cam#הגדר מרכז_י 146 // מרכז אמת אמיתי של קמינט פידה; // הימנע מתהליך pidb; // עקוב אחר processint pidc; // score processint have_ball = 0; // מספר לאיזו פונקציה אנו מרגישים main () {long ch; enable_servos (); // אפשר servos init_camera (); // התחל מצלמה cconnect (); // התחבר ליצירה עם שליטה מלאה start_a (); // התחל להימנע מפונקציה start_b (); // התחל את הפונקציה ball_tracking בעוד (1) {if (r_button () || gc_ldrop || gc_rdrop) {// אם הרים אותו או r כפתור כתף להרוג (pida); להרוג (pidb); להרוג (pidc); disable_servos (); לְנַתֵק(); break;} create_battery_charge (); display_clear (); printf ("תשלום = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); להרוג (pidb); להרוג (pidc); לזרוק(); have_ball = 0; create_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("תשלום = %l / n", gc_battery_charge); שינה (1.0);} cconnect (); חזור(); שינה (2.0); התחל(); start_b ();}}} void avoid () {while (1) {// repeat לנצח create_sensor_update (); // עדכן את כל ערכי החיישנים // create_drive (speeda, straight); אם (gc_lbump == 1) {// בליטה שמאלית avoid_right ();} // פונה ימינה כדי להימנע מכך אם (gc_rbump == 1) {// בליטה ימנית avoid_left ();} // פונה שמאלה כדי להימנע מכך אם (gc_lfcliff == 1) {// צוק הקדמי השמאלי avoid_right ();} אחרת אם (gc_rfcliff == 1) {// צוק הקדמי הימני avoid_left ();} אחרת אם (gc_lcliff == 1) {// הצוק השמאלי הימנע_ימין ();} אחרת אם (gc_rcliff == 1) {// ימני מצוק הימנע_שמאל ();}}} void track_ball () {kill (pidc); בעוד (! have_ball) {// חזור עד לקבל track_update הכדור (); far (); // מכין את המצלמה מוכנה (); // מכוון את הזרוע בעוד (et <255) {// עד שהערך המרבי יקרה כאשר הכדור נתפס track_update (); // עדכן את תמונת המצלמה אם (ball_x <= (מרכז -5)) {// אם הכדור נותר track_update (); create_drive_direct (איטי, מהיר); // פנה שינה שמאלה (מנוחה);} אחרת אם (ball_x> = (מרכז+5)) {// אם הכדור נכון track_update (); create_drive_direct (מהיר, איטי); // פנה ימינה לישון (מנוחה);} אחרת אם (ball_x (מרכז -5)) {// אם הכדור מרוכז track_update (); create_drive_straight (מהיר); // ללכת לישון ישר (לנוח);}} לתפוס (); // לתפוס ביפ כדור (); // לעצור רעש (); // להפסיק לנהוג have_ball = 1; // לרשום ש יש לי כדור} start_c (); // מצא את סל הסל (1.0); // שינה כדי שאני לא אעשה כלום כשאני נהרג} void find_basket () {kill (pidb); // תהליך מעקב כדור הורג find (); // לשים את המצלמה track_set_minarea (1000); // לוח האחורי גדול, אז חפש רק כתמים גדולים בעוד (have_ball) {// בזמן שיש לי את הכדור track_update (); while (track_x (backb, 0) = (center_x+20)) {// while not centered track_update (); if (track_x (backb, 0)> = (center_x+20)) {// אם הלוח האחורי נשאר track_update (); create_spin_CCW (100);} // פנה שמאלה אחרת אם (track_x (backb, 0) <= (center_x-20)) {// אם לוח הגב הוא נכון track_update (); create_spin_CW (300-center_x);} // פנה באיטיות ימינה כשהמרכז מתקרב} עצור (); while (track_size (backb, 0) <= (6000)) {// בעוד היעד הוא פחות מ- 6000 פיקסלים בגודל track_update (); if (track_x (backb, 0) <= (center_x-5)) {// אם היעד נשאר track_update (); create_drive_direct (איטי, מהיר); // פנה שינה שמאלה (מנוחה);} אחרת אם (track_x (backb, 0)> = (center_x+5)) {// אם היעד הוא track_update הנכון (); create_drive_direct (מהיר, איטי); // פנה ימינה לישון (מנוחה);} אחרת אם (track_x (backb, 0) (center_x-5)) {// אם היעד מרוכז track_update (); create_drive_straight (מהיר); // ללכת לישון ישר (לנוח);}} לעצור (); // create_drive_straight (מהיר); // להתקרב קצת // לישון (1.0); //תפסיק(); שינה (1.0); create_spin_CW (speeda); // סיבוב שינה ימינה (הפוך); // שינה מספיק ארוכה לעצור של 180 סיבובים (); למטה (); // לשים את המצלמה כדי לעקוב אחר השינה בלוח האחורי (1.0); track_set_minarea (200); // השתמש בגודל מינימלי קטן יותר, מכיוון שאנו מכוונים אליו ומתקרבים בעוד (track_y (backb, 0)> = (center_y-140)) {// בעוד שהמטרה פחותה מה- y לתאם track_update (); if (track_x (backb, 0) <= (center_x-5)) {// אם היעד נשאר track_update (); back_right (); // פנה שינה שמאלה (rest);} אחרת אם (track_x (backb, 0)> = (center_x+5)) {// אם היעד הוא track_update נכון (); אחורי_שמאל (); // פנה שינה ימינה (מנוחה);} אחרת אם (track_x (גב, 0) (center_x-5)) {// אם היעד מרוכז track_update (); גב (); // ללכת לישון ישר (לנוח);}} לעצור (); ביפ (); לזרוק (); // לירות שינה (1.0); have_ball = 0; // תזכורת זרקתי כדור ואין לי אותו} start_b (); // חזרה למצב שינה (1.0); // אל תעשה כלום עד שהתהליך הזה ימות} void cconnect () {create_connect (); create_full (); // לבקרה מלאה של חיישני מדפים create_power_led (0, 255);} // ניתוק של ledvoid ירוק () {stop (); // הפסקת הזזה create_disconnect ();} void back_away () {back (); שינה (צלולה); stop ();} void rotate_l () {create_spin_CCW (speeda); זמן שינה); stop ();} void rotate_r () {create_spin_CW (speeda); זמן שינה); stop ();} void stop () {create_drive (0, straight);} void back () {create_drive (back_s, straight);} void ready () {set_servo_position (arm, a_down);} check void () {set_servo_position (cam, track_c);} void far () {set_servo_position (cam, track_f);} מדף void () {set_servo_position (זרוע, נתפס);} זריקת חלל () {int a; עבור (a = 50; a> = 30; a- = 1) {// להתכונן set_servo_position (זרוע, א);} set_servo_position (זרוע, לירות);} לתפוס חלל () {int a; עבור (a = 0; a <= החזק; a+= 1) {// הרם את הזרוע בצורה חלקה set_servo_position (זרוע, א);}} בטל כלפי מטה () {set_servo_position (cam, track_d);} מצא חלל () {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; // המתן עד לסיום תהליך היצירה הנוכחי, וקח עדיפות kill_process (pid); CREATE_FREE; // סיימתי stop ();} void avoid_left () {kill (pidb); // להפסיק את כל השאר kill (pidc); מדף (); // להרים טופר כדי שלא להיתפס על השולחן בחזרה (); // לסובב לסובב את (); // לסובב הרחק מהמכשול מוכן (); // לשים את הטופר בחזרה אם (יש_כדור) {// אם יש לי את הכדור start_c ();} // // התחל מעקב אחר שערים אחרת אם (! have_ball) {// אם אין לי את הכדור start_b ();} // התחל מעקב אחר הכדור} void avoid_right () {להרוג (pidb); להרוג (pidc); מַדָף(); תתרחק(); rotate_r (); מוּכָן(); 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);}

שלב 6: האם זה היה שווה את זה?

העלויות היו: יצירת + סוללה + דוק = ערכת התחלה XBC $ 260 (xbc, מצלמה, לבני לגו, חיישנים) = $ 579 PVC + צבע + ברגים = כ- $ 20 סך העלות = $ 859 כבר הייתה לי ערכת ההתחלה של XBC מבית בוטבול, אז העלות מבחינתי העלות של ה- Create. I חושבת שזה היה שווה את זה, והחלק הטוב ביותר הוא שכל החלקים בהם השתמשתי ניתנים לשימוש חוזר, אם הייתי יכול להביא את עצמי לחלק את הבוט הזה. סרטון זה מציג את שגרת המשנה להימנע., על משטח שולחן. בסרטון זה נראה הרובוט הבקיע 5 כדורים כתומים בשער. עזרתי רק להאיץ את התהליך, הוא היה מוצא בסופו של דבר את כדור 5 לבד.

שלב 7: סיכום

התוצאה הסופית היא רובוט שיכול להרים ולכבוש כדורים כתומים בשער לבד.

אהבתי לעבוד על הפרויקט הזה. ככל שעבדתי יותר על הרובוט הזה כך התחברתי אליו יותר. עכשיו אני מדבר אליו כאילו היה חיית מחמד. אני מקווה שזה עזר לך בפרויקט הבא שלך. יש הרבה אנשים שאני צריך להודות להם, אבל יש יותר מדי. כמו שברנרד מארטרס אמר באלגנטיות כל כך: "אנחנו כמו גמדים על כתפיהם של ענקים, כך שנוכל לראות יותר מהם ודברים במרחק גדול יותר, לא מכוח חדות ראייה מצידנו, או כל פיזי. ההבחנה, אלא בגלל שאנחנו נשאים גבוהים ומורמים בגודל הענק שלהם ".

מוּמלָץ: