Αυτόνομοι Πράκτορες Nao becomes a painter Ομάδα εργασίας: ΚΑΤΣΑΝΙ ΜΕΡΙΕΜΕ 2011030035 Περιγραφή Στόχος της εργασίας εξαμήνου ήταν ο προγραμματισμός της συμπεριφοράς στο Aldebaran NAO ανθρωποειδές ρομπότ, ώστε να επιδεικνύει συμπεριφορά... ζωγράφου! Είναι γνωστός ο θαυμασμός του ρομποτικού, αυτού, πράκτορα προς τη ζωγραφική και πιο συγκεκριμένα η κλίση του προς το καλλιτεχνικό ρεύμα του κυβισμού. Επομένως, στην εν λόγω εργασία γίνεται προσπάθεια υλοποίησης της συμπεριφοράς ενός κυβιστή ζωγράφου, ο οποίος εμπνέεται από γεωμετρικά αντικείμενα που του επιδεικνύουν. Στη συγκεκριμένη εργασία, το ρομπότ ζωγραφίζει έναν κύκλο ελλειπτοειδούς μορφής. Έτσι, το ρομπότ φωτογραφίζει το σχήμα που επιθυμεί να σχεδιάσει και αφού επεξεργαστεί κατάλληλα την εικόνα και εξάγει το αντικείμενο σε μια ευδάκριτη, για το ίδιο, μορφή, αναλαμβάνει τελικά να το ζωγραφίσει χρησιμοποιώντας το δεξί του χέρι.
Προσέγγιση του προβλήματος Η εργασία πραγματοποιήθηκε μέσω προσομοιωτή, επομένως, επιλογή γραφικού περιβάλλοντος προσομοίωσης αποτέλεσε το λογισμικό Webots, σε συνδυασμό με τη γλώσσα προγραμματισμού Python, καθώς η Aldebaran παρέχει πλούσιο υλικό σε Python, το οποίο φάνηκε ιδιαίτερα χρήσιμο. Για την υλοποίηση της ζητούμενης συμπεριφοράς, ακολούθησαν τα εξής βήματα: Αρχικά, η τοποθέτηση του ρομπότ σε μια ασφαλή θέση, ώστε να εκκινήσει από εκεί τη συνολική διαδικασία, καταλήγοντας τελικά στην πόζα αρχικοποίησης(standinit) που παρέχεται μέσω της κλάσης ALProxy για τον έλεγχο της κίνησης(motion) του ρομπότ. Αντίστοιχα, η τοποθέτηση σε θέση ηρεμίας κατά την ολοκλήρωση του προγράμματος μέσω της rest(). Ακόμη, αρχικοποιείται η θέση του δεξιού χεριού χρησιμοποιώντας 4 βαθμούς ελευθερίας(dof), μέσω RshoulderPitch, RshoulderRoll, RelbowRoll και RArm. Στη συνέχεια, ξεκινά η διαδικασία λήψης και αποθήκευσης της εικόνας που θα επεξεργαστεί το ρομπότ, επομένως θέτουμε και το κεφάλι στην επιθυμητή στάση, ώστε η κάμερα να φωτογραφίζει το αντικείμενο που υπάρχει μπροστά(στο πλαίσιο της προσομοίωσης, πρόκειται περί του χώρου που απαρτίζει τον κόσμο του ΝΑΟ). Ακολουθώντας τις οδηγίες που παρέχονται από το σχετικό documentation ( http://doc.aldebaran.com/2-1/dev/python/examples/vision/get_image.html ) στην ιστοσελίδα της Aldebaran για τη λήψη και την αποθήκευση της φωτογραφίας μέσω της βιβλιοθήκης PIL(Python Image Library). Παρακάτω φαίνεται το αποτέλεσμα της εικόνας που φωτογραφίζει και αποθηκεύει το ρομπότ μέσω της κάμερας camimage.png : Έπειτα, συνεχίζεται η ανάλυση και επεξεργασία της εικόνας μέσω της βιβλιοθήκης ανοικτού λογισμικού OpenCV(Open Source Computer Vision Library), η οποία αποτελεί εξαιρετικό εργαλείο σε συνδυασμό με την Python. Πιο συγκεκριμένα, έγινε εφαρμογή φίλτρου διάβρωσης(erosion), μετατροπή σε μονοχρωματική εικόνα αποχρώσεων του
γκρι(grayscale), φίλτρο για μείωση θορύβου(gaussianblur) καθώς και κατωφλίωση μέσω της μεθόδου ανίχνευσης ακμών Canny, ώστε να μετατραπεί η αρχική εικόνα σε μορφή πιο ευανάγνωστη για το ρομπότ. Ακόμη, πραγματοποιήθηκε εξαγωγή του περιγράμματος του σχήματος που θα χρησιμοποιηθεί στη συνέχεια για την ανάγνωση του σχήματος καθώς και εύρεση των γωνιών του σχήματος(harris). Παρακάτω φαίνεται το αποτέλεσμα της εικόνας μετά την εφαρμογή των παραπάνω φίλτρων και της επεξεργασίας newimage.png : καθώς επίσης και η αρχική εικόνα, μετά την εύρεση των γωνιών(harris corners) όπως προκύπτει:
Ασφαλώς, χρειάζεται ιδιαίτερη προσοχή στην τιμή κάθε κατωφλίου που εφαρμόστηκε, καθώς προσαρμόζεται ανάλογα την κάθε εικόνα. Εδώ παρουσιάζεται κυρίως ενδεικτικά, καθώς το συνολικό σχήμα που παρατηρεί το ρομπότ είναι ιδιαίτερα περίπλοκο. Τέλος, ολοκληρώνεται το αρχικό εγχείρημα μέσω του ελέγχου της κίνησης του χεριού, ώστε να σχεδιαστεί το αντικείμενο που διαβάστηκε. Όπως γίνεται αντιληπτό, προηγείται η διαδικασία μετατροπής των (x,y) σημείων που διαβάστηκαν από το ρομπότ από pixels σε meters για την κίνηση του χεριού. Επιπλέον, ελέγχεται η διαφορά της επόμενης και της προηγούμενης θέσης του χεριού και για να ολοκληρωθεί η κίνηση, εφαρμόζεται επιλεγμένο API, που αφορά τον καρτεσιανό έλεγχο προγραμματισμένης κίνησης μέσω επίλυσης inverse kinematics( http://doc.aldebaran.com/2-1/naoqi/motion/control-cartesian.html). Έτσι, μετακινούνται τελικά μόνο τα επίπεδα ΧΥ, ενώ παραμένει σταθερό το επίπεδο Ζ. Το κάδρο που επιλέχθηκε ήταν ο κορμός(torso) καθώς προτείνεται από πολλούς προγραμματιστές της εταιρίας Aldebaran για την εν λόγω υλοποίηση. ΝΑΟ ρομπότ σε κάδρο TORSO καθώς και οι αντίστοιχοι ΧΥΖ άξονες: Παρακάτω παρουσιάζεται η μετατροπή pixels σε meters, όπως εφαρμόστηκε: pointlist = [] for p in points: value = [] newx = (float(p[1]/1850))*0.3 newy = (-(float(p[0])/1600)*0.3) value.insert(0,newx) value.insert(1,newy) pointlist.append(value) Αξίζει να σημειωθεί πως λόγω της περιπλοκότητας της παραπάνω εικόνας που φωτογραφίζει το ρομπότ, η κίνηση για το σχεδιασμό του τελικού σχήματος ήταν σχεδόν ανέφικτη. Παρόλα αυτά, υλοποιήθηκε χειροκίνητα η διαδρομή της κίνησης του χεριού ώστε να σχηματιστεί ένα σχήμα που προσεγγίζει έναν κύκλο(ο)-έλλειψη, μέσω ενός αρχείου movements.txt και της εγγραφής αυτού σε schema.p αρχείο, το οποίο φορτώνεται στο πρόγραμμα, ώστε να υλοποιείται η τελική κίνηση μέσω αυτών. Χρησιμοποιείται, βέβαια, η εικόνα που σχολιάστηκε προηγουμένως καθώς και οι αντίστοιχες παραμέτροι, επομένως το τελικό αποτέλεσμα δεν είναι απολύτως ιδανικό, αλλά αποτελεί μια ικανοποιητική προσέγγιση.
Στις φωτογραφίες που ακολουθούν, φαίνεται η περιστροφική κίνηση του χεριού που υλοποιεί το NAO, ώστε να σχεδιάσει τον κύκλο-έλλειψη: Καθώς και μια ακόμη αλληλουχία κινήσεων για τον σχεδιασμό του ελλειπτοειδούς κύκλου από διαφορετική οπτική, κατά την οποία πινέλο του ζωγράφου αποτελεί το ίδιο το χέρι του: Ακόμη, παρακάτω φαίνονται και τα χρονικά στιγμιότυπα κατά τα οποία εκτελείται το πρόγραμμα και οι διάφορες κινήσεις για τη συμπεριφορά που παρουσιάζεται: