Πίνακας περιεχομένων:
Βίντεο: A Hearing MeArm, Google Coral TPU Accelerator Driven: 3 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:34
Στο παρακάτω θα ήθελα να περιγράψω μια φωνητικά ελεγχόμενη έκδοση του MeArm, ένα μικρό ρομπότ xyz βραχίονα με πιασίματα. Χρησιμοποίησα το MeArm Pi από βιομηχανίες MIME, αλλά το σύστημα θα πρέπει να ισχύει για οποιαδήποτε έκδοση του MeArm, ή παρόμοιες σερβοκίνητες συσκευές.
Η χρήση του Google Coral TPU Accelerator επιτρέπει την εκτέλεση γρήγορων σεναρίων αναγνώρισης φωνής TensorFlow εκτός σύνδεσης στο Raspberry Pi και τον έλεγχο των φυσικών συσκευών με προφορικές παραγγελίες, με καθυστέρηση κάτω του ενός δευτερολέπτου.
Η συσκευή που περιγράφεται εδώ είναι ένας συνδυασμός και επέκταση των εννοιών που περιγράφονται σε δύο προηγούμενες οδηγίες. Είναι μια επέκταση μιας παλαιότερης εφαρμογής του φωνητικού ελέγχου Google Coral, ενός Jumping Jack, που περιγράφεται εδώ και μιας τεράστιας βελτίωσης ενός MeArm με φωνητικό έλεγχο Google AIY που περιγράφεται εδώ.
Το φωνητικά ελεγχόμενο MeArm χρησιμοποιώντας το σύστημα Google Voice AIY απαιτούσε πρόσβαση στο διαδίκτυο, δεν ήταν εύκολο να εφαρμοστεί, απαιτείται να πατήσετε ένα κουμπί για να ενεργοποιήσετε την ακρόαση φωνητικών παραγγελιών και είχε πολύ χρόνο καθυστέρησης. Ο επιταχυντής Google Coral TPU που χρησιμοποιείται τώρα επιτρέπει την εκτέλεση μοντέλων TensorFlowLite εκτός σύνδεσης με μεγάλη ταχύτητα σε Raspberry Pi ή άλλες συσκευές Linux. Μεταξύ των παραδειγμάτων στη σελίδα Google Coral Github υπάρχει ένα παράδειγμα που ονομάζεται "ακουστικό φίδι" για ένα σύστημα αναγνώρισης φωνής που μπορεί να κατανοήσει 140 φράσεις -κλειδιά (Σεπτέμβριος 2019), οι οποίες στη συνέχεια αντιστοιχίζονται σε εικονικές πληκτρολογήσεις. Η σύζευξη αυτών των "πληκτρολογήσεων" με την εκτέλεση ορισμένων λειτουργιών που έχουν προγραμματιστεί σε Python καθιστά δυνατή τη δημιουργία μιας συσκευής ελεγχόμενης φωνητικής εντολής. Πρόσφατα είχα περιγράψει μια πρώτη εφαρμογή, έναν ηλεκτρομηχανικό βύσμα με φωνητικό έλεγχο. Η εφαρμογή εδώ είναι λίγο πιο περίπλοκη και επιτρέπει τον έλεγχο και των τεσσάρων σερβομηχανισμών του MeArm είτε για να μετακινείτε συνεχώς το MeArm είτε για να το μετακινήσετε σε έναν αριθμό προκαθορισμένων θέσεις, ή για την εκτέλεση κάποιων πιο σύνθετων εργασιών.
Χρησιμοποιώντας το σενάριο που παρέχεται εδώ ως παράδειγμα, θα πρέπει να είναι σχετικά απλή η κατασκευή άλλων συσκευών ελεγχόμενης φωνής, π.χ. ρομποτικά αυτοκίνητα ή μονάδες υποβοηθητικής τεχνολογίας.
Προμήθειες
- MeArm. Χρησιμοποιείται εδώ: MeArm Pi από τις βιομηχανίες MIME
- Raspberry Pi 4
- Επιταχυντής Google Coral TPU
- Serva καπό Adafruit 16 καναλιών
- μερικά καλώδια βραχυκυκλωτήρων
- προαιρετικά: πυκνωτής για servo καπό, περίπου 400 μF για 4 servos (προτείνεται από την Adafruit)
- Πηγή ισχύος 5-6 V για servo καπό. Χρησιμοποίησα εδώ έναν παλιό φορτιστή 6V, μια μπαταρία 4x AA λειτουργεί επίσης
- Μικρόφωνο. Χρησιμοποίησα μια παλιά κάμερα Microsoft HD3000 ως μικρόφωνο.
Βήμα 1: Ρύθμιση του συστήματος
Κατεβάστε την προκαθορισμένη εικόνα Raspian για το Google Coral TPU Accelerator από τη σελίδα Google Coral Github και εγκαταστήστε την σε μια κάρτα μSD. Η εικόνα περιέχει επίσης έναν αριθμό παραδειγμάτων σεναρίων. Ρυθμίστε το Pi όπως υποδεικνύεται.
Εγκαταστήστε το παράδειγμα spotter λέξεων -κλειδιών από τον ιστότοπο Google Coral GitHub, εάν δεν περιλαμβάνεται στην εικόνα και όλα τα απαιτούμενα προγράμματα. Συνδέστε το μικρόφωνο στο Pi. Θα συνιστούσα να παίξετε με το παράδειγμα "Hearing Snake" για να βεβαιωθείτε ότι όλα λειτουργούν.
Κατεβάστε και εγκαταστήστε το λογισμικό καπό Adafruit 16 καναλιών, όπως περιγράφεται εδώ. Εγκαταστήστε το καπό και παίξτε με τα παραδείγματα Adafruit για να διασφαλίσετε ότι όλα λειτουργούν σωστά.
Κατεβάστε τα αρχεία που είναι συνημμένα σε αυτό το εκπαιδευτικό και αντιγράψτε τα στο φάκελο "Project Keyword Spotter". Το αρχείο "commands_v1_MeArm.txt" πρέπει να αντιγραφεί στον υποφάκελο "config".
Συνδέστε τα servos της MeArm σας στο σερβομπάουντ όπως υποδεικνύεται. Χρησιμοποίησα τη θύρα 15 για άνω/κάτω, θύρα 11 για εμπρός/πίσω, θύρα 7 για στροφή και θύρα 3 για σερβίτσια πιασίματος.
Μέσα στο σενάριο μπορεί να χρειαστεί να προσαρμόσετε τις τιμές min/center/max για κάθε σερβο στη διαμόρφωσή σας. Αυτές οι ρυθμίσεις βοηθούν στην αποφυγή ζημιάς στα servos. Μπορεί επίσης να χρειαστεί να τροποποιήσετε τις συμπεριλαμβανόμενες λίστες "θέσεων", "μεταφοράς1" και "μεταφοράς2".
Εκτελέστε το σενάριο. Μέχρι τώρα το χρησιμοποιούσα από το IDE.
Σε περίπτωση που θέλετε να τροποποιήσετε τις φράσεις κλειδιά που προκαλούν μια συγκεκριμένη λειτουργία σύμφωνα με τις ανάγκες σας. Μια πλήρης λίστα με τις διαθέσιμες φράσεις -κλειδιά βρίσκονται στο αρχείο "labels_gc2 raw.txt" στον υποφάκελο διαμόρφωσης.
Το σύστημα έχει χρόνο καθυστέρησης περίπου 1 δευτερόλεπτο, αλλά εξαρτάται πολύ από το ποιες ενέργειες εκτελούνται. Σε ορισμένες περιπτώσεις η βασική φάση πρέπει να επαναληφθεί, η ακρίβεια αναγνώρισης δεν είναι πάντα 100%.
Βήμα 2: Χρήση της συσκευής
Εάν όλα έχουν ρυθμιστεί και ελεγχθεί, μπορείτε να εκτελέσετε τη συσκευή.
Ένας τρέχων περιορισμός είναι ότι μια δεδομένη παραγγελία εκτελείται επαναλαμβανόμενα, εφόσον δεν σταματά (χρησιμοποιώντας "διακοπή παιχνιδιού") ή δίνεται άλλη εντολή. Σύνθετες εργασίες πολλαπλών βημάτων, π.χ. Τα "transport1" (που προκαλούνται από τη φράση "παιχνίδι εκτόξευσης") εκτελούνται πάντα στο τελικό βήμα.
Έτσι, «στρίβοντας δεξιά», η συσκευή θα κινηθεί με μικρά βήματα προς τα δεξιά μέχρι να σταματήσει ή να επιτευχθεί η προκαθορισμένη μέγιστη τιμή. "παιχνίδι εκκίνησης", "επόμενο παιχνίδι" ή "start_video" θα ξεκινήσουν μια σειρά κινήσεων που ορίζονται από λίστες που περιέχουν τη ρύθμιση για κάθε σερβο σε ένα δεδομένο βήμα. "τυχαίο παιχνίδι" η συσκευή θα μεταβεί από το ένα βήμα στο άλλο, επιλέχθηκε τυχαία από μια λίστα ρυθμίσεων.
Όπως μπορείτε να δείτε στο συνοδευτικό βίντεο, είχα κατασκευάσει ένα αντικείμενο διαβολικού σχήματος από το LEGO που μπορεί να παραληφθεί από το MeArm και να μεταφερθεί από τη μία θέση στην άλλη με ένα προκαθορισμένο σύνολο κινήσεων. Μπορείτε να ορίσετε τις δικές σας λειτουργίες τροποποιώντας τις λίστες «transport1» ή «transport2».
Βήμα 3: Το σενάριο
Το σενάριο που παρατίθεται εδώ είναι μια τροποποίηση του παραδείγματος "Hearing Snake" από το "Project Keyword Spotter". Το παράδειγμα έχει αφαιρεθεί στο ελάχιστο και στη συνέχεια προστέθηκε το μέρος για την οδήγηση των σερβο, με βάση το λογισμικό και τα παραδείγματα που παρέχονται για το σερβο καπό του Adafruit.
Το σενάριο δεν έχει βελτιστοποιηθεί μέχρι τώρα. Χρησιμοποιήστε το με δική σας ευθύνη, μη διστάσετε να τροποποιήσετε και να βελτιστοποιήσετε.
Εκτός από το σενάριο python υπάρχει το αρχείο εντολών και το χρησιμοποιημένο αρχείο ετικετών. Τοποθετήστε το στον υποφάκελο config.
Όπως αναφέρθηκε προηγουμένως, ενδέχεται να απαιτηθούν αρκετές προσαρμογές παραμέτρων για την προσαρμογή του σεναρίου για το ειδικό MeArm ή κάποια άλλη συσκευή σας.
# Πνευματικά δικαιώματα 2019 Google LLC#
# Άδεια βάσει της άδειας Apache, έκδοση 2.0 (η "άδεια"). # δεν μπορείτε να χρησιμοποιήσετε αυτό το αρχείο παρά μόνο σύμφωνα με την Άδεια. # Μπορείτε να λάβετε αντίγραφο της Άδειας στη διεύθυνση # # href = "https://www.apache.org/licenses/LICENSE-2.0" href = "https://www.apache.org/licenses/LICENSE-2.0" https://www.apache.org/licenses/LICENSE-2.0 # # Εκτός εάν απαιτείται από την ισχύουσα νομοθεσία ή συμφωνηθεί εγγράφως, το λογισμικό # που διανέμεται βάσει της Άδειας διανέμεται σε ΒΑΣΗ "ΟΠΩΣ ΕΙΝΑΙ", # ΧΩΡΙΣ ΕΓΓΥΗΣΕΙΣ CON ΠΡΟDΠΟΘΕΣΕΙΣ ΟΠΟΙΟΔΗΠΟΤΕ, είτε ρητό είτε σιωπηρό. # Δείτε την Άδεια για τη συγκεκριμένη γλώσσα που διέπει τα δικαιώματα και τους # περιορισμούς βάσει της Άδειας. # ο αρχικός κώδικας "φίδι_ακοής" τροποποιήθηκε για υλοποίηση για το MeArm από τον Δρ H. Τα servos ενός MeArm (βιομηχανίες MIME) ήταν προσαρτημένα στις θύρες 3, 7, 11 και 15 του καπό. Για λεπτομέρειες, ρίξτε μια ματιά στο "Hearing MeArm" Instructable. Εντολές: "θέση x", x = 0 έως 9, μετακινεί τη συσκευή σε μια δεδομένη προκαθορισμένη θέση. "μετακίνηση/ανέβασμα", "μετακίνηση/κατέβασμα", "μετάβαση/στροφή προς τα εμπρός", "μετάβαση/στροφή προς τα πίσω", "στροφή/πάει αριστερά" και "στροφή/πάει δεξιά" προκαλεί μια αργή, βαθμιαία κίνηση στο δεδομένο κατεύθυνση, "σταματήστε το παιχνίδι" σταματά τις κινήσεις. "ανοιχτή καρτέλα" και "κλείσιμο καρτέλας" ανοίγει ή κλείνει τη λαβή. "Έναρξη βίντεο" προκαλεί τη συσκευή να ακολουθήσει μια προκαθορισμένη σειρά θέσεων, που καθορίζεται από τη λίστα "θέσεις". Το "τυχαίο παιχνίδι" έχει ως αποτέλεσμα ένα τυχαίο μοτίβο κινήσεων, το "παιχνίδι διακοπής" τελειώνει. Το "παιχνίδι εκκίνησης" ξεκινά μια άλλη σειρά κινήσεων που προκαθορίζονται από τη λίστα "transport1", "επόμενο παιχνίδι" την αντίστροφη λειτουργία που ορίζεται από το "transport2" Χρησιμοποιήστε με δική σας ευθύνη. '' 'από _future_ εισαγωγή απόλυτη_ εισαγωγή από _future_ εισαγωγή διαίρεση από _future_ εισαγωγή print_function εισαγωγή argparse import os από τυχαία εισαγωγή randint από threading import importρα εισαγωγής νήματος από edgetpu.basic.basic_engine import BasicEngine model import import pygame from pygame.locals import * import queue from τυχαία εισαγωγή randrange από adafruit_servokit import ServoKit import board board import busio import adafruit_pca9685 import time i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (κανάλια = 16) # σύνολο αριθμού καναλιών # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # λεπτό, κέντρο και μέγιστες ρυθμίσεις up_l = 145 # σερβο πάνω/κάτω: επάνω md_l = 95 dn_l = 45 up_r = 135 # servo εμπρός/πίσω md_r = 90 dn_r = 50 ri_t = 30 # στροφή του βραχίονα δεξιά ή αριστερά: δεξιά θέση md_t = 90 # στροφή του βραχίονα δεξιά ή αριστερά: κεντρική θέση le_t = 150 op_g = 65 # πιασίματα ανοιχτά md_g = 90 # gripper centered cl _g = 130 # gripper κλειστό vert = 15 # αριθμός σερβο -θύρας, σερβο πάνω/κάτω forw = 11 # αριθμός σερβο -στροφής, προς τα εμπρός/προς τα πίσω σέρβις στροφής = 7 # σερβο -θύρα για στροφή σερβο -λαβής = 3 # σερβο -θύρα για κράτημα servo #λίστα ρυθμίσεων βραχίονα για εννέα θέσεις θέσης = [(md_l, md_r, md_t, op_g), (up_l, md_r, ri_t, op_g), (up_l, md_r, md_t, cl_g), (up_l, md_r, le_t, cl_g), (md_l, md_r, md_t, op_g), (md_l, md_r, md_t, md_g), (md_l, md_r, md_t, cl_g), (dn_l, dn_r, ri_t, op_g), (dn_l, dn_r, dn_r, dn_r), (dn_l, dn_r, le_t, md_g)] # ορίζει 10 θέσεις βάσης, που υποδεικνύονται από ακέραιους αριθμούς 0-9 # διαδικασίες μεταφοράς [vert/forward/turn/grip] transport1 = [(140, 70, 65, op_g), (110, 50, 65, op_g), (65, 50, 65, op_g), (65, 70, 65, cl_g), (120, 70, 65, cl_g), #get object (100, 70, 135, cl_g), (100, 80, 135, cl_g), (100, 80, 135, md_g), (100, 80, 135, op_g), (140, 70, 135, op_g), (140, 70, 90, op_g), (140, 70, 65, op_g)]
μεταφορά2 = [(140, 70, 65, op_g), (140, 70, 135, op_g), (95, 70, 135, op_g), (95, 80, 135, op_g), (95, 80, 135, cl_g), (110, 70, 135, cl_g), (110, 70, 65, cl_g), (70, 70, 65, cl_g), (70, 70, 65, op_g), (80, 50, 65, op_g)]
χορός1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # α "χορός"
#moving MeArm to Zero position status = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. angle = status [2] kit.servo [grip].angle = status [3] class (print) class (control) controller (object): #Callback function def _init _ (self, q): self._q = q def callback (self, εντολή): self._q.put (command) class App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return True def on_event (self, event): if event.type == pygame. QUIT: self._running = False def MeArmPos (self, keys): # οδηγεί το MeArm σε προκαθορισμένες θέσεις, λέξεις -κλειδιά: "position x" key = int (keys) p = θέση [πλήκτρο] a = p [0] b = p [1] c = p [2] d = p [3] εκτύπωση ("Θέσεις:", κλειδί, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "μοίρες") κατάσταση = [a, b, c, d] # έγγραφα τρέχουσα κατάσταση εκτύπωση (κατάσταση) # sys.stdout.write ("Θέση: ", κλειδί," αριστερά/δεξιά: ", a,"/", b," βαθμό ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # control MeArm dance, keyword: "start_video" dnce = dance1 sp = (len (dnce)) για r στο εύρος (sp): #σειρά χορού θέσεων, sp βήματα dc = dnce [r] p = θέση [dc] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # ορίζει ταχύτητα κινήσεων time.sleep (0,5) # διάλειμμα στο τέλος της διαδικασίας def TransMeArm1 (self): # ελέγχει τη μεταφορά MeArm 1, λέξη -κλειδί: "παιχνίδι εκκίνησης" tr1 = transport1 sp = (len (tr1)) #υπολογίστε τον αριθμό των βημάτων για το r στο εύρος (sp): #μεταβείτε σε οποιοδήποτε βήμα p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip]. γωνία = d εκτύπωση (p) χρόνος. ύπνος (1) # σετ ταχύτητα κινήσεων time.sleep (0.5) def TransMeArm2 (self): # έλεγχος χορού MeArm, λέξη -κλειδί: "επόμενο παιχνίδι" tr2 = transport2 sp = (len (tr2)) για r στο εύρος (sp): #σειρά χορού θέσεων, sp βήματα p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # ορίζει ταχύτητα κινήσεων time.sleep (0.5) def RandomMoves (self): # άλματα τυχαία μεταξύ προκαθορισμένων θέσεων, λέξη -κλειδί: "τυχαίο παιχνίδι" dr = randrange (9) # τυχαία επιλέγει μια θέση p = θέση [dr] # διαβάζει τις παραμέτρους θέσης a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].ango = c kit.servo [λαβή].angle = d time.sleep (1) # ρυθμίζει την ταχύτητα των κινήσεων def MoveUp (self): # ανύψωση λαβής σε μικρά βήματα u0 = κατάσταση [0] # ανάγνωση τρέχουσας κατάστασης u1 = u0 + 5 # συν x μοίρες αν (u1 > up_l): # δοκιμές εάν δεν υπερβαίνουν τις ελάχιστες/μέγιστες παραμέτρους u1 = up_l # διαφορετικά ορίζεται σε min/max value kit.servo [vert].angle = u1 # move servo status [0] = u1 # προσαρμόζω την τιμή εκτύπωσης (" πάνω ", κατάσταση) time.sleep (1) # ορίζει ταχύτητα def MoveDown (self): d 0 = κατάσταση [0] d1 = d0 - 5 #minus x μοίρες εάν (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # move servo status [1] = f1 print ("forward", status) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x degree if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo κατάσταση [2] = l1 εκτύπωση ("αριστερά", κατάσταση) time.sleep (0,2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x μοίρες εάν (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print ("right", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # set grip to "open" position: "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # ορίστε τη λαβή στην "κλειστή" θέση: " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # δεν κάνει τίποτα, αλλά σταματά τις κινήσεις εκτύπωσης (" stop ", status) time.sleep (0.25) def spotter (self, args): κινητήρας = BasicEngine (args.model_file) mic = args.mic αν args.mic δεν είναι κανένα άλλο int (args.mic) model.classify_audio (μικρόφωνο, κινητήρας, labels_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz_, int = int (args.num_frames_hop)) def on_execute (self, args): αν όχι self.on_init (): self._running = False q = model.get_queue () self._controler = Controller (q) αν όχι args.debug_keyboard: t = Νήμα (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 while self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (True, 0.1) εκτός από την ουρά. Άδειο: new_item = Καμία αν το new_item δεν είναι Κανένα: item = new_item if (args.debug_keyboard και κλειδιά [pygame. K_ESCAPE]) ή item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) or item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) ή στοιχείο == "δεξιά": # στρίψτε δεξιά self. MoveRight () if (args.debug_ke yboard και κλειδιά [pygame. K_LEFT]) ή στοιχείο == "αριστερά": # στρίψτε αριστερά self. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) or item == "up": self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) or item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) or item == "b": # backwards self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # Forwards self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) or item == "o": # open grip: self. OpenGrip () if (args.debug_keyboard and keys [pygame. K_C]) or item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys [pygame. K_S]) ή item == "s": # stop stop: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) or item == "0": self. MeArmPos (0) if (args.debug_keyboard and keys [pygame. K_1]) or item == "1": self. MeArmPos (1) if (args.debug_keyboard and keys [pygame. K_2]) or item == "2": self. MeArmPos (2) εάν (args.debug_keyboard και κλειδιά [pygame. K_3]) ή αυτό em == "3": self. MeArmPos (3) if (args.debug_keyboard and keys [pygame. K_4]) or item == "4": self. MeArmPos (4) if (args.debug_keyboard και κλειδιά [pygame K_5]) ή στοιχείο == "5": self. MeArmPos (5) if (args.debug_keyboard and keys [pygame. K_6]) or item == "6": self. MeArmPos (6) if (args.debug_keyboard και κλειδιά [pygame. K_7]) ή στοιχείο == "7": self. MeArmPos (7) εάν (args.debug_keyboard και κλειδιά [pygame. K_8]) ή στοιχείο == "8": self. MeArmPos (8) εάν (args.debug_keyboard και κλειδιά [pygame. K_9]) ή στοιχείο == "9": self. MeArmPos (9) εάν (args.debug_keyboard και κλειδιά [pygame. K_a]) ή στοιχείο == "d": self. DancingMeArm () #dancing MeArm, στο "next_game" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. RandomMoves () #random dance "random game" if (args.debug_keyboard και κλειδιά [pygame. K_j]) ή στοιχείο == "j": self. TransMeArm1 () # αντικείμενο μεταφοράς: "lunch_game" if (args.debug_keyboard and keys [pygame. K_k]) or item == "k": self. TransMeArm2 () # αντίστροφη κατεύθυνση μεταφοράς αντικειμένου: "next_game" '' 'if (args.debug_keyboard και κλειδιά [pygame. K_l]) ή στοιχείο == "l": self. JumpingJack2 (1) #LED blink "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Χρησιμοποιήστε το πληκτρολόγιο για να ελέγξετε το MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)
Συνιστάται:
Panzer VIII Maus Driven by Microbit: 4 Βήματα
Panzer VIII Maus Driven by Microbit: thisταν σε αυτό το εξάμηνο που η τάξη των χαρισματικών του σχολείου μας είχε ένα ειδικό μάθημα: Χρησιμοποιήστε το BBC micro: bit για να τροφοδοτήσετε ένα τρισδιάστατο εκτυπωμένο αυτοκίνητο. Αλλά δεν μου άρεσε το πλαίσιο που έκανε ο δάσκαλός μας για εμάς (Ξέρετε , πληκτρολογήστε "BitCar Micro Bit" στο Google και θα δείτε πολλά
RTK GPS Driven Mower: 16 Βήματα
RTK GPS Driven Mower: Αυτό το χλοοκοπτικό ρομπότ είναι ικανό για πλήρως αυτόματη κοπή χόρτου σε μια προκαθορισμένη πορεία. Χάρη στην καθοδήγηση του RTK GPS, το μάθημα αναπαράγεται με κάθε κούρεμα με ακρίβεια μεγαλύτερη από 10 εκατοστά
CPU & GPU Driven Fan Controller: 6 βήματα (με εικόνες)
CPU & GPU Driven Fan Controller: Πρόσφατα αναβάθμισα την κάρτα γραφικών μου. Το νέο μοντέλο GPU έχει υψηλότερη TDP από την CPU μου και μια παλιά GPU, οπότε ήθελα επίσης να εγκαταστήσω επιπλέον ανεμιστήρες θήκης. Δυστυχώς, το MOBO μου διαθέτει μόνο 3 υποδοχές ανεμιστήρα με έλεγχο ταχύτητας και μπορούν να συνδεθούν μόνο με το
A Hearing Jumping Jack, Google Coral TPU Accelerator Έκδοση: 4 Βήματα
A Hearing Jumping Jack, Google Coral TPU Accelerator Version: Κινεί τα άκρα του, ακούει τις παραγγελίες σας, οδηγείται από την τελευταία τεχνολογία μηχανικής εκμάθησης! Το «Hearing Jumping Jack» είναι ένα απλό ηλεκτρομηχανικό Jumping Jack, που οδηγείται από δύο μικρο σερβο και ένα πολύ απλό γρανάζι, με LED ως «μάτια». Το
Pool Pi Guy - AI Driven Alarm System and Pool Monitoring Using Raspberry Pi: 12 βήματα (με εικόνες)
Pool Pi Guy - AI Driven Alarm System and Monitoring Pool Using Raspberry Pi: Το να έχεις πισίνα στο σπίτι είναι διασκεδαστικό, αλλά έρχεται με μεγάλη ευθύνη. Η μεγαλύτερη ανησυχία μου είναι η παρακολούθηση εάν κάποιος βρίσκεται κοντά στην πισίνα χωρίς επίβλεψη (ειδικά τα μικρότερα παιδιά). Η μεγαλύτερη ενόχλησή μου είναι να βεβαιωθώ ότι η γραμμή νερού της πισίνας δεν πηγαίνει ποτέ κάτω από την είσοδο της αντλίας