فهرست مطالب:

A Hearing MeArm ، Google Coral TPU Accelerator Driven: 3 Step
A Hearing MeArm ، Google Coral TPU Accelerator Driven: 3 Step

تصویری: A Hearing MeArm ، Google Coral TPU Accelerator Driven: 3 Step

تصویری: A Hearing MeArm ، Google Coral TPU Accelerator Driven: 3 Step
تصویری: Gesture control Robot Arm MediaPipe MeArm 2024, جولای
Anonim
A Hearing MeArm ، Google Coral TPU Accelerator Driven
A Hearing MeArm ، Google Coral TPU Accelerator Driven
A Hearing MeArm ، Google Coral TPU Accelerator Driven
A Hearing MeArm ، Google Coral TPU Accelerator Driven
A Hearing MeArm ، Google Coral TPU Accelerator Driven
A Hearing MeArm ، Google Coral TPU Accelerator Driven
A Hearing MeArm ، Google Coral TPU Accelerator Driven
A Hearing MeArm ، Google Coral TPU Accelerator Driven

در ادامه می خواهم یک نسخه کنترل صدا از MeArm ، بازوی کوچک ربات xyz با گریپر را توصیف کنم. من از MeArm Pi از صنایع MIME استفاده کردم ، اما سیستم باید برای هر نسخه از MeArm یا دستگاه های مشابه سروو استفاده شود.

استفاده از Google Coral TPU Accelerator به شما امکان می دهد اسکریپت های تشخیص سریع صدای آفلاین TensorFlow را بر روی رزبری پای اجرا کرده و بدین وسیله دستگاه های فیزیکی را با دستورات گفتاری و با تأخیر کمتر از یک ثانیه کنترل کنید.

دستگاهی که در اینجا توضیح داده شده ترکیبی از مفاهیم توصیف شده در دو دستورالعمل قبلی است. این فرمت یک پیاده سازی قبلی از کنترل صوتی مرجان گوگل ، Jumping Jack است که در اینجا شرح داده شده است و پیشرفت گسترده ای از MeArm با صدای AIY گوگل است که در اینجا شرح داده شده است.

MeArm کنترل صدا با استفاده از سیستم Google Voice AIY نیاز به دسترسی آنلاین داشت ، پیاده سازی آن آسان نبود ، برای فشار دادن یک دکمه برای فعال کردن گوش دادن به سفارشات صوتی و زمان تأخیر طولانی لازم بود. Google Coral TPU Accelerator استفاده شده در حال حاضر اجازه می دهد تا مدل های TensorFlowLite را به صورت آفلاین با سرعت بالا در Raspberry Pi یا سایر دستگاه های لینوکس اجرا کنید. در بین نمونه های موجود در صفحه Google Coral Github ، یک مثال به نام "مار شنوایی" برای یک سیستم تشخیص صدا وجود دارد که می تواند 140 عبارت کلیدی را درک کند (سپتامبر 2019) ، که سپس برای ضربه زدن به کلیدهای مجازی ترسیم می شوند. پیوند دادن این "ضربه زدن به کلید" با اجرای برخی از عملکردهای برنامه نویسی شده در پایتون ، ساختن یک دستگاه کنترل شده با فرمان صوتی را ممکن می سازد. من اخیراً اولین پیاده سازی را توضیح دادم ، یک جک پرش الکترومکانیکی کنترل صدا. پیاده سازی در اینجا کمی پیچیده تر است و به شما امکان می دهد هر چهار سرویس MeArm را کنترل کنید تا MeArm را به طور مداوم حرکت دهید یا آن را به تعدادی از پیش تعیین شده منتقل کنید موقعیت ها یا انجام کارهای پیچیده تر

با استفاده از اسکریپت ارائه شده در اینجا به عنوان مثال ، ساخت سایر دستگاه های کنترل شده با صدا ، به عنوان مثال ، باید نسبتاً ساده باشد. خودروهای روباتیک یا واحدهای فناوری کمکی.

تدارکات

  • MeArm مورد استفاده در اینجا: MeArm Pi از صنایع MIME
  • تمشک پای 4
  • Google Coral TPU Accelerator
  • کاپوت سروو 16 کانال Adafruit
  • برخی از کابل های جهنده
  • اختیاری: خازن سرو کاپوت ، حدود 400 µF برای 4 سرو (توصیه شده توسط Adafruit)
  • منبع تغذیه 5-6 ولت برای کاپوت سروو. من در اینجا از یک شارژر قدیمی 6 ولت استفاده کردم ، یک بسته باتری 4 برابر AA نیز کار می کند
  • میکروفون. من از یک وب کم قدیمی Microsoft HD3000 به عنوان میکروفون استفاده کردم.

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

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

تصویر Raspian از پیش تنظیم شده برای Google Coral TPU Accelerator را از صفحه Google Coral Github بارگیری کرده و بر روی کارت microSD نصب کنید. تصویر همچنین شامل تعدادی اسکریپت نمونه است. Pi را مطابق شکل تنظیم کنید.

درصورتی که در تصویر گنجانده نشده است ، و مثال برنامه کلید واژه را از سایت Google Coral GitHub و همه برنامه های مورد نیاز نصب کنید. میکروفون را به Pi وصل کنید. توصیه می کنم با مثال "مار شنونده" بازی کنید تا مطمئن شوید همه چیز در حال کار است.

همانطور که در اینجا توضیح داده شد ، نرم افزار کلاه کاپ Adafruit 16 را بارگیری و نصب کنید. کاپوت را نصب کنید و با مثالهای Adafruit بازی کنید تا مطمئن شوید همه چیز به درستی کار می کند.

فایلهای پیوست شده به این دستورالعمل را بارگیری کرده و در پوشه "Project Keyword Spotter" کپی کنید. فایل "commands_v1_MeArm.txt" باید در زیر پوشه "config" کپی شود.

سرویس های MeArm خود را به کاپوت سروو وصل کنید. من از پورت 15 برای بالا/پایین ، پورت 11 برای جلو/عقب ، پورت 7 برای نوبت و پورت 3 برای سرویس گیربکس استفاده کردم.

در اسکریپت ممکن است مجبور باشید مقادیر min/center/max را برای هر سروو با پیکربندی خود تنظیم کنید ، این تنظیمات به جلوگیری از آسیب رساندن به سرویس ها کمک می کند. همچنین ممکن است مجبور شوید لیست های "موقعیت" ، "transport1" و "transport2" را تغییر دهید.

اسکریپت را اجرا کنید. تا اینجا من آن را از IDE اجرا می کردم.

در صورت تمایل به اصلاح عبارات کلیدی که عملکرد خاصی را با توجه به نیاز شما برمی انگیزند. لیست کاملی از عبارات کلیدی موجود در فایل "labels_gc2 raw.txt" در زیر پوشه پیکربندی یافت می شود.

زمان تأخیر سیستم حدود 1 ثانیه است ، اما بستگی به این دارد که چه اقداماتی انجام می شود. در برخی موارد ، مرحله کلیدی باید تکرار شود ، دقت تشخیص همیشه 100 نیست.

مرحله 2: استفاده از دستگاه

اگر همه چیز تنظیم و بررسی شده باشد ، می توانید دستگاه را اجرا کنید.

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

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

همانطور که ممکن است در ویدئو همراه آن مشاهده کنید ، من یک شیء دیابلو شکل از LEGO ساخته بودم که می تواند توسط MeArm برداشته شود و توسط مجموعه ای از پیش تعیین شده از حرکات از محلی به مکان دیگر منتقل شود. شما می توانید با اصلاح لیست های "transport1" یا "transport2" ، عملکردهای خود را تعریف کنید.

مرحله 3: اسکریپت

اسکریپتی که در اینجا ذکر شده است اصلاح نمونه "مار شنونده" از "Project Keyword Spotter" است. مثال به حداقل رسیده و سپس قسمت رانندگی سروها بر اساس نرم افزار و مثال هایی که برای کاپوت سرو Adafruit ارائه شده است ، اضافه شد.

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

علاوه بر اسکریپت پایتون ، دستورات فایل و برچسب های مورد استفاده نیز وجود دارد. آن را در زیر پوشه config قرار دهید.

همانطور که قبلاً ذکر شد ، ممکن است تعدادی پارامتر برای تعدیل اسکریپت برای MeArm خاص یا دستگاه دیگر مورد نیاز باشد.

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

# دارای مجوز تحت مجوز Apache ، نسخه 2.0 ("مجوز") ؛ # شما نمی توانید از این فایل استفاده کنید مگر با رعایت مجوز. # شما می توانید یک نسخه از مجوز را در # # href = "https://www.apache.org/licenses/LICENSE-2.0" href = "https://www.apache.org/licenses/LICENSE-2.0" دریافت کنید. https://www.apache.org/licenses/LICENSE-2.0 # # نرم افزارهای توزیع شده تحت مجوز بدون نیاز به ضمانت نامه یا شرایط ، مگر در مواردی که توسط قانون مربوطه مورد نیاز است یا به صورت کتبی موافقت شده است ، توزیع می شود. هر نوع ، یا بیان شده یا ضمنی. # برای دسترسی به زبان خاص و محدودیت های تحت مجوز به مجوز مراجعه کنید. # کد اصلی "مار_شنوایی" برای پیاده سازی برای MeArm توسط دکتر H. "دستورالعمل ها" دستورالعمل های پیاده سازی من از Raspbery Pi 4 با شتاب دهنده گوگل مرجانی و سرپوش سروو 16 کانال Adafruit متصل استفاده می کند. سرویس های MeArm (صنایع MIME) به پورت های 3 ، 7 ، 11 و 15 کاپوت متصل شده است. برای جزئیات بیشتر ، لطفاً به دستورالعمل "Hearing MeArm" نگاه کنید. دستورات: "موقعیت x" ، x = 0 تا 9 ، دستگاه را به موقعیت از پیش تعیین شده منتقل می کند. "حرکت/بالا رفتن" ، "حرکت/پایین آمدن" ، "رفتن/چرخاندن به جلو" ، "رفتن/برگشتن به عقب" ، "گردش/رفتن به چپ" و "گردش/رفتن به راست" باعث ایجاد یک حرکت آهسته و گام به گام در این مورد می شود. جهت ، "توقف بازی" حرکات را متوقف می کند. "باز کردن برگه" و "بستن برگه" گریپر را باز یا بسته می کند. "شروع ویدئو" دستگاه را وادار می کند تا از ترتیب از پیش تعیین شده موقعیت ها ، که توسط لیست "موقعیت ها" تعریف می شود ، پیروی کند. "بازی تصادفی" منجر به یک الگوی حرکتی تصادفی می شود ، "توقف بازی" به آن خاتمه می دهد. "بازی راه اندازی" مجموعه دیگری از حرکتها را که از طریق لیست "transport1" ، "بازی بعدی" از پیش تعیین شده شروع می شود ، "بازی بعدی" عملیات معکوس که از قبل با "transport2" تعریف شده است را به خطر می اندازید. '' 'از _future_ واردات مطلق از _future_ بخش واردات از _future_ import print_function import argparse import os from random import randint from threading import زمان واردات موضوع از edgetpu.basic.basic.engine واردات BasicEngine مدل واردات pygame از pygame.locals واردات تصادفی از adafruit_servokit import ServoKit واردات برد واردات 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 = 145 # سروو بالا/پایین: بالا md_l = 95 dn_l = 45 up_r = 135 # سروو جلو/عقب md_r = 90 dn_r = 50 ri_t = 30 # چرخش بازو به راست یا چپ: موقعیت راست md_t = 90 # چرخش بازو به راست یا چپ: موقعیت مرکز le_t = 150 op_g = 65 # دستگیره باز md_g = 90 # gripper centered cl _g = 130 # gripper vert vert = 15 # تعداد سروو پورت ، سروو بالا/پایین forw = 11 # تعداد سروو ، چرخش سروو به جلو/عقب = 7 # پورت سروو برای چرخاندن سروو گیره = 3 # پورت سروو برای گرفتن سرو #لیست تنظیمات بازو برای موقعیت نه موقعیت =) ، (md_l ، md_r ، md_t ، op_g) ، (md_l ، md_r ، md_t ، md_g) ، (md_l ، md_r ، md_t ، cl_g) ، (dn_l ، dn_r ، ri_t ، op_g) ، (dn_l ، dn_r ،) ، (dn_l ، dn_r ، le_t ، md_g)] # 10 موقعیت پایه را مشخص می کند که با اعداد صحیح 0-9 نشان داده شده است # روشهای حمل و نقل [vert/forward/turn/grip] transport1 = [(140 ، 70 ، 65 ، op_g) ، (110، 50، 65، op_g)، (65، 50، 65، op_g)، (65، 70، 65، cl_g)، (120، 70، 65، cl_g)، #گرفتن شی (100، 70، 135، cl_g) ، (100 ، 80 ، 135 ، cl_g) ، (100 ، 80 ، 135 ، md_g) ، (100 ، 80 ، 135 ، op_g) ، (140 ، 70 ، 135 ، op_g) ، (140 ، 70 ، 90 ، op_g) ، (140 ، 70 ، 65 ، op_g)]

transport2 = [(140، 70، 65، op_g)، (140، 70، 135، op_g)، (95، 70، 135، op_g)، (95، 80، 135، op_g)،

(95، 80، 135، cl_g)، (110، 70، 135، cl_g)، (110، 70، 65، cl_g)، (70، 70، 65، cl_g)، (70، 70، 65، op_g)، (80 ، 50 ، 65 ، op_g)]

dance1 = (0، 8، 7، 4، 1، 2، 3، 6، 9، 8، 5، 2، 1، 4، 7، 8، 9، 6، 3، 2، 0) # a "dance"

#حرکت MeArm به وضعیت موقعیت صفر = [md_l ، md_r ، md_t ، md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. angle = status [2] kit.servo [grip].angle = status [3] class print (status) controller (object): #تابع برگشت به تماس def _init _ (self، q): self._q = q def callback (self، command): self._q.put (command) کلاس برنامه: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = self._running = true True def on_event (self، event): if event.type == pygame. QUIT: self._running = False def MeArmPos (self، keys): # MeArm را به موقعیت های از پیش تعیین شده هدایت می کند ، کلمات کلیدی: "position x" key = int (keys) p = موقعیت [کلید] a = p [0] b = p [1] c = p [2] d = p [3] چاپ ("موقعیت ها" ، کلید ، "vert/forw/turn/grip:" ، a ، "/" ، b ، "/" ، c ، "/" ، d ، "degree") status = [a، b، c، d] # اسناد وضعیت فعلی چاپ (وضعیت) # sys.stdout.write ("موقعیت: "، کلید ،" چپ/راست: "، a ،"/"، b ،" درجه ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # کنترل رقص MeArm ، کلید واژه: "start_video" dnce = dance1 sp = (len (dnce)) برای r در محدوده (sp): #ترتیب رقص موقعیت ها ، sp مراحل dc = dnce [r] p = موقعیت [dc] a = p [0] b = p [1] c = p [2] = d [p] (1) # سرعت حرکتها را تنظیم می کند. خواب (0.5) # استراحت در پایان عمل #محاسبه تعداد مراحل برای r در محدوده (sp): #رفتن به هر مرحله p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # مجموعه سرعت حرکات time.sleep (0.5) def TransMeArm2 (خود): # رقص MeArm را کنترل می کند ، کلید واژه: "بازی بعدی" tr2 = transport2 sp = (len (tr2)) برای r در محدوده (sp): #ترتیب رقص موقعیت ها ، sp مراحل p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # سرعت حرکت زمان را تنظیم می کند. خواب (0.5)) def RandomMoves (self): # به طور تصادفی بین موقعیت های از پیش تعریف شده می پرید ، کلمه کلیدی: "بازی تصادفی" dr = randrange (9) # به طور تصادفی موقعیتی را انتخاب می کند p = موقعیت [dr] # پارامترهای موقعیت را می خواند a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [گرفتن].angle = d time.sleep (1) # تنظیم سرعت حرکت def MoveUp (خود): # بلند کردن دستگیره در مراحل کوچک u0 = وضعیت [0] # خواندن وضعیت فعلی u1 = u0 + 5 # به علاوه x درجه اگر (u1 > up_l): # آزمایش اگر بیش از حداقل/حداکثر پارامترها نیست u1 = up_l # در غیر اینصورت بر روی min/max value set قرار دارد. servo [vert].angle = u1 # انتقال وضعیت سروو [0] = u1 # تنظیم مقدار چاپ وضعیت (" بالا "، وضعیت) time.sleep (1) # مجموعه سرعت را از MoveDown (خود) تنظیم می کند: d 0 = وضعیت [0] d1 = d0 - 5 # دقیقه x درجه اگر (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # انتقال وضعیت سروو [1] = f1 چاپ ("جلو" ، وضعیت) time.sleep (1) def MoveBack (خود): b0 = وضعیت [1] b1 = b0 - 5 # دقیقه x درجه if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo وضعیت [2] = l1 چاپ ("چپ" ، وضعیت) time.sleep (0.2) def MoveRight (خود): r0 = وضعیت [2] r1 = r0 - 2 #دقیقه x درجه اگر (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print ("right"، status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # set grip to "open" position: "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # تنظیم گرفتن در موقعیت "بسته": " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # کاری انجام نمی دهد ، اما چاپ را متوقف می کند (" stop "، status) time.sleep (0.25) def spotter (self، args): موتور = 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_v1_MeArm.txt" ، dectection_callback = self._controler.callback ، sample_rate_hz_ ، int = (args.samp) int (args.num_frames_hop)) def on_execute (self، args): اگر نه self.on_init (): self._running = False q = model.get_queue () self._controler = Controller (q) if not 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 و کلیدها [pygame. K_ESCAPE]) یا مورد == "stop": self._running = # if (args.debug_keyboard and keys [pygame. K_SPACE]) or item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys) [pygame. K_RIGHT]) یا مورد == "راست": # گردش به راست self. MoveRight () if (args.debug_ke yboard و کلیدها [pygame. K_LEFT]) یا مورد == "چپ": # خود را به چپ بپیچانید. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) or item == "up": self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) or item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) or item == "b": # به عقب self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # self forwards. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) or item == "o": # open grip: self. OpenGrip () if (args.debug_keyboard and keys [pygame. K_C]) or item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys) [pygame. K_S]) یا مورد == "s": # توقف حرکت: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) or item == "0": self. MeArmPos (0) if (args.debug_keyboard and keys [pygame. K_1]) or item == "1": self. MeArmPos (1) if (args.debug_keyboard and keys [pygame. K_2]) or item == "2": self. MeArmPos (2) if (args.debug_keyboard and keys [pygame. K_3]) یا آن em == "3": self. MeArmPos (3) if (args.debug_keyboard and keys [pygame. K_4]) or item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) یا مورد == "5": self. MeArmPos (5) if (args.debug_keyboard and keys [pygame. K_6]) or item == "6": self. MeArmPos (6) if (args.debug_keyboard و کلیدها [pygame. K_7]) یا مورد == "7": self. MeArmPos (7) if (args.debug_keyboard and keys [pygame. K_8]) or item == "8": self. MeArmPos (8) اگر (args.debug_keyboard و کلیدها [pygame. K_9]) یا مورد == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. DancingMeArm () #dancing MeArm ، در "بازی بعدی" اگر (args.debug_keyboard و کلیدها [pygame. K_r]) یا مورد == "r": self. RandomMoves () #رقص تصادفی "بازی تصادفی" if (args.debug_keyboard and keys [pygame. K_j]) یا مورد == "j": self. TransMeArm1 () # شیء حمل و نقل: "بازی_ناهار" if (args.debug_keyboard and keys [pygame. K_k]) or item == "k": self. TransMeArm2 () # شی جابجایی جهت معکوس: "next_game" '' 'if (args.debug_keyboard و کلیدها [pygame. K_l]) یا مورد == "l": self. JumpingJack2 (1) #LED چشمک زدن "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard'، help = 'برای کنترل MeArm از صفحه کلید استفاده کنید.'، action = 'store_true'، default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = برنامه () the_app.on_execute (args)

توصیه شده: