Mục lục:

Jack nhảy thính, Phiên bản Google Coral TPU Accelerator: 4 bước
Jack nhảy thính, Phiên bản Google Coral TPU Accelerator: 4 bước

Video: Jack nhảy thính, Phiên bản Google Coral TPU Accelerator: 4 bước

Video: Jack nhảy thính, Phiên bản Google Coral TPU Accelerator: 4 bước
Video: Sam Sung Galaxy S7 Egde Màn hình cong Bản coppy 32GB Hồng kong 2024, Tháng bảy
Anonim
Jack nhảy thính, phiên bản Google Coral TPU Accelerator
Jack nhảy thính, phiên bản Google Coral TPU Accelerator
Jack nhảy thính, Phiên bản Google Coral TPU Accelerator
Jack nhảy thính, Phiên bản Google Coral TPU Accelerator
Jack nhảy thính, Phiên bản Google Coral TPU Accelerator
Jack nhảy thính, Phiên bản Google Coral TPU Accelerator

Nó cử động chân tay, lắng nghe mệnh lệnh của bạn, nó được điều khiển bởi công nghệ máy học mới nhất

“Jack nhảy thính” là một Jack nhảy cơ điện đơn giản, được điều khiển bởi hai servo nhỏ và một bánh răng rất đơn giản, có đèn LED làm “mắt”. Nó được điều khiển bằng các lệnh thoại đơn giản cho biết nó sẽ thực hiện vị trí nào trong số chín vị trí được xác định trước, hoặc nếu đèn LED nên được bật hoặc tắt, hoặc nếu nó sẽ thực hiện một "điệu nhảy" được xác định trước hoặc tập hợp các bước di chuyển ngẫu nhiên.

Yếu tố cốt lõi của hệ thống là bộ tăng tốc Google Coral TPU, cho phép chạy ngoại tuyến các mô hình Tensorflow Lite với tốc độ rất cao, ngay cả trên một máy tính “yếu” như Raspberry Pi. Điều này cho phép v.d. nhận dạng và phân loại đối tượng nhanh chóng bằng máy ảnh RPi mà còn để chạy cục bộ các chức năng nhận dạng giọng nói dựa trên máy học.

Theo hiểu biết của tôi, đây là ví dụ đầu tiên được xuất bản cho thiết bị tự làm vật lý điều khiển bằng giọng nói Coral Accelerator và ví dụ mã đính kèm cũng có thể được sử dụng cho các dự án khác, phức tạp hơn.

Điều khiển bằng giọng nói dựa trên ví dụ “con rắn thính” trong “trình phát hiện từ khóa dự án” (https://github.com/google-coral/project-keyword-spotter) mà gần đây (tháng 9 năm 2019) đã được đặt trên GitHub. Trong cấu hình của tôi, hệ thống này bao gồm Raspberry Pi 4 được trang bị nắp ca-pô 16 kênh trợ giúp Adafruit, Bộ tăng tốc TPU của Google Coral và một webcam, ở đây được sử dụng làm micrô. Jumping Jack đã được mô tả trước đây trong một hướng dẫn trước đó, nơi nó được điều khiển bởi bộ Google Voice để đọc lệnh thoại, được gắn vào Servo Bonnet trong phiên bản 2.0 được mô tả trong phần sau.

Phiên bản Google Voice Kit trước đó có ba hạn chế chính: đó là phụ thuộc vào các dịch vụ nhận dạng giọng nói dựa trên web của Google và việc thiết lập tương đối phức tạp, bạn phải nhấn một số loại nút trước khi có thể ra lệnh và có độ trễ nghiêm trọng. giữa việc nói lệnh và phản hồi của hệ thống. Sử dụng trình tăng tốc Google Coral giúp giảm thời gian phản hồi xuống còn vài giây, không phụ thuộc vào kết nối internet và luôn lắng nghe. Với một số sửa đổi, bạn có thể sử dụng nó để điều khiển các thiết bị phức tạp hơn nhiều như Jumping Jack, như rô bốt hoặc ô tô hoặc bất cứ thứ gì bạn có thể chế tạo và điều khiển bằng Raspberry Pi.

Trong phiên bản hiện tại, Keyword Spotter hiểu một tập hợp khoảng 140 từ khóa / cụm từ khóa ngắn, được xác định trong tệp mô hình đi kèm (“voice_commands_v0.7_egetpu.tflite”) và được mô tả trong một tệp nhãn riêng biệt (“label_gc2.raw.txt”). Được xác định bởi một tệp có thể sửa đổi tự do (“command_v2_hampelmann.txt”), các từ khóa được sử dụng cụ thể bởi tập lệnh của chúng tôi sau đó được ánh xạ tới các lần nhấn phím trên bàn phím ảo, ví dụ: cho các chữ cái, số, lên / xuống / trái / phải, crtl + c, vân vân.

Sau đó, v.d. bằng cách sử dụng pygame.key, các “tổ hợp phím” này được đọc và sử dụng để điều khiển các hành động mà một thiết bị, ở đây là giắc cắm, sẽ thực hiện. Trong trường hợp của chúng tôi, điều này có nghĩa là điều khiển hai servo đến các vị trí được xác định trước hoặc để bật hoặc tắt đèn LED. Khi công cụ dò tìm từ khóa chạy trong một chuỗi riêng biệt, nó có thể nghe lệnh của bạn vĩnh viễn.

Phiên bản ngày 21 tháng 9 năm 2019

Quân nhu

Raspberry Pi 4, thông qua Pimoroni

Google Coral TPU Accelerator, của Mouser Germany, 72 €

Adafruit 16 Servo Bonnet, thông qua Pimoroni, khoảng 10 €

www.adafruit.com/product/3416

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

Tiêu đề ngăn xếp (nếu cần)

www.adafruit.com/product/2223

Bộ pin 4x AA (hoặc nguồn điện 5-6V khác) cho Servo Bonnet

Webcam cũ, làm micrô

Servo điều khiển Jumping Jack, như được mô tả trong hướng dẫn trước. Bản vẽ bố trí được đính kèm cho bước tiếp theo, nhưng có thể yêu cầu điều chỉnh.

Các bộ phận cần thiết cho Jumping Jack:

- Tấm ngoại hối 3 mm

- 2 servo nhỏ

- Vít và đai ốc 2 và 3 mm

- 2 đèn LED trắng và một điện trở

- một chút cáp

Bước 1: Thiết lập thiết bị

Thiết lập thiết bị
Thiết lập thiết bị
Thiết lập thiết bị
Thiết lập thiết bị
Thiết lập thiết bị
Thiết lập thiết bị

Để xây dựng Jumping Jack, vui lòng làm theo các chỉ dẫn được đưa ra trong hướng dẫn trước. Tôi đã sử dụng Forex cho mẫu thử nghiệm của mình, nhưng bạn có thể sử dụng tấm acrylic hoặc ván ép được cắt bằng laser. Bạn có thể phải điều chỉnh cách bố trí tùy theo kích thước của servo, v.v. Kiểm tra xem các chi và bánh răng có thể chuyển động mà không có ma sát hay không.

Thiết lập Raspberry Pi của bạn. Trên trang Coral Github, có sẵn hình ảnh Raspian chứa mọi thứ cần thiết để chạy trình tăng tốc Coral trên Pi và chứa rất nhiều dự án, với tất cả các cài đặt đã có sẵn.

Nhận tiêu điểm từ khóa của dự án từ trang Google Coral GitHub. Cài đặt tất cả các phần mềm cần thiết theo chỉ dẫn.

Cài đặt các tệp được cung cấp. Đặt tập lệnh python jack jump trong thư mục spotter từ khóa dự án và tệp lệnh cốt lõi trong thư mục con cấu hình.

Gắn Bonnet Servo Adafruit vào Pi. Vì tôi đang sử dụng vỏ RPI với quạt, tôi cần sử dụng bộ xếp GPIO (ví dụ: có sẵn từ Pimoroni) để kích hoạt kết nối. Cài đặt tất cả các thư viện bắt buộc, như được chỉ ra trong hướng dẫn Adafruit cho nắp ca-pô servo.

Gắn nguồn điện 5-6V vào nắp ca-pô servo. Gắn servo và đèn LED. Tôi trường hợp của tôi, tôi đã sử dụng cổng 0 cho đèn LED và cổng 11 và 15 cho servo.

Để kiểm tra mọi thứ, tôi khuyên bạn nên thử ví dụ từ khóa "thính giác rắn" của dự án và ví dụ về nắp ca-pô của Adafruit servo trước.

Bước 2: Chạy Jumping Jack

Nếu tất cả các bộ phận đã được thiết lập và chạy, hãy thử sử dụng nó. Bạn có thể chạy tập lệnh trong IDE hoặc từ dòng lệnh.

Việc hét lên từ "vị trí 0" đến "vị trí 9" sẽ kích hoạt Jumping Jack chiếm một trong những vị trí được xác định trước. Tôi đã định nghĩa "1" là cả hai cánh tay hướng lên (uu), "3" là trái lên, sang phải (ud), "9" là cả hai cánh tay hướng xuống (đ) và "5" là cả hai cánh tay ở giữa (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" giống với "5". "3" và "8" không được trình phát hiện từ khóa nhận dạng tốt và có thể phải lặp lại.

Bạn có thể phải điều chỉnh các giá trị tối thiểu và tối đa cho mỗi servo / bên để các servo không bị chặn và sau đó tiêu thụ quá nhiều điện năng.

"trò chơi tiếp theo" sẽ bắt đầu "điệu nhảy", tức là một chuỗi các vị trí xác định, trong khi "trò chơi ngẫu nhiên" sẽ bắt đầu Jumping Jack để thực hiện một chuỗi di chuyển ngẫu nhiên. Trong cả hai trường hợp, chúng sẽ chạy mãi mãi, vì vậy bạn có thể phải dừng các chuyển động, ví dụ: với lệnh "vị trí số không".

"dừng trò chơi" sẽ gọi một "ctrl + c" và dừng quá trình.

"bật" và "tắt" có thể được sử dụng để bật và tắt đèn LED.

Bằng cách sửa đổi các giá trị time.sleep, bạn có thể điều chỉnh tốc độ của các chuyển động.

Bước 3: Mã và tệp lệnh

Đoạn mã được trình bày ở đây là một sửa đổi của mã "con rắn thính" nằm trong gói dò tìm từ khóa của dự án. Tôi chỉ xóa bất kỳ thứ gì không cần thiết cho ứng dụng của mình mà không có bất kỳ sự hiểu biết thực sự nào về chi tiết. Mọi cải tiến đều được hoan nghênh.

Sau đó, tôi đã thêm các phần cần thiết cho Adafruit Servo Bonnet, dựa trên các tệp ví dụ của chúng.

Tôi xin cảm ơn các lập trình viên của cả hai phần.

Mã này có thể được đính kèm dưới dạng tệp. Sử dụng nó cho những rủi ro của riêng bạn, sửa đổi nó, cải thiện nó, chơi với nó.

# Bản quyền 2019 Google LLC

# # Được cấp phép theo Giấy phép Apache, Phiên bản 2.0 ("Giấy phép"); # bạn không thể sử dụng tệp này trừ khi tuân thủ Giấy phép. # Bạn có thể lấy bản sao của Giấy phép tại # # https://www.apache.org/licenses/LICENSE-2.0 # # Trừ khi luật hiện hành yêu cầu hoặc được đồng ý bằng văn bản, phần mềm # được phân phối theo Giấy phép sẽ được phân phối trên một CƠ SỞ "NGUYÊN TRẠNG", # KHÔNG CÓ ĐẢM BẢO HOẶC ĐIỀU KIỆN BẤT KỲ HÌNH THỨC NÀO, dù rõ ràng hay ngụ ý. # Xem Giấy phép để biết các quyền điều chỉnh ngôn ngữ cụ thể và # giới hạn theo Giấy phép. từ _future_ nhập tuyệt đối_import từ _future_ bộ phận nhập từ _future_ nhập print_ Chức năng nhập khẩu Argparse nhập hệ điều hành từ ngẫu nhiên nhập ngẫu nhiên randint từ nhập luồng Thời gian nhập luồng từ edgetpu.basic.basic_engine nhập Mô hình nhập BasicEngine nhập pygame từ pygame.locals nhập * hàng đợi nhập từ randrange nhập ngẫu nhiên from adafruit_servokit import board nhập ServoKit import busio import adafruit_pca9685 import time i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (channel = 16) # set number trong tổng số kênh # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # cài đặt lên, giữa và xuống cho cánh tay trái và phải up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # số cổng servo, servo trái (0-8)

rgt = 11 # số cổng servo, servo phải (0-8) led_channel_0 = hat.channels [0] # LED được đặt trên cổng 0 led_channel_0.duty_cycle = 0 # bật LED 100% # danh sách cài đặt cánh tay cho chín vị trí = [(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)] # xác định 9 vị trí JumpingJack, được biểu thị bằng số nguyên 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "dance" class Controler (object): #Callback function def _init _ (self, q): self._q = q def callback (self, command): self._q.put (command) class Ứng dụng: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return True def on_event (self, event): if event.type == pygame. QUIT: self._running = False def JumpingJack0 (self, key): # điều khiển Jumping Jack, từ khóa: "position x" key = int (key) p = position [key] a = p [0] b = p [1] print ("Vị trí:", key, "left / phải: ", a," / ", b," độ ") # sys.stdout.write (" Vị trí: ", phím," trái / phải: ", a," / ", b," độ ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # điều khiển điệu nhảy Jumping Jack, từ khóa: "trò chơi tiếp theo" dnce = dance1 sp = (len (dnce)) cho r trong phạm vi (sp): # thứ tự thăng bằng của các vị trí, bước sp dc = dnce [r] if (dc không trong phạm vi (10)): # print ("lỗi nhập tại vị trí", 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) # đặt vận tốc của chuyển động def JumpingJack2 (self, phím): # điều khiển đèn LED Jumping Jack, từ khóa: "bật / tắt" led = int (phím) if led == 1: led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.1) if led == 0: led_channel_0.duty_cycle = 0 # off LED time.sleep (0.1) if led == 2: # nhấp nháy led_channel_0.duty_cycle = 0xffff # bật LED 100% thời gian. Ngủ (0.5) led_channel_0.duty_cycle = 0 #turn on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff # bật LED 100% thời gian. ngủ (0.5) led_channel_0.duty_cycle = 0 # bật LED 100% thời gian. ngủ (0.5) led_channel_0.duty_cycle = 0xffff # bật LED 100% thời gian. ngủ (0.1) def JumpingJack3 (tự): # điều khiển Nhảy Jumping Jack, từ khóa: "trò chơi ngẫu nhiên" # cho h trong phạm vi (10): dr = randrange (9) p = position [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0,25) # đặt vận tốc của chuyển động def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic is None else int (args.mic) model.classify_audio (mic, engine, label_file = "config / label_gc2.raw.txt", command_file = "config / command_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, args):

if not self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) if not 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: key = pygame.key.get_pressed () else: try: new_item = q.get (Đúng, 0,1) ngoại trừ hàng đợi. (args.debug_keyboard và các phím [pygame. K_SPACE]) hoặc item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard and key [pygame. K_RIGHT]) hoặc item == "right": self. JumpingJack0 (6) if (args.debug_keyboard and key [pygame. K_LEFT]) or item == "left": self. JumpingJack0 (4) if (args.debug_keyboard and key [pygame. K_UP]) or item == " up ": self. JumpingJack0 (1) if (args.debug_keyboard and key [pygame. K_DOWN]) hoặc item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and key [pygam e. K_0]) hoặc item == "0": self. JumpingJack0 (0) if (args.debug_keyboard and key [pygame. K_1]) hoặc item == "1": self. JumpingJack0 (1) if (args. debug_keyboard và các phím [pygame. K_2]) hoặc item == "2": self. JumpingJack0 (2) if (args.debug_keyboard and key [pygame. K_3]) hoặc item == "3": self. JumpingJack0 (3) if (args.debug_keyboard and key [pygame. K_4]) hoặc item == "4": self. JumpingJack0 (4) if (args.debug_keyboard and key [pygame. K_5]) hoặc item == "5": self. JumpingJack0 (5) if (args.debug_keyboard and key [pygame. K_6]) hoặc item == "6": self. JumpingJack0 (6) if (args.debug_keyboard and key [pygame. K_7]) or item == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard and key [pygame. K_8]) or item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard and key [pygame. K_9]) hoặc item == "9": self. JumpingJack0 (9) if (args.debug_keyboard and key [pygame. K_a]) hoặc item == "d": self. JumpingJack1 () #dancing Jack, trên "next_game" if (args. debug_keyboard và các phím [pygame. K_j]) hoặc item == "j": self. JumpingJack2 (0) #LED on, ON " switch_on "if (args.debug_keyboard and key [pygame. K_k]) or item ==" k ": self. JumpingJack2 (1) #LED off, on" swithch off "if (args.debug_keyboard and key [pygame. K_l]) hoặc item == "l": self. JumpingJack2 (1) #LED nhấp nháy "target" nếu (args.debug_keyboard và các phím [pygame. K_r]) hoặc item == "r": self. JumpingJack3 () #random dance "random game" time.sleep (0,05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Sử dụng bàn phím để điều khiển JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Ngoài ra còn có tệp cấu hình lệnh "command_v2_hampelmann.txt". Sửa đổi theo ý muốn. Nó chỉ là một danh sách các tổ hợp "lệnh, phím, (độ mạnh,)", dựa trên tệp nhãn.

position_zero, 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, down, move_backwards, left, move_forwards, right, go_backwards, left, go_forwards, right, 0.8 target, l, mute, z, yes, y, no, n, switch_on, j, switch_off, k, volume_up, lên, volume_down, xuống, next_game, d, random_game, r, start_game, s, stop_game, ctrl + c,

Bước 4: Ý tưởng bổ sung và các ví dụ khác

Rõ ràng là cài đặt này cũng có thể được sử dụng để điều khiển rô bốt hoặc các thiết bị khác. Về cơ bản, mọi thứ có thể được điều khiển bởi Raspberry Pi.

Tôi đang làm việc trên một phần mở rộng của tập lệnh để thúc đẩy MeArm và hy vọng có thể trình bày phần mở rộng này vào tháng 10 năm 2019.

Tôi cũng đang cân nhắc sử dụng Jumping Jack làm semaphore và sử dụng chương trình nhận dạng vị trí chi "project posenet" như một công cụ để đọc các vị trí của Jumping Jack và dịch nó trở lại một số. Bằng cách này, nó thậm chí có thể giao tiếp văn bản, với 2x 8 vị trí có thể chỉ ra 64 số khác nhau, quá đủ cho bảng chữ cái, số và dấu hiệu. Điều này có thể cho phép, trong khi được sửa đổi một chút, một hiện thực hóa vật lý cho IETF được đề xuất "Truyền biểu đồ IP qua Hệ thống báo hiệu cờ Semaphore (SFSS)" (https://tools.ietf.org/html/rfc4824).

Nhưng đây sẽ là một hướng dẫn khác. Và, như các thí nghiệm đầu tiên đã chỉ ra rằng giắc nhảy sẽ cần những sửa đổi đáng kể trước khi nó được hệ thống AI công nhận là con người có thể cần một thời gian.

Tôi muốn thu hút sự chú ý của bạn đến hướng dẫn sau: Đối tượng-Tìm-Cá nhân-Trợ lý-Robot-Ft-Raspberry, nơi mô tả một rô-bốt tìm kiếm vật thể bằng cách sử dụng kết hợp Raspberry Pi và Google Coral TPU.

Đề xuất: