PostHeaderIcon Computer Vision truck robot - programming

Ευρετήριο Άρθρου
Computer Vision truck robot
EZtruck constraction
Power supply
programming
conclusion
Όλες οι Σελίδες

Προγραμματισμός

Για τον προγραμματισμό του οχήματος χρησιμοποιήθηκε το LabVIEW σε συνδυασμό με το δωρεάν API που υπήρχε μαζί με τα υλικά της Phidget.

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

Interface

Το interface του προγράμματος  χωρίζεται σε τρεις περιοχές.

main2

Περιοχή 1

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

Για κάθε IR αισθητήρα έχουμε αριθμητική ένδειξη αλλά και χρωματική. Ανάλογα με την απόσταση που μετράμε το χρώμα μεταβάλλεται σταδιακά σε πράσινο-κίτρινο-κόκκινο για απόσταση >80cm - 30cm - <15cm αντίστοιχα.

Επίσης το χρώμα των ερπυστριών μεταβάλλεται από μαύρο (σταματημένο) σε πράσινο(κίνηση εμπρός) και κόκκινο (κίνηση προς τα πίσω) με την ένταση του χρώματος να υποδηλώνει την ταχύτητα.

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

Περιοχή 2

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

Περιοχή 3

Στην περιοχή αυτή βρίσκεται ότι αφορά την επεξεργασία των εικόνων.

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

Επίσης βλέπουμε το frame Rate του βίντεο καθώς και τον χρόνο που απαιτείται για επεξεργασία του κάθε frame.

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

Το κυρίως Πρόγραμμα

Το κυρίως πρόγραμμα περιλαμβάνει 3 εισόδους. Το χειριστήριο (gamepad), τους αισθητήρες και την εικόνα. Ενώ σαν έξοδο δίνει τις κατάλληλες τιμές στις ερπύστριες και στους κινητήρες pan-tilt της κάμερας.

Το χειριστήριο

PS2 gamepad

Πρόκειται για ένα απλό τύπου PlayStation χειριστήριο με σύνδεση USB που χρησιμοποιείται με τρόπο που δίνει την αίσθηση στον χρήστη πως παίζει κάποιο ηλεκτρονικό παιχνίδι με αυτοκίνητα:

  1. X button -> κίνηση εμπρός
  2. [] button -> κίνηση προς τα πίσω
  3. < > (αριστερό δεξί βελάκι) -> σε συνδυασμό με το Χ ή το [] για να κινηθούμε αριστερά ή δεξιά
  4. Right analοg stick -> αλλάζει την θέση της κάμερας (για έλεγχο του περιβάλλοντα χώρου)
  5. L2 -> αριστερόστροφη επιτόπια κίνηση (στροφή γύρο από τον άξονα του)
  6. R2 -> δεξιόστροφη επιτόπια κίνηση
  7. L1->  image tracking. Το όχημα κινείται από τον χρήστη αλλά η κάμερα ανιχνεύει και παρακολουθεί αυτόνομα.
  8. R1-> Πλήρης αυτόνομη κίνηση με  χρήση όλων των αισθητήρων και των δεδομένων από την κάμερα. Το όχημα αναλαμβάνει αυτόνομα να φτάσει στο αντικείμενο προς αναγνώριση-στοχο αποφεύγοντας εμπόδια και σταματήσει όταν φτάσει σε μια συγκεκριμένη απόσταση από τον στόχο.

Οι αισθητήρες

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

Όλες οι τιμές των αισθητήρων χρησιμοποιούν ένα φίλτρο kalman (LINK)

Για να απορρίψουν τιμές που προκαλούνται από «θόρυβο».

Η τιμή του αισθητήρα απόστασης της κάμερας (SONAR) χρησιμοποιείται μόνο κατά την αυτόνομη λειτουργία ώστε να κρατεί μια σταθερή απόσταση από το αντικείμενο προς αναγνώριση. Έτσι γνωρίζει ποτέ να σταματήσει κατά την αυτόνομη λειτουργία.

Από τις τιμές των υπέρυθρων αισθητήρων IR χρησιμοποιώντας τον τύπο

w=75/(x-20)2 όπου x η τιμή του αισθητήρα.

Προκύπτει ένα «βάρος» w με το οποίο μεταβάλλεται η ταχύτητα της κάθε ερπύστριας.

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

Απόσταση – ποσοστό μείωσης.

Προσοχή πρέπει να δοθεί στο σημείο «ασυνέχειας» καθώς και στις τιμές <25 όπου το w πρέπει να παραμένει στο μέγιστο και όχι να μικραίνει όπως φαίνετε στην γραφική παράσταση.

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

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

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

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

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

Η κάμερα

Η εικόνα έπαιζε το σημαντικότερο ρόλο στην κατασκευή καθώς αυτό ήταν και το κυρίως αντικείμενο. Η κάμερα όπως ήδη αναφέρθηκε ήταν μια απλή webcamera Logitech C500 με σύνδεση USB. Ιδιαίτερο χαρακτηριστικό της είναι η υποστήριξη USB video class ή UVC.

Αυτό είναι ένα πρότυπο που χρησιμοποιείτε από τα περισσότερα Unix-like συστήματα για να χειρίζονται βιντεοκάμερες. Προτέρημα αποτελεί το γεγονός ότι η συμπίεση του βίντεο γίνετε πάνω στην κάμερα και ΟΧΙ στον υπολογιστή ελευθερώνοντας έτσι πολύτιμους πόρους σε ισχύ και bandwidth.

Το SBC με την σειρά του δίνει την δυνατότητα να λάβουμε την εικόνα μέσω δικτύου tcp/ip (και ασύρματα μέσω wi-fi) με δυο τρόπους.

  1. Χρησιμοποιώντας ένα MJPEG stream το οποίο πρόκειται στην ουσία για απλές εικόνες JPEG οι οποίες στέλνονται πολύ γρήγορα και διαδοχικά δίνοντας την αίσθηση στον χρήστη ότι παρακολουθεί ένα ενιαίο βίντεο.
  2. http://PhidgetSBC:81/?action=stream

  3. Ή με στατική εικόνα που την στέλνει μέσω της διεύθυνσης Ηttp://phidgetsbc.local:81/?action=snapshot. Το πρόβλημα με αυτή την μέθοδο είναι ότι πρέπει να κάνουμε συνέχεια POST-GET για να λαμβάνουμε το κάθε frame πράγμα το οποίο οδηγεί σε υπερβολική καθυστέρηση και πολύ χαμηλό frame Rate.

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

To frame rate δυστυχώς ακόμα και έτσι δεν ήταν ιδιαίτερα υψηλό καθώς η usb 1.0 έκδοση του SBC αποδείχτηκε ότι δεν είχε αρκετό bandwidth για χρήση.

Για ανάλυση 800χ600 το frame rate κυμαινόταν από 2 έως 5 FPS.

Ενώ η σημαντικότερη παράμετρος η καθυστέρηση ήταν περίπου 1sec πράγμα που δυσκόλευε αρκετά το σύστημα μας.

Δυστυχώς αυτοί ήταν περιορισμοί του hardware USB1.0 και wi-fi και δεν κατάφερα να βγάλω περισσότερα FPS με πιο μικρό delay.

Πιστεύω ότι η καλύτερη μέθοδος θα ήταν μια απλή αναλογική κάμερα (όπως κάποιες κάμερες συστημάτων ασφαλείας) και με ένα DVR να δίνει απευθείας τα δεδομένα στην υπολογιστή για επεξεργασία.



 

Παρακαλώ κάντε πρώτα login για να μπορείτε να κανετε σχολια.