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

Ρομπο-Τεχνικός: 8 Βήματα
Ρομπο-Τεχνικός: 8 Βήματα

Βίντεο: Ρομπο-Τεχνικός: 8 Βήματα

Βίντεο: Ρομπο-Τεχνικός: 8 Βήματα
Βίντεο: Η γκουγκου δεν σεβεται τον πατερα της 2024, Νοέμβριος
Anonim
Ρομπο-Τεχνικός
Ρομπο-Τεχνικός

Φανταστείτε για ένα δευτερόλεπτο ότι είστε ένας από τους αστροναύτες που προσγειώνονται στον Άρη. Έχετε ένα εκατομμύριο πράγματα να κάνετε, δείγματα να πάρετε, πειράματα να εκτελέσετε, δεδομένα να συλλέξετε, αλλά μία ή δύο φορές την ημέρα πρέπει να τρέξετε γύρω από τις ενότητες κατοικίας ή/και έρευνας που ζείτε και εργάζεστε για να τα επιθεωρήσετε. Είναι απαραίτητο, κάποιος πρέπει να διασφαλίσει ότι το αντικείμενο είναι σε καλή κατάσταση, ότι όλα τα χιλιάδες κομμάτια και εξαρτήματα λειτουργούν και είναι στη θέση τους. Αλλά τι θα γινόταν αν υπήρχε ένας αυτοματοποιημένος βοηθός για να σας απαλλάξει από αυτά τα καθήκοντα. Τι θα γινόταν αν υπήρχε ένα μικρό ρομπότ που θα μπορούσε να κυκλοφορήσει μέσα στις μονάδες για να βεβαιωθεί ότι όλα ήταν στη θέση τους, λειτουργούσαν και ήταν ασφαλή.

Robo-Technician στη διάσωση.

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

Και πάλι ως προειδοποίηση, αυτό είναι ένα έργο σε εξέλιξη. Ο κώδικας, όπως υπάρχει, λειτουργεί, αλλά έχει λόξυγκα, ειδικά επειδή υπάρχουν πολλά, αλληλεπικαλυπτόμενα προγράμματα. Επίσης, για να λειτουργήσει αυτό το έργο σε μια πραγματική αποστολή στον Άρη, θα έπρεπε να κατασκευαστεί ένα ρομπότ για τον συγκεκριμένο σκοπό, οπότε και πάλι υποθέτω ότι πρόκειται για μια κατασκευή "απόδειξης της ιδέας".

Υπάρχουν μερικά πράγματα που θα χρειαστείτε για να ξεκινήσει. Θα χρειαστείτε ένα ακριβό πρόγραμμα, πακέτα υποστήριξης για αυτό το πρόγραμμα και ένα μικρό υπόβαθρο στην κωδικοποίηση. Καθώς είμαι φοιτητής και έχει δοθεί κάποιος κωδικός στο ισόγειο (για το raspberry pi), δεν θα μιλήσω συγκεκριμένα για τη ρύθμιση. Μπορείτε να βρείτε όλους τους συνδέσμους για αυτόν τον βασικό κώδικα παρακάτω. Πάμε στη λίστα των υλικών.

Σκεύη, εξαρτήματα

  • Raspberry Pi (χρησιμοποιήσαμε μια έκδοση 3)
  • iRobot
  • κάποιο είδος συσκευής συγκράτησης για να κρατήσει το Raspberry Pi προσκολλημένο στο Robo-Technician
  • Κάμερα Raspberry Pi (δεν έχει σημασία τι είδους, αρκεί να έχει καλή αυτόματη εστίαση και ανάλυση εικόνας)
  • κάποιο είδος βάσης ή θήκης για να κρατάτε την κάμερα στραμμένη προς τα εμπρός στον Robo-Technician
  • ένα υλικό για χρήση ως λωρίδα, λευκό (ή πολύ ανοιχτόχρωμο), που συγκρατείται με ασφάλεια στο πάτωμα. Πρέπει να είναι ελαφρώς μεγαλύτερο από το διάστημα μεταξύ των δύο μπροστινών αισθητήρων βράχου.
  • 4 πινακίδες με πολύ μεγάλο κείμενο (με τις λέξεις ΕΙΚΟΝΑ, ΔΕΞΙΑ, ΠΙΣΩ και ΑΡΙΣΤΕΡΑ τυπωμένες πάνω τους)
  • Φύλλα χρωματισμένου χαρτιού (τουλάχιστον τρία και κατά προτίμηση κόκκινο, πράσινο και μπλε)

Λογισμικό

  • Matlab (2018α και 2017β χρησιμοποιήθηκαν και φαίνεται να κάνουν μικρή διαφορά)
  • Πακέτο υποστήριξης Raspberry Pi για το Matlab
  • Κωδικός Raspberry Pi για σύνδεση στο Matlab (σύνδεσμος στον πηγαίο κώδικα που παρέχεται παρακάτω)
  • Εργαλειοθήκη επεξεργασίας εικόνας για το Matlab (δεν μπορείτε να κάνετε αυτό το έργο χωρίς την εργαλειοθήκη)
  • ΠΡΟΑΙΡΕΤΙΚΟ: Το Matlab Mobile είναι εγκατεστημένο στο τηλέφωνό σας, το οποίο θα εξηγήσω αργότερα

Βήμα 1: Ρύθμιση του υλικού

ef.engr.utk.edu/ef230-2018-08/projects/roo…

Αυτός είναι ο σύνδεσμος για τον βασικό κώδικα για να διασφαλιστεί ότι το iRobot® μπορεί να επικοινωνήσει με το Matlab, μαζί με ένα βασικό σεμινάριο. Όπως είπα προηγουμένως, δεν θα καλύψω αυτό το συγκεκριμένο τμήμα, καθώς το σεμινάριο είναι πολύ καλά σχεδιασμένο ήδη. Θα αναφέρω ότι μόλις ακολουθήσετε τα βήματα στο σύνδεσμο, μπορείτε να χρησιμοποιήσετε την εντολή "doc" του Matlab για να αναζητήσετε τις συμπεριλαμβανόμενες πληροφορίες. ΕΙΔΙΚΑ:

doc roomba

Και ένα ακόμη πολύ σημαντικό σημείο.

Όταν κατεβάζετε τα αρχεία από τον παραπάνω σύνδεσμο, ΒΑΛΤΕ ΤΑ ΣΤΟΝ ΦΑΚΕΛΟ ΠΟΥ ΠΕΡΙΓΡΑΦΑ ΠΑΝΩ, αφού το Matlab απαιτεί τα αρχεία που δημιουργούνται από τον χρήστη να βρίσκονται στον τρέχοντα φάκελο εργασίας.

Με αυτό εκτός δρόμου, ας προχωρήσουμε στον κώδικα.

Βήμα 2: Εύρεση όλων αυτών των αισθητήρων

Εύρεση όλων αυτών των αισθητήρων
Εύρεση όλων αυτών των αισθητήρων
Εύρεση όλων αυτών των αισθητήρων
Εύρεση όλων αυτών των αισθητήρων

Πάρτε ένα δευτερόλεπτο και δώστε στο iRobot® μια επιθεώρηση. Καλό είναι να γνωρίζετε πού βρίσκονται αυτά, ώστε να έχετε μια ιδέα για τις εισροές που λαμβάνει ο Robo-Technician και θα μπορείτε να καταλάβετε γιατί το πράγμα περιστρέφεται σε κύκλους αντί να ακολουθείτε τη διαδρομή που θα ρυθμίσετε (αυτό μπορεί ή μπορεί να μην συνέβη). Προφανώς θα δείτε τον μεγάλο φυσικό αισθητήρα χτυπήματος μπροστά. Οι αισθητήρες του γκρεμού είναι λίγο πιο δύσκολοι, θα πρέπει να το αναποδογυρίσετε και να αναζητήσετε τα τέσσερα, διάφανα πλαστικά παράθυρα κοντά στο μπροστινό άκρο. Οι αισθητήρες χτυπήματος φωτός είναι ακόμα πιο κρυμμένοι, αλλά προς το παρόν θα είναι αρκετό για να πούμε το ζωντανό στη λαμπερή μαύρη ζώνη που τρέχει στο μπροστινό μέρος του iRobot®, το οποίο βρίσκεται στο μπροστινό μέρος της φυσικής μπάρας αισθητήρων χτυπήματος.

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

Βήμα 3: Δοκιμή για ρύθμιση παραμέτρων

Δοκιμή για ρύθμιση παραμέτρων
Δοκιμή για ρύθμιση παραμέτρων

Πριν μπορέσουμε να στείλουμε τον Robo-Technician να κάνει τη δουλειά του, πρέπει να καταλάβουμε τις ιδιαίτερες ιδιαιτερότητες και το εύρος αισθητήρων του. Δεδομένου ότι κάθε iRobot® είναι λίγο διαφορετικό και αλλάζει κατά τη διάρκεια ζωής του ρομπότ, πρέπει να καταλάβουμε πώς διαβάζουν οι αισθητήρες στις περιοχές όπου θα λειτουργεί. Ο ευκολότερος τρόπος για να γίνει αυτό είναι να ρυθμίσετε μια ανοιχτόχρωμη διαδρομή (Χρησιμοποίησα λωρίδες λευκού χαρτιού εκτυπωτή αλλά οτιδήποτε ανοιχτόχρωμο θα κάνει) στην επιφάνεια που θα χειριστεί ο Robo-Technician.

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

Βεβαιωθείτε ότι το Raspberry Pi είναι συνδεδεμένο στο iRobot® και ότι ο υπολογιστής σας είναι συνδεδεμένος στην ίδια σύνδεση στο διαδίκτυο. Θα περάσετε λιγότερο χρόνο τραβώντας τα μαλλιά σας προσπαθώντας να καταλάβετε γιατί το Matlab δεν θα συνδεθεί

r = roomba (αριθμός που ρυθμίσατε)

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

Μόλις ρυθμιστεί το μονοπάτι και συνδεθεί επιτυχώς το roomba, τοποθετήστε τον μελλοντικό Robo-Technician όπου ένας ή δύο από τους αισθητήρες βράχου βρίσκονται πάνω από το μονοπάτι. Προφανώς αυτό σημαίνει ότι τα άλλα δύο ή τρία είναι πάνω από την επιφάνεια που επιλέξατε.

Τώρα ξεκινήστε τους αισθητήρες δοκιμής με την εντολή:

r.test Αισθητήρες

Λάβετε υπόψη ότι το "r." Είναι η μεταβλητή που ορίσατε νωρίτερα, οπότε αν δεν είναι "r" αλλάξτε το "r". σε ό, τι αποφασίσετε. Αυτό θα φέρει την οθόνη του αισθητήρα δοκιμής με έναν τόνο πληροφοριών.

Για αυτό το έργο επικεντρωθείτε στα τμήματα φωτισμού, προφυλακτήρες και γκρεμούς. Μετακινήστε τον Robo-Technician φροντίζοντας να παρακολουθείτε πώς αλλάζουν οι αισθητήρες σε διαφορετικές επιφάνειες ή πόσο κοντά πρέπει να είναι ένα αντικείμενο για να αλλάξουν οι τιμές ligthBumper κ.λπ. Έχετε αυτούς τους αριθμούς υπόψη (ή γράψτε τους) γιατί τα χρειάζεστε για να ορίσετε τις παραμέτρους σας σε ένα δευτερόλεπτο.

Βήμα 4: Εκκίνηση του κώδικα

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

Το επάνω μέρος του κώδικα είναι η ρύθμιση ορισμένων επιλογών εισαγωγής χρήστη. Δημιουργεί μερικές λίστες που θα χρησιμοποιηθούν στο in listdlg και στη συνέχεια εμφανίζει ένα πλαίσιο διαλόγου λίστας. Αυτό επιτρέπει στον χρήστη να επιλέξει ποιο χρώμα διαδρομής επιθυμεί να ακολουθήσει, το οποίο θα τεθεί σε εφαρμογή αργότερα.

λίστα = {'Κόκκινο', 'Μπλε', 'Πράσινο'}

problist = {'Casualty, Save Image', 'Component Out of Place, Save Image', 'Expected, Continue'} pathcolor = listdlg ('PromptString', 'Select a Path Color',… 'SelectionMode', 'single', 'ListString', list) prob = 0; driv = ;

Οι μεταβλητές "prob" και "driv" πρέπει να δηλωθούν εδώ καθώς θα χρησιμοποιηθούν μέσα στον κύριο βρόχο while της συνάρτησης, αλλά πάλι, αν θέλετε να μετονομάσετε οποιαδήποτε από αυτές τις μεταβλητές ή να αλλάξετε τις επιλογές λίστας, είναι εντάξει είστε συνεπείς στον υπόλοιπο κώδικα.

Βήμα 5: Κορυφή του while loop: Physical Bump Sensors

Το επάνω μέρος του βρόχου while περιέχει τη φυσική λογική του αισθητήρα bump. Βασικά, όταν ο Robo-Technician αντιμετωπίζει κάτι που σταματά (ή για τον μπροστινό αισθητήρα χτυπήματος κάνει πίσω 0,1 μέτρα), τότε τοποθετείται για να τραβήξει μια φωτογραφία. Ας καλύψουμε πρώτα το τμήμα ελέγχου ταχύτητας και θέσης.

Εάν δοκιμάσατε όλους τους αισθητήρες στο Robo-Technician στα προηγούμενα βήματα, θα γνωρίζετε ότι οι αισθητήρες χτυπήματος έχουν λογική τιμή (0 ή 1) με μηδέν που αντιπροσωπεύει την κανονική, μη πιεσμένη θέση του αισθητήρα. Λάβετε υπόψη αυτό για τον κώδικα.

ενώ true %main ενώ ο βρόχος %λαμβάνει πληροφορίες προφυλακτήρα S = r.getBumpers αν S.left ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

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

εάν S.left ~ = 0 %εάν ο βρόχος λαμβάνει πληροφορίες προφυλακτήρα και ευθυγραμμίζει την κάμερα για τη φωτογραφία r.turnAngle (5) pause (0.5) img = r.getImage %τραβάει φωτογραφία και εμφανίζει εικόνα (img) %παράθυρο διαλόγου prob = listdlg (' PromptString ',' Εντοπίστηκε ένα απρόσμενο εμπόδιο, προσδιορίστε '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pause (0.5) img = r getImage image (img) prob = listdlg ('PromptString', 'Found a Unnexpected εμπόδιο, Please Identify'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0,1) παύση (0,5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Found a Unexpected εμπόδιο, Please Identify'…, 'SelectionMode', 'single', 'ListString', problist] τέλος

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

Τώρα έβαλα μια ενότητα κώδικα μεταξύ του τμήματος αισθητήρα κτυπήματος και του τμήματος αποθήκευσης φωτογραφιών. Αυτό παίρνει τιμές lightBumper και ορίζει την ταχύτητα κίνησης στα 0,025 μέτρα/δευτερόλεπτο (πολύ αργή), η οποία δεν είναι στην πραγματικότητα απαραίτητη, αλλά μειώνει τον Robo-Technician που χτυπά τα πράγματα και τελικά φθείρει τους φυσικούς αισθητήρες χτυπήματος.

L = r.getLightBumpers if L. αριστερά> 100 || L.leftΜπροστινό> 100 || L.rightFront> 100 || L.right> 100 driv = 0.025 r.setDriveVelocity (0.025) else driv = 0.1 τέλος

Αυτό θα ήταν το μέρος όπου οι αξίες που παρατηρήσατε (και ελπίζω να γράψατε) νωρίτερα μπαίνουν στο παιχνίδι

Το "L. (πλευρά και κατεύθυνση αισθητήρα)> 100" βασίστηκε στις τιμές που παρατήρησα, οπότε αν οι παρατηρήσεις σας είναι διαφορετικές, αλλάξτε αυτούς τους αριθμούς. Η ιδέα είναι ότι αν ο Robo-Technician αισθανθεί κάτι λίγα εκατοστά μπροστά του, θα επιβραδύνει, καθόλου περισσότερο από αυτό είναι περιττό.

Το επόμενο τμήμα είναι όπου αποθηκεύονται οι φωτογραφίες για αργότερα.

%εάν η πρώτη ή η δεύτερη επιλογή ήταν επιλεγμένη στο prob dialog, αποθηκεύει την εικόνα αν prob == 1 %εάν ο βρόχος δημιουργεί πληροφορίες αρχείου για φωτογραφία, γράφει με χρονική σήμανση t = ρολόι. basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); φάκελος = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = πλήρες αρχείο (φάκελος, όνομα βάσης); imwrite (img, fullFileName) κλείσιμο Εικόνα 1 παύση (2) elseif prob == 2 t = ρολόι? basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); φάκελος = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = πλήρες αρχείο (φάκελος, όνομα βάσης); imwrite (img, fullFileName) κλείσιμο Σχήμα 1 παύση (2) τέλος

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

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

Βήμα 6: Ακολουθώντας το μονοπάτι

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

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

clear img clear t clear basename clear fullFileName clear folder

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

C = r.getCliffSensors %if loop ακολουθεί μια χρωματική ζώνη (λευκό) εάν C.leftFront> 2000 && C.rightFront> 2000 %ευθύγραμμη καθοδήγηση r.setDriveVelocity (driv) elseif C.leftFront 2000 %στρίβει δεξιά αν το ρομπότ πάει πολύ μακριά αριστερά r.turnAngle (-2.5) elseif C.leftFront> 2000 && C.rightFront <2000%στρίβει αριστερά αν το ρομπότ πάει πολύ δεξιά r.turnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.leftΜπροστινό> 100 || L.rightFront> 100 || L.right> 100 img = r.getImage end %ελέγχει για να διαπιστωθεί εάν υπάρχει κάμψη στο μονοπάτι αν C.left> 2800 && C.right <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) τέλος %κάτοχος θέσης για διάκριση αναγνώρισης εικόνας διαδρομής («ΛΗETΗ ΕΙΚΟΝΑΣ») τελικό τέλος

Λάβετε υπόψη ότι τα ονόματα μεταβλητών που επέλεξα είναι προαιρετικά, αλλά και πάλι νομίζω ότι διευκολύνει τη χρήση μεταβλητών μεμονωμένων γραμμάτων όταν είναι δυνατόν

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

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

%κάτοχος θέσης για αναγνώριση εικόνας διαδρομήςdisp ("ΛΗETΗ ΕΙΚΟΝΑΣ")

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

Βήμα 7: Επεξεργασία εικόνας

Υπάρχουν δύο μέρη στην επεξεργασία της εικόνας. Πρώτα είναι η αναγνώριση χρώματος, η οποία υπολογίζει την ένταση χρώματος στην εικόνα για να αποφασίσει εάν θα συνεχίσει ή όχι στην αναγνώριση κειμένου. Οι υπολογισμοί χρωμάτων βασίζονται στην επιλογή που έγινε στο πρώτο κουτί διαλόγου στην αρχή (χρησιμοποίησα κόκκινο, μπλε, πράσινο, αλλά μπορείτε να επιλέξετε όποια χρώματα θέλετε, εφόσον οι μέσες τιμές έντασης χρώματος μπορούν να αναγνωριστούν από το Κάμερα Raspberry Pi).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) κόκκινο = μέσο (μέσο (imgb (:,:, 1))); g = μέσος όρος (μέσος όρος (imgb (:,,, 2))); b = μέσος όρος (μέσος όρος (imgb (:,,, 3)));

Αυτός είναι ο έλεγχος έντασης. Αυτό θα χρησιμοποιηθεί στο επόμενο τμήμα για να αποφασίσει τι θέλει να κάνει.

αν κόκκινο> g && red> b εάν pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) if R. Λέξεις {1} == ΕΙΚΟΝΑ || R. Λέξεις {2} == ΕΙΚΟΝΑ || R. Λέξεις {3} == ΕΙΚΟΝΑ t = ρολόι; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); φάκελος = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = πλήρες αρχείο (φάκελος, όνομα βάσης); imwrite (img, fullFileName) παύση (2) elseif R. Words {1} == ΔΕΞΙΑ || R. Λέξεις {2} == ΔΕΞΙΑ || R. Words {3} == RIGHT r.turnAngle (-75) elseif R. Words {1} == ΑΡΙΣΤΕΡΑ || R. Λέξεις {2} == ΑΡΙΣΤΕΡΑ || R. Words {3} == LEFT r.turnAngle (75) elseif R. Words {1} == BACK || R. Λέξεις {2} == ΠΙΣΩ || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end end

Αυτό το τμήμα αποφασίζει εάν το χρώμα που επιλέχθηκε στο πρώτο πλαίσιο διαλόγου ταιριάζει με το χρώμα που βλέπει η κάμερα. Αν το κάνει εκτελεί αναγνώριση κειμένου. Φαίνεται να βλέπουμε ποια λέξη (ΕΙΚΟΝΑ, ΠΙΣΩ, ΔΕΞΙΑ ή ΑΡΙΣΤΕΡΑ) εμφανίζεται και στη συνέχεια είτε γυρίζει (για δεξιά και αριστερά), περιστρέφεται γύρω (για πίσω) είτε τραβάει μια φωτογραφία και την αποθηκεύει με τον ίδιο τρόπο όπως νωρίτερα.

Έχω παράσχει μόνο ένα τμήμα του κώδικα για τα διαφορετικά χρώματα

Για να επιτρέψετε στον κώδικα να αναγνωρίζει μπλε και πράσινο, απλώς αντιγράψτε τον κώδικα και αλλάξτε τον λογικό έλεγχο στο επάνω μέρος του τμήματος και ορίστε το "pathcolor == (αριθμός)" να αντιστοιχεί στις επιλογές χρώματος από το επάνω πλαίσιο διαλόγου (για κωδικός όπως εμφανίζεται, το μπλε θα είναι 2 και το πράσινο θα είναι 3).

Βήμα 8: Το τελικό προϊόν

Το τελικό προϊόν
Το τελικό προϊόν

Τώρα ο Robo-Technician θα πρέπει να κάνει ζουμ στις μονάδες αποστολής του Άρη και να αναφέρει πίσω στους αστροναύτες όταν κάτι δεν είναι στη θέση του.

Θυμηθείτε, όλες οι τιμές του αισθητήρα βράχου και των τιμών lightBumper πρέπει να αλλάξουν στις τιμές που παρατηρήσατε. Επίσης, από την εμπειρία μου, βρήκα καλύτερα να δοκιμάσω αυτό το έργο σε σκούρο χρώμα στο πάτωμα και είναι ακόμα καλύτερο εάν το πάτωμα δεν αντανακλά. Αυτό αυξάνει την αντίθεση μεταξύ της διαδρομής και του δαπέδου, γεγονός που καθιστά πιο πιθανό ότι ο Robo-Technician θα την ακολουθήσει σωστά.

Ελπίζω να απολαύσατε τη δημιουργία ενός μικρού βοηθού για την αποστολή στον Άρη και να διασκεδάσετε.

Συνιστάται: