Daftar Isi:

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

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

Video: Kepala Manekin Pelokalan Suara Dengan Kinect: 9 Langkah (dengan Gambar)
Video: Cara Memasang Manekin Kepala Yuna 2024, Juli
Anonim
Kepala Manekin Pelokalan Suara Dengan Kinect
Kepala Manekin Pelokalan Suara Dengan Kinect

Temui Margaret, boneka pengujian untuk sistem pemantauan kelelahan pengemudi. Dia baru saja pensiun dari tugasnya dan menemukan jalannya ke ruang kantor kami, dan sejak itu menarik perhatian orang-orang yang menganggapnya 'menyeramkan'. Demi keadilan, saya telah memberinya kemampuan untuk menghadapi para penuduhnya secara langsung; alih-alih tampaknya mengikuti Anda dengan tatapan tanpa jiwanya, sekarang dia benar-benar melakukannya. Sistem ini menggunakan susunan mikrofon Microsoft Kinect dan servo untuk mengarahkannya ke arah orang-orang yang berbicara di dekatnya.

Langkah 1: Teori

Teori
Teori

Menghitung Sudut

Ketika kita mendengar sesuatu, kecuali suara itu tepat di depan kita, suara itu akan mencapai satu telinga sebelum telinga lainnya. Otak kita merasakan penundaan kedatangan itu dan mengubahnya menjadi arah umum dari mana suara itu berasal, memungkinkan kita untuk menemukan sumbernya. Kami dapat mencapai jenis lokalisasi yang sama persis menggunakan sepasang mikrofon. Perhatikan diagram yang ditunjukkan, yang berisi sepasang mikrofon dan sumber suara. Jika kita melihat dari atas ke bawah, gelombang suara berbentuk lingkaran, tetapi jika jarak ke sumbernya relatif besar terhadap jarak antar mikrofon, maka dari sudut pandang sensor kita, gelombangnya kira-kira planar. Ini dikenal sebagai asumsi medan jauh dan menyederhanakan geometri dari masalah kita.

Jadi anggap muka gelombang adalah garis lurus. Jika suara datang dari kanan, itu akan mengenai mikrofon #2 pada waktu t2 dan mikrofon #1 pada waktu t1. Jarak d yang ditempuh suara antara memukul mikrofon #2 dan mikrofon #1 adalah perbedaan waktu dalam mendeteksi suara dikalikan dengan kecepatan suara v s:

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

Kita dapat menghubungkan jarak ini dengan jarak d 12 antara pasangan mikrofon dan sudut dari pasangan ke sumber suara dengan hubungan:

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

Karena kita hanya memiliki dua mikrofon, maka akan terjadi kerancuan dalam perhitungan kita apakah sumber suara ada di depan atau di belakang kita. Dalam sistem ini, kita akan mengasumsikan bahwa sumber suara berada di depan pasangan dan menjepit sudut antara 0 derajat (sepenuhnya ke kanan pasangan) hingga 180 derajat (sepenuhnya ke kiri).

Akhirnya, kita dapat memecahkan theta dengan mengambil kosinus terbalik:

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

Untuk membuat sudut sedikit lebih alami, kita dapat mengurangi 90 derajat dari theta, sehingga 0 derajat tepat di depan pasangan dan +/- 90 derajat adalah kiri penuh atau kanan penuh. Ini mengubah ekspresi kita dari invers cosinus ke invers sinus.

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

Menemukan Penundaan

Seperti yang Anda lihat dari persamaan di atas, yang perlu kita selesaikan untuk sudut adalah penundaan gelombang suara yang tiba di mikrofon satu dibandingkan dengan mikrofon dua; kecepatan suara dan jarak antara mikrofon adalah tetap dan diketahui. Untuk mencapai ini, pertama-tama kami mengambil sampel sinyal audio pada frekuensi fs, mengubahnya dari analog ke digital dan menyimpan data untuk digunakan nanti. Kami mengambil sampel untuk periode waktu yang dikenal sebagai jendela pengambilan sampel, yang durasinya cukup lama untuk menangkap fitur yang dapat dibedakan dari gelombang suara kami. Misalnya, jendela kita bisa menjadi data audio setengah detik terakhir.

Setelah mendapatkan sinyal audio berjendela, kami menemukan penundaan antara keduanya dengan menghitung korelasi silangnya. Untuk menghitung korelasi silang, kami menahan sinyal berjendela dari satu mikrofon tetap, dan menggeser sinyal kedua sepanjang sumbu waktu dari semua jalan di belakang yang pertama ke semua jalan di depan yang pertama. Pada setiap langkah di sepanjang slide kami, kami mengalikan setiap titik dalam sinyal tetap kami dengan titik yang sesuai dalam sinyal geser kami, kemudian menjumlahkan semua hasil untuk menghitung koefisien korelasi kami untuk langkah itu. Setelah menyelesaikan slide kami, langkah yang memiliki koefisien korelasi tertinggi sesuai dengan titik di mana dua sinyal paling mirip, dan langkah apa yang kami lakukan memberi tahu kami berapa banyak sampel n sinyal dua diimbangi dari sinyal 1. Jika n negatif, maka sinyal dua tertinggal dari sinyal satu, jika positif maka sinyal dua di depan, dan jika nol maka keduanya sudah sejajar. Kami mengubah offset sampel ini menjadi waktu tunda menggunakan frekuensi sampling kami dengan hubungan t = n/fs, sehingga:

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

Langkah 2: Komponen

Bagian

  • Microsoft Kinect untuk Xbox 360, model 1414 atau 1473. Kinect memiliki empat mikrofon yang diatur dalam susunan linier yang akan kita gunakan.
  • Adaptor untuk mengubah konektor eksklusif Kinect menjadi daya USB + AC seperti ini.
  • Raspberry Pi 2 atau 3 menjalankan Raspbian Stretch. Saya awalnya mencoba menggunakan Pi 1 Model B+, tetapi itu tidak cukup kuat. Saya terus mengalami masalah saat memutuskan sambungan dari Kinect.
  • Kepala manekin paling menyeramkan yang bisa Anda temukan
  • Servo analog yang cukup kuat untuk memutar kepala manekin Anda
  • Pengisi daya dinding USB 5V dengan arus listrik yang cukup untuk memberi daya pada Pi dan servo dan setidaknya dua port. (Saya menggunakan steker 3-port 5A yang mirip dengan ini
  • Kabel ekstensi dengan dua outlet (Satu untuk pengisi daya dinding USB dan yang lainnya untuk adaptor AC Kinect.
  • Dua kabel USB: kabel tipe-A ke micro-USB untuk memberi daya pada Pi dan satu lagi untuk memberi daya pada servo yang tidak ingin Anda potong
  • Sebuah platform untuk segala sesuatu untuk duduk dan platform lain yang lebih kecil untuk kepala manekin. Saya menggunakan nampan saji plastik sebagai alas dan piring plastik sebagai platform kepala. Keduanya dari Walmart dan harganya hanya beberapa dolar
  • 4x #8-32 1/2" baut dan mur untuk memasang servo Anda ke platform yang lebih besar
  • 2x M3 8mm baut dengan ring (atau ukuran apa pun yang Anda butuhkan untuk memasang tanduk servo Anda ke platform yang lebih kecil)
  • Dua kabel jumper pria-ke-pria, satu merah dan satu hitam, dan satu kabel jumper wanita-ke-pria
  • Strip Velcro yang didukung perekat
  • Pita listrik
  • Lakban untuk manajemen kabel

Peralatan

  • Dremel dengan roda pemotong
  • Mengebor
  • 7/64", 11/16", dan 5/16" mata bor
  • Ketuk M3 (Opsional, tergantung pada klakson servo Anda)
  • Obeng
  • Solder besi dengan solder
  • Membantu tangan (opsional)
  • penanda
  • Kompas
  • penari telanjang kawat
  • Multimeter (Opsional)

APD

  • Kacamata pengaman

  • Masker Wajah (untuk potongan plastik dremel-ed).

Langkah 3: Majelis Platform Bawah

Majelis Platform Bawah
Majelis Platform Bawah
Majelis Platform Bawah
Majelis Platform Bawah
Majelis Platform Bawah
Majelis Platform Bawah

Bagian pertama yang akan kita buat adalah platform bawah, yang akan menampung Kinect, servo, dan semua elektronik kita. Untuk membuat platform, Anda perlu:

  • Baki Penyajian Plastik
  • Servo
  • 4x #8-32 1/2" baut dengan mur
  • Dremel dengan Roda Pemotong
  • Obeng
  • Mengebor
  • Mata Bor 11/16"
  • penanda

Bagaimana membuat

  1. Balikkan baki Anda.
  2. Tempatkan servo Anda menyamping di dekat bagian belakang baki, pastikan roda gigi keluaran servo terletak di sepanjang garis tengah baki, lalu tandai di sekitar pangkal servo.
  3. Dengan menggunakan dremel dan roda pemotong Anda, potong area yang Anda tandai, lalu geser servo Anda ke dalam slotnya.
  4. Tandai bagian tengah lubang pemasangan rumah servo di baki, lalu lepaskan servo dan bor lubang itu dengan mata bor 11/16". Sangat mudah untuk memecahkan plastik tipis seperti ini saat mengebor lubang, jadi saya merasa jauh lebih aman untuk menjalankan bor secara terbalik dan perlahan-lahan menghilangkan material. Ini jauh lebih lambat daripada mengebor lubang dengan benar tetapi memastikan tidak ada retakan.
  5. Tempatkan servo Anda kembali ke dalam slot, lalu pasang ke baki dengan baut dan mur #8-32.

Langkah 4: Rakitan Platform Kepala

Rakitan Platform Kepala
Rakitan Platform Kepala
Rakitan Platform Kepala
Rakitan Platform Kepala
Rakitan Platform Kepala
Rakitan Platform Kepala
Rakitan Platform Kepala
Rakitan Platform Kepala

Bagian selanjutnya yang akan kita buat adalah platform untuk menghubungkan kepala manekin ke servo. Untuk membuat platform kepala, Anda perlu:

  • Piring plastik
  • Tanduk servo
  • 2x M3 8mm baut dengan mesin cuci
  • Obeng
  • Mengebor
  • Mata bor 7/64" dan 5/16"
  • Kompas
  • Dremel dengan roda pemotong

Bagaimana membuat

  1. Atur kompas Anda ke radius pangkal kepala manekin Anda.
  2. Gunakan kompas Anda untuk menandai lingkaran yang berpusat di tengah piring. Ini akan menjadi ukuran sebenarnya dari platform kepala kita.
  3. Gunakan dremel dan roda pemotong untuk memotong platform yang lebih kecil dari piring.
  4. Bor bagian tengah platform baru Anda dengan mata bor 5/16". Ini akan memberi kami akses ke sekrup yang memasang tanduk servo kami ke servo kami. Untuk memberikan stabilitas platform saat saya mengebor lubang, saya memasang gulungan kawat di bawahnya dan dibor melalui pusat spool.
  5. Sejajarkan tanduk servo Anda dengan bagian tengah platform dan tandai dua lubang untuk memasang tanduk ke platform. Pastikan lubang pemasangan ini cukup berjauhan sehingga ada ruang untuk kepala baut dan ring M3 Anda.
  6. Bor lubang yang ditandai ini dengan mata bor 7/64".
  7. Lubang bawah tanduk servo saya halus, yaitu tidak memiliki ulir untuk baut M3. Jadi, saya menggunakan bor dan ketukan M3 untuk membuat utas.
  8. Gunakan baut dan ring untuk memasang tanduk servo ke platform kepala.

Langkah 5: Kabel Daya Servo

Kabel Daya Servo
Kabel Daya Servo
Kabel Daya Servo
Kabel Daya Servo
Kabel Daya Servo
Kabel Daya Servo
Kabel Daya Servo
Kabel Daya Servo

Servo analog biasanya didukung dengan 4,8-6V. Karena Raspberry Pi sudah akan didukung oleh 5V dari USB, kami akan menyederhanakan sistem kami dengan juga menyalakan servo dari USB. Untuk melakukannya kita perlu memodifikasi kabel USB. Untuk membuat kabel daya servo, Anda perlu:

  • Cadangan kabel USB dengan ujung tipe-A (jenis yang dihubungkan ke komputer Anda)
  • Satu kabel jumper merah dan satu hitam
  • Besi solder
  • Pateri
  • penari telanjang kawat
  • Pita listrik
  • Membantu tangan (opsional)
  • Multimeter (opsional)

Bagaimana membuat

  1. Potong konektor non USB tipe-A dari kabel Anda, lalu lepaskan sedikit insulasi untuk mengungkapkan keempat kabel bagian dalam. Potong pelindung yang mengelilingi kabel yang terbuka.
  2. Biasanya kabel USB akan memiliki empat kabel: dua untuk transmisi dan penerimaan data dan dua untuk daya dan ground. Kami tertarik pada daya dan ground, yang umumnya berwarna merah dan hitam. Lepaskan beberapa isolasi dari kabel merah dan hitam dan potong kabel hijau dan putih. Jika Anda khawatir tidak memiliki kabel daya dan arde yang benar, Anda dapat mencolokkan kabel ke adaptor daya USB dan memeriksa voltase keluaran dengan multimeter.
  3. Selanjutnya, potong salah satu ujung kabel jumper merah dan hitam Anda dan lepaskan beberapa insulasi.
  4. Sekarang, putar kabel hitam yang terbuka dari jumper dan kabel USB Anda. Seberangi bagian tengah kabel yang terbuka dan putar satu sama lain. Kemudian, oleskan solder ke kabel yang dikawinkan untuk menyatukannya. Membantu tangan akan membuat ini lebih mudah dengan memegang kabel Anda di tempatnya.
  5. Ulangi langkah 4 untuk kabel merah.
  6. Tutupi kabel yang terbuka dengan selotip listrik, atau tabung panas menyusut jika Anda ingin. Sambungan ini akan rapuh karena kabelnya sangat kecil, jadi tambahkan pita lapisan kedua yang menahan kabel jumper ke insulasi luar kabel USB. Ini akan membuat rakitan lebih kaku dan dengan demikian kecil kemungkinannya untuk pecah karena bengkok.

Langkah 6: Pemasangan Elektronik

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

Akhirnya, kami akan menyatukan semuanya, memasang elektronik kami dan yang lainnya ke platform yang lebih rendah. Anda akan perlu:

  • Platform bawah
  • Platform kepala
  • Kepala manekin
  • Kinect dengan adaptor USB+AC
  • Adaptor daya USB
  • Kabel sambungan
  • Kabel mikro USB
  • Kabel daya servo
  • Raspberry Pi
  • Kabel jumper Pria-ke-Wanita
  • Velcro perekat
  • Gunting

Bagaimana membuat

  1. Pasang Pi ke bagian bawah baki dengan Velcro.
  2. Pasang adaptor daya USB dengan Velcro.
  3. Colokkan servo dan Pi ke adaptor daya USB.
  4. Hubungkan pin 12 (GPIO18) dari Pi ke kabel sinyal servo. Ini adalah pin ke-6 di sebelah kanan.
  5. Ulirkan kabel ekstensi Anda melalui pegangan belakang baki dan colokkan adaptor daya USB ke satu sisi.
  6. Ambil adaptor Kinect USB+AC dan colokkan adaptor daya ke sisi lain kabel ekstensi dan USB ke Pi.
  7. Ulirkan kabel Kinect melalui pegangan depan baki dan colokkan ke adaptor Kinect.
  8. Saya menggunakan selotip untuk menahan kabel ke bagian bawah platform. Ini tidak terlihat paling elegan, tapi untungnya semua ini tersembunyi.
  9. Balikkan platform dengan sisi kanan ke atas dan gunakan Velcro untuk memasang Kinect ke bagian depan platform.
  10. Gunakan Velcro untuk memasang kepala manekin ke platform kepala. Namun, setelah semuanya berbaris, pisahkan kedua bagian itu sehingga kita dapat mengakses sekrup pemasangan tanduk servo. Namun, jangan kencangkan klakson ke servo, karena kita perlu memastikan servo berada di posisi tengah terlebih dahulu sehingga kita bisa menyejajarkan semuanya. Kami akan melakukan ini di langkah selanjutnya.

Langkah 7: Perangkat Lunak dan Algoritma

Perangkat Lunak dan Algoritma
Perangkat Lunak dan Algoritma

Gambaran

Perangkat lunak untuk proyek ini ditulis dalam C++ dan terintegrasi dengan Robot Operating System (ROS), kerangka kerja untuk menulis perangkat lunak robotika. Dalam ROS, perangkat lunak untuk suatu sistem dipecah menjadi kumpulan program yang disebut node, di mana setiap node mengimplementasikan subbagian tertentu dari fungsionalitas sistem. Data dilewatkan antar node menggunakan metode publish/subscribe, dimana node yang memproduksi data mempublikasikannya dan node yang mengkonsumsi data berlangganan data tersebut. Memisahkan kode dengan cara ini memungkinkan fungsionalitas sistem diperluas dengan mudah, dan memungkinkan node untuk dibagikan antar sistem untuk pengembangan yang lebih cepat.

Dalam sistem ini, ROS terutama digunakan untuk memisahkan kode yang menghitung arah kedatangan (DOA) sumber suara dari kode yang mengendalikan servo, memungkinkan proyek lain untuk menyertakan estimasi DOA Kinect tanpa menyertakan kode servo yang mungkin tidak mereka perlukan atau inginkan.. Jika Anda ingin melihat kode itu sendiri, itu dapat ditemukan di GitHub:

github.com/raikaDial/kinect_doa

Simpul DOA Kinect

Simpul kinect_doa adalah daging dan tulang dari sistem ini, pada dasarnya melakukan segala sesuatu yang menarik. Saat startup, ini menginisialisasi node ROS, membuat semua keajaiban ROS menjadi mungkin, kemudian mengunggah firmware ke Kinect sehingga aliran audio tersedia. Ini kemudian memunculkan utas baru yang membuka aliran audio dan mulai membaca data mikrofon. Kinect mengambil sampel keempat mikrofonnya pada frekuensi masing-masing 16 kHz, jadi ada baiknya untuk memiliki korelasi silang dan pengumpulan data dalam rangkaian terpisah untuk menghindari data yang hilang karena beban komputasi. Antarmuka dengan Kinect dilakukan dengan menggunakan libfreenect, driver open-source yang populer.

Utas pengumpulan menjalankan fungsi panggilan balik setiap kali data baru diterima, dan keduanya menyimpan data dan menentukan kapan memperkirakan DOA. Data dari setiap mikrofon disimpan dalam buffer bergulir yang panjangnya sama dengan jendela pengambilan sampel kami, yang di sini adalah 8192 sampel. Ini berarti menghitung korelasi silang dengan data sekitar setengah detik terakhir, yang saya temukan melalui eksperimen sebagai keseimbangan yang baik antara kinerja dan beban komputasi. Estimasi DOA dipicu untuk setiap 4096 sampel dengan memberi sinyal pada utas utama, sehingga korelasi silang yang berurutan tumpang tindih sebesar 50%. Pertimbangkan kasus di mana tidak ada tumpang tindih, dan Anda membuat suara yang sangat cepat yang terpotong setengah oleh jendela pengambilan sampel. Sebelum dan sesudah suara khas Anda kemungkinan akan menjadi white noise, yang mungkin sulit untuk disejajarkan dengan korelasi silang. Jendela yang tumpang tindih memberi kami sampel suara yang lebih lengkap, meningkatkan keandalan korelasi silang kami dengan memberi kami lebih banyak fitur berbeda untuk berbaris.

Utas utama menunggu sinyal dari utas koleksi, kemudian menghitung perkiraan DOA. Namun, pertama-tama, ia memeriksa apakah bentuk gelombang yang ditangkap secara signifikan berbeda dari white noise. Tanpa pemeriksaan ini, kami akan menghitung perkiraan kami empat kali per detik terlepas dari apakah ada suara yang menarik atau tidak, dan kepala manekin kami akan berantakan. Algoritme pendeteksi derau putih yang digunakan dalam sistem ini adalah yang pertama dari dua yang tercantum di sini. Kami menghitung rasio integral mutlak turunan bentuk gelombang kami dengan integral mutlaknya; untuk sinyal dengan konten white-noise tinggi, rasio ini lebih tinggi daripada sinyal yang lebih sedikit noise. Dengan menetapkan ambang batas untuk rasio ini yang memisahkan noise dari non-noise, kita dapat memicu korelasi silang hanya jika sesuai. Tentu saja, rasio ini adalah sesuatu yang harus disetel ulang setiap kali sistem dipindahkan ke lingkungan baru.

Setelah menentukan bahwa bentuk gelombang mengandung konten non-noise yang signifikan, program dilanjutkan dengan korelasi silang. Namun ada tiga optimasi penting yang dibangun ke dalam perhitungan ini:

  1. Ada empat mikrofon di Kinect, artinya ada enam pasang total bentuk gelombang yang bisa kita korelasikan silang. Namun, jika Anda melihat susunan spasial dari susunan mikrofon, Anda dapat melihat bahwa mikrofon 2, 3, dan 4 sangat dekat satu sama lain. Faktanya, mereka sangat dekat sehingga karena kecepatan suara dan frekuensi pengambilan sampel kami, bentuk gelombang yang diterima pada 2, 3, dan 4 akan dipisahkan oleh paling banyak satu sampel di depan atau di belakang, yang dapat kami verifikasi dengan perhitungan maxlag = d *fs/vs, di mana d adalah pemisahan pasangan mikrofon, fs adalah frekuensi sampling, dan vs adalah kecepatan suara. Jadi, korelasi pasangan antara ketiganya tidak berguna, dan kita hanya perlu mengkorelasikan mikrofon 1 dengan 2, 3, dan 4.
  2. Korelasi silang standar dari sinyal audio diketahui berkinerja buruk dengan adanya gema (echo). Alternatif yang kuat dikenal sebagai korelasi silang umum dengan transformasi fase (GCC-PHAT). Metode ini bermuara pada penerapan fungsi pembobotan yang memperkuat puncak dalam korelasi silang, membuatnya lebih mudah untuk membedakan sinyal asli dari gema. Saya membandingkan kinerja GCC-PHAT dengan korelasi silang sederhana di ruang gema (baca: kamar mandi beton sedang direnovasi), dan menemukan GCC-PHAT 7 kali lebih efektif dalam memperkirakan sudut yang benar.
  3. Saat melakukan korelasi silang, kami mengambil dua sinyal, menggeser satu di sepanjang yang lain, dan pada setiap langkah mengalikan setiap titik dalam sinyal tetap kami dengan setiap titik dalam sinyal geser kami. Untuk dua sinyal dengan panjang n, ini menghasilkan n^2 komputasi. Kita dapat meningkatkan ini dengan melakukan korelasi silang dalam domain frekuensi sebagai gantinya, yang melibatkan transformasi fourier cepat (perhitungan nlogn), mengalikan setiap titik dalam satu sinyal yang ditransformasikan dengan titik yang sesuai di titik lain (n perhitungan), kemudian melakukan invers transformasi fourier untuk kembali ke domain waktu (perhitungan nlogn), menghasilkan n+2*nlogn perhitungan, kurang dari n^2. Namun, ini adalah pendekatan naif. Mikrofon dalam susunan kami sangat berdekatan dan kecepatan suara relatif lambat sehingga bentuk gelombang audio sebagian besar sudah selaras. Dengan demikian, kita dapat melihat korelasi silang kita untuk hanya mempertimbangkan offset yang sedikit di depan atau di belakang. Untuk mikrofon 1 dan 4, jeda harus berada di antara +/-12 sampel, artinya untuk setiap korelasi silang, kita hanya perlu melakukan penghitungan 24*n, menghasilkan penghematan komputasi saat bentuk gelombang kita lebih panjang dari 2900 sampel.

Sistem ini memanfaatkan perpustakaan minidsp, yang mengimplementasikan algoritma GCC-PHAT dengan optimasi 3.

Setelah menemukan lag dalam sinyal dari setiap pasangan mikrofon, program memilih nilai median untuk lag, menggunakannya untuk menghitung perkiraan sudut, dan mempublikasikan hasilnya sehingga dapat digunakan untuk mengontrol servo.

Node Kontrol Servo

Dibandingkan dengan simpul kinect_doa, simpul servo relatif sederhana. Tugasnya hanya mengambil perkiraan DOA dan memindahkan servo ke sudut itu. Ia menggunakan pustaka wiringPi untuk mengakses modul PWM perangkat keras dari Raspberry Pi, menggunakannya untuk mengatur sudut servo. Kebanyakan servo analog dikendalikan oleh sinyal PWM dengan lebar pulsa mulai dari 1000 s hingga 2000 s, sesuai dengan sudut 0 ° hingga 180 °, tetapi servo yang saya gunakan dikendalikan dengan 500 s hingga 2500 s, sesuai dengan sudut dari 0° sampai 270°. Dengan demikian, node dapat dikonfigurasi untuk perangkat keras servo yang berbeda dengan mengatur parameter untuk lebar pulsa minimum, lebar pulsa maksimum, dan perbedaan antara sudut maksimum dan minimum. Selain itu, servo tidak langsung bergerak ke sudut target, melainkan bergerak ke arah sudut dengan kecepatan yang dapat dikonfigurasi, memberikan Margaret getaran yang lebih bertahap dan menyeramkan (ditambah, suara servo yang bergerak cepat bolak-balik menjadi sangat cepat mengganggu.).

Langkah 8: Bangun dan Instalasi

Instal Dependensi:

Pertama, instal libfreenect. Kami harus membangunnya dari sumber karena versi yang bisa Anda dapatkan dengan pengelola paket tidak menyertakan dukungan untuk audio. Ini karena kita harus mengunggah firmware ke Kinect untuk mengaktifkan audio, dan mendistribusikan ulang firmware ini tidak sah di yurisdiksi tertentu. Selain itu, kita dapat menghindari pembuatan contoh yang memerlukan OpenGL dan glut, yang tidak perlu untuk instalasi 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 make sudo make install sudo cp ~/libfreenect/platform/51-linux/udev.rules /etc/udev/rules.d kontrol udevadm --reload-rules && pemicu udevadm

Selanjutnya, kita perlu menginstal paket wiringPi, yang memungkinkan kita untuk mengontrol pin GPIO dari Pi:

CD

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

Pasang Kepala Manekin:

Dengan wiringPi terinstal, kita sekarang dapat mengambil jalan memutar cepat kembali ke hardware-land untuk memasang kepala manekin ke platform yang lebih rendah. Untuk memusatkan servo melalui baris perintah, masukkan perintah berikut:

gpio pwm-ms

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

Jika tidak ada gerakan, maka servo Anda mungkin sudah terpusat. Namun, yang pasti, Anda dapat mengatur servo ke nilai non-pusat, mis. gpio -g pwm 18 200, lalu setel kembali ke 150.

Setelah Anda yakin servo berada di tengah, pasang tanduk servo platform kepala ke servo sedemikian rupa sehingga kepala manekin Anda akan melihat lurus ke depan. Kemudian, pasang klakson ke servo dan pasang kepala Anda melalui bit Velcro.

Instal ROS:

Selanjutnya, instal ROS di Pi Anda. Panduan pemasangan yang bagus dapat ditemukan di sini; untuk sistem kami, kami tidak memerlukan OpenCV, jadi Anda dapat melewati langkah 3. Pembuatan ini akan memakan waktu beberapa jam untuk diselesaikan. Setelah selesai mengikuti panduan instalasi, tambahkan sumber instalasi ke bashrc Anda sehingga kami dapat menggunakan paket ROS yang baru diinstal:

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

Bangun Paket DOA Kinect:

Setelah semua selesai, buat ruang kerja catkin untuk proyek kita dan masuk ke direktori src:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Kode untuk proyek ini terdapat dalam paket kinect_doa, jadi klon ke direktori src ruang kerja baru Anda:

git clone

Paket robot_upstart menyediakan alat yang mudah digunakan untuk menginstal file peluncuran sehingga mereka berjalan saat startup, jadi juga kloning ini ke dalam ruang kerja Anda:

git clone

Sekarang, kita dapat membangun kode proyek dengan memanggil catkin_make dari direktori tingkat atas ruang kerja kita, lalu sumber build kita sehingga paket kita tersedia:

cd ~/kinect_doa_ws

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

Menjalankan dan Menyetel:

Dengan asumsi semuanya dicolokkan dan dihidupkan, Anda sekarang harus dapat meluncurkan sistem dan membuat Kinect melacak suara Anda! Namun, jika Anda memiliki Kinect 1473, pertama buka file ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch di editor teks dan atur parameter using_kinect_1473 menjadi true. Selain itu, jika Anda menggunakan servo yang berbeda dari yang saya lakukan, mungkin itu adalah servo analog standar, Jadi saat dalam file peluncuran, ubah parameter min_us menjadi 1000, max_us menjadi 2000, dan max_deg menjadi 180.

roslaunch kinect_doa kinect_doa.launch

Bermain-main dengan itu untuk sementara waktu. Jika Anda merasa sistem terlalu sensitif (melihat ke arah acak yang tidak sesuai dengan suara atau suara yang berbeda), coba ubah parameter white_noise_ratio di file peluncuran dan luncurkan kembali sistem hingga responsivitas berada pada tingkat yang Anda rasa nyaman.. Menaikkan rasio akan membuat sistem kurang responsif dan sebaliknya. Anda mungkin harus melakukan penyetelan ini setiap kali Anda memindahkan sistem ke lokasi yang berbeda untuk mendapatkan kinerja yang Anda inginkan.

Untuk meluncurkan program saat kami menyalakan Pi, kami menggunakan paket robot_upstart untuk menginstal file peluncuran kami. Jika ROS saat ini tidak berjalan, mulailah dengan perintah roscore. Kemudian, buka terminal baru dan instal peluncuran dengan:

rosrun robot_upstart install kinect_doa/launch/kinect_doa.launch --user root --symlink

Kami membuat symlink ke file peluncuran alih-alih menyalinnya sehingga kami dapat mengubah parameter dengan mengedit ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

Langkah 9: Menyembunyikannya di Kantor

Menyembunyikannya di Kantor
Menyembunyikannya di Kantor

Sekarang untuk bagian yang menyenangkan. Pergilah bekerja setelah jam kerja dan atur kepala manekin Anda secara rahasia. Kemudian duduk saja dan lihat berapa lama waktu yang dibutuhkan rekan kerja Anda untuk memahami! Anda kreasi baru dijamin untuk mengubah beberapa kepala …

Direkomendasikan: