Mục lục:

Bản địa hóa âm thanh đầu ma-nơ-canh với Kinect: 9 bước (có hình ảnh)
Bản địa hóa âm thanh đầu ma-nơ-canh với Kinect: 9 bước (có hình ảnh)

Video: Bản địa hóa âm thanh đầu ma-nơ-canh với Kinect: 9 bước (có hình ảnh)

Video: Bản địa hóa âm thanh đầu ma-nơ-canh với Kinect: 9 bước (có hình ảnh)
Video: Đau đầu ở người trẻ tuổi- đừng chủ quan bỏ sót 1 bệnh cảnh rất nguy hiểm! 2024, Tháng bảy
Anonim
Bản địa hóa âm thanh đầu ma-nơ-canh với Kinect
Bản địa hóa âm thanh đầu ma-nơ-canh với Kinect

Gặp Margaret, một hình nộm thử nghiệm cho hệ thống giám sát sự mệt mỏi của người lái xe. Cô ấy gần đây đã nghỉ hưu và tìm đường đến không gian văn phòng của chúng tôi, và kể từ đó đã thu hút sự chú ý của những người nghĩ rằng cô ấy 'đáng sợ'. Vì lợi ích của công lý, tôi đã cho cô ấy khả năng đối mặt trực tiếp với những người tố cáo cô ấy; thay vì dường như nhìn theo bạn với ánh mắt vô hồn của cô ấy, bây giờ cô ấy thực sự làm như vậy. Hệ thống sử dụng dãy micrô của Microsoft Kinect và một servo để hướng cô ấy theo hướng những người đang nói chuyện gần cô ấy.

Bước 1: Lý thuyết

Học thuyết
Học thuyết

Tính toán góc

Khi chúng ta nghe thấy điều gì đó, trừ khi tiếng ồn đó ở ngay trước mặt chúng ta, nó truyền đến tai này trước tai kia. Bộ não của chúng ta nhận thức được sự chậm trễ đến đó và chuyển nó thành một hướng chung mà tiếng ồn phát ra, cho phép chúng ta tìm ra nguồn gốc. Chúng tôi có thể đạt được cùng một loại bản địa hóa bằng cách sử dụng một cặp micrô. Hãy xem xét sơ đồ được hiển thị, trong đó có một cặp micrô và một nguồn âm thanh. Nếu chúng ta nhìn từ trên xuống, sóng âm thanh là hình tròn, nhưng nếu khoảng cách đến nguồn lớn so với khoảng cách giữa các micrô, thì theo quan điểm của các cảm biến của chúng ta, sóng gần như phẳng. Đây được gọi là giả định trường xa và đơn giản hóa hình học của bài toán của chúng ta.

Vì vậy, giả sử mặt sóng là một đường thẳng. Nếu âm thanh đến từ bên phải, nó sẽ chạm vào micrô # 2 tại thời điểm t2 và micrô # 1 tại thời điểm t1. Khoảng cách d mà âm thanh truyền được từ khi chạm vào micrô số 2 và micrô số 1 là chênh lệch thời gian phát hiện âm thanh nhân với tốc độ âm thanh v s:

d = v s * (t1-t2) = so với * Δt

Chúng ta có thể liên hệ khoảng cách này với khoảng cách d 12 giữa cặp micrô và góc θ từ cặp tới nguồn âm với mối quan hệ:

cos (θ) = d / d 12 = so với * Δt / d12

Bởi vì chúng tôi chỉ có hai micrô, sẽ có sự mơ hồ trong tính toán của chúng tôi về việc nguồn âm thanh ở phía trước hay phía sau chúng tôi. Trong hệ thống này, chúng tôi sẽ giả định rằng nguồn âm thanh ở phía trước của cặp và kẹp góc giữa 0 độ (hoàn toàn về bên phải của cặp) đến 180 độ (hoàn toàn về bên trái).

Cuối cùng, chúng ta có thể giải quyết vấn đề này bằng cách lấy cosin nghịch đảo:

θ = acos (so với * Δt / d12), 0 <= θ <= π

Để làm cho góc tự nhiên hơn một chút, chúng ta có thể trừ 90 độ từ theta, sao cho 0 độ nằm ngay phía trước cặp và +/- 90 độ là toàn bộ bên trái hoặc bên phải hoàn toàn. Điều này biến biểu thức của chúng ta từ cosin nghịch đảo thành sin nghịch đảo.

  • cos (θ-π / 2) = sin (θ) = d / d12 = vs * Δt / d12

  • θ = asin (so với * Δt / d12), -π / 2 <= θ <= π / 2

Tìm sự chậm trễ

Như bạn có thể thấy từ phương trình trên, tất cả những gì chúng ta cần giải cho góc là độ trễ của sóng âm đến micrô một so với micrô hai; tốc độ âm thanh và khoảng cách giữa các micrô đều cố định và được biết trước. Để thực hiện điều này, trước tiên chúng tôi lấy mẫu tín hiệu âm thanh ở tần số fs, chuyển đổi chúng từ tín hiệu tương tự sang kỹ thuật số và lưu trữ dữ liệu để sử dụng sau này. Chúng tôi lấy mẫu trong một khoảng thời gian được gọi là cửa sổ lấy mẫu, khoảng thời gian này đủ dài để nắm bắt các đặc điểm có thể phân biệt được của sóng âm thanh của chúng tôi. Ví dụ: cửa sổ của chúng tôi có thể là giá trị dữ liệu âm thanh của nửa giây cuối cùng.

Sau khi thu được tín hiệu âm thanh được cửa sổ, chúng tôi tìm ra độ trễ giữa hai tín hiệu bằng cách tính toán mối tương quan chéo của chúng. Để tính toán mối tương quan chéo, chúng tôi giữ cố định tín hiệu cửa sổ từ một micrô và trượt tín hiệu thứ hai dọc theo trục thời gian từ phía sau micrô đầu tiên đến hết phía trước micrô đầu tiên. Tại mỗi bước dọc theo trang trình bày của chúng tôi, chúng tôi nhân mỗi điểm trong tín hiệu cố định với điểm tương ứng trong tín hiệu trượt của chúng tôi, sau đó tổng hợp tất cả các kết quả để tính hệ số tương quan của chúng tôi cho bước đó. Sau khi hoàn thành trang trình bày của chúng tôi, bước có hệ số tương quan cao nhất tương ứng với điểm mà hai tín hiệu giống nhau nhất và bước mà chúng ta đang thực hiện cho chúng ta biết có bao nhiêu mẫu n tín hiệu hai được bù với tín hiệu 1. Nếu n âm, thì tín hiệu hai đang tụt hậu so với tín hiệu một, nếu nó tích cực thì tín hiệu hai ở phía trước và nếu nó bằng 0 thì cả hai đã được căn chỉnh. Chúng tôi chuyển đổi độ lệch mẫu này thành độ trễ thời gian bằng cách sử dụng tần số lấy mẫu của chúng tôi với quan hệ Δt = n / fs, do đó:

θ = asin (so với * n / (d12 * fs)), -π / 2 <= θ <= π / 2

Bước 2: Các thành phần

Các bộ phận

  • Microsoft Kinect cho Xbox 360, kiểu 1414 hoặc 1473. Kinect có bốn micrô được sắp xếp thành một mảng tuyến tính mà chúng tôi sẽ sử dụng.
  • Bộ chuyển đổi để chuyển đổi đầu nối độc quyền của Kinect sang USB + nguồn AC như thế này.
  • Raspberry Pi 2 hoặc 3 chạy Raspbian Stretch. Ban đầu tôi đã cố gắng sử dụng Pi 1 Model B +, nhưng nó không đủ mạnh. Tôi tiếp tục gặp sự cố khi ngắt kết nối khỏi Kinect.
  • Đầu ma-nơ-canh đáng sợ nhất mà bạn có thể tìm thấy
  • Một servo tương tự đủ mạnh để xoay đầu ma-nơ-canh của bạn
  • Bộ sạc tường USB 5V có cường độ dòng điện đủ để cấp nguồn cho cả Pi và servo và ít nhất hai cổng. (Tôi đã sử dụng phích cắm 5A 3 cổng tương tự như thế này
  • Một dây nối dài với hai ổ cắm (Một cho bộ sạc tường USB và một cho bộ chuyển đổi AC Kinect.
  • Hai cáp USB: một cáp loại A đến micro-USB để cấp nguồn cho Pi và một cáp khác để cấp nguồn cho servo mà bạn không ngại cắt bỏ
  • Một nền tảng để mọi thứ nằm trên và một nền tảng khác nhỏ hơn cho đầu ma-nơ-canh. Tôi đã sử dụng một khay phục vụ bằng nhựa làm cơ sở và một tấm nhựa làm bệ đỡ đầu. Cả hai đều đến từ Walmart và chỉ có giá vài đô la
  • 4x # 8-32 1/2 "bu lông và đai ốc để gắn servo của bạn vào nền tảng lớn hơn
  • Chốt 2x M3 8mm với vòng đệm (hoặc bất kỳ kích thước nào bạn cần để gắn còi servo của mình vào nền tảng nhỏ hơn)
  • Hai dây nhảy nam sang nam, một dây đỏ và một đen, và một dây nhảy nữ sang nam
  • Dải dán dính được hỗ trợ
  • Băng điện
  • Băng keo để quản lý cáp

Công cụ

  • Dremel với bánh xe cắt
  • Máy khoan
  • Mũi khoan 7/64 ", 11/16" và 5/16"
  • Vòi M3 (Tùy chọn, tùy thuộc vào còi servo của bạn)
  • Cái vặn vít
  • Hàn sắt với thuốc hàn
  • Giúp đỡ tay (tùy chọn)
  • Đánh dấu
  • Compa
  • Dụng cụ tuốt dây
  • Đồng hồ vạn năng (Tùy chọn)

PPE

  • Kính bảo vệ

  • Mặt nạ (đối với các miếng nhựa dremmel-ed).

Bước 3: Lắp ráp nền tảng dưới

Lắp ráp nền tảng thấp hơn
Lắp ráp nền tảng thấp hơn
Lắp ráp nền tảng thấp hơn
Lắp ráp nền tảng thấp hơn
Lắp ráp nền tảng thấp hơn
Lắp ráp nền tảng thấp hơn

Phần đầu tiên chúng tôi sẽ làm là nền tảng thấp hơn, sẽ chứa Kinect, servo và tất cả các thiết bị điện tử của chúng tôi. Để tạo nền tảng, bạn sẽ cần:

  • Khay phục vụ bằng nhựa
  • Servo
  • 4x # 8-32 1/2 "bu lông có đai ốc
  • Dremel với Bánh xe cắt
  • Cái vặn vít
  • Máy khoan
  • 11/16 "Bit khoan
  • Đánh dấu

Cách làm

  1. Lật ngược khay của bạn.
  2. Đặt servo của bạn sang một bên gần mặt sau của khay, đảm bảo bánh răng đầu ra của servo nằm dọc theo đường tâm của khay, sau đó đánh dấu xung quanh đế của servo.
  3. Sử dụng bánh mài và bánh xe cắt của bạn, cắt bỏ khu vực bạn đã đánh dấu, sau đó trượt servo của bạn vào khe của nó.
  4. Đánh dấu tâm của các lỗ gắn vỏ servo trên khay, sau đó tháo servo và khoan các lỗ đó bằng mũi khoan 11/16 "của bạn. Khi khoan lỗ rất dễ làm nứt lớp nhựa mỏng như thế này, vì vậy tôi thấy nó an toàn hơn nhiều chạy ngược lại mũi khoan và từ từ lấy đi vật liệu. Nó chậm hơn nhiều so với việc khoan các lỗ đúng cách nhưng đảm bảo rằng không có vết nứt.
  5. Đặt lại servo của bạn vào khe, sau đó lắp nó vào khay bằng các bu lông và đai ốc # 8-32.

Bước 4: Lắp ráp nền tảng trưởng

Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly
Head Platform Assembly

Phần tiếp theo chúng ta sẽ làm một nền tảng để kết nối đầu ma-nơ-canh với servo. Để tạo nền tảng đầu, bạn sẽ cần:

  • Tấm nhựa
  • Sừng Servo
  • 2x M3 bu lông 8mm với vòng đệm
  • Cái vặn vít
  • Máy khoan
  • Mũi khoan 7/64 "và 5/16"
  • Compa
  • Dremel với bánh xe cắt

Cách làm

  1. Đặt la bàn của bạn theo bán kính của đế của đầu ma-nơ-canh.
  2. Sử dụng la bàn của bạn để đánh dấu một vòng tròn có tâm ở giữa đĩa. Đây sẽ là kích thước thực tế của nền tảng đầu của chúng tôi.
  3. Sử dụng bánh mài và bánh xe cắt của bạn để cắt nền nhỏ hơn ra khỏi đĩa.
  4. Khoan lỗ trung tâm của nền tảng mới của bạn bằng một mũi khoan 5/16 ". Điều này sẽ cho chúng tôi quyền truy cập vào vít gắn còi servo với servo của chúng tôi. Để tạo sự ổn định cho nền tảng khi tôi khoan lỗ, tôi đã đặt một ống dây bên dưới nó và khoan qua tâm của ống chỉ.
  5. Đặt còi trợ động của bạn thẳng hàng với tâm của bệ và đánh dấu hai lỗ để gắn còi vào bệ. Đảm bảo các lỗ lắp này cách nhau đủ xa để có đủ chỗ cho đầu bu lông M3 và vòng đệm của bạn.
  6. Khoan các lỗ đã đánh dấu này bằng mũi khoan 7/64 ".
  7. Lỗ dưới của còi servo của tôi nhẵn, tức là nó không có ren cho bu lông M3. Vì vậy, tôi đã sử dụng máy khoan của mình và một vòi M3 để tạo các sợi chỉ.
  8. Sử dụng bu lông và vòng đệm để gắn còi servo vào bệ đầu.

Bước 5: Cáp nguồn Servo

Cáp nguồn Servo
Cáp nguồn Servo
Cáp nguồn Servo
Cáp nguồn Servo
Cáp nguồn Servo
Cáp nguồn Servo
Cáp nguồn Servo
Cáp nguồn Servo

Servos tương tự thường được cấp nguồn với 4,8-6V. Vì Raspberry Pi đã được cấp nguồn 5V từ USB, chúng tôi sẽ đơn giản hóa hệ thống của mình bằng cách cấp nguồn cho servo từ USB. Để làm như vậy, chúng tôi sẽ cần sửa đổi cáp USB. Để tạo cáp nguồn servo, bạn sẽ cần:

  • Cáp USB dự phòng có đầu loại A (loại cắm vào máy tính của bạn)
  • Một dây nhảy màu đỏ và một màu đen
  • Hàn sắt
  • Hàn
  • Dụng cụ tuốt dây
  • Băng điện
  • Giúp đỡ tay (tùy chọn)
  • Đồng hồ vạn năng (tùy chọn)

Cách làm

  1. Cắt đầu nối không phải USB loại A khỏi cáp của bạn, sau đó bóc một chút lớp cách điện để lộ bốn dây bên trong. Cắt bỏ lớp che chắn xung quanh các dây điện tiếp xúc.
  2. Thông thường, cáp USB sẽ có bốn dây: hai dây để truyền và nhận dữ liệu và hai dây để cấp nguồn và nối đất. Chúng tôi quan tâm đến nguồn điện và mặt đất, thường có màu đỏ và đen tương ứng. Tách một số lớp cách điện ra khỏi dây màu đỏ và đen và cắt dây màu xanh lá cây và màu trắng. Nếu lo lắng rằng bạn không có nguồn điện và dây nối đất chính xác, bạn có thể cắm cáp vào bộ chuyển đổi nguồn USB và kiểm tra điện áp đầu ra bằng đồng hồ vạn năng.
  3. Tiếp theo, cắt một đầu của dây cáp nhảy màu đỏ và đen của bạn và loại bỏ một số lớp cách điện.
  4. Bây giờ, hãy xoắn các dây màu đen lộ ra của cáp nối và cáp USB lại với nhau. Bắt chéo qua tâm của các dây tiếp xúc và xoắn chúng xung quanh nhau. Sau đó, bôi chất hàn vào các dây đã giao phối để giữ chúng lại với nhau. Giúp đỡ bạn sẽ làm điều này dễ dàng hơn bằng cách giữ dây cáp của bạn tại chỗ.
  5. Lặp lại bước 4 cho các dây màu đỏ.
  6. Che phần dây điện lộ ra ngoài bằng băng dính điện hoặc ống co nhiệt nếu bạn cảm thấy thích thú. Các mối nối này sẽ dễ vỡ vì dây rất nhỏ, vì vậy hãy thêm một lớp băng dính thứ hai giữ cáp jumper vào lớp cách điện bên ngoài của cáp USB. Điều này sẽ làm cho bộ phận lắp ráp cứng hơn và do đó ít có khả năng bị gãy hơn do bị cong.

Bước 6: Gắn thiết bị điện tử

Gắn thiết bị điện tử
Gắn thiết bị điện tử
Gắn thiết bị điện tử
Gắn thiết bị điện tử
Gắn thiết bị điện tử
Gắn thiết bị điện tử

Cuối cùng, chúng tôi sẽ kết hợp mọi thứ lại với nhau, gắn thiết bị điện tử của chúng tôi và mọi thứ khác vào nền tảng thấp hơn. Bạn sẽ cần:

  • Nền tảng thấp hơn
  • Nền tảng đầu
  • Đầu nộm
  • Kinect với bộ chuyển đổi USB + AC
  • Bộ chuyển đổi nguồn USB
  • Dây kéo dài
  • Cáp micro USB
  • Cáp nguồn Servo
  • Raspberry Pi
  • Cáp nhảy nam-nữ
  • Keo dán
  • Cây kéo

Cách làm

  1. Gắn Pi vào đáy khay bằng Velcro.
  2. Gắn bộ chuyển đổi nguồn USB với Velcro.
  3. Cắm servo và Pi vào bộ chuyển đổi nguồn USB.
  4. Kết nối chân 12 (GPIO18) của Pi với cáp tín hiệu của servo. Nó là chốt thứ 6 ở bên phải.
  5. Rắn dây nối của bạn qua tay cầm phía sau của khay và cắm bộ chuyển đổi nguồn USB vào một bên.
  6. Lấy bộ chuyển đổi Kinect USB + AC và cắm bộ đổi nguồn vào phía bên kia của dây nối và USB vào Pi.
  7. Rắn dây của Kinect qua tay cầm phía trước của khay và cắm vào bộ chuyển đổi Kinect.
  8. Tôi đã sử dụng băng keo để giữ các dây cáp vào mặt dưới của nền tảng. Điều này trông không phải là thanh lịch nhất, nhưng may mắn là tất cả điều này được che giấu.
  9. Lật mặt phải của nền và sử dụng Velcro để gắn Kinect vào mặt trước của nền.
  10. Sử dụng Velcro để gắn đầu ma-nơ-canh vào bệ đỡ đầu. Tuy nhiên, khi mọi thứ đã được sắp xếp thẳng hàng, hãy tách hai phần ra để chúng ta có thể tiếp cận vít gắn còi servo. Tuy nhiên, đừng vặn còi vào servo, vì trước tiên chúng ta cần đảm bảo rằng servo ở vị trí trung tâm của nó để chúng ta có thể sắp xếp mọi thứ. Chúng tôi sẽ thực hiện việc này trong bước sau.

Bước 7: Phần mềm và thuật toán

Phần mềm và Thuật toán
Phần mềm và Thuật toán

Tổng quat

Phần mềm cho dự án này được viết bằng C ++ và được tích hợp với Hệ điều hành Robot (ROS), một khuôn khổ để viết phần mềm người máy. Trong ROS, phần mềm của một hệ thống được chia thành một tập hợp các chương trình được gọi là các nút, trong đó mỗi nút thực hiện một tiểu mục cụ thể về chức năng của hệ thống. Dữ liệu được truyền giữa các nút bằng phương pháp xuất bản / đăng ký, trong đó các nút đang sản xuất dữ liệu sẽ xuất bản dữ liệu đó và các nút sử dụng dữ liệu đăng ký. Việc tách mã theo cách này cho phép dễ dàng mở rộng chức năng hệ thống và cho phép chia sẻ các nút giữa các hệ thống để phát triển nhanh hơn.

Trong hệ thống này, ROS chủ yếu được sử dụng để tách mã tính toán hướng đến (DOA) của nguồn âm thanh khỏi mã điều khiển servo, cho phép các dự án khác bao gồm ước tính Kinect DOA mà không bao gồm mã servo mà họ có thể không cần hoặc muốn. Nếu bạn muốn xem mã, bạn có thể tìm thấy mã này trên GitHub:

github.com/raikaDial/kinect_doa

Kinect DOA Node

Nút kinect_doa là phần thịt và xương của hệ thống này, về cơ bản làm mọi thứ thú vị. Khi khởi động, nó khởi tạo nút ROS, làm cho tất cả các điều kỳ diệu của ROS có thể thực hiện được, sau đó tải phần sụn lên Kinect để các luồng âm thanh có sẵn. Sau đó, nó tạo ra một chuỗi mới, mở các luồng âm thanh và bắt đầu đọc trong dữ liệu micrô. Kinect lấy mẫu bốn micrô của mình ở tần số 16 kHz mỗi micrô, do đó, rất tốt để có sự tương quan chéo và thu thập dữ liệu trong các chuỗi riêng biệt để tránh bị thiếu dữ liệu do tải tính toán. Giao tiếp với Kinect được thực hiện bằng cách sử dụng libfreenect, một trình điều khiển nguồn mở phổ biến.

Luồng thu thập thực hiện một hàm gọi lại bất cứ khi nào nhận được dữ liệu mới và cả hai đều lưu trữ dữ liệu và xác định thời điểm ước tính DOA. Dữ liệu từ mỗi micrô được lưu trữ trong bộ đệm cuộn có độ dài bằng với cửa sổ lấy mẫu của chúng tôi, ở đây là 8192 mẫu. Điều này có nghĩa là tính toán mối tương quan chéo với giá trị dữ liệu trong nửa giây vừa qua, những gì tôi nhận thấy qua thử nghiệm là sự cân bằng tốt giữa hiệu suất và tải tính toán. Ước tính DOA được kích hoạt cho mỗi 4096 mẫu bằng cách báo hiệu luồng chính, để các mối tương quan chéo liên tiếp trùng nhau 50%. Hãy xem xét một trường hợp không có sự chồng chéo và bạn tạo ra một tiếng ồn rất nhanh bị cửa sổ lấy mẫu cắt đôi. Trước và sau âm thanh đặc biệt của bạn có thể sẽ là tiếng ồn trắng, khó có thể phù hợp với mối tương quan chéo. Các cửa sổ chồng chéo cung cấp cho chúng ta một mẫu âm thanh hoàn chỉnh hơn, tăng độ tin cậy của mối tương quan chéo của chúng ta bằng cách cung cấp cho chúng ta các tính năng khác biệt hơn để sắp xếp.

Luồng chính đợi tín hiệu từ luồng thu thập, sau đó tính toán ước tính DOA. Tuy nhiên, trước tiên, nó kiểm tra xem các dạng sóng thu được có khác biệt đáng kể so với nhiễu trắng hay không. Nếu không có kiểm tra này, chúng tôi sẽ tính toán ước tính của mình bốn lần một giây bất kể có tiếng động thú vị hay không, và đầu ma-nơ-canh của chúng tôi sẽ là một mớ hỗn độn co cứng. Thuật toán phát hiện nhiễu trắng được sử dụng trong hệ thống này là thuật toán đầu tiên trong số hai thuật toán được liệt kê ở đây. Chúng tôi tính tỷ lệ của tích phân tuyệt đối của đạo hàm của dạng sóng của chúng tôi với tích phân tuyệt đối của nó; đối với các tín hiệu có hàm lượng nhiễu trắng cao, tỷ lệ này cao hơn so với các tín hiệu ít nhiễu hơn. Bằng cách đặt ngưỡng cho tỷ lệ này để tách tiếng ồn khỏi tiếng ồn không, chúng tôi có thể kích hoạt mối tương quan chéo chỉ khi thích hợp. Tất nhiên, tỷ lệ này là thứ phải được điều chỉnh lại mỗi khi hệ thống được chuyển sang một môi trường mới.

Sau khi xác định rằng các dạng sóng có chứa nội dung không nhiễu đáng kể, chương trình sẽ tiến hành các tương quan chéo. Tuy nhiên, có ba cách tối ưu hóa quan trọng được tích hợp trong các tính toán này:

  1. Có bốn micrô trên Kinect, nghĩa là có tổng cộng sáu cặp dạng sóng mà chúng ta có thể tương quan chéo. Tuy nhiên, nếu bạn nhìn vào cách sắp xếp không gian của dãy micro, bạn có thể thấy rằng các micro 2, 3 và 4 rất gần nhau. Trên thực tế, chúng rất gần nhau đến mức do tốc độ âm thanh và tần số lấy mẫu của chúng ta, các dạng sóng nhận được ở 2, 3 và 4 sẽ cách nhau nhiều nhất một mẫu ở phía trước hoặc phía sau, chúng ta có thể xác minh bằng phép tính maxlag = Δd * fs / vs, trong đó Δd là khoảng cách của cặp micrô, fs là tần số lấy mẫu và vs là tốc độ âm thanh. Do đó, các cặp tương quan giữa ba loại này là vô ích và chúng ta chỉ cần ghép micrô tương quan chéo 1 với 2, 3 và 4.
  2. Tương quan chéo tiêu chuẩn của tín hiệu âm thanh được biết là hoạt động kém khi có tiếng vang (tiếng vang). Một giải pháp thay thế mạnh mẽ được gọi là tương quan chéo tổng quát với biến đổi pha (GCC-PHAT). Phương pháp này kết hợp với việc áp dụng một hàm trọng số giúp khuếch đại các đỉnh trong mối tương quan chéo, giúp dễ dàng phân biệt tín hiệu gốc với tiếng vọng hơn. Tôi đã so sánh hiệu suất của GCC-PHAT với tương quan chéo đơn giản trong một buồng dội âm (đọc: phòng tắm bê tông đang được tu sửa) và nhận thấy GCC-PHAT hiệu quả hơn gấp 7 lần trong việc ước tính góc chính xác.
  3. Khi thực hiện tương quan chéo, chúng ta đang lấy hai tín hiệu trượt dọc theo nhau và ở mỗi bước nhân mỗi điểm trong tín hiệu cố định với mỗi điểm trong tín hiệu trượt của chúng ta. Đối với hai tín hiệu có độ dài n, điều này dẫn đến n ^ 2 phép tính. Thay vào đó, chúng ta có thể cải thiện điều này bằng cách thực hiện tương quan chéo trong miền tần số, bao gồm một phép biến đổi fourier nhanh (phép tính nlogn), nhân mỗi điểm trong một tín hiệu đã biến đổi với điểm tương ứng trong một điểm khác (n phép tính), sau đó thực hiện phép nghịch đảo biến đổi fourier để quay trở lại miền thời gian (phép tính nlogn), dẫn đến n + 2 * phép tính nlogn, nhỏ hơn n ^ 2. Tuy nhiên, đây là cách tiếp cận ngây thơ. Các micrô trong mảng của chúng tôi quá gần nhau và tốc độ âm thanh tương đối chậm nên các dạng sóng âm thanh gần như đã được căn chỉnh. Do đó, chúng ta có thể xác định mối tương quan chéo của mình để chỉ xem xét các hiệu số vượt lên phía trước hoặc phía sau một chút. Đối với micrô 1 và 4, độ trễ phải nằm trong khoảng +/- 12 mẫu, có nghĩa là đối với mỗi tương quan chéo, chúng tôi chỉ cần thực hiện phép tính 24 * n, dẫn đến tiết kiệm tính toán khi dạng sóng của chúng tôi dài hơn 2900 mẫu.

Hệ thống này tận dụng thư viện minidsp, thực hiện thuật toán GCC-PHAT với tối ưu hóa 3.

Sau khi tìm thấy độ trễ trong tín hiệu từ mỗi cặp micrô, chương trình sẽ chọn giá trị trung bình cho độ trễ, sử dụng giá trị đó để tính toán góc ước tính và xuất bản kết quả để có thể sử dụng nó để điều khiển servo.

Nút điều khiển Servo

So với nút kinect_doa, nút servo tương đối đơn giản. Công việc của nó là chỉ lấy DOA ước tính và di chuyển servo đến góc đó. Nó sử dụng thư viện wiringPi để truy cập vào mô-đun PWM phần cứng của Raspberry Pi, sử dụng nó để đặt góc của servo. Hầu hết các servo tương tự được điều khiển bởi tín hiệu PWM với độ rộng xung nằm trong khoảng từ 1000 µs đến 2000 µs, tương ứng với một góc từ 0 ° đến 180 °, nhưng servo tôi đã sử dụng được điều khiển với 500 µs đến 2500 µs, tương ứng với một góc từ 0 ° đến 270 °. Do đó, nút có thể được cấu hình cho các phần cứng servo khác nhau bằng cách thiết lập các thông số cho độ rộng xung tối thiểu, độ rộng xung tối đa và sự khác biệt giữa góc tối đa và góc tối thiểu. Ngoài ra, servo không di chuyển ngay lập tức đến góc mục tiêu, mà di chuyển về phía góc với tốc độ có thể định cấu hình, tạo cho Margaret cảm giác rùng rợn hơn (thêm vào đó, âm thanh của một servo di chuyển nhanh qua lại gây khó chịu rất nhanh).

Bước 8: Xây dựng và cài đặt

Cài đặt Phụ thuộc:

Đầu tiên, hãy cài đặt libfreenect. Chúng tôi phải xây dựng nó từ nguồn vì phiên bản bạn có thể tải xuống với trình quản lý gói không bao gồm hỗ trợ cho âm thanh. Điều này là do chúng tôi phải tải chương trình cơ sở lên Kinect để kích hoạt âm thanh và việc phân phối lại chương trình cơ sở này không hợp pháp ở một số khu vực pháp lý nhất định. Ngoài ra, chúng ta có thể tránh xây dựng các ví dụ yêu cầu OpenGL và quá phức tạp, không cần thiết đối với cài đặt Raspbian không đầu.

sudo apt-get install git cmake build-Essential libusb-1.0-0-dev

cd git clone https://github.com/OpenKinect/libfreenect cd libfreenect mkdir build cd build cmake.. -DCMAKE_BUILD_REDIST_PACKAGE = OFF -DCMAKE_BUILD_EXAMPLES = OFF make sudoct thực hiện cài đặt sudo cp ~ / libfreenect / platform / linux / udev.rules /etc/udev/rules.d udevadm control --reload-rules && udevadm trigger

Tiếp theo, chúng ta cần cài đặt gói wiringPi, cho phép chúng ta điều khiển các chân GPIO của Pi:

đĩa CD

git clone git: //git.drogon.net/wiringPi cd ~ / wiringPi./build

Đính kèm đầu ma nơ canh:

Với việc cài đặt wiringPi, giờ đây chúng ta có thể đi đường vòng nhanh chóng trở lại vùng đất phần cứng để gắn đầu ma-nơ-canh vào nền tảng thấp hơn. Để căn giữa servo qua dòng lệnh, hãy nhập các lệnh sau:

gpio pwm-ms

gpio pwmc 192 gpio pwmr 2000 gpio -g pwm 18 150

Nếu không có chuyển động, thì có thể servo của bạn đã được căn giữa. Tuy nhiên, để chắc chắn, bạn có thể đặt servo thành giá trị không ở giữa, ví dụ: gpio -g pwm 18 200, sau đó đặt nó trở lại 150.

Khi bạn đã chắc chắn rằng servo được căn giữa, hãy gắn còi servo của bệ đầu vào servo sao cho đầu ma-nơ-canh của bạn sẽ nhìn thẳng về phía trước. Sau đó, vặn còi vào servo và gắn đầu của bạn qua các bit Velcro.

Cài đặt ROS:

Tiếp theo, cài đặt ROS trên Pi của bạn. Hướng dẫn cài đặt tuyệt vời có thể được tìm thấy ở đây; đối với hệ thống của chúng tôi, chúng tôi không cần OpenCV, vì vậy bạn có thể bỏ qua bước 3. Quá trình xây dựng này sẽ mất vài giờ để hoàn thành. Khi hoàn tất theo hướng dẫn cài đặt, hãy thêm nguồn cài đặt vào bashrc của bạn để chúng tôi có thể sử dụng các gói ROS mới được cài đặt của chúng tôi:

echo "nguồn /opt/ros/kinetic/setup.bash" >> ~ /.bashrc

Xây dựng gói Kinect DOA:

Sau khi tất cả những gì đã hoàn thành, hãy tạo một không gian làm việc catkin cho dự án của chúng tôi và nhập thư mục src:

mkdir -p ~ / kinect_doa_ws / src

cd ~ / kinect_doa_ws / src

Mã cho dự án này được chứa trong gói kinect_doa, vì vậy hãy sao chép nó vào thư mục src của không gian làm việc mới của bạn:

git clone

Gói robot_upstart cung cấp một công cụ dễ sử dụng để cài đặt các tệp khởi chạy để chúng chạy khi khởi động, vì vậy cũng sao chép nó vào không gian làm việc của bạn:

git clone

Bây giờ, chúng tôi có thể xây dựng mã dự án bằng cách gọi catkin_make từ thư mục cấp cao nhất của không gian làm việc của chúng tôi, sau đó mã nguồn xây dựng của chúng tôi để các gói của chúng tôi có sẵn:

cd ~ / kinect_doa_ws

catkin_make echo "nguồn /home/pi/kinect_doa_ws/devel/setup.bash" >> ~ /.bashrc

Chạy và điều chỉnh:

Giả sử mọi thứ đã được cắm và bật nguồn, bây giờ bạn sẽ có thể khởi động hệ thống và có bản nhạc Kinect mà bạn nói! Tuy nhiên, nếu bạn có Kinect 1473, trước tiên hãy mở tệp ~ / kinect_doa_ws / src / kinect_doa / launcher / kinect_doa.launch trong trình soạn thảo văn bản và đặt tham số using_kinect_1473 thành true. Ngoài ra, nếu bạn sử dụng một servo khác với tôi đã làm, nó có thể là một servo tương tự tiêu chuẩn, Vì vậy, trong khi ở trong tệp khởi chạy, hãy thay đổi tham số min_us thành 1000, max_us thành 2000 và max_deg thành 180.

roslaunch kinect_doa kinect_doa.launch

Chơi với nó một lúc. Nếu bạn cảm thấy hệ thống quá nhạy cảm (nhìn theo các hướng ngẫu nhiên không tương ứng với giọng nói hoặc tiếng ồn đặc biệt), hãy thử thay đổi thông số white_noise_ratio trong tệp khởi chạy và khởi chạy lại hệ thống cho đến khi khả năng phản hồi ở mức bạn cảm thấy thoải mái.. Nâng cao tỷ lệ sẽ làm cho hệ thống kém phản hồi và ngược lại. Bạn có thể sẽ phải thực hiện điều chỉnh này bất cứ khi nào bạn di chuyển hệ thống đến một vị trí khác để có được hiệu suất như mong muốn.

Để khởi chạy chương trình khi bật Pi, chúng tôi sử dụng gói robot_upstart để cài đặt tệp khởi chạy của chúng tôi. Nếu ROS hiện không chạy, hãy khởi động nó bằng lệnh roscore. Sau đó, mở một thiết bị đầu cuối mới và cài đặt khởi chạy với:

rosrun robot_upstart cài đặt kinect_doa / khởi chạy / kinect_doa.launch - người dùng root --symlink

Chúng tôi tạo một liên kết tượng trưng cho tệp khởi chạy thay vì sao chép nó để chúng tôi có thể thay đổi các tham số bằng cách chỉnh sửa ~ / kinect_doa_ws / src / kinect_doa / launcher / kinect_doa.launch.

Bước 9: Ẩn nó tại văn phòng

Giấu nó tại văn phòng
Giấu nó tại văn phòng

Bây giờ cho phần thú vị. Tiếp tục làm việc sau nhiều giờ và chuẩn bị bí mật cho ma-nơ-canh của bạn. Sau đó, chỉ cần ngồi lại và xem mất bao lâu để đồng nghiệp của bạn bắt kịp! Tác phẩm mới của bạn được đảm bảo sẽ thay đổi một vài điều…

Đề xuất: