Isi kandungan:

Suara Melekatkan Kepala Manekin Dengan Kinect: 9 Langkah (dengan Gambar)
Suara Melekatkan Kepala Manekin Dengan Kinect: 9 Langkah (dengan Gambar)

Video: Suara Melekatkan Kepala Manekin Dengan Kinect: 9 Langkah (dengan Gambar)

Video: Suara Melekatkan Kepala Manekin Dengan Kinect: 9 Langkah (dengan Gambar)
Video: Kepala kamu kenapa? 2024, Julai
Anonim
Suara Melekatkan Kepala Manekin Dengan Kinect
Suara Melekatkan Kepala Manekin Dengan Kinect

Temui Margaret, dummy ujian untuk sistem pemantauan keletihan pemandu. Dia baru-baru ini bersara dari tugasnya dan sampai di ruang pejabat kami, dan sejak itu menarik perhatian mereka yang menganggapnya 'menyeramkan.' Demi kepentingan keadilan, saya telah memberinya kemampuan untuk menghadapi penuduh secara langsung; dan bukannya mengikutimu dengan pandangannya yang tidak berjiwa, sekarang dia benar-benar melakukannya. Sistem ini menggunakan susunan mikrofon Microsoft Kinect dan servo untuk mengarahkannya ke arah orang yang bercakap di dekatnya.

Langkah 1: Teori

Teori
Teori

Mengira Sudut

Apabila kita mendengar sesuatu, kecuali bunyi itu betul-betul di depan kita, ia akan sampai ke satu telinga sebelum yang lain. Otak kita merasakan bahawa kelewatan kedatangan dan mengubahnya menjadi arah umum dari mana bunyi datang, membolehkan kita mencari sumbernya. Kita dapat mencapai penyetempatan yang sama dengan menggunakan sepasang mikrofon. Pertimbangkan gambar rajah yang ditunjukkan, yang mengandungi pasangan mikrofon dan sumber suara. Sekiranya kita melihat dari atas ke bawah, gelombang bunyi berbentuk bulat, tetapi jika jarak ke sumbernya besar berbanding jarak antara mikrofon, maka dari sudut pandang sensor kita, gelombang kira-kira datar. Ini dikenali sebagai andaian jarak jauh dan mempermudah geometri masalah kita.

Oleh itu, anggap bahagian hadapan gelombang adalah garis lurus. Sekiranya suaranya datang dari kanan, ia akan menekan mikrofon # 2 pada waktu t2 dan mikrofon # 1 pada waktu t1. Jarak d suara yang dilalui antara menekan mikrofon # 2 dan mikrofon # 1 adalah perbezaan waktu dalam mengesan bunyi dikalikan dengan kelajuan suara v:

d = v s * (t1-t2) = vs * Δt

Kita dapat mengaitkan jarak ini dengan jarak d 12 antara pasangan mikrofon dan sudut θ dari pasangan ke sumber bunyi dengan hubungan:

cos (θ) = d / d 12 = vs * Δt / d12

Oleh kerana kita hanya mempunyai dua mikrofon, maka akan ada kesamaran dalam pengiraan kita mengenai apakah sumber suara berada di depan atau di belakang kita. Dalam sistem ini, kita akan menganggap bahawa sumber suara berada di hadapan pasangan dan menjepit sudut antara 0 darjah (sepenuhnya di sebelah kanan pasangan) hingga 180 darjah (sepenuhnya ke kiri).

Akhirnya, kita dapat menyelesaikan theta dengan mengambil kosinus terbalik:

θ = acos (vs * Δt / d12), 0 <= θ <= π

Untuk menjadikan sudut sedikit lebih semula jadi, kita boleh mengurangkan 90 darjah dari theta, sehingga 0 darjah berada tepat di depan pasangan dan +/- 90 darjah adalah kiri penuh atau kanan penuh. Ini mengubah ungkapan kita dari kosinus songsang menjadi sinus terbalik.

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

Mencari Kelewatan

Seperti yang anda dapat lihat dari persamaan di atas, yang perlu kita selesaikan untuk sudut adalah kelewatan gelombang suara yang tiba di mikrofon berbanding mikrofon dua; kelajuan suara dan jarak antara mikrofon tetap dan diketahui. Untuk mencapai ini, pertama-tama kami mengambil contoh isyarat audio pada frekuensi fs, menukarnya dari analog ke digital dan menyimpan data untuk digunakan kemudian. Kami mengambil sampel untuk jangka masa yang dikenali sebagai sampling window, yang cukup lama untuk menangkap ciri-ciri gelombang suara kita yang dapat dibezakan. Sebagai contoh, tetingkap kami boleh menjadi data audio bernilai setengah saat terakhir.

Setelah mendapat isyarat audio yang di tingkap, kami mendapati kelewatan antara keduanya dengan mengira korelasi silang mereka. Untuk menghitung korelasi silang, kita menahan isyarat tingkap dari satu mikrofon tetap, dan meluncurkan isyarat kedua di sepanjang paksi masa dari semua jalan di belakang yang pertama hingga ke jalan yang lebih awal daripada yang pertama. Pada setiap langkah di sepanjang slaid kita mengalikan setiap titik dalam isyarat tetap kita dengan titik yang sepadan dalam isyarat gelongsor kita, kemudian menjumlahkan semua hasil untuk menghitung pekali korelasi kita untuk langkah itu. Setelah melengkapkan slaid kami, langkah yang mempunyai pekali korelasi tertinggi sepadan dengan titik di mana kedua-dua isyarat paling serupa, dan langkah apa yang kita sampaikan memberitahu kita berapa banyak sampel n isyarat dua yang diimbangi dari isyarat 1. Jika n negatif, maka isyarat dua ketinggalan dari isyarat satu, jika positif maka isyarat dua berada di depan, dan jika sifar maka keduanya sudah sejajar. Kami menukar offset sampel ini menjadi kelewatan masa menggunakan frekuensi persampelan kami dengan hubungan Δt = n / fs, dengan demikian:

θ = asin (vs * n / (d12 * fs)), -π / 2 <= θ <= π / 2

Langkah 2: Komponen

Bahagian

  • Microsoft Kinect untuk Xbox 360, model 1414 atau 1473. Kinect mempunyai empat mikrofon yang disusun dalam array linear yang akan kita gunakan.
  • Adaptor untuk menukar penyambung proprietari Kinect ke kuasa USB + AC seperti ini.
  • Raspberry Pi 2 atau 3 menjalankan Raspbian Stretch. Saya pada awalnya cuba menggunakan Model B 1 Pi 1, tetapi tidak cukup kuat. Saya terus mengalami masalah memutuskan sambungan dari Kinect.
  • Kepala manekin paling menyeramkan yang anda dapati
  • Servo analog cukup kuat untuk mengubah kepala manekin anda
  • Pengecas dinding USB 5V dengan ampere yang mencukupi untuk memberi kuasa kepada Pi dan servo dan sekurang-kurangnya dua port. (Saya menggunakan palam 3-port 5A yang serupa dengan ini
  • Kabel sambungan dengan dua soket (Satu untuk pengecas dinding USB dan satu lagi untuk penyesuai Kinect AC.
  • Dua kabel USB: kabel jenis-A hingga mikro-USB untuk menghidupkan Pi dan yang lain untuk memberi kuasa kepada servo yang anda tidak keberatan memotongnya
  • Platform untuk semua duduk dan platform lain yang lebih kecil untuk kepala manekin. Saya menggunakan dulang hidangan plastik sebagai pangkalan dan plat plastik sebagai pelantar kepala. Kedua-duanya berasal dari Walmart dan hanya berharga beberapa dolar
  • Baut dan mur 4x # 8-32 1/2 "untuk memasang servo anda ke platform yang lebih besar
  • Baut 2x M3 8mm dengan mesin basuh (atau saiz apa pun yang anda perlukan untuk memasang tanduk servo anda ke platform yang lebih kecil)
  • Dua wayar pelompat lelaki-ke-lelaki, satu merah dan satu hitam, dan satu wayar pelompat wanita-ke-lelaki
  • Jalur Velcro yang disokong pelekat
  • Pita elektrik
  • Pita saluran untuk pengurusan kabel

Alat

  • Dremel dengan roda pemotong
  • Gerudi
  • Bit gerudi 7/64 ", 11/16", dan 5/16"
  • Ketik M3 (Pilihan, bergantung pada tanduk servo anda)
  • Pemutar skru
  • Pateri dengan solder
  • Tangan menolong (pilihan)
  • Penanda
  • Kompas
  • Pelucut wayar
  • Multimeter (Pilihan)

PPE

  • Kacamata Keselamatan

  • Topeng Muka (untuk bit plastik edemmel).

Langkah 3: Pemasangan Platform Rendah

Perhimpunan Platform Bawah
Perhimpunan Platform Bawah
Perhimpunan Platform Bawah
Perhimpunan Platform Bawah
Perhimpunan Platform Bawah
Perhimpunan Platform Bawah

Bahagian pertama yang akan kami buat adalah platform bawah, yang akan memegang Kinect, servo, dan semua elektronik kami. Untuk membuat platform, anda memerlukan:

  • Dulang Servis Plastik
  • Servo
  • 4x # 8-32 1/2 "selak dengan kacang
  • Dremel dengan Cutting Wheel
  • Pemutar skru
  • Gerudi
  • 11/16 "Mata Bor
  • Penanda

Bagaimana cara untuk membuat

  1. Balikkan dulang anda terbalik.
  2. Letakkan servo anda di sebelah belakang dulang, pastikan gear output servo terletak di sepanjang garis tengah dulang, kemudian tandakan di sekitar pangkal servo.
  3. Dengan menggunakan dremel dan roda pemotong anda, potong kawasan yang anda tandakan, kemudian masukkan servo anda ke dalam slotnya.
  4. Tandakan pusat lubang pemasangan servo pada dulang, kemudian keluarkan servo dan buka lubang tersebut dengan gerudi 11/16 "anda. Sangat mudah untuk memecahkan plastik nipis seperti ini semasa menggerudi lubang, jadi saya rasa jauh lebih selamat untuk menjalankan gerudi secara terbalik dan perlahan-lahan mengasingkan bahan. Jauh lebih perlahan daripada menggerudi lubang dengan betul tetapi memastikan tidak ada keretakan.
  5. Letakkan servo anda kembali ke dalam slot, kemudian pasangkannya ke dulang dengan baut dan mur # 8-32.

Langkah 4: Perhimpunan Platform Ketua

Perhimpunan Platform Ketua
Perhimpunan Platform Ketua
Perhimpunan Platform Ketua
Perhimpunan Platform Ketua
Perhimpunan Platform Ketua
Perhimpunan Platform Ketua
Perhimpunan Platform Ketua
Perhimpunan Platform Ketua

Bahagian seterusnya yang akan kita buat akan menjadi platform untuk menghubungkan kepala manekin ke servo. Untuk membuat platform kepala, anda memerlukan:

  • Plat plastik
  • Tanduk servo
  • Selak 2x M3 8mm dengan mesin basuh
  • Pemutar skru
  • Gerudi
  • Bit gerudi 7/64 "dan 5/16"
  • Kompas
  • Dremel dengan roda pemotong

Bagaimana cara untuk membuat

  1. Tetapkan kompas anda ke jejari pangkal kepala manekin anda.
  2. Gunakan kompas anda untuk menandakan bulatan yang berpusat di tengah pinggan. Ini akan menjadi ukuran sebenar platform kepala kita.
  3. Gunakan roda pemotong dan pemotong anda untuk memotong pelantar yang lebih kecil dari piring.
  4. Bor pusat platform baru anda dengan bit gerudi 5/16 ". Ini akan memberi kita akses ke skru yang memasang tanduk servo ke servo kita. Untuk memberikan kestabilan platform ketika saya menggerudi lubang, saya meletakkan gulungan wayar di bawahnya dan digerudi melalui pusat gelendong.
  5. Sejajarkan tanduk servo anda dengan bahagian tengah platform dan tandakan dua lubang untuk memasang tanduk ke platform. Pastikan lubang pelekap ini cukup jauh sehingga terdapat ruang untuk kepala dan pencuci bolt M3 anda.
  6. Lubang lubang yang ditandakan ini dengan gerudi 7/64 ".
  7. Lubang bawah tanduk servo saya licin, iaitu tidak mempunyai benang untuk bolt M3. Oleh itu, saya menggunakan gerudi saya dan paip M3 untuk membuat utas.
  8. Gunakan selak dan mesin basuh untuk memasang tanduk servo ke pelantar kepala.

Langkah 5: Kabel Kuasa Servo

Kabel Kuasa Servo
Kabel Kuasa Servo
Kabel Kuasa Servo
Kabel Kuasa Servo
Kabel Kuasa Servo
Kabel Kuasa Servo
Kabel Kuasa Servo
Kabel Kuasa Servo

Servo analog biasanya dikuasakan dengan 4.8-6V. Oleh kerana Raspberry Pi sudah dikuasakan oleh 5V dari USB, kami akan mempermudah sistem kami dengan juga menghidupkan servo dari USB. Untuk melakukannya, kita perlu mengubahsuai kabel USB. Untuk membuat kabel kuasa servo, anda memerlukan:

  • Kabel USB ganti dengan hujung jenis-A (jenis yang dipasang ke komputer anda)
  • Satu wayar pelompat merah dan satu
  • Besi pematerian
  • Pateri
  • Pelucut wayar
  • Pita elektrik
  • Tangan menolong (pilihan)
  • Multimeter (pilihan)

Bagaimana cara untuk membuat

  1. Potong penyambung bukan USB jenis-A dari kabel anda, kemudian lepaskan sedikit penebat untuk mendedahkan empat wayar dalaman. Potong pelindung yang mengelilingi wayar yang terdedah.
  2. Biasanya kabel USB akan mempunyai empat wayar: dua untuk penghantaran dan penerimaan data dan dua untuk kuasa dan pembumian. Kami berminat dengan daya dan tanah, yang masing-masing berwarna merah dan hitam. Tanggalkan sebahagian penebat dari wayar merah dan hitam dan potong wayar hijau dan putih. Sekiranya anda bimbang bahawa anda tidak mempunyai kabel kuasa dan kabel tanah yang betul, anda boleh memasang kabel anda ke penyesuai kuasa USB dan memeriksa voltan keluaran dengan multimeter.
  3. Seterusnya, potong satu hujung kabel pelompat merah dan hitam anda dan lepaskan sebahagian penebatnya.
  4. Sekarang, putar kabel hitam pelindung dan kabel USB yang terdedah. Melintasi pusat wayar yang terdedah dan memutarnya antara satu sama lain. Kemudian, sapukan pateri pada wayar yang dikawan untuk menyatukannya. Menolong tangan akan menjadikannya lebih mudah dengan memegang kabel anda di tempatnya.
  5. Ulangi langkah 4 untuk wayar merah.
  6. Tutup pendawaian yang terdedah dengan pita elektrik, atau tiub pengecutan panas jika anda merasa mewah. Sambungan ini akan rapuh kerana wayarnya sangat kecil, jadi tambahkan pita lapisan kedua yang memegang kabel pelompat ke penebat luar kabel USB. Ini akan menjadikan pemasangan lebih kaku dan dengan itu cenderung tidak patah daripada bengkok.

Langkah 6: Pemasangan Elektronik

Pemasangan Elektronik
Pemasangan Elektronik
Pemasangan Elektronik
Pemasangan Elektronik
Pemasangan Elektronik
Pemasangan Elektronik

Akhirnya, kami akan menyatukan semuanya, memasangkan elektronik dan semua yang lain ke platform yang lebih rendah. Anda perlu:

  • Platform yang lebih rendah
  • Pelantar kepala
  • Kepala manekin
  • Kinect dengan penyesuai USB + AC
  • Penyesuai kuasa USB
  • Kord lanjutan
  • Kabel USB mikro
  • Kabel kuasa servo
  • Pai raspberi
  • Kabel pelompat Lelaki-ke-Perempuan
  • Velcro pelekat
  • Gunting

Bagaimana cara untuk membuat

  1. Pasang Pi ke bahagian bawah dulang dengan Velcro.
  2. Pasang penyesuai kuasa USB dengan Velcro.
  3. Pasang servo dan Pi ke penyesuai kuasa USB.
  4. Sambungkan pin 12 (GPIO18) Pi ke kabel isyarat servo. Ia adalah pin ke-6 di sebelah kanan.
  5. Pasang tali pelanjutan anda melalui pemegang belakang dulang dan pasangkan penyesuai kuasa USB ke satu sisi.
  6. Ambil penyesuai Kinect USB + AC dan pasangkan penyesuai kuasa ke bahagian lain dari kabel sambungan dan USB ke dalam Pi.
  7. Pasang tali Kinect melalui pemegang depan dulang dan pasangkan ke penyesuai Kinect.
  8. Saya menggunakan pita saluran untuk menahan kabel ke bahagian bawah platform. Ini tidak kelihatan paling elegan, tetapi untungnya semua ini tersembunyi.
  9. Balik platform ke kanan ke atas dan gunakan Velcro untuk memasang Kinect ke bahagian depan platform.
  10. Gunakan Velcro untuk memasang kepala manekin ke platform kepala. Setelah semuanya berbaris, pisahkan kedua-dua kepingan itu sehingga kita dapat mengakses skru pelekap servo tanduk. Namun, jangan memasang tanduk ke servo, kerana kita perlu memastikan servo berada di kedudukan tengahnya terlebih dahulu sehingga kita dapat mengatur semuanya. Kami akan melakukan ini kemudian.

Langkah 7: Perisian dan Algoritma

Perisian dan Algoritma
Perisian dan Algoritma

Gambaran keseluruhan

Perisian untuk projek ini ditulis dalam C ++ dan disatukan dengan Robot Operating System (ROS), kerangka kerja untuk menulis perisian robotik. Di ROS, perisian untuk sistem dipecah menjadi kumpulan program yang disebut node, di mana setiap node melaksanakan subseksyen tertentu dari fungsi sistem. Data disalurkan antara node menggunakan kaedah penerbitan / langganan, di mana node yang menghasilkan data menerbitkannya dan nod yang menggunakan data melanggannya. Memisahkan kod dengan cara ini membolehkan fungsi sistem diperluas dengan mudah, dan membolehkan nod dikongsi antara sistem untuk pengembangan yang lebih cepat.

Dalam sistem ini, ROS digunakan terutamanya untuk memisahkan kod yang mengira arah kedatangan (DOA) sumber suara dari kod yang mengawal servo, yang membolehkan projek lain memasukkan anggaran Kinect DOA tanpa memasukkan kod servo yang mungkin tidak mereka perlukan atau inginkan. Sekiranya anda ingin melihat kod itu sendiri, ia boleh didapati di GitHub:

github.com/raikaDial/kinect_doa

Kinect DOA Node

Node kinect_doa adalah daging dan tulang sistem ini, yang pada dasarnya melakukan semua perkara yang menarik. Semasa memulakan, ia memulakan simpul ROS, menjadikan semua keajaiban ROS mungkin, kemudian memuat naik firmware ke Kinect sehingga aliran audio tersedia. Ini kemudian menelurkan benang baru yang membuka aliran audio dan mula membaca dalam data mikrofon. Kinect mengambil sampel empat mikrofonnya pada frekuensi 16 kHz masing-masing, jadi ada baiknya hubungan silang dan pengumpulan data dalam rangkaian berasingan untuk mengelakkan kehilangan data kerana beban komputasi. Berinteraksi dengan Kinect dicapai menggunakan libfreenect, pemacu sumber terbuka yang popular.

Thread pengumpulan melaksanakan fungsi callback setiap kali data baru diterima, dan keduanya menyimpan data dan menentukan kapan untuk menganggar DOA. Data dari setiap mikrofon disimpan dalam penyangga bergulir yang panjangnya sama dengan tetingkap pensampelan kami, yang berikut adalah 8192 sampel. Ini diterjemahkan untuk mengira korelasi silang dengan kira-kira setengah detik data terakhir, yang saya dapati melalui eksperimen untuk menjadi keseimbangan yang baik antara prestasi dan beban pengiraan. Anggaran DOA dipicu untuk setiap 4096 sampel dengan memberi isyarat pada utas utama, sehingga korelasi silang berturut-turut bertindih sebanyak 50%. Pertimbangkan kes di mana tidak ada pertindihan, dan anda membuat bunyi yang sangat cepat yang dipotong separuh oleh tetingkap pensampelan. Sebelum dan selepas bunyi khas anda mungkin bunyi putih, yang sukar untuk diselaraskan dengan korelasi silang. Tingkap bertindih memberi kita contoh suara yang lebih lengkap, meningkatkan kebolehpercayaan silang hubungan kita dengan memberi kita lebih banyak ciri yang berbeza untuk diselaraskan.

Benang utama menunggu isyarat dari utas koleksi, kemudian mengira anggaran DOA. Pertama, ia memeriksa sama ada bentuk gelombang yang ditangkap berbeza atau tidak dengan bunyi putih. Tanpa pemeriksaan ini, kami akan mengira anggaran kami empat kali sesaat tanpa mengira sama ada terdapat bunyi yang menarik atau tidak, dan kepala manekin kami akan menjadi kekacauan spastik. Algoritma pengesanan bunyi putih yang digunakan dalam sistem ini adalah yang pertama dari dua yang disenaraikan di sini. Kami mengira nisbah kamiran mutlak dari terbitan gelombang kami dengan kamiran mutlaknya; untuk isyarat dengan kandungan bunyi putih tinggi nisbah ini lebih tinggi daripada isyarat yang kurang bising. Dengan menetapkan ambang untuk nisbah ini yang memisahkan kebisingan dari bukan suara, kita dapat memicu korelasi silang hanya bila sesuai. Sudah tentu, nisbah ini adalah sesuatu yang harus ditala semula setiap kali sistem dipindahkan ke persekitaran baru.

Setelah menentukan bahawa bentuk gelombang mengandungi kandungan bukan bunyi yang ketara, program ini meneruskan hubungan silang. Terdapat tiga pengoptimuman penting yang terdapat dalam pengiraan ini:

  1. Terdapat empat mikrofon di Kinect, yang bermaksud ada enam pasang bentuk gelombang yang dapat kita kaitkan silang. Walau bagaimanapun, jika anda melihat susunan spatial array mikrofon, anda dapat melihat bahawa mikrofon 2, 3, dan 4 sangat dekat satu sama lain. Sebenarnya, keduanya sangat dekat sehingga kerana kelajuan suara dan frekuensi pensampelan kita, bentuk gelombang yang diterima pada 2, 3, dan 4 akan dipisahkan oleh paling banyak satu sampel di depan atau di belakang, yang dapat kita sahkan dengan pengiraan maxlag = Δd * fs / vs, di mana Δd adalah pemisahan pasangan mikrofon, fs adalah frekuensi pensampelan, dan vs adalah kelajuan suara. Oleh itu, menghubungkan pasangan antara ketiga-tiga ini tidak berguna, dan kita hanya perlu menghubungkan mikrofon 1 dengan 2, 3, dan 4.
  2. Hubungan silang piawai isyarat audio diketahui berprestasi rendah apabila terdapat gema (echos). Alternatif yang kuat dikenali sebagai korelasi silang umum dengan transformasi fasa (GCC-PHAT). Kaedah ini berkembang untuk menerapkan fungsi pemberat yang menguatkan puncak dalam korelasi silang, menjadikannya lebih mudah untuk membezakan isyarat asal dari echos. Saya membandingkan prestasi GCC-PHAT dengan korelasi silang yang sederhana di ruang gema (baca: bilik mandi konkrit sedang diubah suai), dan mendapati GCC-PHAT 7 kali lebih berkesan dalam menganggarkan sudut yang betul.
  3. Semasa melakukan korelasi silang, kita mengambil dua isyarat, meluncur satu di sepanjang yang lain, dan pada setiap langkah mengalikan setiap titik dalam isyarat tetap kita dengan setiap titik dalam isyarat gelongsor kita. Untuk dua isyarat panjang n, ini menghasilkan pengiraan n ^ 2. Kami dapat memperbaikinya dengan melakukan korelasi silang dalam domain frekuensi, yang melibatkan transformasi Fourier cepat (pengiraan nlogn), mengalikan setiap titik dalam satu isyarat yang diubah dengan titik yang sesuai di titik yang lain (pengiraan n), kemudian melakukan pembalikan transformasi Fourier untuk kembali ke domain waktu (pengiraan nlogn), menghasilkan pengiraan n + 2 * nlogn, kurang dari n ^ 2. Namun, ini adalah pendekatan naif. Mikrofon dalam susunan kami begitu rapat dan kelajuan bunyi agak perlahan sehingga bentuk gelombang audio sudah selari. Oleh itu, kita dapat menjalin hubungan silang-silang kita untuk hanya mempertimbangkan ofset yang sedikit ke depan atau di belakang. Untuk mikrofon 1 dan 4, jeda mesti berada di antara +/- 12 sampel, yang bermaksud untuk setiap korelasi silang, kita hanya perlu melakukan pengiraan 24 * n, yang menghasilkan penjimatan komputasi apabila bentuk gelombang kita lebih panjang daripada 2900 sampel.

Sistem ini memanfaatkan perpustakaan minidsp, yang menerapkan algoritma GCC-PHAT dengan pengoptimuman 3.

Setelah menemui jeda pada isyarat dari setiap pasangan mikrofon, program ini memilih nilai median untuk ketinggian, menggunakannya untuk mengira anggaran sudut, dan menerbitkan hasilnya sehingga dapat digunakan untuk mengendalikan servo.

Nod Kawalan Servo

Berbanding dengan kinect_doa node, servo node agak mudah. Tugasnya adalah hanya mengambil DOA yang dianggarkan dan memindahkan servo ke sudut itu. Ia menggunakan perpustakaan wiringPi untuk mengakses modul PWM perkakasan Raspberry Pi, menggunakannya untuk mengatur sudut servo. Sebilangan besar servo analog dikendalikan oleh isyarat PWM dengan lebar nadi antara 1000 µs hingga 2000 µs, sepadan dengan sudut 0 ° hingga 180 °, tetapi servo yang saya gunakan dikendalikan dengan 500 µs hingga 2500 µs, sesuai dengan sudut dari 0 ° hingga 270 °. Oleh itu, simpul dapat dikonfigurasi untuk perkakasan servo yang berbeza dengan menetapkan parameter untuk lebar denyut minimum, lebar denyut maksimum, dan perbezaan antara sudut maksimum dan minimum. Selain itu, servo tidak langsung bergerak ke sudut sasaran, tetapi bergerak ke arah sudut pada kelajuan yang dapat dikonfigurasi, memberikan Margaret getaran yang lebih beransur-ansur dan menyeramkan (ditambah, suara servo bergerak cepat bolak-balik menjadi menjengkelkan dengan sangat cepat).

Langkah 8: Bina dan Pemasangan

Pasang Tanggungan:

Pertama, pasang libfreenect. Kami harus membuatnya dari sumber kerana versi yang anda dapat dengan pengurus pakej tidak termasuk sokongan untuk audio. Ini kerana kita mesti memuat naik firmware ke Kinect untuk mengaktifkan audio, dan mengedarkan firmware ini tidak sah di bidang kuasa tertentu. Selain itu, kita tidak boleh membina contoh yang memerlukan OpenGL dan kekenyangan, tidak perlu untuk pemasangan Raspbian tanpa kepala.

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 buat sudo buat pasang sudo cp ~ / libfreenect / platform / linux / platform / linux / linux / platform / linux.rules /etc/udev/rules.d udevadm control --reload-Rules && udevadm trigger

Seterusnya, kita perlu memasang pakej wiringPi, yang membolehkan kita mengawal pin GPIO Pi:

cd

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

Pasang Kepala Manekin:

Dengan pemasangan wiringPi, kita sekarang dapat mengambil jalan memutar cepat ke tanah perkakasan untuk memasang kepala manekin ke platform bawah. Untuk memusatkan servo melalui baris perintah, masukkan perintah berikut:

gpio pwm-ms

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

Sekiranya tidak ada pergerakan, maka servo anda mungkin sudah berpusat. Yang pasti, anda boleh menetapkan servo ke nilai bukan pusat, mis. gpio -g pwm 18 200, kemudian tetapkan semula ke 150.

Sebaik sahaja anda yakin servo berpusat, pasangkan tanduk servo platform kepala ke servo sehingga kepala manekin anda akan kelihatan lurus ke depan. Kemudian, pasangkan tanduk ke servo dan pasangkan kepala anda melalui bit Velcro.

Pasang ROS:

Seterusnya, pasang ROS pada Pi anda. Panduan pemasangan yang hebat boleh didapati di sini; untuk sistem kami, kami tidak memerlukan OpenCV, jadi anda boleh melangkau langkah 3. Pembinaan ini akan memakan masa beberapa jam untuk disiapkan. Setelah selesai mengikuti panduan pemasangan, tambahkan sumber pemasangan ke bashrc anda supaya kami dapat menggunakan pakej ROS kami yang baru dipasang:

echo "sumber /opt/ros/kinetic/setup.bash" >> ~ /.bashrc

Pakej Build Kinect DOA:

Setelah semua selesai, buat ruang kerja catkin untuk projek kami dan masukkan direktori src:

mkdir -p ~ / kinect_doa_ws / src

cd ~ / kinect_doa_ws / src

Kod untuk projek ini terdapat dalam pakej kinect_doa, jadi klon ke direktori src ruang kerja baru anda:

git klon

Pakej robot_upstart menyediakan alat yang mudah digunakan untuk memasang fail pelancaran sehingga mereka berjalan pada permulaan, jadi juga klon ini ke ruang kerja anda:

git klon

Sekarang, kita dapat membina kod projek dengan memanggil catkin_make dari direktori tingkat atas ruang kerja kita, kemudian sumber bina kami sehingga pakej kami tersedia:

cd ~ / kinect_doa_ws

catkin_make echo "source /home/pi/kinect_doa_ws/devel/setup.bash" >> ~ /.bashrc

Berlari dan Menala:

Dengan andaian semuanya terpasang dan dihidupkan, anda seharusnya dapat melancarkan sistem dan mempunyai Kinect track yang anda suarakan! Walau bagaimanapun, jika anda mempunyai Kinect 1473, pertama-tama buka fail ~ / kinect_doa_ws / src / kinect_doa / launch / kinect_doa.lancarkan di editor teks dan tetapkan parameter menggunakan_kinect_1473 menjadi benar. Selain itu, jika anda menggunakan servo yang berbeza daripada yang saya lakukan, ini mungkin servo analog standard, Jadi semasa dalam fail pelancaran, ubah parameter min_us menjadi 1000, max_us ke 2000, dan max_deg menjadi 180.

roslaunch kinect_doa kinect_doa.launch

Bermain dengannya sebentar. Sekiranya anda merasakan sistem ini terlalu sensitif (melihat ke arah rawak yang tidak sesuai dengan suara atau suara khas), cuba ubah parameter white_noise_ratio dalam fail pelancaran dan lancarkan semula sistem sehingga responsif berada pada tahap yang anda inginkan. Meningkatkan nisbah akan menjadikan sistem kurang responsif dan sebaliknya. Anda mungkin perlu melakukan penalaan ini setiap kali anda memindahkan sistem ke lokasi lain untuk mendapatkan prestasi yang anda mahukan.

Untuk melancarkan program semasa kami menghidupkan Pi, kami menggunakan paket robot_upstart untuk memasang fail pelancaran kami. Sekiranya ROS tidak berjalan, mulakan dengan perintah roscore. Kemudian, buka terminal baru dan pasang pelancaran dengan:

rosrun robot_upart install kinect_doa / launch / kinect_doa.launch - root pengguna --symlink

Kami membuat symlink ke fail pelancaran dan bukannya menyalinnya sehingga kami dapat mengubah parameter dengan mengedit ~ / kinect_doa_ws / src / kinect_doa / launch / kinect_doa.launch.

Langkah 9: Menyembunyikannya di Pejabat

Menyembunyikannya di Pejabat
Menyembunyikannya di Pejabat

Sekarang untuk bahagian yang menyeronokkan. Pergi ke tempat kerja selepas berjam-jam dan tetapkan kepala manekin anda secara rahsia. Kemudian duduk dan lihat berapa lama masa yang diperlukan rakan sekerja anda! Anda ciptaan baru dijamin akan menoleh …

Disyorkan: