فهرست مطالب:

A Hearing Jumping Jack، Google Coral TPU Accelerator نسخه: 4 مرحله
A Hearing Jumping Jack، Google Coral TPU Accelerator نسخه: 4 مرحله

تصویری: A Hearing Jumping Jack، Google Coral TPU Accelerator نسخه: 4 مرحله

تصویری: A Hearing Jumping Jack، Google Coral TPU Accelerator نسخه: 4 مرحله
تصویری: Installing SteamOS on a Google Meet Video Conference Computer 2024, جولای
Anonim
A Hearing Jumping Jack ، Google Coral TPU Accelerator Version
A Hearing Jumping Jack ، Google Coral TPU Accelerator Version
A Hearing Jumping Jack ، Google Coral TPU Accelerator Version
A Hearing Jumping Jack ، Google Coral TPU Accelerator Version
A Hearing Jumping Jack ، Google Coral TPU Accelerator Version
A Hearing Jumping Jack ، Google Coral TPU Accelerator Version

اندام خود را حرکت می دهد ، به دستورات شما گوش می دهد ، توسط جدیدترین فناوری یادگیری ماشین هدایت می شود

"جک پرش شنوایی" یک جک پرش الکترومکانیکی ساده است که توسط دو میکرو سرویس و یک دنده بسیار ساده هدایت می شود و دارای LED به عنوان "چشم" است. این دستگاه با دستورات صوتی ساده ای مشخص می شود که نشان می دهد کدام یک از نه موقعیت از پیش تعیین شده را باید بگیرد ، یا آیا LED باید روشن یا خاموش شود یا باید یک حرکت "رقص" یا تصادفی از پیش تعیین شده انجام دهد.

عنصر اصلی سیستم شتاب دهنده Google Coral TPU است که به شما امکان می دهد مدلهای Tensorflow Lite را بصورت آفلاین با سرعت بسیار بالا حتی در رایانه ای "ضعیف" مانند Raspberry Pi اجرا کنید. این اجازه می دهد به عنوان مثال شناسایی و طبقه بندی سریع اجسام با استفاده از دوربین RPi ، بلکه برای اجرای عملکردهای تشخیص صدا مبتنی بر یادگیری ماشین به صورت محلی.

تا جایی که من می دانم این اولین نمونه منتشر شده برای یک دستگاه DIY فیزیکی با قابلیت تشخیص صدا Coral Accelerator است و مثال کد پیوست شده ممکن است برای پروژه های پیچیده تر نیز استفاده شود.

کنترل صدا بر اساس مثال "مار شنونده" در "spotter keyword project" (https://github.com/google-coral/project-keyword-spotter) است که اخیراً (سپتامبر 2019) در GitHub قرار داده شده است. در پیکربندی من ، سیستم شامل رزبری پای 4 است که مجهز به سرپوش سرآمد 16 کانال Adafruit ، شتاب دهنده Google Coral TPU و وب کم است که در اینجا به عنوان میکروفون استفاده می شود. Jumping Jack قبلاً در دستورالعمل قبلی توضیح داده شده بود ، جایی که توسط کیت Google Voice به منظور خواندن دستورات صوتی هدایت شده بود ، در نسخه 2.0 شرح داده شده در زیر به Servo Bonnet متصل شده است.

نسخه قبلی Google Voice Kit دارای سه محدودیت اصلی بود: بسته به خدمات تشخیص صدا مبتنی بر وب Google و تنظیمات نسبتاً پیچیده ، قبل از اینکه بتوانید فرمان دهید باید دکمه ای را فشار دهید و تأخیر جدی وجود داشت. بین گفتن فرمان و پاسخ سیستم. استفاده از شتاب دهنده مرجانی گوگل زمان پاسخ دهی را به ثانیه کاهش می دهد ، مستقل از اتصال به اینترنت است و همیشه در حال گوش دادن است. با برخی تغییرات می توانید از آن برای کنترل دستگاه های بسیار پیچیده تر مانند Jumping Jack ، به عنوان روبات یا اتومبیل یا هر چیزی که می توانید با Raspberry Pi بسازید و کنترل کنید ، استفاده کنید.

کلمه کلیدی Spotter در نسخه فعلی خود مجموعه ای از 140 کلمه کلیدی کوتاه/عبارت کلیدی را درک می کند که در فایل مدل همراه ("voice_commands_v0.7_egetpu.tflite") تعریف شده و در یک فایل برچسب جداگانه توضیح داده شده است ("labels_gc2.raw.txt") به کلمات کلیدی که به طور خاص توسط اسکریپت ما استفاده می شود ، توسط یک فایل آزاد قابل تغییر ("commands_v2_hampelmann.txt") تعریف می شود ، سپس برای ضربه زدن به کلیدهای صفحه کلید مجازی ، به عنوان مثال ، نقشه برداری می شود. برای حروف ، اعداد ، بالا/پایین/چپ/راست ، crtl+c و غیره.

سپس ، به عنوان مثال با استفاده از pygame.key ، این "ضربه زدن به کلید" خوانده می شود و برای کنترل عملکردهایی که دستگاه ، در اینجا جک پرش انجام می دهد ، استفاده می شود. در مورد ما این بدان معناست که دو سروو را به موقعیت های از پیش تعیین شده برسانید یا LED ها را روشن یا خاموش کنید. همانطور که کلمه کلیدی spotter در یک آج جداگانه اجرا می شود ، می تواند به طور مرتب به سفارشات شما گوش دهد.

نسخه 21 سپتامبر 2019

تدارکات

Raspberry Pi 4 ، از طریق Pimoroni

Google Coral TPU Accelerator ، via Mouser Germany ، 72 یورو

Adafruit 16 Servo Bonnet ، از طریق Pimoroni ، حدود 10 €

www.adafruit.com/product/3416

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

هدر پشته (در صورت لزوم)

www.adafruit.com/product/2223

4 برابر باتری AA (یا منبع تغذیه دیگر 5-6 ولت) برای Servo Bonnet

وب کم قدیمی ، به عنوان میکروفون

سروو همانطور که در دستورالعمل قبلی توضیح داده شد ، جامپینگ جک را هدایت می کرد. نقشه های طرح بندی به مرحله بعدی ضمیمه شده است ، اما ممکن است نیاز به تعدیل داشته باشد.

قطعات مورد نیاز برای جک جامپینگ:

- صفحه فارکس 3 میلیمتری

- 2 میکرو سرو

- پیچ و مهره 2 و 3 میلی متری

- 2 LED سفید و یک مقاومت

- کمی کابل

مرحله 1: راه اندازی دستگاه

راه اندازی دستگاه
راه اندازی دستگاه
راه اندازی دستگاه
راه اندازی دستگاه
راه اندازی دستگاه
راه اندازی دستگاه

برای ساخت جک جامپینگ ، لطفاً نکاتی را که در دستورالعمل قبلی داده شده است ، دنبال کنید. من از Forex برای نمونه اولیه خود استفاده کردم ، اما شما ممکن است از صفحات اکریلیک یا تخته سه لا برش لیزری استفاده کنید. ممکن است مجبور شوید طرح را با توجه به اندازه سرووها و غیره تنظیم کنید. آیا می توانید اندام و چرخ دنده بدون اصطکاک حرکت کنید.

رزبری پای خود را تنظیم کنید. در سایت Coral Github ، یک تصویر Raspian موجود است که حاوی همه چیز مورد نیاز برای اجرای شتاب دهنده Coral در Pi است و شامل پروژه های زیادی است ، با همه تنظیمات در حال حاضر.

کلید واژه پروژه را از صفحه Google Coral GitHub دریافت کنید. تمام نرم افزارهای مورد نیاز را همانطور که نشان داده شده نصب کنید.

فایل های ارائه شده را نصب کنید. اسکریپت پرش جک پایتون را در پوشه کلمه کلیدی spotter و فایل دستورات مربوطه در زیر پوشه پیکربندی قرار دهید.

Adafruit Servo Bonnet را به Pi وصل کنید. از آنجا که از یک محفظه RPI با یک فن استفاده می کنم ، برای فعال کردن اتصال نیاز به استفاده از استیکرهای GPIO (به عنوان مثال از Pimoroni) دارم. همانطور که در دستورالعمل Adafruit برای سرو سروپوش نشان داده شده است ، تمام کتابخانه های مورد نیاز را نصب کنید.

منبع تغذیه 5-6 ولت را به کاپوت سروو وصل کنید. سرویس ها و LED ها را وصل کنید. در مورد من ، از پورت 0 برای LED ها و پورت های 11 و 15 برای سروها استفاده کردم.

برای بررسی همه چیز ، توصیه می کنم ابتدا از کلمه کلیدی پروژه "مار شنوایی" و نمونه های کاپوت سرو سرو Adafruit استفاده کنید.

مرحله 2: اجرای جک جامپینگ

اگر همه قطعات راه اندازی شده و در حال اجرا هستند ، سعی کنید از آن استفاده کنید. می توانید اسکریپت را در IDE یا خط فرمان اجرا کنید.

فریاد زدن "موقعیت 0" تا "موقعیت 9" باعث می شود جک جامپینگ یکی از موقعیت های از پیش تعیین شده را بگیرد. من "1" را به عنوان هر دو دست بالا (uu) ، "3" را به عنوان چپ به بالا ، راست به پایین (ud) ، "9" را به عنوان هر دو دست پایین (dd) و "5" را هر دو بازو در مرکز (cc) تعریف کردم.

uu uc ud = 1 2 3

cc cd cd = 4 5 6

du dc dd = 7 8 9

"0" با "5" یکسان است. "3" و "8" توسط کلمه کلیدی spotter به خوبی شناخته نمی شوند و ممکن است مجبور به تکرار شوند.

ممکن است مجبور باشید حداقل و حداکثر مقادیر را برای هر سروو/طرف تنظیم کنید تا سرویس ها مسدود نشوند و سپس نیروی زیادی را بکشند.

"بازی بعدی" "رقص" را شروع می کند ، یعنی یک دنباله مشخص از موقعیت ها ، در حالی که "بازی تصادفی" Jumping Jack را برای انجام یک دنباله تصادفی از حرکتها آغاز می کند. در هر دو حالت آنها برای همیشه اجرا می شوند ، بنابراین ممکن است مجبور شوید حرکات را متوقف کنید ، به عنوان مثال. با فرمان "موقعیت صفر".

"توقف بازی" یک "ctrl + c" را تداعی می کند و روند را متوقف می کند.

برای روشن و خاموش کردن LED ها می توان از "روشن" و "خاموش" استفاده کرد.

با تغییر مقادیر time.sleep می توانید سرعت حرکات را تنظیم کنید.

مرحله 3: کد و فایل دستورات

کدی که در اینجا ارائه شده است اصلاح کد "مار شنونده" است که بخشی از بسته کلمات کلیدی پروژه spotter است. من فقط هر چیزی را که برای برنامه من ضروری نبود ، بدون هیچ درک واقعی از جزئیات حذف کردم. هرگونه پیشرفتی خوش آمدید.

سپس قطعات مورد نیاز Adafruit Servo Bonnet را بر اساس فایلهای نمونه آنها اضافه کردم.

من می خواهم از برنامه نویسان هر دو قسمت تشکر کنم.

کد را می توان در فایل ضمیمه یافت. از آن برای خطرات خود استفاده کنید ، آن را اصلاح کنید ، بهبود دهید ، با آن بازی کنید.

# حق نسخه برداری 2019 Google LLC

# # تحت مجوز Apache ، نسخه 2.0 ("مجوز") ؛ # شما نمی توانید از این فایل استفاده کنید مگر با رعایت مجوز. # شما می توانید یک نسخه از مجوز را در شماره # # https://www.apache.org/licenses/LICENSE-2.0 # # بدست آورید ، مگر اینکه طبق قانون قابل اجرا باشد یا به صورت کتبی موافقت شده باشد ، نرم افزارهای # تحت مجوز توزیع شده در "AS IS" اساس ، # بدون ضمانت نامه یا شرایط هر نوع ، اعم از ضمنی یا ضمنی. # برای دسترسی به زبان خاص و محدودیت های تحت مجوز به مجوز مراجعه کنید. از _future_ واردات absolute_import از _future_ بخش واردات از _future_ import print_function واردات argparse import os از واردات تصادفی randint از threading import زمان واردات موضوع از edgetpu.basic.basic.engine از adafruit_servokit import ServoKit import board import busio import 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) #تنظیمات بالا ، وسط و پایین برای بازوهای چپ و راست up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # تعداد سروو پورت ، سروو سمت چپ (0-8)

rgt = 11 # تعداد پورت سروو ، سرووی راست (0-8) led_channel_0 = hat.channels [0] # LED تنظیم شده روی پورت 0 led_channel_0.duty_cycle = 0 # LED را 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.put (فرمان) کلاس برنامه: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = true self._running = True return True def on_event (خود ، رویداد): if event.type == pygame. QUIT: self._running = False def JumpingJack0 (خود ، کلیدها): # کنترل Jumping Jack ، کلمات کلیدی: "position x" key = int (keys) p = position [key] a = p [0] b = p [1] print ("موقعیت:" ، کلید ، "سمت چپ /right: "، a،"/"، b،" degree ") # sys.stdout.write (" موقعیت: "، کلید ،" چپ/راست: "، a ،"/"، b ،" درجه ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # کنترل Jumping Jack رقص ، کلید واژه: "بازی بعدی" dnce = dance1 sp = (len (dnce)) برای r در محدوده (sp): # ترتیب رقص موقعیت ها ، sp مراحل dc = dnce [r] اگر (dc در محدوده (10)) نیست: # print ("خطای ورودی در موقعیت" ، sp) dc = 4 p = موقعیت [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt]. زنجیره = b time.sleep (0.25) # مجموعه سرعت of moves def JumpingJack2 (خود ، کلیدها): # کنترل Jumping LED های LED ، کلمات کلیدی: "روشن/خاموش" led = int (keys) if led == 1: led_channel_0.duty_cycle = 0xffff # LED 100٪ time.sleep را روشن کنید (0.1) if led == 0: led_channel_0.duty_cycle = 0 # زمان LED را خاموش کنید. خواب (0.1) در صورت led == 2: # چشمک زدن led_channel_0.duty_cycle = 0xffff # روشن کردن LED 100٪ زمان. خواب (0.5) led_channel_0.duty_cycle = 0 #LED را 100٪ روشن کنید. خواب (0.5) led_channel_0.duty_cycle = 0xffff #LED را 100٪ زمان روشن کنید. خواب (0.5) led_channel_0.duty_cycle = 0 #LED را 100٪ زمان روشن کنید. خواب (0.5) led_channel_0.duty_cycle = 0xffff #LED را 100٪ زمان روشن کنید. خواب (0.1) def JumpingJack3 (خود): # کنترل Jumping رقص جک ، کلید واژه: "بازی تصادفی" # برای ساعت در محدوده (10): dr = randrange (9) p = موقعیت [dr] a = p [0] b = p [1] kit.servo [lft].angle = a 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 (خود ، args):

اگر نه self.on_init (): self._running = غلط q = model.get_queue () self._controler = کنترل کننده (q) اگر args.debug_keyboard: t = موضوع (target = self.spotter ، args = (args ،)) t.daemon = true t.start () item = -1 while self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (درست ، 0.1) بجز صف. خالی: new_item = هیچکدام اگر new_item نباشد هیچ کدام: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) یا مورد == "stop": self._running = False # اگر (args.debug_keyboard and keys [pygame. K_SPACE]) or item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) یا مورد == "right": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_LEFT]) or item == "left": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_UP]) یا مورد == " بالا ": self. JumpingJack0 (1) if (args.debug_keyboard and keys [pygame. K_DOWN]) or item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygam e. K_0]) یا مورد == "0": self. JumpingJack0 (0) if (args.debug_keyboard and keys [pygame. K_1]) یا مورد == "1": self. JumpingJack0 (1) if (args) debug_keyboard و کلیدها [pygame. K_2]) یا مورد == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) or 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]) یا 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) if (args.debug_keyboard and keys [pygame. K_8]) or item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard and keys [pygame. K_9]) یا مورد == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) یا مورد == "d": self. JumpingJack1 () #رقص جک ، در "next_game" if (args. debug_keyboard و کلیدها [pygame. K_j]) یا مورد == "j": self. JumpingJack2 (0) #LED on، ON " switch_on "if (args.debug_keyboard and keys [pygame. K_k]) or item ==" k ": self. JumpingJack2 (1) #LED off، on (swithch off) if (args.debug_keyboard and keys [pygame. K_l]) یا آیتم == "l": self. JumpingJack2 (1) #LED چشمک زدن "هدف" اگر (args.debug_keyboard و کلیدها [pygame. K_r]) یا مورد == "r": self. JumpingJack3 () #رقص تصادفی "بازی تصادفی" time.sleep (0.05) self.on_cleanup () if _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" وجود دارد. هر طور که دوست دارید اصلاح کنید. این فقط لیستی از ترکیبات "فرمان ، کلید ، (قدرت ،)" است که بر اساس فایل برچسب تهیه شده است.

position_zero، 0،

موقعیت_یک ، 1 ، موقعیت_دو ، 2 ، موقعیت_سه ، 3 ، موقعیت_چهارم ، 4 ، موقعیت_پنج ، 5 ، موقعیت_شش ، 6 ، موقعیت_هفت ، 7 ، موقعیت_هفت ، 8 ، موقعیت_نه ، 9 ، حرکت_بالا ، بالا ، رفتن_بالا ، بالا ، حرکت_پایین ، پایین ، رفتن_پایین ، پایین ، حرکت_به عقب ، چپ ، حرکت_به جلو ، راست ، رفتن_به عقب ، چپ ، رفتن_به جلو ، راست ، 0.8 هدف ، l ، خاموش ، z ، بله ، y ، نه ، n ، switch_on ، j ، switch_off ، k ، volume_up ، بالا ، volume_down ، down ، next_game ، d ، random_game ، r ، start_game ، s ، stop_game ، ctrl+c ،

مرحله 4: ایده های بیشتر و مثال های دیگر

کاملاً واضح است که این تنظیمات ممکن است برای کنترل روبات ها یا سایر دستگاه ها نیز مورد استفاده قرار گیرد. اساساً هر چیزی که ممکن است توسط Raspberry Pi کنترل شود.

من روی فرمت اسکریپت برای رانندگی MeArm کار می کنم و امیدوارم بتوانم این را در اکتبر 2019 ارائه کنم.

من همچنین در نظر دارم که از Jumping Jack به عنوان یک سمافور استفاده کنم و از برنامه تشخیص موقعیت اندام "project posenet" به عنوان ابزاری برای خواندن موقعیت های Jumping Jack و ترجمه آن به یک عدد استفاده کنم. به این ترتیب حتی ممکن است متن را نیز در ارتباط قرار دهد ، با توجه به موقعیت های 2 * 8 می تواند 64 عدد مختلف را نشان دهد ، که برای الفبا ، اعداد و علائم بیش از حد کافی است. این می تواند ، در حالی که کمی اصلاح شده است ، تحقق فیزیکی را برای IETF پیشنهادی "انتقال داده های IP بر روی سیستم سیگنالینگ پرچم Semaphore (SFSS)" (https://tools.ietf.org/html/rfc4824) فعال کند.

اما این یک دستورالعمل دیگر خواهد بود. و همانطور که اولین آزمایش ها نشان داد که جک پرش قبل از اینکه توسط سیستم AI به عنوان انسان شناخته شود ، نیاز به تغییرات قابل توجهی دارد ، ممکن است به زمان نیاز داشته باشد.

من می خواهم توجه شما را به موارد زیر جلب کنم: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry ، جایی که یک روبات پیدا کننده شی با استفاده از ترکیبی از Raspberry Pi و Google Coral TPU شرح داده شده است.

توصیه شده: