Πίνακας περιεχομένων:

Sound Localizing Mannequin Head With Kinect: 9 βήματα (με εικόνες)
Sound Localizing Mannequin Head With Kinect: 9 βήματα (με εικόνες)

Βίντεο: Sound Localizing Mannequin Head With Kinect: 9 βήματα (με εικόνες)

Βίντεο: Sound Localizing Mannequin Head With Kinect: 9 βήματα (με εικόνες)
Βίντεο: Margaret - The Sound Localizing Mannequin Head 2024, Ιούλιος
Anonim
Sound Localizing Mannequin Head With Kinect
Sound Localizing Mannequin Head With Kinect

Γνωρίστε τη Μάργκαρετ, ένα ομοίωμα δοκιμών για ένα σύστημα παρακολούθησης της κόπωσης του οδηγού. Πρόσφατα αποσύρθηκε από τα καθήκοντά της και βρήκε τον δρόμο της στον χώρο του γραφείου μας και έκτοτε τράβηξε την προσοχή όσων πιστεύουν ότι είναι «ανατριχιαστική». Για λόγους δικαιοσύνης, της έδωσα τη δυνατότητα να αντιμετωπίσει κατάματα τους κατήγορους της. αντί να σε ακολουθεί φαινομενικά με το άψυχο βλέμμα της, τώρα το κάνει στην πραγματικότητα. Το σύστημα χρησιμοποιεί τη σειρά μικροφώνου ενός Microsoft Kinect και ενός σερβο για να την κατευθύνει προς την κατεύθυνση των ανθρώπων που μιλούν κοντά της.

Βήμα 1: Θεωρία

Θεωρία
Θεωρία

Υπολογισμός της γωνίας

Όταν ακούμε κάτι, εκτός εάν αυτός ο θόρυβος είναι ακριβώς μπροστά μας, φτάνει στο ένα αυτί πριν από το άλλο. Ο εγκέφαλός μας αντιλαμβάνεται αυτή την καθυστέρηση άφιξης και τη μετατρέπει σε μια γενική κατεύθυνση από την οποία προέρχεται ο θόρυβος, επιτρέποντάς μας να βρούμε την πηγή. Μπορούμε να επιτύχουμε το ίδιο ακριβώς είδος εντοπισμού χρησιμοποιώντας ένα ζεύγος μικροφώνων. Εξετάστε το διάγραμμα που εμφανίζεται, το οποίο περιέχει ένα ζεύγος μικροφώνου και μια πηγή ήχου. Αν κοιτάμε από πάνω προς τα κάτω, τα ηχητικά κύματα είναι κυκλικά, αλλά αν η απόσταση από την πηγή είναι μεγάλη σε σχέση με το διάστημα μεταξύ των μικροφώνων, τότε από την άποψη των αισθητήρων μας το κύμα είναι περίπου επίπεδο. Αυτό είναι γνωστό ως υπόθεση μακρινού πεδίου και απλοποιεί τη γεωμετρία του προβλήματός μας.

Ας υποθέσουμε λοιπόν ότι το μέτωπο κύματος είναι μια ευθεία γραμμή. Εάν ο ήχος προέρχεται από τα δεξιά, θα χτυπήσει το μικρόφωνο #2 τη στιγμή t2 και το μικρόφωνο #1 τη στιγμή t1. Η απόσταση d που διανύει ο ήχος μεταξύ χτυπήματος μικροφώνου #2 και μικροφώνου #1 είναι η χρονική διαφορά στην ανίχνευση του ήχου πολλαπλασιασμένη με την ταχύτητα του ήχου v s:

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

Μπορούμε να συσχετίσουμε αυτήν την απόσταση με την απόσταση d 12 μεταξύ του ζεύγους μικροφώνου και τη γωνία θ από το ζεύγος στην πηγή ήχου με τη σχέση:

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

Επειδή έχουμε μόνο δύο μικρόφωνα, θα υπάρχει ασάφεια στον υπολογισμό μας για το αν η πηγή ήχου βρίσκεται μπροστά ή πίσω μας. Σε αυτό το σύστημα, υποθέτουμε ότι η πηγή ήχου βρίσκεται μπροστά από το ζεύγος και σφίγγουμε τη γωνία μεταξύ 0 μοίρες (πλήρως στα δεξιά του ζεύγους) έως 180 μοίρες (πλήρως προς τα αριστερά).

Τέλος, μπορούμε να λύσουμε για θήτα παίρνοντας το αντίστροφο συνημίτονο:

θ = acos (έναντι*Δt/d12), 0 <= θ <= π

Για να κάνουμε τη γωνία λίγο πιο φυσική, μπορούμε να αφαιρέσουμε 90 μοίρες από τη θήτα, έτσι ώστε οι 0 μοίρες να βρίσκονται ακριβώς μπροστά από το ζεύγος και οι +/- 90 μοίρες να είναι πλήρως αριστερά ή πλήρως δεξιά. Αυτό μετατρέπει την έκφρασή μας από το αντίστροφο συνημίτονο στο αντίστροφο ημίτονο.

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

  • θ = asin (έναντι*Δt/d12), -π/2 <= θ <= π/2

Εύρεση της καθυστέρησης

Όπως μπορείτε να δείτε από την παραπάνω εξίσωση, το μόνο που πρέπει να λύσουμε για τη γωνία είναι η καθυστέρηση στο ηχητικό κύμα που φτάνει στο μικρόφωνο ένα σε σύγκριση με το μικρόφωνο δύο. η ταχύτητα του ήχου και η απόσταση μεταξύ των μικροφώνων είναι σταθερές και γνωστές. Για να το πετύχουμε αυτό, παίρνουμε πρώτα δείγματα των ηχητικών σημάτων στη συχνότητα fs, μετατρέποντάς τα από αναλογικά σε ψηφιακά και αποθηκεύοντας τα δεδομένα για μελλοντική χρήση. Κάνουμε δειγματοληψία για ένα χρονικό διάστημα γνωστό ως παράθυρο δειγματοληψίας, το οποίο έχει αρκετά μεγάλη διάρκεια για να αποτυπώσει διακριτά χαρακτηριστικά του ηχητικού μας κύματος. Για παράδειγμα, το παράθυρό μας θα μπορούσε να είναι ηχητικά δεδομένα αξίας τελευταίου μισού δευτερολέπτου.

Αφού λάβουμε τα ηχητικά σήματα με παράθυρα, βρίσκουμε την καθυστέρηση μεταξύ των δύο υπολογίζοντας τη συσχέτισή τους. Για να υπολογίσουμε τη διασταυρούμενη συσχέτιση, κρατάμε το παράθυρο του σήματος από ένα μικρόφωνο σταθερό και ολισθαίνουμε το δεύτερο σήμα κατά μήκος του άξονα του χρόνου από όλη τη διαδρομή πίσω από το πρώτο σε όλο το δρόμο μπροστά από το πρώτο. Σε κάθε βήμα κατά μήκος της διαφάνειάς μας πολλαπλασιάζουμε κάθε σημείο στο σταθερό σήμα μας με το αντίστοιχο σημείο στο ολισθαίνον σήμα μας και στη συνέχεια αθροίζουμε όλα τα αποτελέσματα για να υπολογίσουμε τον συντελεστή συσχέτισης για αυτό το βήμα. Αφού ολοκληρώσουμε τη διαφάνειά μας, το βήμα που έχει τον υψηλότερο συντελεστή συσχέτισης αντιστοιχεί στο σημείο όπου τα δύο σήματα είναι πιο παρόμοια και σε ποιο βήμα βρισκόμαστε μας λέει πόσα δείγματα το σήμα δύο αντισταθμίζεται από το σήμα 1. Εάν το n είναι αρνητικό, τότε το σήμα δύο υστερεί πίσω από το σήμα ένα, αν είναι θετικό τότε το σήμα δύο είναι μπροστά και αν είναι μηδέν τότε τα δύο είναι ήδη ευθυγραμμισμένα. Μετατρέπουμε αυτό το δείγμα offset σε χρονική καθυστέρηση χρησιμοποιώντας τη συχνότητα δειγματοληψίας μας με τη σχέση Δt = n/fs, έτσι:

θ = asin (έναντι*n/(d12*fs)), -π/2 <= θ <= π/2

Βήμα 2: Συστατικά

Ανταλλακτικά

  • Microsoft Kinect για Xbox 360, μοντέλο 1414 ή 1473. Το Kinect διαθέτει τέσσερα μικρόφωνα διατεταγμένα σε μια γραμμική συστοιχία που θα χρησιμοποιήσουμε.
  • Προσαρμογέας για τη μετατροπή της ιδιόκτητης υποδοχής του Kinect σε τροφοδοσία USB + AC όπως αυτή.
  • Raspberry Pi 2 ή 3 που τρέχει Raspbian Stretch. Αρχικά προσπάθησα να χρησιμοποιήσω ένα Pi 1 Model B+, αλλά δεν ήταν αρκετά ισχυρό. Συνέχισα να έχω προβλήματα αποσύνδεσης από το Kinect.
  • Το πιο ανατριχιαστικό κεφάλι μανεκέν που μπορείτε να βρείτε
  • Ένα αναλογικό σερβο αρκετά δυνατό για να γυρίσει το κεφάλι του μανεκέν
  • Ένας φορτιστής τοίχου USB 5V με αρκετό ρεύμα για να τροφοδοτήσει τόσο το Pi όσο και το σερβο και τουλάχιστον δύο θύρες. (Χρησιμοποίησα ένα βύσμα 5Α 3 θυρών παρόμοιο με αυτό
  • Ένα καλώδιο επέκτασης με δύο πρίζες (το ένα για τον φορτιστή τοίχου USB και το άλλο για τον προσαρμογέα AC Kinect.
  • Δύο καλώδια USB: ένα καλώδιο τύπου A σε micro-USB για την τροφοδοσία του Pi και ένα άλλο για την τροφοδοσία του σερβο που δεν σας πειράζει να κόψετε
  • Μια πλατφόρμα για να καθίσουν όλα και μια άλλη μικρότερη πλατφόρμα για το κεφάλι μανεκέν. Χρησιμοποίησα ένα πλαστικό δίσκο σερβιρίσματος ως βάση και μια πλαστική πλάκα ως πλατφόρμα κεφαλής. Και οι δύο ήταν από την Walmart και κόστιζαν μόνο μερικά δολάρια
  • Μπουλόνια και παξιμάδια 4x #8-32 1/2 "για να συνδέσετε το σερβο σας στη μεγαλύτερη πλατφόρμα
  • 2x μπουλόνι M3 8mm με ροδέλες (ή οποιοδήποτε μέγεθος χρειάζεστε για να στερεώσετε το σερβοκόρνα σας στη μικρότερη πλατφόρμα)
  • Δύο καλώδια άλτης από αρσενικό σε αρσενικό, ένα κόκκινο και ένα μαύρο και ένα καλώδιο άλτης από γυναίκα σε αρσενικό
  • Αυτοκόλλητες λωρίδες Velcro
  • Ηλεκτρική ταινία
  • Κολλητική ταινία για τη διαχείριση καλωδίων

Εργαλεία

  • Dremel με τροχό κοπής
  • Τρυπάνι
  • Τρυπάνια 7/64 ", 11/16" και 5/16"
  • Πατήστε M3 (Προαιρετικό, ανάλογα με το σερβοκόρνα σας)
  • Κατσαβίδι
  • Συγκολλητικό σίδερο με συγκόλληση
  • Χέρια βοήθειας (προαιρετικά)
  • Σημάδι
  • Πυξίδα
  • Απογυμνωτές καλωδίων
  • Πολύμετρο (προαιρετικό)

ΜΑΠ

  • Γυαλιά ασφαλείας

  • Μάσκα προσώπου (για πλαστικά κομμάτια με μύτη dremmel).

Βήμα 3: Συνέλευση κάτω πλατφόρμας

Συνέλευση Κάτω Πλατφόρμας
Συνέλευση Κάτω Πλατφόρμας
Συνέλευση Κάτω Πλατφόρμας
Συνέλευση Κάτω Πλατφόρμας
Συνέλευση Κάτω Πλατφόρμας
Συνέλευση Κάτω Πλατφόρμας

Το πρώτο μέρος που θα φτιάξουμε είναι η χαμηλότερη πλατφόρμα, η οποία θα περιέχει το Kinect, το σερβο και όλα τα ηλεκτρονικά μας. Για να φτιάξετε την πλατφόρμα θα χρειαστείτε:

  • Πλαστικός δίσκος σερβιρίσματος
  • Servo
  • Βίδες 4x #8-32 1/2 "με παξιμάδια
  • Dremel με τροχό κοπής
  • Κατσαβίδι
  • Τρυπάνι
  • Τρυπάνι 11/16"
  • Σημάδι

Πως να φτιάξεις

  1. Γυρίστε το δίσκο σας ανάποδα.
  2. Τοποθετήστε το σερβο πλάγια κοντά στο πίσω μέρος του δίσκου, βεβαιωθείτε ότι η ταχύτητα εξόδου του σερβο βρίσκεται κατά μήκος της κεντρικής γραμμής του δίσκου και, στη συνέχεια, σημειώστε γύρω από τη βάση του σερβο.
  3. Χρησιμοποιώντας το dremel και τον τροχό κοπής, κόψτε την περιοχή που σημειώσατε και, στη συνέχεια, σύρετε το servo σας στην υποδοχή του.
  4. Σημειώστε τα κέντρα των τρυπών στερέωσης του servo περιβλήματος στο δίσκο, στη συνέχεια αφαιρέστε το σερβο και ανοίξτε αυτές τις τρύπες με το τρυπάνι σας 11/16 ". Είναι πολύ εύκολο να σπάσετε λεπτό πλαστικό έτσι όταν ανοίγετε τρύπες, οπότε το θεωρώ πολύ πιο ασφαλές για να τρέξετε το τρυπάνι αντίστροφα και να απομακρύνετε αργά το υλικό. Είναι πολύ πιο αργό από το να ανοίξετε σωστά τις τρύπες, αλλά διασφαλίζει ότι δεν υπάρχουν ρωγμές.
  5. Τοποθετήστε το σερβο ξανά στην υποδοχή και στη συνέχεια τοποθετήστε το στο δίσκο με τα μπουλόνια και τα παξιμάδια #8-32.

Βήμα 4: Συνέλευση πλατφόρμας κεφαλής

Συνέλευση κεφαλής πλατφόρμας
Συνέλευση κεφαλής πλατφόρμας
Συνέλευση κεφαλής πλατφόρμας
Συνέλευση κεφαλής πλατφόρμας
Συνέλευση κεφαλής πλατφόρμας
Συνέλευση κεφαλής πλατφόρμας
Συνέλευση κεφαλής πλατφόρμας
Συνέλευση κεφαλής πλατφόρμας

Το επόμενο μέρος που θα φτιάξουμε θα είναι μια πλατφόρμα για να συνδέσετε το κεφάλι μανεκέν με το σερβο. Για να φτιάξετε την πλατφόρμα κεφαλής θα χρειαστείτε:

  • Πλαστική πλάκα
  • Servo κέρατο
  • 2x Μ3 μπουλόνι 8mm με ροδέλες
  • Κατσαβίδι
  • Τρυπάνι
  • Τρυπάνια 7/64 "και 5/16"
  • Πυξίδα
  • Dremel με τροχό κοπής

Πως να φτιάξεις

  1. Ρυθμίστε την πυξίδα σας στην ακτίνα της βάσης του κεφαλιού μανεκέν σας.
  2. Χρησιμοποιήστε την πυξίδα σας για να σημειώσετε έναν κύκλο κεντραρισμένο στο κέντρο της πλάκας. Αυτό θα είναι το πραγματικό μέγεθος της πλατφόρμας κεφαλής μας.
  3. Χρησιμοποιήστε το dremel και τον τροχό κοπής για να κόψετε τη μικρότερη πλατφόρμα από την πλάκα.
  4. Τρυπήστε το κέντρο της νέας σας πλατφόρμας με ένα τρυπάνι 5/16 ". Αυτό θα μας δώσει πρόσβαση στη βίδα που στερεώνει το σερβοκόρνο μας στο σερβο. Για να δώσει σταθερότητα στην πλατφόρμα καθώς άνοιξα την τρύπα, έβαλα ένα καρούλι σύρμα από κάτω και τρυπήθηκε στο κέντρο του καρουλιού.
  5. Ευθυγραμμίστε το σερβοκόρνα σας με το κέντρο της πλατφόρμας και σημειώστε δύο τρύπες για να στερεώσετε το κέρατο στην πλατφόρμα. Βεβαιωθείτε ότι αυτές οι οπές στερέωσης είναι αρκετά μακριά μεταξύ τους, ώστε να υπάρχει χώρος για τις κεφαλές μπουλονιών και τις ροδέλες M3.
  6. Ανοίξτε αυτές τις σημαδεμένες τρύπες με ένα τρυπάνι 7/64 ".
  7. Η κάτω τρύπα του σερβοκόρνου μου ήταν ομαλή, δηλαδή δεν είχε τα νήματα για το μπουλόνι Μ3. Έτσι, χρησιμοποίησα το τρυπάνι μου και μια βρύση Μ3 για να φτιάξω τα νήματα.
  8. Χρησιμοποιήστε τα μπουλόνια και τις ροδέλες για να στερεώσετε το σερβοκόρνα στην πλατφόρμα κεφαλής.

Βήμα 5: Καλώδιο τροφοδοσίας σερβο

Servo καλώδιο τροφοδοσίας
Servo καλώδιο τροφοδοσίας
Servo καλώδιο τροφοδοσίας
Servo καλώδιο τροφοδοσίας
Servo καλώδιο τροφοδοσίας
Servo καλώδιο τροφοδοσίας
Servo καλώδιο τροφοδοσίας
Servo καλώδιο τροφοδοσίας

Τα αναλογικά σερβίτσια τροφοδοτούνται συνήθως με 4,8-6V. Δεδομένου ότι το Raspberry Pi πρόκειται ήδη να τροφοδοτηθεί από 5V από USB, θα απλοποιήσουμε το σύστημά μας τροφοδοτώντας επίσης το σερβο από USB. Για να το κάνουμε αυτό θα πρέπει να τροποποιήσουμε ένα καλώδιο USB. Για να φτιάξετε το σερβο καλώδιο τροφοδοσίας θα χρειαστείτε:

  • Ανταλλακτικό καλώδιο USB με άκρο τύπου A (το είδος που συνδέεται στον υπολογιστή σας)
  • Ένα κόκκινο και ένα μαύρο καλώδιο βραχυκυκλωτήρα
  • Συγκολλητικό σίδερο
  • Κόλλα μετάλλων
  • Απογυμνωτές καλωδίων
  • Ηλεκτρική ταινία
  • Χέρια βοήθειας (προαιρετικά)
  • Πολύμετρο (προαιρετικό)

Πως να φτιάξεις

  1. Κόψτε το καλώδιο σας από τη σύνδεση USB τύπου A, και αφαιρέστε λίγο από τη μόνωση για να αποκαλύψετε τα τέσσερα εσωτερικά καλώδια. Κόψτε τη θωράκιση που περιβάλλει τα εκτεθειμένα καλώδια.
  2. Συνήθως το καλώδιο USB θα έχει τέσσερα καλώδια: δύο για μετάδοση και λήψη δεδομένων και δύο για τροφοδοσία και γείωση. Μας ενδιαφέρει η δύναμη και το έδαφος, τα οποία είναι συνήθως κόκκινα και μαύρα, αντίστοιχα. Αφαιρέστε μέρος της μόνωσης από τα κόκκινα και μαύρα καλώδια και κόψτε τα πράσινα και άσπρα καλώδια. Εάν ανησυχείτε ότι δεν έχετε τα σωστά καλώδια τροφοδοσίας και γείωσης, μπορείτε να συνδέσετε το καλώδιό σας στον προσαρμογέα τροφοδοσίας USB και να ελέγξετε την τάση εξόδου με ένα πολύμετρο.
  3. Στη συνέχεια, κόψτε το ένα άκρο των κόκκινων και μαύρων καλωδίων βραχυκυκλωτήρα και αφαιρέστε λίγη από τη μόνωση.
  4. Τώρα, στρίψτε μαζί τα εκτεθειμένα μαύρα καλώδια του βραχυκυκλωτήρα σας και τα καλώδια USB. Διασχίστε τα κέντρα των εκτεθειμένων καλωδίων και στρίψτε τα το ένα γύρω στο άλλο. Στη συνέχεια, εφαρμόστε κόλλα στα ζευγαρωμένα καλώδια για να τα συγκρατήσετε. Τα χέρια που βοηθούν θα το κάνουν πιο εύκολο κρατώντας τα καλώδια στη θέση τους.
  5. Επαναλάβετε το βήμα 4 για τα κόκκινα καλώδια.
  6. Καλύψτε την εκτεθειμένη καλωδίωση με ηλεκτρική ταινία ή θερμοσυστελλόμενη σωλήνωση εάν αισθάνεστε φανταχτερά. Αυτοί οι σύνδεσμοι θα είναι εύθραυστοι αφού τα σύρματα είναι τόσο μικρά, οπότε προσθέστε ένα δεύτερο στρώμα ταινίας που συγκρατεί τα καλώδια του βραχυκυκλωτήρα στην εξωτερική μόνωση του καλωδίου USB. Αυτό θα κάνει το συγκρότημα πιο άκαμπτο και συνεπώς λιγότερο πιθανό να σπάσει από την κάμψη.

Βήμα 6: Τοποθέτηση ηλεκτρονικών συσκευών

Τοποθέτηση ηλεκτρονικών
Τοποθέτηση ηλεκτρονικών
Τοποθέτηση ηλεκτρονικών
Τοποθέτηση ηλεκτρονικών
Τοποθέτηση ηλεκτρονικών
Τοποθέτηση ηλεκτρονικών

Τέλος, θα φέρουμε τα πάντα μαζί, τοποθετώντας τα ηλεκτρονικά μας και όλα τα άλλα στην κάτω πλατφόρμα. Θα χρειαστείτε:

  • Κάτω πλατφόρμα
  • Πλατφόρμα κεφαλής
  • Κεφαλή μανεκέν
  • Kinect με προσαρμογέα USB+AC
  • Προσαρμογέας ρεύματος USB
  • Καλώδιο επέκτασης
  • Καλώδιο Micro USB
  • Servo καλώδιο τροφοδοσίας
  • Raspberry Pi
  • Καλώδιο άλτης από άντρα σε γυναίκα
  • Κολλητικό Velcro
  • Ψαλίδι

Πως να φτιάξεις

  1. Τοποθετήστε το Pi στο κάτω μέρος του δίσκου με Velcro.
  2. Συνδέστε το τροφοδοτικό USB με Velcro.
  3. Συνδέστε το servo και το Pi στον προσαρμογέα τροφοδοσίας USB.
  4. Συνδέστε τον ακροδέκτη 12 (GPIO18) του Pi στο καλώδιο σήματος του servo. Είναι η 6η ακίδα κάτω δεξιά.
  5. Βιδώστε το καλώδιο επέκτασής σας στην πίσω λαβή του δίσκου και συνδέστε το τροφοδοτικό USB στη μία πλευρά.
  6. Πάρτε τον προσαρμογέα AC Kinect USB+και συνδέστε τον προσαρμογέα ρεύματος στην άλλη πλευρά του καλωδίου επέκτασης και το USB στο Pi.
  7. Βιδώστε το καλώδιο του Kinect μέσω της μπροστινής λαβής του δίσκου και συνδέστε τον προσαρμογέα Kinect.
  8. Χρησιμοποίησα κολλητική ταινία για να συγκρατήσω τα καλώδια στο κάτω μέρος της πλατφόρμας. Αυτό δεν φαίνεται το πιο κομψό, αλλά ευτυχώς όλα αυτά είναι κρυμμένα.
  9. Γυρίστε την πλατφόρμα προς τα δεξιά και χρησιμοποιήστε Velcro για να τοποθετήσετε το Kinect στο μπροστινό μέρος της πλατφόρμας.
  10. Χρησιμοποιήστε το Velcro για να τοποθετήσετε το κεφάλι του μανεκέν στην πλατφόρμα κεφαλής. Μόλις τακτοποιηθούν όλα, ωστόσο, χωρίστε τα δύο κομμάτια, ώστε να έχουμε πρόσβαση στη βίδα στερέωσης του σερβοκόρνας. Μην βιδώνετε ακόμα το κέρατο στο σερβο, όμως, καθώς πρέπει να βεβαιωθούμε ότι το σερβο είναι πρώτα στην κεντρική του θέση, ώστε να μπορέσουμε να τακτοποιήσουμε τα πάντα. Θα το κάνουμε σε επόμενο βήμα.

Βήμα 7: Λογισμικό και αλγόριθμος

Λογισμικό και αλγόριθμος
Λογισμικό και αλγόριθμος

ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑ

Το λογισμικό για αυτό το έργο είναι γραμμένο σε C ++ και είναι ενσωματωμένο στο λειτουργικό σύστημα ρομπότ (ROS), ένα πλαίσιο για τη σύνταξη λογισμικού ρομποτικής. Στο ROS, το λογισμικό για ένα σύστημα χωρίζεται σε μια συλλογή προγραμμάτων που ονομάζονται κόμβοι, όπου κάθε κόμβος υλοποιεί μια συγκεκριμένη υποενότητα της λειτουργικότητας του συστήματος. Τα δεδομένα διαβιβάζονται μεταξύ κόμβων χρησιμοποιώντας μια μέθοδο δημοσίευσης/εγγραφής, όπου οι κόμβοι που παράγουν τα δεδομένα τα δημοσιεύουν και οι κόμβοι που καταναλώνουν τα δεδομένα εγγραφούν σε αυτά. Η αποσύνδεση του κώδικα με αυτόν τον τρόπο επιτρέπει την εύκολη επέκταση της λειτουργικότητας του συστήματος και επιτρέπει την κοινή χρήση κόμβων μεταξύ των συστημάτων για ταχύτερη ανάπτυξη.

Σε αυτό το σύστημα, το ROS χρησιμοποιείται κυρίως για να διαχωρίσει τον κώδικα που υπολογίζει την κατεύθυνση άφιξης (DOA) της πηγής ήχου από τον κωδικό που ελέγχει το σερβο, επιτρέποντας σε άλλα έργα να συμπεριλάβουν την εκτίμηση Kinect DOA χωρίς να συμπεριλάβουν σερβοκώδικα που μπορεί να μην χρειάζονται ή να θέλουν Το Εάν θέλετε να δείτε τον ίδιο τον κώδικα, μπορείτε να τον βρείτε στο GitHub:

github.com/raikaDial/kinect_doa

Κόμβος Kinect DOA

Ο κόμβος kinect_doa είναι το κρέας και τα οστά αυτού του συστήματος, κάνοντας βασικά όλα τα ενδιαφέροντα. Κατά την εκκίνηση, αρχικοποιεί τον κόμβο ROS, καθιστώντας δυνατή τη μαγεία του ROS και στη συνέχεια ανεβάζει το υλικολογισμικό στο Kinect, έτσι ώστε οι ροές ήχου να είναι διαθέσιμες. Στη συνέχεια, δημιουργεί ένα νέο νήμα που ανοίγει τις ροές ήχου και αρχίζει να διαβάζει στα δεδομένα του μικροφώνου. Το Kinect δοκιμάζει τα τέσσερα μικρόφωνά του σε συχνότητα 16 kHz το καθένα, οπότε καλό είναι να υπάρχει η συσχέτιση και η συλλογή δεδομένων σε ξεχωριστά νήματα για να αποφευχθούν τα δεδομένα που λείπουν λόγω υπολογιστικού φορτίου. Η διασύνδεση με το Kinect πραγματοποιείται χρησιμοποιώντας το libfreenect, ένα δημοφιλές πρόγραμμα οδήγησης ανοιχτού κώδικα.

Το νήμα συλλογής εκτελεί μια λειτουργία επανάκλησης κάθε φορά που λαμβάνονται νέα δεδομένα, και τα δύο αποθηκεύουν τα δεδομένα και καθορίζουν πότε θα εκτιμήσουν το DOA. Τα δεδομένα από κάθε μικρόφωνο αποθηκεύονται σε κυλιόμενες μνήμες ίσου μήκους με το παράθυρο δειγματοληψίας, το οποίο εδώ είναι 8192 δείγματα. Αυτό μεταφράζεται σε υπολογισμό της συσχέτισης με δεδομένα αξίας περίπου του τελευταίου μισού δευτερολέπτου, αυτό που βρήκα μέσω του πειραματισμού ήταν μια καλή ισορροπία μεταξύ της απόδοσης και του υπολογιστικού φορτίου. Η εκτίμηση DOA ενεργοποιείται για κάθε 4096 δείγματα σηματοδοτώντας το κύριο νήμα, έτσι ώστε οι διαδοχικοί διασταυρούμενοι συσχετισμοί να επικαλύπτονται κατά 50%. Εξετάστε μια περίπτωση όπου δεν υπάρχει επικάλυψη και κάνετε έναν πολύ γρήγορο θόρυβο που κόβεται στο μισό από το παράθυρο δειγματοληψίας. Πριν και μετά ο διακριτικός ήχος σας πιθανότατα θα είναι λευκός θόρυβος, ο οποίος μπορεί να είναι δύσκολο να ευθυγραμμιστεί με τη διασταυρούμενη συσχέτιση. Τα επικαλυπτόμενα παράθυρα μας παρέχουν ένα πιο ολοκληρωμένο δείγμα ήχου, αυξάνοντας την αξιοπιστία της συσχέτισής μας, δίνοντάς μας πιο ευδιάκριτα χαρακτηριστικά για να ευθυγραμμιστούμε.

Το κύριο νήμα περιμένει το σήμα από το νήμα συλλογής και στη συνέχεια υπολογίζει την εκτίμηση DOA. Πρώτον, όμως, ελέγχει εάν οι κυματομορφές που έχουν καταγραφεί διαφέρουν σημαντικά από τον λευκό θόρυβο. Χωρίς αυτόν τον έλεγχο, θα υπολογίζαμε την εκτίμησή μας τέσσερις φορές το δευτερόλεπτο, ανεξάρτητα από το αν υπήρχαν ενδιαφέροντες θόρυβοι ή όχι, και το κεφάλι μανεκέν μας θα ήταν ένα σπαστικό χάος. Ο αλγόριθμος ανίχνευσης λευκού θορύβου που χρησιμοποιείται σε αυτό το σύστημα είναι ο πρώτος από τους δύο που αναφέρονται εδώ. Υπολογίζουμε τον λόγο του απόλυτου ολοκλήρου της παραγώγου της κυματομορφής μας προς το απόλυτο ολοκλήρωμά του. για σήματα με υψηλό περιεχόμενο λευκού θορύβου αυτή η αναλογία είναι υψηλότερη από ό, τι για λιγότερο θορυβώδη σήματα. Ορίζοντας ένα όριο για αυτήν την αναλογία που διαχωρίζει τον θόρυβο από τον μη θόρυβο, μπορούμε να ενεργοποιήσουμε τη διασταύρωση μόνο όταν είναι κατάλληλο. Φυσικά, αυτή η αναλογία είναι κάτι που πρέπει να συντονίζεται κάθε φορά που το σύστημα μετακινείται σε νέο περιβάλλον.

Μόλις διαπιστωθεί ότι οι κυματομορφές περιέχουν σημαντικό περιεχόμενο χωρίς θόρυβο, το πρόγραμμα προχωρά σε διασταυρούμενους συσχετισμούς. Ωστόσο, υπάρχουν τρεις σημαντικές βελτιστοποιήσεις που ενσωματώνονται σε αυτούς τους υπολογισμούς:

  1. Υπάρχουν τέσσερα μικρόφωνα στο Kinect, που σημαίνει ότι υπάρχουν έξι συνολικά ζεύγη κυματομορφών που μπορούμε να συσχετίσουμε. Ωστόσο, αν κοιτάξετε τη χωρική διάταξη της συστοιχίας μικροφώνου, μπορείτε να δείτε ότι τα μικρόφωνα 2, 3 και 4 βρίσκονται πολύ κοντά το ένα στο άλλο. Στην πραγματικότητα, είναι τόσο κοντά που λόγω της ταχύτητας του ήχου και της συχνότητας δειγματοληψίας μας, οι κυματομορφές που λαμβάνονται στα 2, 3 και 4 θα χωρίζονται το πολύ από ένα δείγμα μπροστά ή πίσω, το οποίο μπορούμε να επαληθεύσουμε με τον υπολογισμό maxlag = Δd *fs/vs, όπου Δd είναι ο διαχωρισμός του ζεύγους μικροφώνου, fs είναι η συχνότητα δειγματοληψίας και vs η ταχύτητα του ήχου. Έτσι, η συσχέτιση ζευγών μεταξύ αυτών των τριών είναι άχρηστη και χρειάζεται μόνο να συσχετίσουμε το μικρόφωνο 1 με 2, 3 και 4.
  2. Η τυπική διασταυρούμενη συσχέτιση των ηχητικών σημάτων είναι γνωστό ότι αποδίδει ελάχιστα παρουσία αντήχησης (ηχώ). Μια ισχυρή εναλλακτική λύση είναι γνωστή ως γενικευμένος διασταυρούμενος συσχετισμός με μετασχηματισμό φάσης (GCC-PHAT). Αυτή η μέθοδος καταλήγει στην εφαρμογή μιας συνάρτησης στάθμισης που ενισχύει τις κορυφές στη διασταυρούμενη συσχέτιση, καθιστώντας ευκολότερη τη διάκριση του αρχικού σήματος από τον ηχώ. Συγκρίνω την απόδοση του GCC-PHAT με την απλή συσχέτιση σε έναν θάλαμο αντήχησης (διαβάστε: το συγκεκριμένο μπάνιο αναδιαμορφώνεται) και διαπίστωσα ότι το GCC-PHAT ήταν 7 φορές πιο αποτελεσματικό στην εκτίμηση της σωστής γωνίας.
  3. Κατά την εκτέλεση της διασταυρούμενης συσχέτισης, παίρνουμε τα δύο σήματα, ολισθαίνουμε το ένα κατά μήκος του άλλου και σε κάθε βήμα πολλαπλασιάζουμε κάθε σημείο του σταθερού σήματος μας με κάθε σημείο του ολισθαίνοντος σήματος. Για δύο σήματα μήκους n, αυτό οδηγεί σε n^2 υπολογισμούς. Θα μπορούσαμε να το βελτιώσουμε εκτελώντας αντίθετα τη συσχέτιση στον τομέα συχνοτήτων, ο οποίος περιλαμβάνει έναν γρήγορο μετασχηματισμό φουριέ (υπολογισμοί nlogn), πολλαπλασιάζοντας κάθε σημείο σε ένα μετασχηματισμένο σήμα με το αντίστοιχο σημείο στο άλλο (n υπολογισμοί), και στη συνέχεια εκτελώντας αντίστροφο μετασχηματισμός Fourrier για επιστροφή στον τομέα του χρόνου (υπολογισμοί nlogn), με αποτέλεσμα υπολογισμούς n+2*nlogn, μικρότερους από n^2. Ωστόσο, αυτή είναι η αφελής προσέγγιση. Τα μικρόφωνα στη συστοιχία μας είναι τόσο κοντά μεταξύ τους και η ταχύτητα του ήχου είναι τόσο σχετικά αργή που οι κυματομορφές του ήχου θα είναι ήδη ευθυγραμμισμένες. Έτσι, μπορούμε να διαχωρίσουμε τον συσχετισμό μας για να λάβουμε υπόψη μόνο τις αντισταθμίσεις που είναι ελαφρώς μπροστά ή πίσω. Για τα μικρόφωνα 1 και 4, η καθυστέρηση πρέπει να είναι μεταξύ +/- 12 δειγμάτων, πράγμα που σημαίνει ότι για κάθε διασταυρούμενο συσχετισμό χρειαζόμαστε μόνο υπολογισμούς 24*n, με αποτέλεσμα εξοικονόμηση υπολογισμού όταν οι κυματομορφές μας είναι μεγαλύτερες από 2900 δείγματα.

Αυτό το σύστημα αξιοποιεί τη βιβλιοθήκη minidsp, η οποία υλοποιεί τον αλγόριθμο GCC-PHAT με βελτιστοποίηση 3.

Μόλις εντοπίσει την καθυστέρηση στα σήματα από κάθε ζεύγος μικροφώνου, το πρόγραμμα επιλέγει τη μέση τιμή για καθυστέρηση, τη χρησιμοποιεί για τον υπολογισμό της εκτιμώμενης γωνίας και δημοσιεύει το αποτέλεσμα, ώστε να μπορεί να χρησιμοποιηθεί για τον έλεγχο του σερβο.

Servo Control Node

Σε σύγκριση με τον κόμβο kinect_doa, ο σερβο κόμβος είναι σχετικά απλός. Η δουλειά του είναι να παίρνει μόνο το εκτιμώμενο DOA και να μετακινεί το σερβο σε αυτή τη γωνία. Χρησιμοποιεί τη βιβλιοθήκη wiringPi για πρόσβαση στην μονάδα υλικού PWM του Raspberry Pi, χρησιμοποιώντας την για να ρυθμίσει τη γωνία του σερβο. Τα περισσότερα αναλογικά σερβίς ελέγχονται από ένα σήμα PWM με πλάτος παλμού που κυμαίνεται από 1000 μs έως 2000 μs, που αντιστοιχεί σε γωνία 0 ° έως 180 °, αλλά το σερβο που χρησιμοποίησα ελέγχθηκε με 500 μs έως 2500 μs, που αντιστοιχεί σε γωνία από 0 ° έως 270 °. Έτσι, ο κόμβος μπορεί να διαμορφωθεί για διαφορετικό σερβο υλικό, ορίζοντας παραμέτρους για το ελάχιστο πλάτος παλμού, το μέγιστο πλάτος παλμού και τη διαφορά μεταξύ της μέγιστης και της ελάχιστης γωνίας. Επιπλέον, το σερβο δεν μετακινείται αμέσως στη γωνία στόχου, αλλά μάλλον κινείται προς τη γωνία με ρυθμιζόμενη ταχύτητα, δίνοντας στη Μάργκαρετ μια πιο σταδιακή, ανατριχιαστική ατμόσφαιρα (συν, ο ήχος ενός σερβο που κινείται γρήγορα μπρος -πίσω γίνεται ενοχλητικός πολύ γρήγορα).

Βήμα 8: Δημιουργία και εγκατάσταση

Εγκατάσταση εξαρτήσεων:

Αρχικά, εγκαταστήστε το libfreenect. Πρέπει να το δημιουργήσουμε από την πηγή, επειδή η έκδοση που μπορείτε να λάβετε με τον διαχειριστή πακέτων δεν περιλαμβάνει υποστήριξη ήχου. Αυτό οφείλεται στο ότι πρέπει να ανεβάσουμε υλικολογισμικό στο Kinect για να ενεργοποιήσουμε τον ήχο και η αναδιανομή αυτού του υλικολογισμικού δεν είναι νόμιμη σε ορισμένες δικαιοδοσίες. Επιπλέον, μπορούμε να αποφύγουμε τη δημιουργία των παραδειγμάτων που απαιτούν OpenGL και υπερπλήρωση, περιττά για ακέφαλες εγκαταστάσεις 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/sudo//51.rules /etc/udev/rules.d έλεγχος udevadm-κανόνες επαναφόρτωσης && udevadm σκανδάλη

Στη συνέχεια, πρέπει να εγκαταστήσουμε το πακέτο wiringPi, το οποίο μας επιτρέπει να ελέγχουμε τις ακίδες GPIO του Pi:

CD

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

Συνδέστε το κεφάλι μανεκέν:

Με εγκατεστημένο το wiringPi, μπορούμε τώρα να κάνουμε μια γρήγορη παράκαμψη πίσω στο hardware-land για να στερεώσουμε το κεφάλι του μανεκέν στην κάτω πλατφόρμα. Για να κεντράρετε το σερβο μέσω της γραμμής εντολών, εισαγάγετε τις ακόλουθες εντολές:

gpio pwm-ms

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

Εάν δεν υπάρχει κίνηση, τότε το σερβο σας είναι πιθανώς ήδη στο κέντρο. Για να είστε σίγουροι, όμως, μπορείτε να ορίσετε το σερβο σε μη κεντρική τιμή, π.χ. gpio -g pwm 18 200 και, στη συνέχεια, ρυθμίστε το ξανά στο 150.

Αφού βεβαιωθείτε ότι το σερβο είναι κεντραρισμένο, συνδέστε το σερβοκόρνα της πλατφόρμας κεφαλής στο σερβο, έτσι ώστε το κεφάλι μανεκέν να κοιτάζει ευθεία προς τα εμπρός. Στη συνέχεια, βιδώστε την κόρνα στο σερβο και συνδέστε το κεφάλι σας μέσω των κομματιών Velcro.

Εγκατάσταση ROS:

Στη συνέχεια, εγκαταστήστε το ROS στο Pi σας. Μπορείτε να βρείτε έναν εξαιρετικό οδηγό εγκατάστασης. για το σύστημά μας δεν χρειαζόμαστε OpenCV, ώστε να παραλείψετε το βήμα 3. Αυτή η κατασκευή θα διαρκέσει αρκετές ώρες για να ολοκληρωθεί. Όταν τελειώσετε ακολουθώντας τον οδηγό εγκατάστασης, προσθέστε την προμήθεια της εγκατάστασης στο bashrc σας, ώστε να μπορούμε να χρησιμοποιήσουμε τα πρόσφατα εγκατεστημένα πακέτα ROS:

ηχώ "πηγή /opt/ros/kinetic/setup.bash" >> ~/.bashrc

Δημιουργία πακέτου Kinect DOA:

Μετά από όλα όσα έχουν γίνει, δημιουργήστε έναν χώρο εργασίας για το έργο μας και εισαγάγετε τον κατάλογο src:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Ο κώδικας για αυτό το έργο περιέχεται στο πακέτο kinect_doa, οπότε κλωνοποιήστε τον στον κατάλογο src του νέου χώρου εργασίας σας:

git clone

Το πακέτο robot_upstart παρέχει ένα εύκολο στη χρήση εργαλείο για την εγκατάσταση αρχείων εκκίνησης, έτσι ώστε να εκτελούνται κατά την εκκίνηση, οπότε κλωνοποιήστε το και στον χώρο εργασίας σας:

git clone

Τώρα, μπορούμε να δημιουργήσουμε τον κώδικα του έργου καλώντας το catkin_make από τον κατάλογο ανώτατου επιπέδου του χώρου εργασίας μας και, στη συνέχεια, προμηθευτείτε το build μας, ώστε να είναι διαθέσιμα τα πακέτα μας:

cd ~/kinect_doa_ws

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

Τρέξιμο και συντονισμός:

Αν υποθέσουμε ότι όλα είναι συνδεδεμένα και ενεργοποιημένα, θα πρέπει τώρα να μπορείτε να εκκινήσετε το σύστημα και να έχετε το Kinect κομμάτι που φωνάζετε! Ωστόσο, εάν έχετε ένα Kinect 1473, ανοίξτε πρώτα το αρχείο ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa. εκκινήστε σε έναν επεξεργαστή κειμένου και ορίστε την παράμετρο χρησιμοποιώντας το_kinect_1473 σε true. Επιπλέον, εάν χρησιμοποιήσατε διαφορετικό σερβο από αυτό που έκανα, είναι πιθανότατα ένας τυπικός αναλογικός σερβο, οπότε ενώ βρίσκεστε στο αρχείο εκκίνησης, αλλάξτε την παράμετρο min_us σε 1000, max_us σε 2000 και max_deg σε 180.

roslaunch kinect_doa kinect_doa.launch

Παίξτε με αυτό για λίγο. Εάν πιστεύετε ότι το σύστημα είναι πολύ ευαίσθητο (κοιτάζοντας τυχαίες κατευθύνσεις που δεν αντιστοιχούν σε φωνές ή διακριτικούς θορύβους), δοκιμάστε να αλλάξετε την παράμετρο white_noise_ratio στο αρχείο εκκίνησης και να επανεκκινήσετε το σύστημα έως ότου η απόκριση είναι στο επίπεδο που σας ικανοποιεί Το Η αύξηση της αναλογίας θα κάνει το σύστημα λιγότερο ανταποκρινόμενο και το αντίστροφο. Πιθανότατα θα πρέπει να εκτελείτε αυτόν τον συντονισμό κάθε φορά που μετακινείτε το σύστημα σε διαφορετική τοποθεσία για να έχετε την απόδοση που θέλετε.

Για να ξεκινήσουμε το πρόγραμμα όταν ενεργοποιούμε το Pi, χρησιμοποιούμε το πακέτο robot_upstart για να εγκαταστήσουμε το αρχείο εκκίνησης. Εάν το ROS δεν εκτελείται αυτήν τη στιγμή, ξεκινήστε το με την εντολή roscore. Στη συνέχεια, ανοίξτε ένα νέο τερματικό και εγκαταστήστε την εκκίνηση με:

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

Δημιουργούμε έναν σύνδεσμο στο αρχείο εκκίνησης αντί να το αντιγράψουμε ώστε να μπορούμε να αλλάξουμε τις παραμέτρους επεξεργάζοντας το ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

Βήμα 9: Απόκρυψη στο γραφείο

Το κρύβω στο γραφείο
Το κρύβω στο γραφείο

Τώρα για το διασκεδαστικό κομμάτι. Προχωρήστε στη δουλειά μετά από ώρες και τοποθετήστε το μανεκέν σας μυστικά. Στη συνέχεια, απλά καθίστε και δείτε πόσος χρόνος χρειάζεται για να πιάσουν οι συνεργάτες σας! Η νέα σας δημιουργία είναι σίγουρο ότι θα γυρίσει μερικά κεφάλια…

Συνιστάται: