Αυτόνομοι Πράκτορες ΝΑΟ Μουσικός Καρατζαφέρης Ευστάθιος Αλέξανδρος 2007 030 046 Πολυτεχνείο Κρήτης
Σύντομη Περιγραφή Στόχος της εργασίας μας είναι η υλοποίηση της συμπεριφοράς αλλα και της λειτουργικότητας ενός μουσικού, στο ρομπότ ΝΑΟ της Aldebaran. Το ρομπότ μας θα παίζει διάφορες μελωδίες στο μουσικό όργανο μεταλλόφωνο, θα συνομιλεί με το κοινό του και θα εκτελεί κάποια animation σχετικά με το θέμα μας. Η ροή εκτέλεσης καθορίζεται απο τον χρήστη που θα δίνει εντολές στο ΝΑΟ. Υπάρχουν 2 δυνατές επιλογές. Στη πρώτη περίπτωση ο χρήστης ζητά απο το ΝΑΟ να του παίξει κάποια μελωδία που ήδη γνωρίζει, ενώ στη δεύτερη περίπτωση το ΝΑΟ παίζει τις νότες που του δίνονται σαν είσοδος απο τον χρήστη. Παρακάτω θα αναλύσουμε περισσότερο κάθε διαδικασία, και δικαιολογήσουμε και τις επιλογές μας. Επιλογή οργάνου Η επιλογή του μεταλλόφωνου σαν το μουσικό όργανο που θα χρησιμοποιεί το ΝΑΟ, δεν ήταν τυχαία. Το μεταλλόφωνο είναι ενα σχετικά εύκολο στην εκμάθηση όργανο αφού έχει μονάχα μια οκτάβα νότες, ενώ ταυτόγχρονα δεν απαιτεί ιδιαίτερη δεξιότητα για να πάιξεις κάποια μελωδία σ αυτό. Αυτομάτως γίνεται άριστη επιλογή για την εργασία μας, αφού ο χειρισμός του απο το ΝΑΟ θα είναι σχετικά απλός στον σχεδιασμό, ενώ η πολυπλοκότητα που εισάγει σε επίπεδο σχεδιασμου κινήσεων είναι σχετικά μικρή (διαθέτει 8 μόνο νότες). Τέλος, σημαντικό ρόλο έπαιξε και το γεγονός πως το μεταλλόφωνο είναι ένα όργανο μικρών διαστάσεων, που είναι όντως δυνατό να παιχτεί αποτελεσματικά απο το ΝΑΟ. (Αν π.χ. χρησιμοποιήσουμε κάποιο αρμόνιο που έχει τουλάχιστον 4-5 οκτάβες νοτών, τότε το ρομποτ μας θα χρειαζόταν να περπατήσει για να παιξεί διαδοχικά 2 νοτές που βρίσκονταν σε μεγάλη απόσταση μεταξύ τους.)
Development Software Επιλέξαμε να σχεδιάσουμε το project μας στο Choreographe. Πρόκειται για ένα εργαλείο που επιτρέπει τον σχεδιασμό και τη δόμηση της λειτουργικότητας που επιθυμουμέ να υλοποιήσουμε σε μορφή γράφων. Συνεπώς, μας είναι σχετικά απλό να σχεδιάσουμε και να ελέγξουμε τη ροή ελέγχου του ΝΑΟ. Ένα ακόμα σημαντικό στοιχείο, είναι τα animation που μπορείς να σχεδιάσεις στο Choreographe, ορίζοντας σε κάθε frame τη θέση των μελών του ΝΑΟ. Τέλος, μας δίνεται η δυνατότητα να συντάξουμε script σε γλώσσα Python, γεγόνος που θα μας φανεί ιδιαίτερα χρήσιμο στον χειρισμό και την ανάγνωση των νοτών απο το ΝΑΟ. Προσσέγγιση του προβλήματος Μελετώντας βαθύτερα το αντικείμενο της εργασίας, καταλήγουμε σε 3 βασικά προβήματα που καλούμαστε να δώσουμε λύση.
1) Πως θα μοντελοποιήσουμε τη συμπεριφορά του ΝΑΟ ως μουσικός? Τι στοιχεία θα χρειαστεί να προσθέσουμε στη «προσωπικότητα» του ΝΑΟ ώστε να πείθει το κοινό του πως είναι όντως μουσικός? Και τέλος, εφόσον αυτά τα στοιχεία θα είναι κάποια animation ή κάποιοι διάλογοι, πως θα υλοποιήθουν? 2) Πως θα αλληλεπιδρά το ΝΑΟ με το κοινό του? Τι θα δέχεται σαν είσοδο και τι θα δίνει σαν έξοδο? Πως θα ελέγχει ο χρήστης τη ροή εκτέλεσης? 3) Πως θα αναπτύξουμε τις κατάλληλες δεξιότητες ώστε το ΝΑΟ να αναγνωρίζει τι και πώς πρέπει να παίζει κάτι στο μεταλλόφωνο του? Λύνοντας τα παράπάνω προβλήματα θα έχουμε σε μεγάλο βαθμό πετύχει το στόχο μας. Μοντελοποίηση συμπεριφοράς ΝΑΟ Όπως αναφέραμε και αρχικά, εκτός απο τη λειτουργικότητα του μουσικού, επιθυμούμε να υλοποιήσουμε και μια συμπεριφορά, μια προσωπικότητα, που να παραπέμπει σε μουσικό. Για να το πετύχουμε αυτό, χρησιμοποιούμε μια σειρά απο διαλόγους και animations. Διάλογοι: Οι διάλογοι υλοποιούνται στο Choreographe με το box Say, όπου δίνουμε σαν είσοδο ένα κέιμενο και το ΝΑΟ αναλαμβάνει την ανάγνωση του. Στη προσπάθεια μας για ένα πειστικό αποτέλεσμα φροντίσαμε να εμπλουτίσουμε το λεξιλόγιο του ΝΑΟ με κάποιες slang ωρολογίες της μουσικής σκήνης. Animation: Με το box timeline στο Choreographe, σχεδιάσαμε κάποια animation. Συγκεκριμένα, ορίζοντας σε κάθε frame την ακριβή θέση των μελών του ΝΑΟ, και στη συνέχεια επιλέγοντας τη χρονική απόσταση μεταξύ των frames, καταφέραμε να δημιουργήσουμε κάποια ρεαλιστικά animation. Ένα απ αυτά είναι η εποπτεία του κοινού απο το ΝΑΟ, ενώ χρησιμοποίησαμε και κάποια έτοιμα animation που μας έδινε το Choreographe, όπως το Wipe Forehead.
User Interface Το θέμα της εργασίας μας, απαιτεί κάποια μορφή αλληλεπίδρασης του ΝΑΟ με το κοινό του. Εφόσον δίνουμε 2 δυνατές επιλογές στον χρήστη σχετικά με το κομμάτι το οποίο θα εκτελέσει το ΝΑΟ (ήδη γνωστό ή είσοδος του χρήστη), πρέπει με κάποιο τρόπο να αλληλεπιδρά με το ΝΑΟ και να κάνει την επιλογή του. Με βάση τα παραπάνω, υλοποίησαμε ένα «μενού» επιλογών για το ΝΑΟ, που δουλεύει ως εξής: Το ΝΑΟ απευθύνει ερωτήσεις τύπου Y/N προς τον χρήστη, και αναλόγως με την απάντηση που θα λάβει ως είσοδο, επιλέγει πως θα συνεχίσει. Αρχική σκέψη ήταν να υλοποιήθει το μενού με μια σειρά απο γενικόλογες ερωτήσεις, και όχι απο απλές ερτήσεις τύπου ναι ή οχι, αλλα δεν λειτουργούσε η φωνητική αναγνώριση στο ΝΑΟ. Συνεπώς, ο μόνος αισθητήρας που μπορούσαμε να χρησιμοποιήσουμε στο ΝΑΟ σαν είσοδο, ήταν τα foot bumpers. Μεταφράζουμε το ερέθισμα που προέρχεται απο τον αριστερό αισθητήρα σαν ΝΑΙ και αυτό απο τον δεξιά σαν ΟΧΙ. Αξίζει να σημειώσουμε πως αν λειτουργούσαν οι αισθητήρες αφής στο κεφάλι του ΝΑΟ, θα είχαμε είσοδο με 3 επιλογές και όχι 2. Τέλος, το ΝΑΟ χρησιμοποιεί κάποιες φωνητικές εντολές για να ενημερώνει τον χρήστη για τη κατάσταση στην οποία βρίσκεται, ή για να τον ενημερώσει για την ολοκλήρωση κάποιας λειτουργίας. Επίσης δέχεται σαν είσοδο plain text (για την ανάγνωση νοτών του χρήστη) απο το αντίστοιχο box του Choreographe.
Λειτουργικότητα Το ΝΑΟ δεν γνωρίζει απο μουσική θεωρία, οπότε δεν είναι σε θέση να γράψει ή να παίξει κάποιο κομμάτι χωρίς να ξέρει εξαρχής τις νότες του. Είναι απαραίτητο λοιπόν κάποιο Note Sheet, και φροντίζουμε να υπάρχει ένα κάθε φορά που το ΝΑΟ εκτελεί κάποιο κομμάτι. Όπως έχουμε ήδη αναφέρει, το μεταλλόφωνο διαθέτει 8 νότες (1 οκτάβα). Χρησιμοποιούμε την αγγλική ωρολογία και συμβολίζουμε τις νότες ως: a,b,c,d,e,f,g,a,*. Με κεφαλαίο Α συμβολίζεται η Λα που απέχει μια οκτάβα απο τη πρώτη Λα (a). Τέλος, επειδή δεν παρέχουμε στο ΝΑΟ κάποια πληροφορία σχετικά με τον ρυθμό του τραγουδιού, του δίνουμε σαν δυνατή είσοδο μια παύση που τη συμβολίζουμε με *. Παιρνώντας στο πρακτικό κομμάτι, η εκτέλεση μια μελωδίας στο μεταλλοφωνο απαιτεί τη χρήση 2 stick. Εφόσον αυτά τοποθετηθούν πάνω απο κάποια νότα στο μεταλλόφωνο, αρκεί μια απότομη παλινδρομική κίνηση για να παιχτεί. Συνεπώς, καταλήγουμε πως εκτέλεση μιας μελωδίας είναι μια επαναληπτική διαδικασία 3 βημάτων. 1) Αναγνώριση νότας. 2) Τοποθέτηση του stick πάνω απο τη νότα. 3) Απότομη παλινδρομική κίνηση. Το πλήθος των επαναλήψεων, εξαρτάται απο το πλήθος των νοτών. Αναλυτικότερα, η υλοποίηση του πρώτου βήματος έχει ως εξής: Το Note Sheet της μελωδίας υπάρχει αποθηκευμένο σε ένα box του Choreographe και παραμένει εκεί καθόλη τη διάρκει εκτέλεσης. Καθε νότα διαβάζεται μέσω ενός Python Script που λειτουργεί ως εξής: Αρχικά μετατρέπουμε τη συμβολοσειρά σε λίστα, και στη συνέχεια μέσω του κατάλληλου index, επιστρέφουμε τη νότα που πρέπει να εκτελεστέι. Το index προκύπτει από ενα for loop που ουσιαστικά απαριθμεί τις νότες που έχουμε παίξει. Εφόσον ξέρουμε πλέον ποια νότα πρεπει να παίξει το ΝΑΟ, ακολουθέι το δεύτερο βήμα, που είναι η μετακίνηση του stick πάνω απο τη νότα στο μεταλλόφωνο. Οι κινήσεις έχουν σχεδιαστεί σαν timeline animations στο Choreographe. Επίσης αναφέρουμε πως το αριστερό χέρι του ΝΑΟ είναι υπεύθυνο για την εκτέλεση των νοτών a,b,c,d, ενώ το δεξί για τις νότες e,f,g,a. Στη περίπτωση της παύσης, το ΝΑΟ απλώς περιμένει για 0.5 sec πριν συνεχίσει με την εκτέλεση της επόμενης νότας. Τέλος απομένει μονάχα το animation εκτέλεσης της νότας. Το συγκεκριμένο animation είναι ίδιο σε κάθε περίπτωση, και περιλαμβάνει μια απότομη αλλαγή του ύψους του χεριού του ΝΑΟ. Η αλλαγή αυτή διαρκεί μονάχα ένα frame, τον ελάχιστο δυνατό χρόνο δηλαδή.
Γράφοι Τέλος παραθέτουμε τους τελικούς γράφους μαζί με κάποια σχόλια που θα καλύψουν πιθανον παραλείψεις. Αρχικός γραφός: Αρχικά εκτελούνται κάποιες λειτουργίες για initiation. Ακολουθεί το μενού, που οδηγεί είτε σε κάποιο action είτε σε μια σειρά ενέργειες τερματισμού. Τέλος μετα απο κάθε ενέργεια, ακολουθεί ένα μικρό μενού που ρωτά τον χρήστη αν θέλει να ξεκινήσει απ την αρχή.
Ο γραφός αρχικοποίησης. Αρχικά θετει το ρομποτ σε θέση stand up, και στη συνέχεια χαιρετά τον χρήστη με animation αλλα και φωνητική εντολή. Στη συνέχεια εκτελει το animation, Wipe Forehead, θετει ξανα το ΝΑΟ σε θέση stand up και ακολουθούν 2 ακόμα ειδικά animation. Το πρώτο είναι αυτό της εποπτοίας του κοινού του, και το δευτερο θέτει τα χέρια του ΝΑΟ σε μια αρχική θέση. Γράφος Μενου: Κάθε φορά ακολουθούμε την ίδια διαδικασία. Το ΝΑΟ ρωτά, και περιμένει απάντηση μέσω των αισθητήρων bumpers.
Ο γράφος Try Again είναι της ίδιας λογικής με τον γράφο μενου. Γράφος τερματισμού: Θέτει ξανα το ρομποτ σε stand up position. Εκτελεί το animation Wipe Forehead (ύστερα απο τη κουραστική συναυλία που μόλις έδωσε) και τέλος χαιρετα το κοινό του.
Γραφος ενεργειών: Στο box του for loop, θέτουμε σαν παράμετρο Final Value το πλήθος των νοτών που θα εκτελέσει το ΝΑΟ. To box Parse Note, δεχεται σαν παράμετρο τη τρέχουσα τιμή του for loop και τη χρησιμοποιεί σαν index, ενώ δέχεται και σαν παράμετρο το Note Sheet. Έτσι είναι σε θέση να δώσει στην έξοδο του τη νότα που πρέπει να παιχτεί, ενέργεια που αναλαμβάνει το box Play Note.
Ο γράφος Play Note ξεκινά μ ενα switch case οπου με βάση το ποια νότα παίζουμε, εκτελούμε και την αντίστοιχη ενέργεια. Στη περίπτωση της παύσης, απλά εκτελούμε ένα wait. Τέλος όλα τα actions που φαίνονται στον παραπάνω γράφο, είναι αυτής της μορφής. Αρχικά εκτελείται το animation που μετακινεί το χέρι του ΝΑΟ στη σωστή θέση και στη συνέχει το animation με το οποίο το ΝΑΟ παίζει τη νότα στο μεταλλόφωνο.