Πίνακας περιεχομένων:
2025 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2025-01-13 06:57
Αυτό το έργο είναι ένα αυτόνομα πλοήγηση ρομπότ που προσπαθεί να φτάσει στη θέση του στόχου αποφεύγοντας εμπόδια στο δρόμο του. Το ρομπότ θα είναι εξοπλισμένο με έναν αισθητήρα LiDAR που θα χρησιμοποιηθεί για την ανίχνευση αντικειμένων στο περιβάλλον του. Καθώς τα αντικείμενα ανιχνεύονται και το ρομπότ κινείται, ένας χάρτης σε πραγματικό χρόνο θα ενημερώνεται. Ο χάρτης θα χρησιμοποιηθεί για να αποθηκεύσει τις θέσεις των εμποδίων που έχουν εντοπιστεί. Με αυτόν τον τρόπο, το ρομπότ δεν θα επιχειρήσει ξανά μια αποτυχημένη διαδρομή προς τη θέση στόχου. Αντ 'αυτού θα επιχειρήσει διαδρομές που είτε δεν έχουν εμπόδια είτε διαδρομές που δεν έχουν ακόμη ελεγχθεί για εμπόδια.
Το ρομπότ θα κινείται με δύο τροχούς με κινητήρα DC και δύο τροχούς τροχού. Οι κινητήρες θα προσαρτηθούν στο κάτω μέρος μιας κυκλικής πλατφόρμας. Οι κινητήρες θα ελέγχονται από δύο οδηγούς. Οι οδηγοί κινητήρα θα λάβουν εντολές PWM από τον επεξεργαστή Zynq. Όλοι οι κωδικοποιητές σε κάθε κινητήρα χρησιμοποιούνται για να παρακολουθούν τη θέση και τον προσανατολισμό των οχημάτων. Όλο το σύστημα θα τροφοδοτείται με μπαταρία LiPo.
Βήμα 1: Συναρμολόγηση του οχήματος
Το ρομπότ τροφοδοτείται από δύο κινητήρες που συνδέονται με τους πλευρικούς τροχούς και στη συνέχεια υποστηρίζεται επιπλέον από δύο τροχούς κάστερ, έναν μπροστά και έναν πίσω. Η πλατφόρμα και οι βάσεις κινητήρα ήταν κατασκευασμένες από λαμαρίνα αλουμινίου. Αγοράστηκε ένας κόμβος κινητήρα για τη σύνδεση των τροχών στον κινητήρα. Ωστόσο, έπρεπε να γίνει ένας προσαρμοσμένος ενδιάμεσος συζεύκτης επειδή το μοτίβο οπών του διανομέα ήταν διαφορετικό από το μοτίβο οπής του τροχού.
Ο κινητήρας που επιλέχθηκε ήταν ένα μοτέρ Port Escap 12V DC με ενσωματωμένους κωδικοποιητές. Αυτός ο κινητήρας μπορεί να αγοραστεί στο ebay για μια πολύ λογική τιμή (βλέπε Bill of Materials). Αναζητήστε λέξεις -κλειδιά "12V Escap 16 Coreless Geared DC Motor with Encoders" στο ebay για να βρείτε τον κινητήρα. Συνήθως υπάρχει αρκετός αριθμός πωλητών για να επιλέξετε. Οι προδιαγραφές και τα pinouts των κινητήρων φαίνονται στα παρακάτω διαγράμματα.
Η συναρμολόγηση του ρομπότ ξεκίνησε με CAD modeldesign του πλαισίου. Το παρακάτω μοντέλο δείχνει την κάτοψη του προφίλ σχήματος 2D που έχει σχεδιαστεί για το πλαίσιο.
Προτείνεται το πλαίσιο να σχεδιαστεί ως 2Dprofile έτσι ώστε να μπορεί να κατασκευαστεί εύκολα. Κόψαμε ένα φύλλο αλουμινίου 12”X12” στο σχήμα του σασί χρησιμοποιώντας έναν κόφτη εκτόξευσης νερού. Η πλατφόρμα του πλαισίου θα μπορούσε επίσης να κοπεί με ένα πριόνι μπάντας.
Βήμα 2: Τοποθέτηση κινητήρων
Το επόμενο βήμα είναι να κάνετε τις βάσεις του κινητήρα. Προτείνεται οι βάσεις κινητήρα να είναι κατασκευασμένες από φύλλο αλουμινίου 90 μοιρών. Χρησιμοποιώντας αυτό το μέρος, ο κινητήρας μπορεί να συνδεθεί με πρόβολο στη μία όψη του λαμαρίνας χρησιμοποιώντας τα δύο
Οι οπές Μ2 του κινητήρα και της άλλης όψης μπορούν να βιδωθούν στην πλατφόρμα. Πρέπει να τρυπηθούν τρύπες στη βάση του κινητήρα, ώστε να μπορούν να χρησιμοποιηθούν βίδες για τη στερέωση του κινητήρα στη βάση κινητήρα και τη βάση κινητήρα στην πλατφόρμα. Η βάση του κινητήρα φαίνεται στην παραπάνω εικόνα.
Στη συνέχεια, ο διανομέας κινητήρα Pololu (βλέπε Πίνακας Υλικών) τοποθετείται στον άξονα του κινητήρα και σφίγγεται με την παρεχόμενη βίδα ρύθμισης και το κλειδί Allen. Το μοτίβο οπών του διανομέα κινητήρα Pololu δεν ταιριάζει με το μοτίβο οπών του τροχού VEX, οπότε πρέπει να γίνει ένας προσαρμοσμένος ενδιάμεσος συζεύκτης. Προτείνεται το παλιοσίδερα από αλουμίνιο που χρησιμοποιήθηκε για την κατασκευή της πλατφόρμας του πλαισίου να χρησιμοποιηθεί για την κατασκευή του ζεύκτη. Το μοτίβο οπών και οι διαστάσεις αυτού του ζεύγους φαίνονται στο παρακάτω σχήμα. Η εξωτερική διάμετρος και το σχήμα (δεν χρειάζεται να είναι κύκλος) του προσαρμοσμένου συζεύκτη αλουμινίου δεν έχει σημασία εφόσον όλες οι οπές ταιριάζουν στο τμήμα.
Βήμα 3: Δημιουργία Vivado Block Design
- Ξεκινήστε δημιουργώντας ένα νέο έργο Vivado και επιλέξτε το Zybo Zynq 7000 Z010 ως συσκευή -στόχο.
- Στη συνέχεια κάντε κλικ στη δημιουργία νέου σχεδιασμού μπλοκ και προσθέστε το IP Zynq. Κάντε διπλό κλικ στο IP Zynq και εισαγάγετε τις παρεχόμενες ρυθμίσεις XPS για το Zynq. Στη συνέχεια, ενεργοποιήστε το UART0 με το MIO 10..11 στην καρτέλα διαμορφώσεων MIO και επίσης βεβαιωθείτε ότι είναι ενεργοποιημένα το χρονόμετρο 0 και το χρονόμετρο Watchdog.
- Προσθέστε δύο AXI GPIOS στο σχεδιασμό του μπλοκ. Για το GPIO 0 ενεργοποιήστε το διπλό κανάλι και ρυθμίστε και τα δύο σε όλες τις εξόδους. Ρυθμίστε το πλάτος GPIO για το κανάλι 1 έως 4 bit και για το κανάλι 2 έως 12 bits, αυτά τα κανάλια θα χρησιμοποιηθούν για να ρυθμίσετε την κατεύθυνση του κινητήρα και να στείλετε τον αριθμό των τσιμπουριών των μέτρων κωδικοποίησης στον επεξεργαστή. Για το GPIO 1 ορίστε μόνο ένα κανάλι σε όλες τις εισόδους με πλάτος καναλιού 4 bit. Αυτό θα χρησιμοποιηθεί για τη λήψη δεδομένων από τους κωδικοποιητές. Κάντε όλες τις θύρες GPIO εξωτερικές.
- Επόμενο Προσθέστε δύο AXI Timers. Κάντε εξωτερικές τις θύρες pwm0 και στους δύο χρονοδιακόπτες. Αυτά θα είναι τα pwms που ελέγχουν την ταχύτητα με την οποία περιστρέφονται οι κινητήρες.
- Τέλος, εκτελέστε την αυτοματοποίηση μπλοκ και την αυτοματοποίηση σύνδεσης. Βεβαιωθείτε ότι ο σχεδιασμός μπλοκ που έχετε ταιριάζει με τον παρεχόμενο.
Βήμα 4: Επικοινωνία με το LiDAR
Αυτό το LiDAR χρησιμοποιεί ένα πρωτόκολλο SCIP 2.0 για να επικοινωνήσει μέσω του UART, το συνημμένο αρχείο περιγράφει ολόκληρο το πρωτόκολλο.
Για να επικοινωνήσουμε με το LiDAR θα χρησιμοποιήσουμε το UART0. Το LiDAR επιστρέφει 682 σημεία δεδομένων το καθένα που αντιπροσωπεύει την απόσταση από ένα αντικείμενο σε αυτή τη γωνία. Το LiDAR σαρώνει αριστερόστροφα από -30 μοίρες έως 210 μοίρες με βήμα 0,351 μοίρες.
- Όλη η επικοινωνία με το LiDAR γίνεται με χαρακτήρες ASCI, ανατρέξτε στο πρωτόκολλο SCIP για τη μορφή που χρησιμοποιείται. Ξεκινάμε στέλνοντας την εντολή QT για να ενεργοποιήσετε το LiDAR. Στη συνέχεια, στέλνουμε την εντολή GS αρκετές φορές ζητώντας 18 σημεία δεδομένων κάθε φορά στα ft στο UARTS 64 byte FIFO. Τα δεδομένα που επιστρέφονται από το LiDAR στη συνέχεια αναλύονται και αποθηκεύονται στον παγκόσμιο πίνακα SCANdata.
- Κάθε αποθηκευμένο σημείο δεδομένων είναι 2 byte κωδικοποιημένων δεδομένων. Η μετάδοση αυτών των δεδομένων στον αποκωδικοποιητή θα επιστρέψει μια απόσταση σε χιλιοστά.
Στο αρχείο main_av.c θα βρείτε τις ακόλουθες λειτουργίες για επικοινωνία με το LiDAR
sendLIDARcmd (εντολή)
- Αυτό θα στείλει τη συμβολοσειρά εισόδου στο LiDAR μέσω του UART0
recvLIDARdata ()
- Αυτό θα λάβει δεδομένα μετά την αποστολή μιας εντολής στο LiDAR και την αποθήκευση των δεδομένων στο RECBuffer
requestDistanceData ()
- Αυτή η λειτουργία θα στείλει μια σειρά εντολών για ανάκτηση και των 682 σημείων δεδομένων. Αφού ληφθεί κάθε σύνολο 18 σημείων δεδομένων, το parseLIDARinput () καλείται να αναλύσει τα δεδομένα και να σταδιακά αποθηκεύσει τα σημεία δεδομένων στα SCANdata.
Βήμα 5: Συμπλήρωση πλέγματος με εμπόδια
Το GRID που αποθηκεύεται είναι ένας πίνακας 2D με κάθε τιμή ευρετηρίου να αντιπροσωπεύει μια τοποθεσία. Τα δεδομένα που αποθηκεύονται σε κάθε δείκτη είναι είτε 0 είτε 1, Χωρίς εμπόδιο και εμπόδιο αντίστοιχα. Η τετραγωνική απόσταση σε χιλιοστά που αντιπροσωπεύει κάθε δείκτης μπορεί να αλλάξει με τον ορισμό GRID_SCALE στο αρχείο autom.h. Το μέγεθος της συστοιχίας 2D μπορεί επίσης να μεταβληθεί για να επιτρέψει στο όχημα να σαρώσει μια μεγαλύτερη περιοχή τροποποιώντας τον ορισμό GRID_SIZE.
Μετά τη σάρωση ενός νέου συνόλου δεδομένων απόστασης, το LiDAR καλείται updateGrid (). Αυτό θα επαναλαμβάνεται σε κάθε σημείο δεδομένων που είναι αποθηκευμένο στον πίνακα SCANdata για να καθορίσει ποιοι δείκτες στο πλέγμα έχουν εμπόδια. Χρησιμοποιώντας τον τρέχοντα προσανατολισμό του οχήματος μπορούμε να καθορίσουμε τη γωνία που αντιστοιχεί σε κάθε σημείο δεδομένων. Για να προσδιορίσετε πού βρίσκεται ένα εμπόδιο, τότε απλά πολλαπλασιάστε την αντίστοιχη απόσταση με cos/sin της γωνίας. Η προσθήκη αυτών των δύο τιμών στην τρέχουσα θέση x και y των οχημάτων θα επιστρέψει τον δείκτη στο πλέγμα του εμποδίου. Ο διαχωρισμός της απόστασης που επιστρέφεται από αυτήν τη λειτουργία με το GRID_SCALE θα μας επιτρέψει να αλλάξουμε πόσο μεγάλη είναι η τετραγωνική απόσταση κάθε δείκτη.
Οι παραπάνω εικόνες δείχνουν το τρέχον περιβάλλον των οχημάτων και το προκύπτον Πλέγμα.
Βήμα 6: Επικοινωνία με κινητήρες
Για να επικοινωνήσουμε με τους κινητήρες ξεκινάμε με την προετοιμασία των GPIO για έλεγχο ήταν η κατεύθυνση που περιστρέφεται ο κινητήρας. Στη συνέχεια, γράφοντας απευθείας στη βασική διεύθυνση των PWMs στο AXI Timer μας επιτρέπει να ορίσουμε πράγματα όπως η περίοδος και ο κύκλος λειτουργίας που ελέγχουν άμεσα το ταχύτητα περιστροφής του κινητήρα.
Βήμα 7: Σχεδιασμός διαδρομής
Θα εφαρμοστεί στο εγγύς μέλλον.
Χρησιμοποιώντας τη λειτουργία πλέγματος και κινητήρα που περιγράφηκε προηγουμένως, είναι πολύ εύκολο να εφαρμοστούν αλγόριθμοι όπως το A*. Καθώς το όχημα κινείται θα συνεχίσει να σαρώνει τη γύρω περιοχή και να καθορίζει εάν η διαδρομή στην οποία βρίσκεται εξακολουθεί να ισχύει