สารบัญ:

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 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 แบบออฟไลน์บน Raspberry Pi ได้อย่างรวดเร็ว และด้วยเหตุนี้จึงควบคุมอุปกรณ์ทางกายภาพด้วยคำสั่งเสียง โดยมีเวลาแฝงต่ำกว่าหนึ่งวินาที

อุปกรณ์ที่อธิบายในที่นี้เป็นการผสมผสานและการขยายแนวคิดที่อธิบายไว้ในสองคำสั่งก่อนหน้า เป็นส่วนขยายของการใช้งานก่อนหน้าของการควบคุมด้วยเสียงของ Google Coral, Jumping Jack ที่อธิบายไว้ที่นี่และการปรับปรุง MeArm ที่ควบคุมด้วยเสียงของ Google AIY ที่อธิบายไว้ที่นี่

MeArm ที่ควบคุมด้วยเสียงโดยใช้ระบบ Google Voice AIY จำเป็นต้องมีการเข้าถึงออนไลน์ ไม่ง่ายในการใช้งาน ต้องกดปุ่มเพื่อเปิดใช้งานการฟังคำสั่งเสียง และมีเวลาแฝงนาน Google Coral TPU Accelerator ที่ใช้ในขณะนี้ทำให้สามารถเรียกใช้รุ่น TensorFlowLite แบบออฟไลน์ด้วยความเร็วสูงบน Raspberry Pi หรืออุปกรณ์ Linux อื่นๆ ในบรรดาตัวอย่างในหน้า Google Coral Github มีตัวอย่างที่เรียกว่า "งูได้ยิน" สำหรับระบบจดจำเสียงที่สามารถเข้าใจวลีสำคัญ 140 วลี (กันยายน 2019) ซึ่งจะถูกจับคู่กับการกดแป้นเสมือน การจับคู่ "การกดแป้น" เหล่านี้กับการทำงานของฟังก์ชันบางอย่างที่ตั้งโปรแกรมไว้ใน Python ทำให้สามารถสร้างอุปกรณ์ที่ควบคุมด้วยคำสั่งเสียงได้ เมื่อเร็ว ๆ นี้ฉันได้อธิบายการใช้งานครั้งแรก ซึ่งเป็นแจ็คกระโดดข้ามระบบเครื่องกลไฟฟ้าที่ควบคุมด้วยเสียง การใช้งานในที่นี้ซับซ้อนกว่าเล็กน้อย และอนุญาตให้ควบคุมเซอร์โวทั้งสี่ของ MeArm เพื่อย้าย MeArm อย่างต่อเนื่องหรือให้ย้ายไปตามจำนวนที่กำหนดไว้ล่วงหน้า ตำแหน่งหรือเพื่อทำงานที่ซับซ้อนมากขึ้น

ตัวอย่างการใช้สคริปต์ที่ให้ไว้ที่นี่ ค่อนข้างง่ายในการสร้างอุปกรณ์ควบคุมด้วยเสียงอื่นๆ เช่น อุปกรณ์ควบคุมด้วยเสียง รถหุ่นยนต์หรือหน่วยเทคโนโลยีช่วยเหลือ

เสบียง

  • มีอาร์ม. ใช้ที่นี่: MeArm Pi จาก MIME Industries
  • ราสเบอร์รี่ Pi 4
  • Google Coral TPU Accelerator
  • ฝากระโปรงหน้าเซอร์โว Adafruit 16 ช่อง
  • สายจัมเปอร์บางสาย
  • อุปกรณ์เสริม: ตัวเก็บประจุสำหรับฝากระโปรงหน้าเซอร์โว ประมาณ 400 µF สำหรับ 4 เซอร์โว (แนะนำโดย Adafruit)
  • แหล่งพลังงาน 5-6 V สำหรับฝากระโปรงหน้าเซอร์โว ฉันใช้ที่ชาร์จ 6V แบบเก่า ก้อนแบตเตอรี่ AA 4x ก็ใช้งานได้เช่นกัน
  • ไมโครโฟน. ฉันใช้เว็บแคม Microsoft HD3000 รุ่นเก่าเป็นไมโครโฟน

ขั้นตอนที่ 1: การตั้งค่าระบบ

การตั้งค่าระบบ
การตั้งค่าระบบ
การตั้งค่าระบบ
การตั้งค่าระบบ

ดาวน์โหลดอิมเมจ Raspian ที่กำหนดค่าไว้ล่วงหน้าสำหรับ Google Coral TPU Accelerator จากหน้า Google Coral Github และติดตั้งบนการ์ด µSD รูปภาพประกอบด้วยสคริปต์ตัวอย่างจำนวนหนึ่ง ตั้งค่า Pi ตามที่ระบุไว้

ติดตั้งตัวอย่าง Keyword spotter จากเว็บไซต์ Google Coral GitHub หากไม่รวมอยู่ในรูปภาพ และโปรแกรมที่จำเป็นทั้งหมด แนบไมโครโฟนกับ Pi ฉันอยากจะแนะนำให้เล่นกับตัวอย่าง "Hearing Snake" เพื่อให้แน่ใจว่าทุกอย่างใช้งานได้

ดาวน์โหลดและติดตั้งซอฟต์แวร์ฝากระโปรงหน้า Adafruit 16 ช่อง ตามที่อธิบายไว้ที่นี่ ติดตั้งฝากระโปรงหน้าและเล่นกับตัวอย่าง Adafruit เพื่อให้แน่ใจว่าทุกอย่างทำงานอย่างถูกต้อง

ดาวน์โหลดไฟล์ที่แนบมากับคำแนะนำนี้และคัดลอกไปยังโฟลเดอร์ "Project Keyword Spotter" ต้องคัดลอกไฟล์ "commands_v1_MeArm.txt" ไปยังโฟลเดอร์ย่อย "config"

เชื่อมต่อเซอร์โวของ MeArm กับฝากระโปรงหน้าเซอร์โวตามที่ระบุ ฉันใช้พอร์ต 15 สำหรับขึ้น/ลง พอร์ต 11 สำหรับไปข้างหน้า/ข้างหลัง พอร์ต 7 สำหรับเทิร์น และพอร์ต 3 สำหรับเซอร์โวกริปเปอร์

ภายในสคริปต์ คุณอาจต้องปรับค่าต่ำสุด/กึ่งกลาง/สูงสุดสำหรับเซอร์โวแต่ละตัวให้เข้ากับการกำหนดค่าของคุณ การตั้งค่าเหล่านี้จะช่วยหลีกเลี่ยงความเสียหายต่อเซอร์โว คุณอาจต้องแก้ไขรายการ "ตำแหน่ง", "ขนส่ง1" และ "ขนส่ง2" ที่รวมอยู่ด้วย

เรียกใช้สคริปต์ จนถึงตอนนี้ฉันได้เรียกใช้จาก IDE

ในกรณีที่คุณต้องการแก้ไขวลีสำคัญที่ทำให้เกิดฟังก์ชันบางอย่างตามความต้องการของคุณ รายการคีย์วลีทั้งหมดที่มีจะพบได้ในไฟล์ "labels_gc2 raw.txt" ในโฟลเดอร์ย่อย config

ระบบมีเวลาแฝงประมาณ 1 วินาที แต่ขึ้นอยู่กับว่าจะดำเนินการใด ในบางกรณี จำเป็นต้องทำซ้ำขั้นตอนสำคัญ ความแม่นยำของการรู้จำอาจไม่แม่นยำ 100% เสมอไป

ขั้นตอนที่ 2: การใช้อุปกรณ์

หากทุกอย่างได้รับการตั้งค่าและตรวจสอบแล้ว คุณสามารถเรียกใช้อุปกรณ์ได้

ข้อจำกัดในปัจจุบันคือคำสั่งที่ให้ไว้จะถูกดำเนินการซ้ำๆ ตราบใดที่ยังไม่หยุด (โดยใช้ "หยุดเกม") หรือได้รับคำสั่งอื่น งานหลายขั้นตอนที่ซับซ้อนเช่น "transport1" (ปรากฏโดยวลี "เปิดตัวเกม") จะดำเนินการจนถึงขั้นตอนสุดท้ายเสมอ

ดังนั้นเมื่อ "เลี้ยวขวา" เครื่องจะเคลื่อนไปทางขวาทีละน้อยๆ จนกว่าจะหยุด หรือถึงค่าสูงสุดที่ตั้งไว้ล่วงหน้า "เปิดเกม", "เกมถัดไป" หรือ "start_video" จะเริ่มชุดการเคลื่อนไหวที่กำหนดโดยรายการที่มีการตั้งค่าสำหรับเซอร์โวแต่ละตัวในขั้นตอนที่กำหนด "เกมสุ่ม" จะทำให้อุปกรณ์กระโดดจากที่หนึ่งไปอีกขั้นโดยสุ่มเลือกจากรายการการตั้งค่า

ดังที่คุณเห็นในวิดีโอประกอบ ฉันได้สร้างวัตถุรูปทรง Diabolo จาก LEGO ที่ MeArm หยิบขึ้นมาได้ และเคลื่อนย้ายจากที่หนึ่งไปยังอีกที่หนึ่งด้วยชุดการเคลื่อนไหวที่กำหนดไว้ล่วงหน้า คุณสามารถกำหนดฟังก์ชันของคุณเองได้โดยแก้ไขรายการ 'transport1' หรือ 'transport2'

ขั้นตอนที่ 3: สคริปต์

สคริปต์ที่แสดงรายการนี้เป็นการปรับเปลี่ยนตัวอย่าง "Hearing Snake" จาก "Project Keyword Spotter" ตัวอย่างถูกถอดออกให้เหลือน้อยที่สุด จากนั้นจึงเพิ่มส่วนสำหรับขับเคลื่อนเซอร์โวตามซอฟต์แวร์และตัวอย่างที่มีให้สำหรับฝากระโปรงหน้าเซอร์โว Adafruit

สคริปต์ยังไม่ได้รับการปรับให้เหมาะสมในตอนนี้ ใช้ความเสี่ยงของคุณเอง ปรับเปลี่ยนและเพิ่มประสิทธิภาพได้ตามสบาย

นอกจากสคริปต์ python แล้ว ยังมี command-file และ labels-file ที่ใช้อยู่ วางไว้ในโฟลเดอร์ config-sub

ดังที่กล่าวไว้ก่อนหน้านี้ อาจจำเป็นต้องปรับพารามิเตอร์หลายอย่างเพื่อปรับสคริปต์สำหรับ 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 # # เว้นแต่กฎหมายที่ใช้บังคับหรือตกลงกันเป็นลายลักษณ์อักษร ซอฟต์แวร์ # ที่เผยแพร่ภายใต้ใบอนุญาตถูกแจกจ่าย "ตามที่เป็น" # โดยไม่มีการรับประกันหรือเงื่อนไข ใดๆ ไม่ว่าจะโดยชัดแจ้งหรือโดยนัย # ดูใบอนุญาตสำหรับภาษาเฉพาะที่ควบคุมการอนุญาตและ # ข้อ จำกัด ภายใต้ใบอนุญาต # รหัส "hearing_snake" ดั้งเดิมได้รับการแก้ไขสำหรับการใช้งาน MeArm โดย Dr H. ''' คำแนะนำ การใช้งานของฉันใช้ Raspbery Pi 4 พร้อมตัวเร่งความเร็วของ Google Coral และติดฝากระโปรงหน้าเซอร์โว Adafruit 16 ช่อง เซอร์โวของ MeArm (อุตสาหกรรม MIME) ถูกต่อเข้ากับพอร์ต 3, 7, 11 และ 15 ของฝากระโปรงหน้า สำหรับรายละเอียด โปรดดูคำแนะนำ "Hearing MeArm" คำสั่ง: "ตำแหน่ง x", x= 0 ถึง 9 ย้ายอุปกรณ์ไปยังตำแหน่งที่กำหนดไว้ล่วงหน้า "เลื่อน/ขึ้น", "เคลื่อน/ลง", "ไป/เลี้ยวไปข้างหน้า", "ไป/เลี้ยวกลับ", "เลี้ยว/ไปทางซ้าย" และ "เลี้ยว/ไปทางขวา" ทำให้เกิดการเคลื่อนไหวช้าๆ ทิศทาง "หยุดเกม" หยุดการเคลื่อนไหว "แท็บเปิด" และ "แท็บปิด" เปิดหรือปิดกริปเปอร์ "วิดีโอเริ่มต้น" กระตุ้นอุปกรณ์ให้ไปตามลำดับตำแหน่งที่กำหนดไว้ล่วงหน้า ซึ่งกำหนดโดย 'ตำแหน่ง' รายการ "เกมสุ่ม" ส่งผลให้รูปแบบการเคลื่อนไหวแบบสุ่ม "หยุดเกม" จบลง "เปิดตัวเกม" เริ่มต้นชุดการเคลื่อนไหวอื่นที่กำหนดไว้ล่วงหน้าโดยรายการ 'transport1', "เกมถัดไป" การดำเนินการย้อนกลับที่กำหนดไว้ล่วงหน้าโดย 'transport2' ใช้ด้วยความเสี่ยงของคุณเอง ''' จาก _future_ นำเข้า absolute_import จาก _future_ นำเข้าแผนกจาก _future_ นำเข้า print_function นำเข้า argparse นำเข้าระบบปฏิบัติการจากการนำเข้าแบบสุ่มจากการนำเข้าเธรด เวลานำเข้าเธรดจาก edgetpu.basic.basic_engine นำเข้า BasicEngine โมเดลการนำเข้า นำเข้า pygame จาก pygame.locals นำเข้า * นำเข้าคิวจาก Randrange นำเข้าแบบสุ่มจาก 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) # การตั้งค่าขั้นต่ำ ศูนย์กลาง และสูงสุด 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 # ศูนย์กลางกริปเปอร์ cl _g = 130 # กริปเปอร์ปิด vert = 15 # จำนวนพอร์ตเซอร์โว, เซอร์โวขึ้น/ลง ไปข้างหน้า = 11 # จำนวนพอร์ตเซอร์โว, หมุนเซอร์โวไปข้างหน้า/ถอยหลัง = 7 # พอร์ตเซอร์โวสำหรับหมุนกริปเซอร์โว = 3 # พอร์ตเซอร์โวสำหรับจับ servo #list ของการตั้งค่าแขนสำหรับเก้าตำแหน่ง = [(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, g_t, cl_), (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), (dn), (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)]

dance1 =(0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # เป็น "การเต้นรำ"

#ย้าย MeArm ไปที่ตำแหน่งศูนย์ สถานะ =[md_l, md_r, md_t, md_g] kit.servo[vert].angle = สถานะ[0] kit.servo[forw].angle = status[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(ตัวเอง, command): 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 (ตัวเอง, เหตุการณ์): if event.type == pygame. QUIT: self._running = False def MeArmPos(ตัวเอง, คีย์): # ขับ MeArm ไปยังตำแหน่งที่กำหนดไว้ คีย์เวิร์ด: "position x" key = int(keys) p = position[key] a = p[0] b = p[1] c = p[2] d = p[3] พิมพ์ ("ตำแหน่ง: ", คีย์, " vert/forw/turn/grip: ", a, "/", b, "/", c, "/", d, "degrees") สถานะ = [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(ตัวเอง): # ควบคุม MeArm dance, คำสำคัญ: "start_video" dnce = dance1 sp=(len(dnce)) สำหรับ r ในช่วง (sp): #dancing ลำดับของตำแหน่ง sp ขั้นตอน dc = dnce[r] p = ตำแหน่ง[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 เวลานอนหลับ (1) # ตั้งค่าความเร็วของการเคลื่อนไหว time.sleep (0.5) # แตกเมื่อสิ้นสุดขั้นตอน def TransMeArm1 (ตัวเอง): # ควบคุม MeArm ขนส่ง 1 คำสำคัญ: "เปิดเกม" tr1 = transport1 sp=(len(tr1)) #คำนวณจำนวนขั้นตอนสำหรับ 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 พิมพ์ (p) time.sleep (1) # ชุด ความเร็วของการเคลื่อนไหว time.sleep(0.5) def TransMeArm2(self): # ควบคุม MeArm dance คีย์เวิร์ด: "next game" tr2 = transport2 sp=(len(tr2)) สำหรับ r ในช่วง (sp): #dancing ลำดับของตำแหน่ง 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(ตัวเอง): # กระโดดแบบสุ่มระหว่างตำแหน่งที่กำหนดไว้ล่วงหน้า คำสำคัญ: "random game" dr= randrange (9) #randomly เลือกตำแหน่ง 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[หมุน].angle = c kit.servo[grip].angle = d time.sleep (1) # ตั้งค่าความเร็วของการเคลื่อนไหว def MoveUp (ตัวเอง): # ยกกริปเปอร์ในขั้นตอนเล็ก ๆ u0 = สถานะ [0] # อ่านสถานะปัจจุบัน u1 = u0 + 5 # บวก x องศาถ้า (u1 > up_l): # ทดสอบถ้าไม่เกินพารามิเตอร์ขั้นต่ำ/สูงสุด u1 = up_l # หรือตั้งค่าเป็นค่าต่ำสุด/สูงสุด kit.servo[vert].angle = u1 # ย้ายสถานะเซอร์โว[0] = u1 # ปรับค่าสถานะพิมพ์ (" ขึ้น ", สถานะ) time.sleep (1) # ตั้งค่าความเร็ว def 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 องศาถ้า (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 # ตั้งค่ากริปไปที่ตำแหน่ง "เปิด": "open_tab" time.sleep(0.5) สถานะ[3] = op_g def CloseGrip(ตัวเอง): 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): engine = BasicEngine(args.model_file) mic = args.mic ถ้า args.mic เป็น None else int(args.mic) model.classify_audio(mic, engine, labels_file="config/labels_gc2.raw.txt", commands_file="config/commands_v1_MeArm.txt", detecction_callback=self._controler.callback, sample_rate_hz=int(args.sample_rate_hz), = num_frames 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() ถ้า args.debug_keyboard: keys = pygame.key.get_pressed() else: ลอง: new_item = q.get(True, 0.1) ยกเว้น queue. Empty: new_item = None ถ้า new_item ไม่ใช่ None: item = new_item if (args.debug_keyboard และ keys[pygame. K_ESCAPE]) หรือ item == "stop": self._running = False # if (args.debug_keyboard and keys[pygame. K_SPACE]) หรือ item == "go": # self. MeArmPos(7) # if (args.debug_keyboard and keys) [pygame. K_RIGHT]) หรือ item == "right": # เลี้ยวขวา self. MoveRight() if (args.debug_ke yboard และ keys[pygame. K_LEFT]) หรือ item == "left": # turn left self. MoveLeft() if (args.debug_keyboard and keys[pygame. K_UP]) หรือ item == "up": self. MoveUp() if (args.debug_keyboard และ keys[pygame. K_DOWN]) หรือ item == "down": self. MoveDown() if (args.debug_keyboard and keys[pygame. K_B]) หรือ item == "b": # ย้อนกลับ self. MoveBack() ถ้า (args.debug_keyboard และ keys[pygame. K_F]) หรือ item == "f": # ส่งต่อ self. MoveForw() ถ้า (args.debug_keyboard และ keys[pygame. K_O]) หรือ 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]) หรือ item == "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) ถ้า (args.debug_keyboard และ 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) if (args.debug_keyboard และ 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" ถ้า (args.debug_keyboard และ keys[pygame. K_r]) หรือ item == "r": self. RandomMoves() #random dance "random game" if (args.debug_keyboard and keys[pygame. K_j]) หรือ item == "j": self. TransMeArm1() # วัตถุขนส่ง: "lunch_game" if (args.debug_keyboard and keys[pygame. K_k]) หรือ item == "k": self. TransMeArm2() # วัตถุขนส่งย้อนกลับทิศทาง: "next_game" ''' ถ้า (args.debug_keyboard และ คีย์[pygame. K_l]) หรือรายการ == "l": self. JumpingJack2(1) #LED กะพริบ "เป้าหมาย" ''' time.sleep(0.05) self.on_cleanup() ถ้า _name_ == '_main_': parser = argparse. ArgumentParser() parser.add_argument('--debug_keyboard', help='Use the keyboard to control the MeArm.', action='store_true', default=False) model.add_model_flags(parser) args = parser.parse_args () the_app = App() the_app.on_execute(args)

แนะนำ: