Głowa manekina lokalizująca dźwięk z sensorem Kinect: 9 kroków (ze zdjęciami)
Głowa manekina lokalizująca dźwięk z sensorem Kinect: 9 kroków (ze zdjęciami)
Anonim
Głowa manekina lokalizująca dźwięk z sensorem Kinect
Głowa manekina lokalizująca dźwięk z sensorem Kinect

Poznaj Margaret, manekin do testowania systemu monitorowania zmęczenia kierowcy. Niedawno przeszła na emeryturę i trafiła do naszej przestrzeni biurowej, i od tego czasu zwróciła uwagę tych, którzy uważają ją za „przerażającą”. W interesie sprawiedliwości dałem jej możliwość stawienia czoła oskarżycielom; zamiast pozornie podążać za tobą swoim bezdusznym spojrzeniem, teraz faktycznie to robi. System wykorzystuje zestaw mikrofonów Microsoft Kinect i serwo, aby skierować ją w stronę osób rozmawiających w jej pobliżu.

Krok 1: Teoria

Teoria
Teoria

Obliczanie kąta

Kiedy coś słyszymy, chyba że ten hałas jest bezpośrednio przed nami, dociera do jednego ucha przed drugim. Nasze mózgi dostrzegają opóźnienie przybycia i przekształcają je w ogólny kierunek, z którego dochodzi hałas, co pozwala nam znaleźć źródło. Dokładnie ten sam rodzaj lokalizacji możemy osiągnąć za pomocą pary mikrofonów. Rozważmy przedstawiony schemat, który zawiera parę mikrofonów i źródło dźwięku. Jeśli patrzymy z góry na dół, fale dźwiękowe są okrągłe, ale jeśli odległość do źródła jest duża w stosunku do odległości między mikrofonami, to z punktu widzenia naszych czujników fala jest w przybliżeniu płaska. Jest to znane jako założenie dalekiego pola i upraszcza geometrię naszego problemu.

Załóżmy więc, że front fali jest linią prostą. Jeśli dźwięk dochodzi z prawej strony, uderzy w mikrofon #2 w chwili t2 i mikrofon #1 w chwili t1. Odległość d dźwięku przebyta między uderzeniem w mikrofon nr 2 a mikrofon nr 1 jest różnicą czasu w wykryciu dźwięku pomnożoną przez prędkość dźwięku v s:

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

Możemy powiązać tę odległość z odległością d 12 między parą mikrofonów a kątem θ od pary do źródła dźwięku za pomocą zależności:

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

Ponieważ mamy tylko dwa mikrofony, nasze obliczenia będą niejednoznaczne, czy źródło dźwięku znajduje się przed, czy za nami. W tym systemie założymy, że źródło dźwięku znajduje się przed parą i ustawimy kąt od 0 stopni (całkowicie na prawo od pary) do 180 stopni (do końca na lewo).

Na koniec możemy znaleźć theta, biorąc odwrotny cosinus:

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

Aby kąt był nieco bardziej naturalny, możemy odjąć 90 stopni od teta, tak aby 0 stopni znajdowało się bezpośrednio przed parą, a +/- 90 stopni było pełne w lewo lub w prawo. To zmienia nasze wyrażenie z odwrotnego cosinusa na odwrotny sinus.

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

Znalezienie opóźnienia

Jak widać z powyższego równania, wszystko, co musimy rozwiązać dla kąta, to opóźnienie fali dźwiękowej docierającej do mikrofonu pierwszego w porównaniu do mikrofonu drugiego; prędkość dźwięku i odległość między mikrofonami są stałe i znane. Aby to osiągnąć, najpierw próbkujemy sygnały audio z częstotliwością fs, konwertując je z analogowych na cyfrowe i przechowując dane do późniejszego wykorzystania. Próbkujemy przez okres czasu znany jako okno próbkowania, który jest wystarczająco długi, aby uchwycić charakterystyczne cechy naszej fali dźwiękowej. Na przykład, nasze okno może zawierać dane audio z ostatnich pół sekundy.

Po uzyskaniu okienkowanych sygnałów audio, znajdujemy opóźnienie między nimi, obliczając ich korelację krzyżową. Aby obliczyć korelację krzyżową, przytrzymujemy nieruchomy sygnał okienkowy z jednego mikrofonu i przesuwamy drugi sygnał wzdłuż osi czasu od całego za pierwszym do całego przed pierwszym. Na każdym kroku wzdłuż naszego slajdu mnożymy każdy punkt w naszym stałym sygnale przez odpowiadający mu punkt w naszym slajdzie, a następnie sumujemy wszystkie wyniki, aby obliczyć nasz współczynnik korelacji dla tego kroku. Po zakończeniu naszego slajdu krok, który ma najwyższy współczynnik korelacji, odpowiada punktowi, w którym oba sygnały są najbardziej podobne, a na jakim kroku jesteśmy, mówi nam, ile próbek n sygnał dwa jest przesunięty w stosunku do sygnału 1. Jeśli n jest ujemne, wtedy sygnał dwa jest opóźniony w stosunku do sygnału pierwszego, jeśli jest dodatni, to sygnał drugi wyprzedza, a jeśli jest zero, to oba są już wyrównane. Przekształcamy to przesunięcie próbki na opóźnienie czasowe przy użyciu naszej częstotliwości próbkowania o zależności Δt = n/fs, w ten sposób:

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

Krok 2: Komponenty

Części

  • Microsoft Kinect na konsolę Xbox 360, model 1414 lub 1473. Kinect ma cztery mikrofony rozmieszczone w szyku liniowym, z których będziemy korzystać.
  • Adapter do konwersji zastrzeżonego złącza Kinect na zasilanie USB + AC, takie jak ten.
  • Raspberry Pi 2 lub 3 z systemem Raspbian Stretch. Początkowo próbowałem użyć Pi 1 Model B+, ale nie był wystarczająco wydajny. Ciągle miałem problemy z odłączaniem się od Kinect.
  • Najbardziej przerażająca głowa manekina, jaką możesz znaleźć
  • Serwo analogowe wystarczająco mocne, aby odwrócić głowę manekina
  • Ładowarka ścienna USB 5 V o natężeniu wystarczającym do zasilania zarówno Pi, jak i serwomechanizmu oraz co najmniej dwóch portów. (Użyłem wtyczki 3 portowej 5A podobnej do tej
  • Przedłużacz z dwoma gniazdami (jedno do ładowarki ściennej USB, a drugie do zasilacza sieciowego Kinect).
  • Dwa kable USB: kabel typu A do micro-USB do zasilania Pi i drugi do zasilania serwomechanizmu, którego nie masz nic przeciwko pocięciu
  • Platforma, na której można usiąść i kolejna mniejsza platforma na głowę manekina. Użyłem plastikowej tacy do serwowania jako podstawy i plastikowego talerza jako platformy pod głowę. Oba były z Walmartu i kosztowały tylko kilka dolarów
  • 4x śruby i nakrętki #8-32 1/2" do mocowania serwa do większej platformy
  • 2x śruba M3 8mm z podkładkami (lub inny rozmiar potrzebny do przymocowania serwomechanizmu do mniejszej platformy)
  • Dwa przewody połączeniowe męsko-męski, jeden czerwony i jeden czarny oraz jeden przewód połączeniowy żeński-męski
  • Samoprzylepne paski na rzepy
  • Taśma elektryczna
  • Taśma izolacyjna do zarządzania kablami

Narzędzia

  • Dremel z tarczą tnącą
  • Wiertarka
  • Wiertła 7/64", 11/16" i 5/16"
  • Kran M3 (opcjonalnie, w zależności od klaksonu serwo)
  • Śrubokręt
  • Lutownica z lutownicą
  • Pomocne dłonie (opcjonalnie)
  • Znacznik
  • Kompas
  • Narzędzia do ściągania izolacji
  • Multimetr (opcjonalnie)

ŚOI

  • Okulary ochronne

  • Maska na twarz (do plastikowych bitów dremmelowych).

Krok 3: Montaż dolnej platformy

Zespół dolnej platformy
Zespół dolnej platformy
Zespół dolnej platformy
Zespół dolnej platformy
Zespół dolnej platformy
Zespół dolnej platformy

Pierwszą częścią, którą wykonamy, jest dolna platforma, na której będzie nasz Kinect, serwo i cała nasza elektronika. Do wykonania platformy potrzebne będą:

  • Plastikowa taca do serwowania
  • Serwo
  • 4x #8-32 1/2" śruby z nakrętkami
  • Dremel z tarczą tnącą
  • Śrubokręt
  • Wiertarka
  • Wiertło 11/16"
  • Znacznik

Jak zrobić

  1. Odwróć tacę do góry nogami.
  2. Umieść serwo bokiem w pobliżu tylnej części tacy, upewnij się, że zębatka wyjściowa serwomechanizmu leży wzdłuż linii środkowej tacy, a następnie zaznacz wokół podstawy serwomechanizmu.
  3. Używając narzędzia dremel i tarczy tnącej, wytnij zaznaczony obszar, a następnie wsuń serwo w odpowiednie miejsce.
  4. Zaznacz środki otworów montażowych obudowy serwomechanizmu na tacy, a następnie wyjmij serwo i wywierć te otwory wiertłem 11/16". Podczas wiercenia otworów bardzo łatwo jest pęknąć cienki plastik podczas wiercenia otworów, więc uważam to za znacznie bezpieczniejsze cofać wiertło i powoli strugać materiał. Jest to znacznie wolniejsze niż prawidłowe wiercenie otworów, ale zapewnia, że nie ma pęknięć.
  5. Umieść serwo z powrotem w gnieździe, a następnie zamontuj go do tacy za pomocą śrub i nakrętek #8-32.

Krok 4: Montaż platformy głowicy

Zespół platformy czołowej
Zespół platformy czołowej
Zespół platformy czołowej
Zespół platformy czołowej
Zespół platformy czołowej
Zespół platformy czołowej
Zespół platformy czołowej
Zespół platformy czołowej

Kolejną częścią jaką wykonamy będzie platforma do połączenia głowicy manekina z serwomechanizmem. Aby wykonać platformę na głowę, potrzebujesz:

  • Plastikowy talerz
  • Róg serwo
  • 2x śruba M3 8mm z podkładkami
  • Śrubokręt
  • Wiertarka
  • Wiertła 7/64" i 5/16"
  • Kompas
  • Dremel z tarczą tnącą

Jak zrobić

  1. Ustaw kompas na promień podstawy głowy manekina.
  2. Użyj kompasu, aby zaznaczyć okrąg wyśrodkowany na środku talerza. Będzie to rzeczywisty rozmiar naszej platformy głowy.
  3. Użyj narzędzia dremel i tarczy tnącej, aby wyciąć mniejszą platformę z płyty.
  4. Wywierć środek nowej platformy wiertłem 5/16". To da nam dostęp do śruby, która mocuje nasz serwomechanizm do naszego serwomechanizmu. Aby zapewnić stabilność platformy podczas wiercenia otworu, włożyłem szpulę drut pod nim i przewiercony przez środek szpuli.
  5. Wyrównaj klakson serwomechanizmu ze środkiem platformy i zaznacz dwa otwory, aby przymocować klakson do platformy. Upewnij się, że te otwory montażowe są wystarczająco daleko od siebie, aby było miejsce na łby śrub M3 i podkładki.
  6. Wywierć te zaznaczone otwory wiertłem 7/64".
  7. Dolny otwór mojego serwomechanizmu był gładki, tzn. nie miał gwintu pod śrubę M3. Do wykonania gwintów użyłem więc wiertarki i gwintownika M3.
  8. Użyj śrub i podkładek, aby przymocować klakson serwomechanizmu do platformy czołowej.

Krok 5: Kabel zasilający serwo

Kabel zasilający serwo
Kabel zasilający serwo
Kabel zasilający serwo
Kabel zasilający serwo
Kabel zasilający serwo
Kabel zasilający serwo
Kabel zasilający serwo
Kabel zasilający serwo

Serwa analogowe są zwykle zasilane napięciem 4,8-6V. Ponieważ Raspberry Pi będzie już zasilane 5V z USB, uprościmy nasz system, zasilając również serwo z USB. W tym celu będziemy musieli zmodyfikować kabel USB. Do wykonania kabla zasilającego serwo potrzebne będą:

  • Zapasowy kabel USB z końcówką typu A (taką, którą podłącza się do komputera)
  • Jeden czerwony i jeden czarny przewód połączeniowy
  • Lutownica
  • Lutować
  • Narzędzia do ściągania izolacji
  • Taśma elektryczna
  • Pomocne dłonie (opcjonalnie)
  • Multimetr (opcjonalnie)

Jak zrobić

  1. Odetnij złącze inne niż USB typu A od kabla, a następnie zdejmij trochę izolacji, aby odsłonić cztery wewnętrzne przewody. Odetnij ekran otaczający odsłonięte przewody.
  2. Zazwyczaj kabel USB ma cztery przewody: dwa do transmisji i odbioru danych oraz dwa do zasilania i uziemienia. Interesuje nas moc i uziemienie, które zwykle są odpowiednio czerwone i czarne. Zdejmij część izolacji z czerwonego i czarnego przewodu i odetnij zielony i biały przewód. Jeśli obawiasz się, że nie masz odpowiednich przewodów zasilających i uziemiających, możesz podłączyć kabel do zasilacza USB i sprawdzić napięcie wyjściowe za pomocą multimetru.
  3. Następnie odetnij jeden koniec czerwonych i czarnych kabli połączeniowych i zdejmij część izolacji.
  4. Teraz skręć ze sobą odsłonięte czarne przewody zworki i kabli USB. Przejdź przez środki odsłoniętych przewodów i skręć je wokół siebie. Następnie nałóż lut na połączone przewody, aby je połączyć. Pomocne dłonie ułatwią to, trzymając kable na miejscu.
  5. Powtórz krok 4 dla czerwonych przewodów.
  6. Zakryj odsłonięte przewody taśmą elektryczną lub rurką termokurczliwą, jeśli masz ochotę. Te złącza będą kruche, ponieważ przewody są tak małe, więc dodaj drugą warstwę taśmy trzymającej kable połączeniowe do zewnętrznej izolacji kabla USB. To sprawi, że zespół będzie sztywniejszy, a tym samym mniej podatny na złamanie i zgięcie.

Krok 6: Montaż elektroniki

Montaż elektroniki
Montaż elektroniki
Montaż elektroniki
Montaż elektroniki
Montaż elektroniki
Montaż elektroniki

Na koniec zbierzemy wszystko razem, montując naszą elektronikę i wszystko inne na dolnej platformie. Będziesz potrzebować:

  • Dolna platforma
  • Platforma głowy
  • Głowa manekina
  • Kinect z zasilaczem USB+AC
  • Zasilacz USB
  • Przedłużacz
  • Kabel micro USB
  • Kabel zasilający serwo
  • Malina Pi
  • Kabel połączeniowy męski na żeński
  • Samoprzylepny rzep
  • Nożyce

Jak zrobić

  1. Zamontuj Pi na dnie tacy za pomocą rzepów.
  2. Podłącz zasilacz USB za pomocą rzepu.
  3. Podłącz serwo i Pi do zasilacza USB.
  4. Podłącz pin 12 (GPIO18) Pi do kabla sygnałowego serwomechanizmu. Jest to szósta szpilka po prawej stronie.
  5. Przeciągnij przedłużacz przez tylny uchwyt tacy i podłącz zasilacz USB z jednej strony.
  6. Weź zasilacz Kinect USB+AC i podłącz zasilacz po drugiej stronie przedłużacza, a USB do Pi.
  7. Przeciągnij przewód sensora Kinect przez przedni uchwyt tacy i podłącz do adaptera Kinect.
  8. Użyłem taśmy klejącej, aby przymocować kable do spodu platformy. Nie wygląda to najbardziej elegancko, ale na szczęście wszystko to jest ukryte.
  9. Odwróć platformę prawą stroną do góry i użyj rzepu, aby zamontować sensor Kinect z przodu platformy.
  10. Użyj rzepu, aby przymocować głowę manekina do platformy głowy. Jednak gdy wszystko jest już ustawione, rozdziel te dwie części, abyśmy mogli uzyskać dostęp do śruby mocującej tubę serwomechanizmu. Nie przykręcaj jeszcze klaksonu do serwa, ponieważ najpierw musimy upewnić się, że serwo jest w pozycji środkowej, abyśmy mogli wszystko wyrównać. Zrobimy to w późniejszym kroku.

Krok 7: Oprogramowanie i algorytm

Oprogramowanie i algorytm
Oprogramowanie i algorytm

Przegląd

Oprogramowanie dla tego projektu jest napisane w C++ i jest zintegrowane z Robot Operating System (ROS), frameworkiem do pisania oprogramowania dla robotyki. W ROS oprogramowanie systemu jest podzielone na zbiór programów zwanych węzłami, gdzie każdy węzeł implementuje określoną podsekcję funkcjonalności systemu. Dane są przesyłane między węzłami przy użyciu metody publikowania/subskrypcji, w której węzły wytwarzające dane publikują je, a węzły, które zużywają dane, subskrybują je. Rozdzielenie kodu w ten sposób pozwala na łatwą rozbudowę funkcjonalności systemu i umożliwia współdzielenie węzłów między systemami w celu szybszego rozwoju.

W tym systemie ROS służy przede wszystkim do oddzielenia kodu obliczającego kierunek nadejścia (DOA) źródła dźwięku od kodu sterującego serwomechanizmem, umożliwiając innym projektom uwzględnienie oszacowania Kinect DOA bez uwzględniania kodu serwa, którego mogą nie potrzebować lub chcieć. Jeśli chcesz spojrzeć na sam kod, możesz go znaleźć na GitHub:

github.com/raikaDial/kinect_doa

Węzeł Kinect DOA

Węzeł kinect_doa jest mięsem i kośćmi tego systemu, robiąc w zasadzie wszystko, co ciekawe. Po uruchomieniu inicjuje węzeł ROS, umożliwiając całą magię ROS, a następnie przesyła oprogramowanie układowe do Kinect, aby strumienie audio stały się dostępne. Następnie tworzy nowy wątek, który otwiera strumienie audio i rozpoczyna odczytywanie danych z mikrofonu. Kinect próbkuje swoje cztery mikrofony z częstotliwością 16 kHz każdy, więc dobrze jest mieć korelację krzyżową i zbieranie danych w osobnych wątkach, aby uniknąć utraty danych z powodu obciążenia obliczeniowego. Połączenie z Kinectem odbywa się za pomocą libfreenect, popularnego sterownika o otwartym kodzie źródłowym.

Wątek kolekcji wykonuje funkcję zwrotną za każdym razem, gdy odbierane są nowe dane, i zarówno przechowuje dane, jak i określa, kiedy należy oszacować DOA. Dane z każdego mikrofonu są przechowywane w buforach kroczących o długości równej naszemu oknu próbkowania, które tutaj zawiera 8192 próbek. Przekłada się to na obliczenie korelacji krzyżowej z danymi z około pół sekundy, co podczas eksperymentów odkryłem, że zapewnia dobrą równowagę między wydajnością a obciążeniem obliczeniowym. Estymacja DOA jest wyzwalana dla każdych 4096 próbek przez zasygnalizowanie głównego wątku, tak że kolejne korelacje krzyżowe nakładają się o 50%. Rozważ przypadek, w którym nie ma nakładania się i wydajesz bardzo szybki dźwięk, który zostaje przecięty na pół przez okno próbkowania. Przed i po Twoim charakterystycznym dźwięku będzie prawdopodobnie biały szum, który może być trudny do dopasowania do korelacji krzyżowej. Nakładające się okna zapewniają nam pełniejszą próbkę dźwięku, zwiększając niezawodność naszej korelacji krzyżowej, dając nam bardziej wyraźne cechy do wyrównania.

Główny wątek czeka na sygnał z wątku kolekcji, a następnie oblicza oszacowanie DOA. Najpierw jednak sprawdza, czy przechwycone przebiegi znacznie różnią się od białego szumu. Bez tej kontroli obliczalibyśmy nasze szacunki cztery razy na sekundę, niezależnie od tego, czy byłyby interesujące dźwięki, czy nie, a głowa manekina byłaby spastycznym bałaganem. Algorytm wykrywania białego szumu używany w tym systemie jest pierwszym z dwóch wymienionych tutaj. Obliczamy stosunek całki bezwzględnej pochodnej naszego przebiegu do jej całki bezwzględnej; dla sygnałów o dużej zawartości szumu białego współczynnik ten jest wyższy niż dla sygnałów o niższym poziomie szumów. Ustawiając próg dla tego współczynnika oddzielającego szum od braku szumu, możemy wywołać korelację krzyżową tylko wtedy, gdy jest to właściwe. Oczywiście ten stosunek jest czymś, co należy dostrajać za każdym razem, gdy system jest przenoszony do nowego środowiska.

Po ustaleniu, że przebiegi zawierają znaczną zawartość bez szumów, program kontynuuje korelacje krzyżowe. W tych obliczeniach wbudowane są jednak trzy ważne optymalizacje:

  1. W sensorze Kinect znajdują się cztery mikrofony, co oznacza, że istnieje łącznie sześć par przebiegów, które możemy skorelować krzyżowo. Jeśli jednak przyjrzysz się przestrzennemu rozmieszczeniu matrycy mikrofonów, zobaczysz, że mikrofony 2, 3 i 4 są bardzo blisko siebie. W rzeczywistości są tak blisko, że ze względu na prędkość dźwięku i naszą częstotliwość próbkowania przebiegi odbierane w punktach 2, 3 i 4 będą oddzielone co najwyżej jedną próbką przed lub za nią, co możemy zweryfikować obliczeniem maxlag = Δd *fs/vs, gdzie Δd to separacja pary mikrofonów, fs to częstotliwość próbkowania, a vs to prędkość dźwięku. Zatem korelowanie par między tymi trzema jest bezużyteczne i musimy jedynie skorelować mikrofon 1 z 2, 3 i 4.
  2. Wiadomo, że standardowa korelacja krzyżowa sygnałów audio działa słabo w obecności pogłosu (echa). Solidna alternatywa jest znana jako uogólniona korelacja krzyżowa z transformacją fazową (GCC-PHAT). Ta metoda sprowadza się do zastosowania funkcji ważenia, która wzmacnia piki w korelacji krzyżowej, ułatwiając odróżnienie oryginalnego sygnału od ech. Porównałem wydajność GCC-PHAT do prostej korelacji krzyżowej w komorze pogłosowej (czytaj: przebudowywana betonowa łazienka) i stwierdziłem, że GCC-PHAT jest 7 razy skuteczniejszy w szacowaniu prawidłowego kąta.
  3. Wykonując korelację krzyżową, bierzemy dwa sygnały, przesuwając jeden po drugim i na każdym kroku mnożąc każdy punkt w naszym stałym sygnale przez każdy punkt w naszym sygnale przesuwnym. Dla dwóch sygnałów o długości n daje to n^2 obliczeń. Moglibyśmy to poprawić, wykonując zamiast tego korelację krzyżową w dziedzinie częstotliwości, która obejmuje szybką transformację Fouriera (obliczenia nlogn), pomnożenie każdego punktu w jednym transformowanym sygnale przez odpowiadający mu punkt w drugim (n obliczenia), a następnie wykonanie odwrotności transformata Fouriera, aby wrócić do dziedziny czasu (obliczenia nlogn), co daje w wyniku n+2*nlogn obliczeń, mniej niż n^2. Jest to jednak podejście naiwne. Mikrofony w naszej macierzy są tak blisko siebie, a prędkość dźwięku jest tak niska, że przebiegi audio będą już w większości wyrównane. W ten sposób możemy okienkować naszą korelację krzyżową, aby uwzględnić tylko przesunięcia, które są nieco przed lub za. W przypadku mikrofonów 1 i 4 opóźnienie musi mieścić się w zakresie +/-12 próbek, co oznacza, że dla każdej korelacji krzyżowej musimy wykonać tylko 24*n obliczeń, co skutkuje oszczędnościami obliczeniowymi, gdy nasze przebiegi są dłuższe niż 2900 próbek.

System ten wykorzystuje bibliotekę minidsp, która implementuje algorytm GCC-PHAT z optymalizacją 3.

Po znalezieniu opóźnienia w sygnałach z każdej pary mikrofonów program wybiera średnią wartość opóźnienia, wykorzystuje ją do obliczenia szacowanego kąta i publikuje wynik, aby można go było użyć do sterowania serwomechanizmem.

Węzeł sterowania serwo

W porównaniu z węzłem kinect_doa węzeł serwo jest stosunkowo prosty. Jego zadaniem jest wyłącznie przejęcie szacowanego DOA i przesunięcie serwa pod ten kąt. Wykorzystuje bibliotekę wirePi do uzyskania dostępu do sprzętowego modułu PWM Raspberry Pi, używając go do ustawienia kąta serwomechanizmu. Większość serw analogowych jest sterowana sygnałem PWM o szerokości impulsu w zakresie od 1000 µs do 2000 µs, co odpowiada kątowi od 0° do 180°, ale serwo, którego użyłem, było sterowane z częstotliwością 500 µs do 2500 µs, co odpowiada kątowi od 0° do 270°. W ten sposób węzeł można skonfigurować dla różnych urządzeń serwo poprzez ustawienie parametrów dla minimalnej szerokości impulsu, maksymalnej szerokości impulsu i różnicy między maksymalnym i minimalnym kątem. Dodatkowo serwo nie przesuwa się od razu do docelowego kąta, ale raczej porusza się w kierunku kąta z konfigurowalną prędkością, dając Margaret bardziej stopniową, przerażającą atmosferę (plus dźwięk serwomechanizmu poruszającego się szybko w tę i z powrotem staje się irytujący, bardzo szybko).

Krok 8: Budowa i instalacja

Zainstaluj zależności:

Najpierw zainstaluj libfreenect. Musimy go zbudować ze źródeł, ponieważ wersja, którą można uzyskać za pomocą menedżera pakietów, nie obejmuje obsługi dźwięku. Dzieje się tak, ponieważ musimy przesłać oprogramowanie układowe do sensora Kinect, aby włączyć dźwięk, a redystrybucja tego oprogramowania układowego jest nielegalna w niektórych jurysdykcjach. Dodatkowo możemy uniknąć budowania przykładów, które wymagają OpenGL i gluta, niepotrzebnych w przypadku bezgłowych instalacji Raspbian.

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/-linux/u.rules /etc/udev/rules.d udevadm control --reload-rules && udevadm trigger

Następnie musimy zainstalować pakiet okablowaniaPi, który pozwala nam kontrolować piny GPIO w Pi:

Płyta CD

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

Dołącz głowę manekina:

Po zainstalowaniu okablowaniaPi możemy teraz zrobić szybki objazd z powrotem do lądu sprzętowego, aby przymocować głowę manekina do dolnej platformy. Aby wyśrodkować serwomechanizm za pomocą wiersza poleceń, wprowadź następujące polecenia:

gpio pwm-ms

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

Jeśli nie ma ruchu, prawdopodobnie twoje serwo jest już wyśrodkowane. Dla pewności można jednak ustawić serwo na wartość niecentralną, np. gpio -g pwm 18 200, a następnie ustaw go z powrotem na 150.

Gdy upewnisz się, że serwo jest wyśrodkowane, przymocuj róg serwa platformy głowicy do serwa tak, aby głowa manekina była skierowana prosto do przodu. Następnie przykręć klakson do serwa i przymocuj głowę za pomocą bitów na rzepy.

Zainstaluj ROS:

Następnie zainstaluj ROS na swoim Pi. Świetny przewodnik po instalacji można znaleźć tutaj; dla naszego systemu nie potrzebujemy OpenCV, więc możesz pominąć krok 3. Ukończenie tej kompilacji zajmie kilka godzin. Po zakończeniu postępowania zgodnie z instrukcją instalacji dodaj źródło instalacji do swojego bashrc, abyśmy mogli korzystać z naszych nowo zainstalowanych pakietów ROS:

echo "źródło /opt/ros/kinetic/setup.bash" >> ~/.bashrc

Zbuduj pakiet Kinect DOA:

Po tym wszystkim zrób obszar roboczy catkin dla naszego projektu i wejdź do katalogu src:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Kod tego projektu jest zawarty w pakiecie kinect_doa, więc sklonuj go do katalogu src w nowym obszarze roboczym:

git klon

Pakiet robot_upstart zapewnia łatwe w użyciu narzędzie do instalowania plików uruchamiania, aby działały przy starcie, więc sklonuj to również do swojego obszaru roboczego:

git klon

Teraz możemy zbudować kod projektu, wywołując catkin_make z katalogu najwyższego poziomu naszego obszaru roboczego, a następnie pobrać nasz build, aby nasze pakiety były dostępne:

cd ~/kinect_doa_ws

catkin_make echo "źródło /home/pi/kinect_doa_ws/devel/setup.bash" >> ~/.bashrc

Bieganie i strojenie:

Zakładając, że wszystko jest podłączone i włączone, powinieneś być teraz w stanie uruchomić system i mieć możliwość śledzenia głosu przez sensor Kinect! Jeśli jednak masz Kinect 1473, najpierw otwórz plik ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch w edytorze tekstu i ustaw parametr using_kinect_1473 na true. Dodatkowo, jeśli użyłeś innego serwa niż ja, to prawdopodobnie jest to standardowe serwo analogowe, więc w pliku startowym zmień parametr min_us na 1000, max_us na 2000 i max_deg na 180.

roslaunch kinect_doa kinect_doa.launch

Pobaw się nim przez chwilę. Jeśli uważasz, że system jest zbyt wrażliwy (patrzy w losowych kierunkach, które nie odpowiadają głosom lub charakterystycznym dźwiękom), spróbuj zmienić parametr white_noise_ratio w pliku uruchamiania i ponownie uruchamiaj system, aż reakcja będzie na poziomie, który jest dla Ciebie komfortowy. Zwiększenie współczynnika sprawi, że system będzie mniej responsywny i na odwrót. Prawdopodobnie będziesz musiał wykonać to strojenie za każdym razem, gdy przeniesiesz system w inne miejsce, aby uzyskać żądaną wydajność.

Aby uruchomić program po włączeniu Pi, używamy pakietu robot_upstart, aby zainstalować nasz plik uruchamiania. Jeśli ROS nie jest aktualnie uruchomiony, uruchom go za pomocą polecenia roscore. Następnie otwórz nowy terminal i zainstaluj uruchomienie za pomocą:

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

Tworzymy dowiązanie symboliczne do pliku uruchamiania zamiast go kopiować, abyśmy mogli zmienić parametry, edytując ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

Krok 9: Ukrywanie w biurze

Ukrywanie go w urzędzie
Ukrywanie go w urzędzie

Teraz czas na zabawną część. Idź do pracy po godzinach i ukryj głowę manekina w tajemnicy. Następnie usiądź wygodnie i zobacz, ile czasu zajmuje Twoim współpracownikom zrozumienie! Twoje nowe dzieło na pewno przyciągnie kilka głów…