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

Rpibot - About Learning Robotics: 9 βήματα
Rpibot - About Learning Robotics: 9 βήματα

Βίντεο: Rpibot - About Learning Robotics: 9 βήματα

Βίντεο: Rpibot - About Learning Robotics: 9 βήματα
Βίντεο: Кен Голдберг: 4 истины, созданные роботами и предназначенные для людей 2024, Νοέμβριος
Anonim
Rpibot - Σχετικά με την εκμάθηση ρομποτικής
Rpibot - Σχετικά με την εκμάθηση ρομποτικής

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

Είχα τις ακόλουθες απαιτήσεις:

  • Απλό υλικό (στο επίκεντρο είναι το λογισμικό)
  • Φθηνό υλικό (περίπου 100 €)
  • Επεκτάσιμο (ορισμένες επιλογές είναι ήδη μέρος της περιγραφής)
  • Τάση τροφοδοσίας για όλα τα εξαρτήματα από μία πηγή 5V (powerbank)

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

Δεν είναι ένα σεμινάριο για αρχάριους. Χρειάζεστε κάποιες βασικές γνώσεις σχετικά με:

  • Προγραμματισμός (Python)
  • Βασικά ηλεκτρονικά (για τη σύνδεση των μονάδων μεταξύ τους με τη σωστή τάση)
  • Βασική θεωρία ελέγχου (PID)

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

Ο πλήρης πηγαίος κώδικας και τα αρχεία είναι διαθέσιμα εδώ:

Προμήθειες:

Μηχανική

  • 1x σανίδα από κόντρα πλακέ (μέγεθος Α4, πάχος 4 mm)
  • 3x M4 x 80 Βίδα και παξιμάδι
  • 2x Gear μοτέρ με δευτερεύοντα άξονα εξόδου για κωδικοποιητή. Τροχοί.
  • 1x Δωρεάν τροχός

1x τοποθέτηση κάμερας και κλίσης (προαιρετικά)

ΗΛΕΚΤΡΟΝΙΚΑ ΕΙΔΗ

  • 1x Raspberry Pi Zero με κεφαλίδα και κάμερα
  • 1x σερβο χειριστήριο PCA 9685
  • 2x τροχός και κύκλωμα οπτικού κωδικοποιητή
  • 1x Γυναικεία καλώδια βραχυκυκλωτήρων
  • 1x USB powerbank
  • 1x πρόγραμμα οδήγησης διπλού κινητήρα DRV8833
  • 2x Micro servos SG90 για κάμερα και κλίση (προαιρετικά)
  • 1x MPU9250 IMU (προαιρετικό)
  • 1x αισθητήρας υπερήχων HC-SR04 υπερήχων (προαιρετικό)
  • 1x διάτρητη σανίδα και σύρμα συγκόλλησης, κεφαλές,…

Βήμα 1: Κατασκευάστε το πλαίσιο

Φτιάξτε το Σασί
Φτιάξτε το Σασί
Φτιάξτε το Σασί
Φτιάξτε το Σασί
Φτιάξτε το Σασί
Φτιάξτε το Σασί

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

  • Φθηνά υλικά
  • Γρήγορη συναρμολόγηση και αποσυναρμολόγηση
  • Επεκτάσιμο (π.χ. χώρος για πρόσθετους αισθητήρες)
  • Ελαφριά υλικά για εξοικονόμηση ενέργειας για τα ηλεκτρονικά

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

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

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

Ιδιότητες τροχού (για υπολογισμούς λογισμικού)

Περιφέρεια: 21, 5 cm Παλμοί: 20 παλμοί/στροφές. Ανάλυση: 1, 075 cm (τελικά 1 παλμός είναι περίπου 1 cm, κάτι που είναι εύκολο για υπολογισμούς λογισμικού)

Βήμα 2: Ηλεκτρονικά και καλωδίωση

Ηλεκτρονικά και καλωδίωση
Ηλεκτρονικά και καλωδίωση
Ηλεκτρονικά και καλωδίωση
Ηλεκτρονικά και καλωδίωση
Ηλεκτρονικά και καλωδίωση
Ηλεκτρονικά και καλωδίωση

Το έργο χρησιμοποιεί διαφορετικές ενότητες όπως φαίνεται στο διάγραμμα.

Το Raspberry Pi Zero είναι ο κύριος ελεγκτής. Διαβάζει τους αισθητήρες και ελέγχει τους κινητήρες με σήμα PWM. Συνδέεται με απομακρυσμένο υπολογιστή μέσω wifi.

Το DRV8833 είναι μια γέφυρα H διπλού κινητήρα. Παρέχει επαρκές ρεύμα στους κινητήρες (κάτι που το Raspberry Pi δεν μπορεί να κάνει καθώς οι έξοδοι μπορούν να αποδώσουν μόνο μερικά mA).

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

Το pca9695 είναι ένας σερβο πίνακας ελέγχου. Επικοινωνεί με σειριακό δίαυλο I2C. Αυτός ο πίνακας παρέχει τα σήματα PWM και την τάση τροφοδοσίας που ελέγχουν τα σερβίτσια για τη μετατόπιση και την κλίση του έκκεντρου.

Το MPU9265 είναι επιτάχυνση 3 αξόνων, γωνιακή ταχύτητα περιστροφής 3 αξόνων και αισθητήρας μαγνητικής ροής 3 αξόνων. Θα το χρησιμοποιήσουμε κυρίως για να αποκτήσουμε τον τίτλο της πυξίδας.

Οι διαφορετικές μονάδες συνδέονται όλες μεταξύ τους με καλώδιο βραχυκυκλωτήρα. Ένας πίνακας ψωμιού λειτουργεί ως αποστολέας και παρέχει τάσεις τροφοδοσίας (5V και 3.3V) και γείωση. Όλες οι συνδέσεις περιγράφονται στον πίνακα συνδέσεων (βλέπε συνημμένο). Η σύνδεση 5V σε είσοδο 3.3V πιθανόν να καταστρέψει το τσιπ σας. Φροντίστε και ελέγξτε όλες τις καλωδιώσεις σας δύο φορές πριν από την παροχή (εδώ ειδικά ο κωδικοποιητής πρέπει να ληφθεί υπόψη). Θα πρέπει να μετρήσετε τις κύριες τάσεις τροφοδοσίας στον πίνακα αποστολής με ένα πολύμετρο πριν συνδέσετε όλες τις πλακέτες. Οι μονάδες στερεώθηκαν με νάιλον βίδες στο πλαίσιο. Επίσης εδώ χάρηκα που τα έκανα σταθερά αλλά και αφαιρούμενα σε περίπτωση δυσλειτουργίας.

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

Βήμα 3: Υποδομή λογισμικού

Υποδομή λογισμικού
Υποδομή λογισμικού
Υποδομή λογισμικού
Υποδομή λογισμικού

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

Git

Αυτό είναι ένα σύστημα ελέγχου έκδοσης δωρεάν και ανοιχτού κώδικα. Χρησιμοποιείται για τη διαχείριση μεγάλων έργων ως Linux, αλλά μπορεί επίσης εύκολα να χρησιμοποιηθεί για μικρά έργα (βλ. Github και Bitbucket).

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

Οι κύριες εντολές που χρησιμοποιούνται είναι:

git clone https://github.com/makerobotics/RPIbot.git [Λήψη του πηγαίου κώδικα και της διαμόρφωσης git]

git pull origin master [λάβετε το τελευταίο από το απομακρυσμένο αποθετήριο]

κατάσταση git [λάβετε την κατάσταση του τοπικού αποθετηρίου. Έχουν αλλάξει κάποια αρχεία;] git log [λάβετε τη λίστα των δεσμεύσεων] git add. [προσθήκη όλων των αλλαγμένων αρχείων στο στάδιο που θα εξεταστούν για την επόμενη δέσμευση] git commit -m "σχόλιο για δέσμευση" [δέσμευση των αλλαγών στο τοπικό αποθετήριο] git push origin master [ώθηση όλων των δεσμεύσεων στο απομακρυσμένο αποθετήριο]

Ξύλευση

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

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

logger = logging.getLogger (_ name_)

logger.setLevel (logging. DEBUG)

Μέτρηση και γραφική παράσταση

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

Το αρχείο ίχνους διαχωρισμένου με ερωτηματικά δημιουργείται από τον κύριο κώδικα python και πρέπει να έχει κεφαλίδες όπως αυτές:

timestamp; yawCorr; encoderR; I_L; odoDistance; ax; encoderL; I_R; yaw; eSpeedR; eSpeedL; pwmL; speedL; CycleTimeControl; wz; pwmR; speedR; Iyaw; hdg; m_y; m_x; eyeaw

1603466959.65;0;0;25;0.0;-0.02685546875;0;25;0;25;25;52;0.0;23;0.221252441406;16;0.0;0;252.069366413;-5.19555664062;-16.0563964844;0;6; 1603466959.71;0;0;50;0.0;0.29150390625;0;50;0;25;25;55;0.0;57;-8.53729248047;53;0.0;0;253.562118111;-5.04602050781;-17.1031494141;0;6; 1603466959.76;0;-1;75;0.0;-0.188232421875;1;75;2;25;25;57;0;52;-24.1851806641;55;0;0;251.433794171;-5.64416503906;-16.8040771484;2;7;

Η πρώτη στήλη περιέχει τη χρονική σήμανση. Οι ακόλουθες στήλες είναι δωρεάν. Το σενάριο σχεδίασης καλείται με μια λίστα στηλών που πρέπει να σχεδιαστούν:

τηλεχειριστήριο@pc: ~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR

Το σενάριο πλοκής είναι διαθέσιμο στο φάκελο εργαλείων:

Ο σχεδιαστής χρησιμοποιεί το mathplotlib στην Python. Πρέπει να το αντιγράψετε στον υπολογιστή σας.

Για μεγαλύτερη άνεση, το σενάριο python καλείται από ένα σενάριο bash (plot.sh) το οποίο χρησιμοποιείται για την αντιγραφή του αρχείου ιχνών Raspberry Pi στον απομακρυσμένο υπολογιστή και την κλήση του σχεδιαστή με επιλογή σήματος. Το σενάριο bash "plot.sh" ρωτά εάν το αρχείο πρέπει να αντιγραφεί. Αυτό ήταν πιο βολικό για μένα αντί να αντιγράφω χειροκίνητα κάθε φορά. Το "sshpass" χρησιμοποιείται για την αντιγραφή του αρχείου από το Raspberry Pi στον απομακρυσμένο υπολογιστή μέσω scp. Είναι σε θέση να αντιγράψει ένα αρχείο χωρίς να ζητήσει τον κωδικό πρόσβασης (περνά ως παράμετρος).

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

Απομακρυσμένη επικοινωνία

Η διεπαφή ανάπτυξης του Raspberry Pi είναι SSH. Τα αρχεία μπορούν να επεξεργαστούν απευθείας στο στόχο ή να αντιγραφούν από το scp.

Για τον έλεγχο του ρομπότ, ένας διακομιστής Ιστού λειτουργεί στο Pi, παρέχοντας έλεγχο μέσω ιστοσελίδων. Αυτή η διεπαφή περιγράφεται στο επόμενο βήμα.

Ρυθμίστε το Raspberry Pi

Υπάρχει ένα αρχείο που περιγράφει τη ρύθμιση του Raspberry Pi στο φάκελο "doc" του πηγαίου κώδικα (setup_rpi.txt). Δεν υπάρχουν πολλές εξηγήσεις αλλά πολλές χρήσιμες εντολές και σύνδεσμοι.

Βήμα 4: Το περιβάλλον εργασίας χρήστη

Το περιβάλλον εργασίας χρήστη
Το περιβάλλον εργασίας χρήστη

Χρησιμοποιούμε τον ελαφρύ διακομιστή Ιστού Tornado για τη φιλοξενία της διεπαφής χρήστη. Είναι μια ενότητα Python την οποία ονομάζουμε κατά την εκκίνηση του λογισμικού ελέγχου ρομπότ.

Αρχιτεκτονική λογισμικού

Η διεπαφή χρήστη δημιουργείται από τα ακόλουθα αρχεία: gui.html [Περιγραφή των στοιχείων ελέγχου και της διάταξης της ιστοσελίδας] gui.js [Περιέχει τον κώδικα javascript για τον χειρισμό των χειριστηρίων και το άνοιγμα σύνδεσης ιστού με το ρομπότ μας] gui.css [Περιέχει τα στυλ του τα στοιχεία ελέγχου html. Οι θέσεις των χειριστηρίων καθορίζονται εδώ]

Η δικτυακή επικοινωνία

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

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

Η διάταξη διεπαφής

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

Βήμα 5: Προγραμματισμός της πλατφόρμας ρομπότ

Προγραμματισμός της πλατφόρμας ρομπότ
Προγραμματισμός της πλατφόρμας ρομπότ
Προγραμματισμός της πλατφόρμας ρομπότ
Προγραμματισμός της πλατφόρμας ρομπότ
Προγραμματισμός της πλατφόρμας ρομπότ
Προγραμματισμός της πλατφόρμας ρομπότ

Αυτό το μέρος ήταν ο κύριος στόχος του έργου. Αναδιαμόρφωσα πολύ το λογισμικό καθώς παρουσίασα το νέο πλαίσιο με κινητήρες DC. Χρησιμοποίησα την Python ως γλώσσα προγραμματισμού για διάφορους λόγους:

  • Είναι η κύρια γλώσσα του Raspberry Pi
  • Είναι μια γλώσσα υψηλού επιπέδου με πολλές ενσωματωμένες δυνατότητες και επεκτάσεις
  • Είναι αντικειμενοστρεφής αλλά μπορεί επίσης να χρησιμοποιηθεί για διαδοχικό προγραμματισμό
  • Δεν απαιτείται μεταγλώττιση ούτε αλυσίδα εργαλείων. Επεξεργαστείτε τον κώδικα και εκτελέστε τον.

Κύρια αρχιτεκτονική λογισμικού

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

Sense Think Actuate

Αίσθηση.py

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

Control.py

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

rpibot.py

Αυτό το κύριο αντικείμενο είναι η διαχείριση του διακομιστή ιστού Tornado και η δημιουργία τάσεων αίσθησης και ελέγχου σε ξεχωριστά νήματα.

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

Ο έλεγχος PID

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

Τέλος, θέλουμε να ελέγξουμε κάθε ταχύτητα τροχού και επίσης την κατεύθυνση του ρομπότ. Για να γίνει αυτό, πρέπει να καταρρίψουμε δύο λογικές ελέγχου.

Για να αυξήσετε την πολυπλοκότητα βήμα προς βήμα, το ρομπότ πρέπει να ελέγχεται:

ανοιχτός βρόχος (με σταθερή ισχύ)

pwm = Κ

στη συνέχεια προσθέστε τον αλγόριθμο κλειστού βρόχου

pwm = Kp.speedError+Ki. Integration (speedError)

και τέλος προσθέστε τον έλεγχο κατεύθυνσης ως τελευταίο βήμα.

Για τον έλεγχο ταχύτητας χρησιμοποίησα ένα χειριστήριο "PI" και "P" μόνο για το χασμουρητό. Ορίζω χειροκίνητα τις παραμέτρους πειραματίζοντας. Πιθανώς πολύ καλύτερες παράμετροι θα μπορούσαν να χρησιμοποιηθούν εδώ. Ο στόχος μου ήταν απλώς μια ευθεία γραμμή και σχεδόν την κατάφερα. Δημιούργησα μια διεπαφή στο λογισμικό για να γράψω μερικές μεταβλητές από τη διεπαφή χρήστη. Η ρύθμιση της παραμέτρου Kp σε 1.0 χρειάζεται την ακόλουθη εντολή στη διεπαφή χρήστη:

SET; Kp; 1.0

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

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

Επισυνάπτεται το χρησιμοποιημένο διάγραμμα ελέγχου. Εμφανίζει μόνο την αριστερή πλευρά του χειριστηρίου ρομπότ.

Βήμα 6: Οι βαθμονομήσεις αισθητήρων

Οι βαθμονομήσεις αισθητήρων
Οι βαθμονομήσεις αισθητήρων
Οι βαθμονομήσεις αισθητήρων
Οι βαθμονομήσεις αισθητήρων
Οι βαθμονομήσεις αισθητήρων
Οι βαθμονομήσεις αισθητήρων

Το πρώτο πράγμα που πρέπει να λάβετε υπόψη είναι ότι ολόκληρη η IMU πρέπει να λειτουργήσει σωστά. Παρήγγειλα 3 μέρη και τα έστειλα πίσω μέχρι να έχω έναν πλήρη αισθητήρα εργασίας. Κάθε προηγούμενος αισθητήρας είχε κάποια μέρη του αισθητήρα που δεν λειτουργούσαν σωστά ή καθόλου. Χρησιμοποίησα μερικά σενάρια παραδείγματος για να δοκιμάσω τα βασικά πριν το τοποθετήσω στο ρομπότ.

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

Βαθμονομήσεις ταχύτητας επιτάχυνσης και περιστροφής

Η ευκολότερη βαθμονόμηση είναι για τη διαμήκη επιτάχυνση (A_x). Σε στάση πρέπει να υπάρχει περίπου 0 m/s². Εάν περιστρέψετε σωστά τον αισθητήρα, μπορείτε να μετρήσετε τη βαρύτητα (περίπου 9, 8 m/s²). Για να βαθμονομήσετε το a_x, απλώς πρέπει να το τοποθετήσετε σωστά και, στη συνέχεια, να ορίσετε το offset για να έχετε 0 m/s² σε στάση. Τώρα το A_x βαθμονομείται. Μπορείτε να λάβετε τις αντισταθμίσεις για τις ταχύτητες περιστροφής με παρόμοιο τρόπο σε στάση.

Η βαθμονόμηση μαγνητόμετρου για την πυξίδα

Μια πιο πολύπλοκη βαθμονόμηση είναι απαραίτητη για τους αισθητήρες μαγνητικού πεδίου. Θα χρησιμοποιήσουμε m_x και m_y για να πάρουμε το μαγνητικό πεδίο σε οριζόντιο επίπεδο. Έχοντας m_x και m_y θα μας δοθεί η ευκαιρία να υπολογίσουμε μια επικεφαλίδα πυξίδας.

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

Καταγράφουμε m_x και m_y ενώ γυρίζουμε το ρομπότ γύρω από τον άξονα z. Σχεδιάζουμε το m_x vs m_y σε ένα διάγραμμα XY. Το αποτέλεσμα σε μια έλλειψη όπως φαίνεται στην εικόνα. Η έλλειψη πρέπει να επικεντρωθεί στην προέλευση. Εδώ εξετάζουμε τις μέγιστες και ελάχιστες τιμές των m_x και m_y για να πάρουμε τις αντισταθμίσεις και προς τις δύο κατευθύνσεις. Τέλος ελέγχουμε τη βαθμονόμηση και βλέπουμε ότι η έλλειψη είναι τώρα στο κέντρο.

Η βαθμονόμηση μαλακού σιδήρου σημαίνει ότι αλλάζουμε την εικόνα από έλλειψη σε κύκλο. Αυτό μπορεί να γίνει προσθέτοντας έναν συντελεστή σε κάθε τιμή αισθητήρα.

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

Η κατεύθυνση της πυξίδας

Τα δεδομένα μαγνητόμετρου θα χρησιμοποιηθούν τώρα για τον υπολογισμό της επικεφαλίδας της πυξίδας. Για αυτό, πρέπει να μετατρέψουμε τα σήματα m_x και m_y σε γωνία. Η Python παρέχει άμεσα τη συνάρτηση math.atan2 που έχει αυτόν τον στόχο. Ο πλήρης υπολογισμός ορίζεται στο αρχείο mpu9250_i2c.py ("calcHeading (mx, my, mz)").

Βήμα 7: Εναλλακτικά σχέδια

Εναλλακτικά Σχέδια
Εναλλακτικά Σχέδια
Εναλλακτικά Σχέδια
Εναλλακτικά Σχέδια
Εναλλακτικά Σχέδια
Εναλλακτικά Σχέδια

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

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

Σερβο συνεχούς περιστροφής συνδεδεμένο στο pca 9695

Για να αποφύγω μια πρόσθετη γέφυρα H για έναν κινητήρα DC, ξεκίνησα πρώτα με servos συνεχούς περιστροφής. Αυτά οδηγήθηκαν από το ήδη υπάρχον σερβο οδηγό pca 9695. Όλη η μηχανική πρόωσης και τα αντίστοιχα ηλεκτρονικά ήταν πολύ πιο απλά. Αυτός ο σχεδιασμός είχε δύο μειονεκτήματα:

  • Το κακό εύρος ελέγχου των σερβο.
  • Λείπει η θέση κράτησης του κωδικοποιητή

Τα servos ξεκινούν να κινούνται με 50% pwm και έχουν πλήρη ταχύτητα περίπου 55%. Αυτό είναι ένα πολύ κακό εύρος ελέγχου.

Χωρίς κράτημα κωδικοποιητή, ήταν πολύ δύσκολο να βρεθεί ένας έτοιμος κωδικοποιητής. Δοκίμασα 3 διαφορετικούς κωδικοποιητές ανακλαστικότητας που ήταν τοποθετημένοι στο πλαίσιο. Τοποθέτησα αυτοκόλλητο τροχό κωδικοποιητή στο εξωτερικό του τροχού με ασπρόμαυρα τμήματα. Χρησιμοποίησα τους αισθητήρες QTR-1RC που χρειάζονται πολλή επεξεργασία σήματος για να πάρουν το σωστό σήμα. Το Raspberry Pi δεν ήταν σε θέση να εκτελέσει αυτό το είδος επεξεργασίας σε πραγματικό χρόνο. Έτσι αποφάσισα να προσθέσω ένα NodeMCU D1 mini ως ελεγκτή πραγματικού χρόνου στο ρομπότ. Συνδέθηκε με το βατόμουρο Pi από το σειριακό UART για να παραδώσει τα επεξεργασμένα δεδομένα αισθητήρα. Το NodeMCU διαχειριζόταν επίσης τον αισθητήρα HC-SR04. Οι μηχανικοί ήταν δύσκολοι και δεν ήταν πολύ στιβαροί, η σειριακή γραμμή έπαιρνε θόρυβο από τη γραμμή I2C και τους κινητήρες, έτσι τελικά έφτιαξα τη δεύτερη έκδοση του πλαισίου με απλούς κινητήρες DC με κινητήρα μια γέφυρα Η. Αυτοί οι κινητήρες έχουν έναν δευτερεύοντα άξονα εξόδου για την τοποθέτηση ενός οπτικού κωδικοποιητή.

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

ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ
ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ
ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ
ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ
ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ
ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ
ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ
ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ

Για να βελτιώσουμε την αυτόνομη οδήγηση, μπορούμε να κάνουμε κάποια επεξεργασία εικόνας.

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

Καταγράφουμε μια εικόνα και εφαρμόζουμε μερικές εργασίες επεξεργασίας εικόνας:

Οι πρώτες δοκιμές έγιναν με μετασχηματισμούς Canny και Sobel. Ο Canny μπορεί να είναι καλός υποψήφιος αλλά δεν είναι αρκετά λογικός. Ο Σόμπελ είναι πολύ λογικός (ανιχνεύονται πάρα πολλά αντικείμενα).

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

  • Μετατρέψτε την έγχρωμη εικόνα σε μια εικόνα γκρι επιπέδου
  • Θολώστε την εικόνα για να αφαιρέσετε μικρό θόρυβο
  • Καθορίστε την εικόνα σε ασπρόμαυρη εικόνα
  • Τώρα εντοπίζουμε οριζόντιες και κάθετες κλίσεις για να ανιχνεύσουμε αντικείμενα ως τοίχους και έπιπλα
  • Φιλτράρουμε μόνο τα μεγάλα περιγράμματα που απομένουν (δείτε έγχρωμα περιγράμματα στην εικόνα)

Τώρα μπορούμε να χρησιμοποιήσουμε αυτές τις νέες πληροφορίες για τον εντοπισμό εμποδίων…

Βήμα 9: Επόμενα βήματα…

Επόμενα βήματα…
Επόμενα βήματα…
Επόμενα βήματα…
Επόμενα βήματα…

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

  • Σύντηξη αισθητήρα χασμουριού και μαγνητικών σημάτων επικεφαλίδας
  • Επεξεργασία εικόνας κάμερας (μόνο χαμηλή CPU διαθέσιμη για αυτό)
  • Ανίχνευση σύγκρουσης (απόσταση υπερήχων και κάμερα)
  • Κατασκευή χάρτη ή προσανατολισμός

Τώρα πηγαίνετε και δημιουργήστε τις δικές σας προκλήσεις ή στόχους…

Συνιστάται: