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

שקע קפיצה שמיעה, גירסת מאיץ ה- TPU של גוגל קורל: 4 שלבים
שקע קפיצה שמיעה, גירסת מאיץ ה- TPU של גוגל קורל: 4 שלבים

וִידֵאוֹ: שקע קפיצה שמיעה, גירסת מאיץ ה- TPU של גוגל קורל: 4 שלבים

וִידֵאוֹ: שקע קפיצה שמיעה, גירסת מאיץ ה- TPU של גוגל קורל: 4 שלבים
וִידֵאוֹ: מטען אוניברסלי לכל סוגי הסוללות - מוצר שמחליף את הצורך ב- תיקון שקע טעינה 2024, נוֹבֶמבֶּר
Anonim
שקע קפיצה שמיעה, גרסת מאיץ ה- TPU של גוגל קורל
שקע קפיצה שמיעה, גרסת מאיץ ה- TPU של גוגל קורל
שקע קפיצה שמיעה, גרסת מאיץ ה- TPU של גוגל קורל
שקע קפיצה שמיעה, גרסת מאיץ ה- TPU של גוגל קורל
שקע קפיצה שמיעה, גרסת מאיץ ה- TPU של גוגל קורל
שקע קפיצה שמיעה, גרסת מאיץ ה- TPU של גוגל קורל

הוא מזיז את איבריו, הוא מקשיב לפקודות שלך, הוא מונע על ידי הטכנולוגיה העדכנית ביותר של למידת מכונה

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

רכיב הליבה של המערכת הוא מאיץ ה- TPU של גוגל קורל, המאפשר להריץ דגמי Tensorflow Lite במצב לא מקוון במהירות גבוהה מאוד, אפילו במחשב "חלש" כמו ה- Raspberry Pi. זה מאפשר למשל זיהוי וסיווג עצמים מהירים באמצעות מצלמת RPi, אך גם הפעלה מקומית של פונקציות זיהוי קוליות המבוססות על למידת מכונה.

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

השליטה הקולית מבוססת על הדוגמה "נחש השמיעה" ב"מאתר מילות מפתח לפרויקט "(https://github.com/google-coral/project-keyword-spotter) שהוצב לאחרונה (ספטמבר 2019) ב- GitHub. בתצורה שלי, המערכת מורכבת מ- Raspberry Pi 4 המצויד במכסה מנוע סרוו של Adafruit 16 ערוצים, מאיץ TPU של Google Coral ומצלמת אינטרנט, המשמשת כאן כמיקרופון. הג'ק ג'אנג תואר קודם לכן בהוראה קודמת, שבה הוא מונע על ידי ערכת Google Voice לקריאת פקודות קוליות, מצורף למכסה המנוע של סרוו בגרסה 2.0 המתוארת להלן.

לגרסת הקודם של Google Voice Kit היו שלוש מגבלות מרכזיות: היא הייתה תלויה בשירותי זיהוי קולי מבוססי אינטרנט של Google וההגדרה הייתה מסובכת יחסית, נדרשה ללחוץ על כפתור כלשהו לפני שתוכל לתת פקודה, והיה עיכוב רציני. בין אמירת הפקודה לבין תגובת המערכת. השימוש במאיץ Google Coral מקטין את זמן התגובה לשניות, אינו תלוי בחיבור לאינטרנט ומאזין כל הזמן. עם כמה שינויים תוכל להשתמש בו כדי לשלוט במכשירים מורכבים הרבה יותר כמו ג'ק קפיצה, כרובוטים או מכוניות, או כל מה שאתה יכול לבנות ולשלוט בו עם פטל פטל.

בגרסתו הנוכחית מפתח מילות המפתח מבין קבוצה של כ -140 מילות מפתח/ביטויי מפתח קצרים, המוגדרים בקובץ המודל הנלווה ("voice_commands_v0.7_egetpu.tflite") ומתואר בקובץ תוויות נפרד ("labels_gc2.raw.txt"). מילות המפתח שהוגדרו על ידי קובץ הניתן לשינוי חופשי ("command_v2_hampelmann.txt") ממופות לאחר מכן להקשות על מקלדת וירטואלית, למשל. עבור אותיות, מספרים, למעלה/למטה/שמאלה/ימין, crtl+c, וכו '.

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

גרסה 21 בספטמבר 2019

אספקה

פטל פי 4, דרך פימורוני

מאיץ TPU TPU מאיץ, באמצעות Mouser גרמניה, 72 €

מצנפת סרוו Adafruit 16, דרך פימורוני, כ -10 €

www.adafruit.com/product/3416

learn.adafruit.com/adafruit-16-channel-pwm…

כותרת ערימה (במידת הצורך)

www.adafruit.com/product/2223

מארז סוללות 4x AA (או מקור כוח 5-6V אחר) עבור מצנפת סרוו

מצלמת אינטרנט ישנה, כמיקרופון

ג'ק קפיצה מונע סרוו, כמתואר בהוראה קודמת. רישומי פריסה מצורפים לשלב הבא, אך עשויים לדרוש התאמות.

החלקים הדרושים לג'ק הקופץ:

- צלחת פורקס 3 מ מ

- 2 מיקרו סרוו

- ברגים ואומים של 2 ו -3 מ מ

- 2 נוריות LED לבנות ונגד

- קצת כבל

שלב 1: הגדרת המכשיר

הגדרת המכשיר
הגדרת המכשיר
הגדרת המכשיר
הגדרת המכשיר
הגדרת המכשיר
הגדרת המכשיר

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

הגדר את ה- Raspberry Pi שלך. באתר Coral Github, ישנה תמונה Raspian זמינה המכילה את כל הדרוש להפעלת מאיץ האלמוגים בפי ומכילה הרבה פרויקטים, כאשר כל ההגדרות כבר קיימות.

קבל את מילות המפתח של הפרויקט מאתרים מדף GitHub של אלמוגים של Google. התקן את כל התוכנות הדרושות כמצוין.

התקן את הקבצים שסופקו. מקם את סקריפט פייתון הקפיצה בתיקיית הצופה של מילת המפתח בפרויקט ובקובץ הפקודות המתאימות בתיקיית המשנה של התצורה.

חבר את מצנפת סרוו Adafruit ל- Pi. מכיוון שאני משתמש בתא RPI עם מאוורר, הייתי צריך להשתמש במערמי GPIO (למשל זמינים מפימורוני) כדי לאפשר חיבור. התקן את כל הספריות הנדרשות, כפי שמצוין בהוראות Adafruit עבור מצנפת סרוו.

חבר מקור כוח של 5-6V למכסה המנוע של סרוו. צרף סרווס ולדים. במקרה שלי, השתמשתי ביציאה 0 עבור נוריות LED ויציאות 11 ו -15 עבור סרווואים.

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

שלב 2: הפעלת הג'ק הקופץ

אם כל החלקים מוגדרים ופועלים, נסה להשתמש בו. תוכל להריץ את הסקריפט ב- IDE או משורת הפקודה.

צעקת "עמדה 0" ל"עמדה 9 "תעורר את ג'ק הקופץ לתפוס את אחת העמדות שהוגדרו מראש. הגדרתי "1" כשתי הזרועות למעלה (uu), "3" כשמאל למעלה, ימינה למטה (ud), "9" כשתי הזרועות כלפי מטה (dd) ו- "5" כששתי הזרועות במרכזן (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" זהה ל- "5". "3" ו- "8" אינם מזוהים היטב על ידי מילת המפתח spotter וייתכן שיהיה צורך לחזור על כך.

ייתכן שיהיה עליך להתאים את ערכי המינימום והמקסימום לכל סרוו/צד, כך שהשרווסים לא ייחסמו ואז ימשוך יותר מדי כוח.

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

"עצור משחק" יעורר "ctrl + c" ויעצור את התהליך.

ניתן להשתמש ב"הדלקה "ו"כיבוי" להדליק ולכבות את הנורות.

על ידי שינוי הזמן. ערכי שינה אתה יכול להתאים את מהירות התנועות.

שלב 3: הקוד וקובץ הפקודות

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

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

אני רוצה להודות למתכנתים של שני החלקים.

ניתן למצוא את הקוד המצורף כקובץ. השתמש בו על הסיכונים שלך, שנה אותו, שפר אותו, שחק עם זה.

# זכויות יוצרים 2019 Google LLC

# # מורשה תחת רישיון Apache, גירסה 2.0 ("הרישיון"); # אינך רשאי להשתמש בקובץ זה אלא בהתאם לרישיון. # תוכל לקבל עותק של הרישיון בכתובת # # https://www.apache.org/licenses/LICENSE-2.0 # # אלא אם כן נדרש על פי החוק החל או מוסכם בכתב, תוכנה # המופצת תחת הרישיון מופצת על גבי בסיס "כפי שהוא", # ללא אחריות או תנאים מכל סוג שהוא, מפורש או משתמע. # עיין ברישיון לקבלת השפה הספציפית המסדירה הרשאות ו- # מגבלות תחת הרישיון. מ _ עתיד _ יבוא מוחלט_יבוא מ _ עתיד _ חטיבת יבוא מ _ עתיד _ ייבוא הדפסה_פונקציה יבוא ארפרס יבוא מ randint יבוא משרשור ייבוא זמן ייבוא חוטים מ edgetpu.basic.basic_engine יבוא דגם יבוא Pygame מ- pygame.locals יבוא * תור יבוא מתוך רנדריינג יבוא אקראי מאת adafruit_servokit יבוא לוח יבוא ServoKit יבוא busio יבוא adafruit_pca9685 זמן יבוא i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (ערוצים = 16) מספר סט של ערוצים #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #הגדרות למעלה, אמצע ולמטה לזרועות שמאל וימין למעלה_ל = 35 md_l = 90 dn_l = 160 למעלה_ר = 160 md_r = 90 dn_r = 35

lft = 15 # מספר יציאת סרוו, סרוו שמאלי (0-8)

rgt = 11 # מספר יציאת סרוו, סרוו ימני (0-8) led_channel_0 = hat.channels [0] # נורית מונחת ביציאה 0 led_channel_0.duty_cycle = 0 #turn on 100% # רשימת הגדרות זרוע לתנוחת עמדות = [(md_l, md_r), (up_l, up_r), (up_l, md_r), (up_l, dn_r), (md_l, up_r), (md_l, md_r), (md_l, dn_r), (dn_l, up_r), (dn_l, md_r), (dn_l, dn_r)] # מגדיר 9 עמדות JumpingJack, המסומנות במספרים שלמים 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # שיעור "ריקוד" פקד (אובייקט): # פונקציית התקשרות def _init _ (עצמי, q): self._q = q def callback (עצמי, פקודה): self._q.put (command) class App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = true self._running = True return True def on_event (עצמי, אירוע): אם event.type == pygame. QUIT: self._running = שגוי שגוי JumpingJack0 (עצמי, מפתחות): # שולט בקפיצה ג'ק, מילות מפתח: "מיקום x" מפתח = int (מפתחות) p = מיקום [מפתח] a = p [0] b = p [1] הדפסה ("מיקום:", מקש, "שמאל /מימין: ", א,"/", ב," תואר ") # sys.stdout.write (" מיקום: ", מקש," שמאל/ימין: ", א,"/", ב," תואר ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (עצמי): # שולטות Jumping Jack dance, מילת מפתח: "המשחק הבא" dnce = dance1 sp = (len (dnce)) עבור r בטווח (sp): # ריקוד של עמדות, sp שלבים dc = dnce [r] אם (dc לא בטווח (10)): # print ("שגיאת קלט במיקום", sp) dc = 4 p = position [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # קובע מהירות של תנועות def JumpingJack2 (עצמי, מקשים): # פקדים קפיצי נורות LED, מילות מפתח: "הדלק/כבה" led = int (מפתחות) אם הוביל == 1: led_channel_0.duty_cycle = 0xffff #turn on 100% time.sleep).duty_cycle = 0 #turn on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #turn on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.1) def JumpingJack3 (self): # פקדים קפיצת ג'ק ריקוד, מילת מפתח: "משחק אקראי" # עבור h בטווח (10): dr = randrange (9) p = position [dr] a = p [0] b = p [1] kit.servo [lft].angle = kit.servo [rgt].angle = b time.sleep (0.25) # קובע את מהירות התנועות def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic הוא אף אחד אחר int (args.mic) model.classify_audio (מיקרופון, מנוע, labels_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v2_hampelmann.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_hz), num_frames_hop = int (args.num_frames_hop))

def on_execute (עצמי, טענות):

אם לא self.on_init (): self._running = False q = model.get_queue () self._controler = בקר (q) אם לא args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = אמת t.start () פריט = -1 בזמן self._running: pygame.event.pump () אם args.debug_keyboard: keys = pygame.key.get_pressed () אחר: נסה: new_item = q.get (נכון, 0.1) למעט queue. Empty: new_item = None אם new_item אינו None: item = new_item if (args.debug_keyboard ומפתחות [pygame. K_ESCAPE]) או item == "stop": self._running = False # if (args.debug_keyboard ומפתחות [pygame. K_SPACE]) או item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard ומפתחות [pygame. K_RIGHT]) או item == "right": self. JumpingJack0 (6) אם (args.debug_keyboard ומפתחות [pygame. K_LEFT]) או item == "left": self. JumpingJack0 (4) if (args.debug_keyboard ומפתחות [pygame. K_UP]) או item == " למעלה ": self. JumpingJack0 (1) אם (args.debug_keyboard ומפתחות [pygame. K_DOWN]) או item ==" למטה ": self. JumpingJack0 (9) if (args.debug_keyboard ומפתחות [pygam e. K_0]) או item == "0": self. JumpingJack0 (0) אם (args.debug_keyboard ומפתחות [pygame. K_1]) או item == "1": self. JumpingJack0 (1) אם (args. לוח המקלדות והמפתחות [pygame. K_2]) או item == "2": self. JumpingJack0 (2) אם (args.debug_keyboard ומפתחות [pygame. K_3]) או item == "3": self. JumpingJack0 (3) if (args.debug_keyboard and keys [pygame. K_4]) or item == "4": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_5]) or item == "5": self. JumpingJack0 (5) if (args.debug_keyboard and keys [pygame. K_6]) or item == "6": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_7]) or item == "7 ": self. JumpingJack0 (7) אם (args.debug_keyboard ומפתחות [pygame. K_8]) או item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard ומפתחות [pygame. K_9]) או פריט == "9": self. JumpingJack0 (9) if (args.debug_keyboard ומפתחות [pygame. K_a]) או item == "d": self. JumpingJack1 () #ריקוד ג'ק, ב- "next_game" אם (args. לוח מקשים ומפתחות [pygame. K_j]) או item == "j": self. JumpingJack2 (0) #LED מופעל, מופעל " switch_on "if (args.debug_keyboard and keys [pygame. K_k]) או item ==" k ": self. JumpingJack2 (1) #LED כבוי, ב-" swithch off "אם (args.debug_keyboard ומפתחות [pygame. K_l]) או item == "l": self. JumpingJack2 (1) #LED למצמץ "יעד" אם (args.debug_keyboard ומפתחות [pygame. K_r]) או item == "r": self. JumpingJack3 () #ריקוד אקראי "משחק אקראי" time.sleep (0.05) self.on_cleanup () אם _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'השתמש במקלדת לשליטה ב- JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

יש גם את קובץ תצורת הפקודה "commands_v2_hampelmann.txt". שנה כפי שאתה אוהב. זוהי רק רשימה של שילובי "פקודה, מקש, (כוח,)", המבוססים על קובץ התווית.

אפס מיקום, 0, position_one, 1, position_two, 2, position_three, 3, position_four, 4, position_five, 5, position_six, 6, position_seven, 7, position_eight, 8, position_nine, 9, move_up, up, go_up, up, move_down, down, go_down, למטה, הזזה_אחור, שמאלה, קדימה_קדימה, ימינה, הלוך אחורה, שמאלה, קדימה, ימינה, 0.8 מטרה, l, השתקה, z, כן, y, לא, n, switch_on, j, switch_off, k, volume_up, למעלה, volume_down, למטה, משחק הבא, ד, משחק אקראי, r, משחק התחלה, ש, משחק עצירה, ctrl+c,

שלב 4: רעיונות נוספים ודוגמאות אחרות

די ברור שהגדרה זו עשויה לשמש גם לשליטה ברובוטים או מכשירים אחרים. בעצם כל מה שעשוי להיות נשלט על ידי פטל פטל.

אני עובד על הרחבה של התסריט לניהול MeArm, ומקווה להצליח להציג זאת באוקטובר 2019.

אני שוקל גם להשתמש בג'ק הקופץ כסמפור, ולהשתמש בתוכנית זיהוי מיקום הגפיים של "פרויקט posenet" ככלי לקריאת עמדותיו של ג'ק הקופץ ולתרגומו חזרה למספר. בדרך זו הוא עשוי אפילו לתקשר טקסט, בהינתן 2x 8 מיקומים יכול להצביע על 64 מספרים שונים, יותר ממספיק לאלף בית, מספרים ושלטים. זה עשוי לאפשר, תוך שינויים קלים, מימוש פיזי של IETF המוצע "העברת נתוני IP על מערכת איתות דגל סמפור (SFSS)" (https://tools.ietf.org/html/rfc4824).

אבל זה יהיה הוראה נוספת. וכפי שהניסויים הראשונים ציינו כי שקע הקפיצה יזדקק לשינויים משמעותיים לפני שהוא יוכר כאנושי על ידי מערכת ה- AI עשוי לדרוש זמן מה.

ברצוני להסב את תשומת לבך להנחיות הבאות: מציאת אובייקטים-אישי-עוזר-רובוט-פט-פטל, שם מתואר רובוט למציאת אובייקטים באמצעות שילוב של פטל פי ו- Google Coral TPU.

מוּמלָץ: