جدول المحتويات:

A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة: 3 خطوات
A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة: 3 خطوات

فيديو: A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة: 3 خطوات

فيديو: A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة: 3 خطوات
فيديو: Gesture control Robot Arm MediaPipe MeArm 2024, شهر نوفمبر
Anonim
A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة
A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة
A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة
A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة
A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة
A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة
A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة
A Hearing MeArm ، Google Coral TPU Accelerator مدفوعة

في ما يلي ، أود أن أصف إصدارًا يتم التحكم فيه صوتيًا من MeArm ، وهو ذراع روبوت صغير xyz مزود بمقبض. لقد استخدمت MeArm Pi من صناعات MIME ، ولكن يجب أن يكون النظام قابلاً للتطبيق على أي إصدار من MeArm ، أو الأجهزة المماثلة التي تعمل بمؤازرة.

يتيح استخدام Google Coral TPU Accelerator تشغيل البرامج النصية السريعة للتعرف على الصوت TensorFlow دون اتصال بالإنترنت على Raspberry Pi ، وبالتالي التحكم في الأجهزة المادية عن طريق الأوامر المنطوقة ، مع زمن انتقال أقل من ثانية واحدة.

الجهاز الموصوف هنا عبارة عن مجموعة ، وامتداد ، من المفاهيم الموصوفة في دليلين سابقين. إنه امتداد لتطبيق سابق للتحكم الصوتي في Google Coral ، وهو Jumping Jack ، الموصوف هنا وتحسين كبير في Google AIY الذي يتحكم فيه الصوت MeArm الموصوف هنا.

لم يكن تطبيق MeArm الذي يتم التحكم فيه صوتيًا باستخدام نظام Google Voice AIY مطلوبًا للوصول عبر الإنترنت ، ولم يكن من السهل تنفيذه ، وكان مطلوبًا للضغط على زر لتنشيط الاستماع للأوامر الصوتية وكان له وقت انتقال طويل. يتيح Google Coral TPU Accelerator المستخدم الآن تشغيل نماذج TensorFlowLite في وضع عدم الاتصال بسرعة عالية على Raspberry Pi أو أجهزة Linux الأخرى. من بين الأمثلة الموجودة على صفحة Google Coral Github ، يوجد مثال يسمى "ثعبان السمع" لنظام التعرف على الصوت الذي يمكنه فهم 140 عبارة رئيسية (سبتمبر 2019) ، والتي يتم تعيينها بعد ذلك إلى ضغطات المفاتيح الافتراضية. إن اقتران "ضغطات المفاتيح" هذه بتنفيذ بعض الوظائف المبرمجة في Python يجعل من الممكن بناء جهاز يتم التحكم فيه بواسطة الأوامر الصوتية. لقد وصفت مؤخرًا أول تطبيق ، وهو مقبس القفز الكهروميكانيكي الذي يتم التحكم فيه صوتيًا. التنفيذ هنا أكثر تعقيدًا بعض الشيء ويسمح بالتحكم في جميع الماكينات الأربعة لـ MeArm إما لتحريك MeArm باستمرار أو جعله ينتقل إلى عدد محدد مسبقًا المواقف ، أو لأداء بعض المهام الأكثر تعقيدًا.

باستخدام البرنامج النصي المقدم هنا كمثال ، يجب أن يكون إنشاء أجهزة أخرى يتم التحكم فيها بالصوت أمرًا بسيطًا نسبيًا ، على سبيل المثال السيارات الآلية أو وحدات التكنولوجيا المساعدة.

اللوازم

  • MeArm. مستخدم هنا: MeArm Pi من MIME Industries
  • رازبيري باي 4
  • Google Coral TPU Accelerator
  • بونيه Adafruit 16 قناة مؤازرة
  • بعض الكابلات الطائر
  • اختياري: مكثف للغطاء المؤازر ، حوالي 400 درجة فهرنهايت لـ 4 أجهزة (موصى به من قبل Adafruit)
  • مصدر طاقة 5-6 فولت لغطاء محرك المؤازرة. لقد استخدمت هنا شاحنًا قديمًا بجهد 6 فولت ، كما تعمل حزمة بطارية مقاس AA أيضًا
  • ميكروفون. لقد استخدمت كاميرا ويب Microsoft HD3000 قديمة كميكروفون.

الخطوة 1: إعداد النظام

إعداد النظام
إعداد النظام
إعداد النظام
إعداد النظام

قم بتنزيل صورة Raspian المكونة مسبقًا لـ Google Coral TPU Accelerator من صفحة Google Coral Github وقم بتثبيتها على بطاقة µSD. تحتوي الصورة أيضًا على عدد من أمثلة البرامج النصية. قم بإعداد Pi كما هو محدد.

قم بتثبيت مثال Keyword spotter من موقع Google Coral GitHub ، إذا لم يكن مدرجًا في الصورة ، وجميع البرامج المطلوبة. قم بتوصيل الميكروفون بـ Pi. أوصي باللعب باستخدام مثال "Hearing Snake" للتأكد من أن كل شيء يعمل.

قم بتنزيل وتثبيت برنامج Adafruit 16 channel bonnet ، كما هو موضح هنا. قم بتثبيت غطاء المحرك واللعب بأمثلة Adafruit للتأكد من أن كل شيء يعمل بشكل صحيح.

قم بتنزيل الملفات المرفقة بهذه التعليمات وانسخها إلى مجلد "Project Keyword Spotter". يجب نسخ ملف "commands_v1_MeArm.txt" إلى المجلد الفرعي "config".

قم بتوصيل أجهزة MeArm الخاصة بك بغطاء محرك المؤازرة كما هو محدد. لقد استخدمت المنفذ 15 لأعلى / لأسفل ، المنفذ 11 للأمام / للخلف ، المنفذ 7 للدوران والمنفذ 3 لأجهزة القابض.

ضمن البرنامج النصي ، قد تضطر إلى ضبط قيم min / center / max لكل مؤازر لتكوينك ، وتساعد هذه الإعدادات على تجنب تلف الماكينات. قد تضطر أيضًا إلى تعديل قوائم "المواضع" و "النقل 1" و "النقل 2" المضمنة.

قم بتشغيل البرنامج النصي. حتى الآن كنت أقوم بتشغيله من IDE.

في حالة رغبتك في تعديل العبارات الرئيسية التي تستحضر وظيفة معينة وفقًا لحاجتك. توجد قائمة كاملة بعبارات المفاتيح المتاحة في ملف "labels_gc2 raw.txt" في مجلد التكوين الفرعي.

يستغرق وقت استجابة النظام حوالي ثانية واحدة ، ولكنه يعتمد كثيرًا على الإجراءات التي يتم تنفيذها. في بعض الحالات ، يجب تكرار المرحلة الأساسية ، ولا تكون دقة التعرف دائمًا 100٪.

الخطوة الثانية: استخدام الجهاز

إذا تم إعداد كل شيء والتحقق منه ، فيمكنك تشغيل الجهاز.

يتمثل القيد الحالي في تنفيذ أمر معين بشكل متكرر طالما لم يتم إيقافه (باستخدام "إيقاف اللعبة") أو تقديم أمر آخر. مهام معقدة متعددة الخطوات ، على سبيل المثال يتم دائمًا تنفيذ "النقل 1" (المستحضر بعبارة "تشغيل اللعبة") إلى الخطوة الأخيرة.

لذلك ، من خلال "الانعطاف إلى اليمين" ، سينتقل الجهاز بخطوات صغيرة إلى اليمين حتى يتوقف ، أو يتم الوصول إلى القيمة القصوى المحددة مسبقًا. ستبدأ "لعبة الإطلاق" أو "اللعبة التالية" أو "بدء الفيديو" سلسلة من الحركات التي يتم تحديدها بواسطة قوائم تحتوي على الإعداد لكل مؤازر في خطوة معينة. "لعبة عشوائية" سوف يقفز الجهاز من خطوة إلى أخرى ، يتم اختيارها عشوائيًا من قائمة الإعدادات.

كما قد ترى في الفيديو المصاحب ، فقد قمت ببناء كائن على شكل ديابولو من LEGO يمكن التقاطه بواسطة MeArm ونقله من موقع إلى آخر بواسطة مجموعة محددة مسبقًا من الحركات. يمكنك تحديد الوظائف الخاصة بك عن طريق تعديل قوائم "النقل 1" أو "النقل 2".

الخطوة 3: البرنامج النصي

النص المدرج هنا هو تعديل لمثال "Hearing Snake" من "Project Keyword Spotter". تم تجريد المثال إلى الحد الأدنى ، ثم تمت إضافة جزء لقيادة الماكينات ، بناءً على البرنامج والأمثلة المقدمة لغطاء محرك Adafruit.

لم يتم تحسين البرنامج النصي حتى الآن. استخدم على مسؤوليتك الخاصة ، فلا تتردد في التعديل والتحسين.

بالإضافة إلى البرنامج النصي Python ، يوجد ملف الأوامر وملف الملصقات المستخدم. ضعه في المجلد الفرعي config.

كما ذكرنا سابقًا ، قد تكون هناك حاجة إلى العديد من عمليات الضبط للمعلمات لتكييف البرنامج النصي مع MeArm الخاص بك أو بعض الأجهزة الأخرى.

# حقوق الطبع والنشر 2019 Google LLC #

# مرخص بموجب ترخيص أباتشي ، الإصدار 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 بواسطة الدكتور هـ. '' تعليمات يستخدم التنفيذ الخاص بي Raspbery Pi 4 مع مُسرع Google Coral وغطاء محرك Adafruit ذو 16 قناة مرفق. تم إرفاق الماكينات الخاصة بـ MeArm (صناعات MIME) بالمنافذ 3 و 7 و 11 و 15 من غطاء المحرك. لمزيد من التفاصيل ، يرجى إلقاء نظرة على تعليمات "Hearing MeArm". الأوامر: "position x" ، x = 0 to 9 ، تنقل الجهاز إلى موضع محدد مسبقًا. "تحرك / اذهب لأعلى" ، "تحرك / انزل" ، "اذهب / انعطف للأمام" ، "اذهب / انعطف للخلف" ، "انعطف / انطلق يسارًا" و "انعطف / اذهب لليمين" تستحضر حركة بطيئة وتدريجية في المعطى الاتجاه ، "توقف اللعبة" توقف الحركات. يفتح "فتح علامة التبويب" و "إغلاق علامة التبويب" أداة الالتقاط أو إغلاقها. "بدء الفيديو" يستحضر الجهاز ليتبع ترتيبًا محددًا مسبقًا للمواضع ، محددًا بقائمة "المواضع". ينتج عن "اللعبة العشوائية" نمط عشوائي من الحركات ، وينهيها "إيقاف اللعبة". تبدأ "لعبة الإطلاق" سلسلة أخرى من الحركات المحددة مسبقًا بواسطة قائمة "النقل 1" ، "اللعبة التالية" العملية العكسية المحددة مسبقًا بواسطة "النقل 2" استخدمها على مسؤوليتك الخاصة. '' من _future_ استيراد مطلق_استيراد من _future_ قسم الاستيراد من _future_ استيراد print_function استيراد argparse استيراد نظام التشغيل من راندنت الاستيراد العشوائي من استيراد مؤشر الترابط وقت الاستيراد من edgetpu.basic.basic_engine استيراد نموذج استيراد BasicEngine من pygame.locals import * ترتيب استيراد عشوائي من adafruit_servokit استيراد لوحة استيراد ServoKit استيراد busio import adafruit_pca9685 وقت الاستيراد i2c = busio. I2C (board. SCL، board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (القنوات = 16) # set عدد القنوات # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000، 2000) # min، center and max settings up_l = 145 # servo up / down: up 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 # تمركز القابض cl _g = 130 # القابض مغلق vert = 15 # عدد منفذ المؤازرة ، المؤازرة لأعلى / لأسفل forw = 11 # عدد منفذ المؤازرة ، دوران مؤازر للأمام / للخلف = 7 # منفذ مؤازر لتدوير قبضة المؤازرة = 3 # منفذ مؤازر للقبضة مؤازرة # قائمة إعدادات الذراع لتسع مواضع = [(md_l، md_r، md_t، op_g)، (up_l، md_r، ri_t، op_g)، (up_l، md_r، md_t، cl_g)، (up_l، md_r، le_t، cl_g)، (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، md_t، md_g)، (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)، #get object (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)]

النقل 2 = [(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)]

الرقص 1 = (0 ، 8 ، 7 ، 4 ، 1 ، 2 ، 3 ، 6 ، 9 ، 8 ، 5 ، 2 ، 1 ، 4 ، 7 ، 8 ، 9 ، 6 ، 3 ، 2 ، 0) # "رقصة"

#moving MeArm to Zero position status = [md_l، md_r، md_t، md_g] kit.servo [vert].angle = الحالة [0] kit.servo [forw].angle = الحالة [1] kit.servo [turn]. angle = status [2] kit.servo [grip].angle = status [3] print (status) class Controler (object): #Callback function def _init _ (self، q): self._q = q def callback (self، الأمر): self._q.put (أمر) فئة التطبيق: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = إرجاع صحيح 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] print ("Positions:"، key، "vert / forw / turn / grip:"، a، "/"، b، "/"، c، "/"، d، "degrees") الحالة = [a، b، c، d] # حالة المستندات الحالية print (status) # sys.stdout.write ("Position: "، مفتاح ،" يسار / يمين: "، أ ،" / "، ب ،" درجة ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [قبضة].angle = d time.sleep (0.5) def DancingMeArm (self): # ضوابط رقصة MeArm ، الكلمة الرئيسية: "start_video" dnce = dance1 sp = (len (dnce)) لـ r في النطاق (sp): # ترتيب الرقص للمواضع ، sp الخطوات dc = dnce [r] p = position [dc] 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 time.sleep (1) # يحدد سرعة الحركات time.sleep (0.5) # break في نهاية الإجراء def TransMeArm1 (self): # controls MeArm transport 1، keyword: "launch game" tr1 = transport1 sp = (len (tr1)) # حساب عدد الخطوات لـ r في النطاق (sp): # انتقل إلى أي خطوة p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. مؤازرة [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # sets سرعة الحركات time.sleep (0.5) def TransMeArm2 (self): # control MeArm dance، keyword: "next game" 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) # يحدد سرعة الحركات time.sleep (0.5) def RandomMoves (self): # يقفز عشوائيًا بين المواضع المحددة مسبقًا ، الكلمة الرئيسية: "لعبة عشوائية" dr = randrange (9) # تحديد موضع عشوائي p = position [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 [grip].angle = d time.sleep (1) # يحدد سرعة الحركات def MoveUp (self): # رفع القابض بخطوات صغيرة u0 = status [0] # قراءة الحالة الحالية u1 = u0 + 5 # plus x درجة إذا (u1 > up_l): # اختبارات إذا لم تكن تتجاوز الحد الأدنى / الحد الأقصى للمعلمات u1 = up_l # ، وإلا تم تعيينها على min / max value kit. up "، status) time.sleep (1) # set speed def MoveDown (self): d 0 = الحالة [0] d1 = d0 - 5 #minus x درجة إذا (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # move servo status [1] = f1 print ("forward"، status) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x درجة if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo الحالة [2] = l1 print ("left"، status) time.sleep (0.2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x درجة if (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 # ضبط القبضة على الوضع "open": حالة "open_tab" time.sleep (0.5) [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): # لا تفعل شيئًا ، لكن توقف الحركات print (" stop "، status) time.sleep (0.25) def spotter (self، args): engine = BasicEngine (args.model_file) mic = args.mic إذا كانت args.mic ليست شيئًا آخر int (args.mic) نموذج. int (args.num_frames_hop)) def on_execute (self ، args): if not self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) إن لم يكن args.debug_keyboard: t = Thread (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: جرب: new_item = q.get (صحيح ، 0.1) باستثناء queue. Empty: new_item = لا شيء إذا لم يكن new_item بلا: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) أو العنصر == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) أو العنصر == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) أو العنصر == "right": # turn right self. MoveRight () if (args.debug_ke yboard and keys [pygame. K_LEFT]) أو item == "left": # turn left self. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) أو item == "up": self. MoveUp () إذا (args.debug_keyboard and keys [pygame. K_DOWN]) أو item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) أو العنصر == "b": # للخلف self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) أو item == "f": # for forward. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) أو item == "o": # open grip: self. OpenGrip () if (args.debug_keyboard and keys [pygame. K_C]) أو العنصر == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys [pygame. K_S]) أو العنصر == "s": # stop Movement: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) أو item == "0": self. MeArmPos (0) if (args.debug_keyboard and keys [pygame. K_1]) أو item == "1": self. MeArmPos (1) if (args.debug_keyboard and keys [pygame. K_2]) أو 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]) أو item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) أو item == "5": self. MeArmPos (5) if (args.debug_keyboard and keys [pygame. K_6]) أو item == "6": self. MeArmPos (6) if (args.debug_keyboard and keys [pygame. K_7]) أو item == "7": self. MeArmPos (7) if (args.debug_keyboard and keys [pygame. K_8]) أو item == "8": self. MeArmPos (8) إذا (args.debug_keyboard and keys [pygame. K_9]) أو item == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) أو item == "d": self. DancingMeArm () #dancing MeArm ، في "next_game" if (args.debug_keyboard and keys [pygame. K_r]) أو item == "r": self. RandomMoves () # رقصة عشوائية "لعبة عشوائية" إذا (args.debug_keyboard and keys [pygame. K_j]) أو item == "j": self. TransMeArm1 () # transport object: "lunch_game" if (args.debug_keyboard and keys [pygame. K_k]) أو item == "k": self. TransMeArm2 () # نقل كائن الاتجاه العكسي: "next_game" "" "if (args.debug_keyboard و keys [pygame. K_l]) أو item == "l": self. JumpingJack2 (1) #LED blink "target" "" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': المحلل اللغوي = argparse. () the_app = التطبيق () the_app.on_execute (args)

موصى به: