Φωτογραφίες..

May 15th, 2008


Χαμόγελο για τους σκοπούς της φωτογράφισης


Δοκιμάστικο Alginment μέσω τεχνητής μύτης V1


Δοκιμάστικο Alginment μέσω τεχνητής μύτης V2


Οι τροχοί είναι γεμισμένοι με βαμβάκι για να μην καταπονούνται από το βάρος


Κάτω αριστερά φαίνεται η χαρτογράφηση βάθους του αριστερού frame Άσπρο=Κοντά

No news , it`s good news.. #2

May 15th, 2008

Πάει αρκετός καιρός από το τελευταίο Update , όχι επειδή δεν ασχολούμαι με το Guard Dog :) αλλά επειδή δεν έχω χρόνο για να καταγράψω την πρόοδο μου..
Συνοπτικά λοιπόν..

1-Το Robot απέκτησε ηχεία τα οποία δεν χρειάζονται μπαταρία και εξωτερική τροφοδοσία για να ακούγονται , τους φτάνει η έξοδος της κάρτας ήχου , και είναι αρκετά δυνατά :) Ανα πάσα στιγμή λοιπόν μπορεί να δώσει κάποιον ήχο προειδοποιήτικό ή οτιδίποτε, ακόμα και να παίζει τραγούδια..

2-Το Robot μπορεί πλέον να κάνει Synthesize ψηφιακή φωνή μέσω του Microsoft SAPI και έφτιαξα ένα Wrapper-Βιβλιοθήκη το οποίο κάνει εύκολη την ενσομάτωση Speech στο οποιοδήποτε πρόγραμμα , υπάρχει εδώ για όποιον ενδιαφέρεται..

3-Το Robot μπορεί να ακούει ambient ήχους και να τους κάνει stream στο αφεντικό του ( με VLC )

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

5-Μετά από αρκετούς πειραματισμούς κατέληξα σε ένα καλύτερο design του κομματιού LEGO που στηρίζει τις κάμερες και προσέθεσα ένα κομμάτι (μύτ&#951&#59;) το οποίο φαίνεται ίσα ίσα στις κάμερες και επιτρέπει ευκολότερη κάθετη και οριζόντια ευθυγράμιση των καμερών

6-Το robot έχει πλέον την αίσθηση του βάθους και οι πληροφορίες από το ένα μάτι συνδυάζονται με το δεύτερο με ένα υβριδικό feature/patch matching αλγόριθμο δικής μου εμπνεύσεως που μέχρι τώρα τα πάει καλά και είναι παραμετρικός κάτι που επιτρέπει από πολύ ακριβή αποτελέσματα μέχρι και γρήγορες σαρώσεις με χοντρικές αποστάσεις για γρήγορη ανταπόκριση.

7-Το face detection κομμάτι του software θα γίνει με χρήση της fdlib μιας freeware και γρήγορης βιβλιοθήκης για face detection , η οποία ( σε εμένα τουλάχιστον ) φαίνεται να έχει καλύτερα αποτελέσματα από την OpenCV ενώ ταυτόχρωνα είναι και λιγότερο CPU intensive ( κάτι πολύ σημαντικό ) και χρησιμοποιεί τον παρακάτω αλγόριθμο αναγνώρισης προσώπου

Το επόμενο βήμα λοιπόν είναι να αρχίσει τα δρομολόγια και να προσθέσω έναν αλγόριθμο Optical Flow

Οι κάμερες γίνονται και διακόπτες!

March 27th, 2008

Οι κάμερες πάνω στο robot πλέον μπορουν να κάνουν restart ή shutdown το ρομπότ ( το οποίο δεν έχει πληκτρολόγιο ή οθόνη :) ) με το πρόγραμμα Button Configuration που έγραψα και υπάρχει εδώ

Άλλη μια κάμερα για το Project !

March 15th, 2008

Μέχρι τώρα το Project χρησιμοποιούσε 2 Microsoft Lifecam Vx - 1000 σαν τα μάτια του..
Μετά από ψάξιμο στο internet λοιπόν αγόρασα και άλλη μια Lifecam Vx - 6000..

Διαφορά στην εικόνα υπάρχει αλλά γενικότερα η απόφαση της αντικατάστασης η μη με προβληματίζει..
Μέχρι τα 640x480 μπορεί να δώσει ρυθμό 30fps ( η Vx-1000 θεωριτικά υποστηρίζει 30fps αλλά για κάποιο λόγο δίνει έως και 28fps στα 640x480 :-/ ) , ενώ η Vx-6000 μπορεί να ανεβάσει resolution στα 800x600 , 1024x768 , 1280x1024 @ 15 fps ( αλλά ιδιαίτερα στα 1280x1024 εμένα φτάνει στα 12fps)…

Δουλεύοντας στις ίδιες αναλύσεις (320x240) και συγκρίνοντας , με την Vx-6000 η εικόνα έχει πιο ζωντανά χρώματα και επίσης λόγω της μεγαλύτερης γωνίας του φακού (71 μοιρώ&#957&#59;) , βλέπεις μεγαλύτερο κομμάτι του χώρου..

Από σχεδόν την ίδια θέση screenshots
LifeCam vx - 6000
Lifecam vx - 6000

LifeCam vx - 1000
Lifecam vx - 1000

Τώρα σε περίπτωση που αγοράσω και μια δεύτερη Vx-6000 ακόμα και αν μπορεί να δουλέψει με resolution 1280x1024 , δεν πρόκειται να ξεπεράσω τα 640x480 καρέ ,
640x480 = 307200 pixels , 307200 x 2 = 614400 pixel προς επεξεργασία δηλαδή 1843200 R + G + B intensity values.. :)
3 passes πάνω τους για Sobel Edges κτλ

Πολύ πληροφορία… Γιαυτό λέγεται πληροφορική μάλλον! &#59;) :D

VideoDLL - A simple way for using webcams with DirectX

March 10th, 2008

Όποιος θέλει να ασχοληθεί με Image Capturing από κάποια συσκευή συνδεδεμένη στον υπολογιστή του , πλέον έχει άλλη μια εναλλακτική (εκτός από αυτές που κυκλοφορούν ήδη στο Internet) Το VideoDLL.dll , το οποίο κατασκεύασα και χρησιμοποιώ στο GuardDog Project μπορείτε να το κατεβάσετε για χρήση στα δικά σας..

Μπορείτε να τα βρείτε ολα εδώ

LEGO Mindstorm Programming SetOuputSettings problems solved with SendMessage

February 27th, 2008

Ενώ το Mindstorm έχει τόσα καλά (Δυνατότητες/Community/Δεκάδες APIs/ακόμα και Open Source Firmware , τους ελαφρύτατους Fantom Drivers κτλ κτλ :) ) ωστόσο έχει ένα μάλλον μέτριο Documentation..

Για κάποιο περίεργο λόγο λοιπόν η Built-in Direct Command SetOutputState που επιτρέπει την χρήση των μοτέρ από τον υπολογιστή δεν φρενάρει.. Και ιδιαίτερα όταν το μοτέρ έχει μεγάλο βάρος ή είναι ρυθμισμένο σε μεγάλη ταχύτητα το overshoot είναι πολλών μοιρών 60+ οπότε το καθιστά όχι χρίσιμο..

Από την στιγμή λοιπόν που δεν φρενάρει η λύση είναι συνεχόμενο Polling του μοτέρ ( GetOutputState ) με την προοπτική της διακοπής τροφοδοσίας του μοτέρ για να το αναγκάσουμε να φρενάρει . Το 2ό πρόβλημα που προκύπτει είναι το delay στην επικοινωνία το οποίο σε συνδυασμό με την ταχύτητα του μοτέρ ( 900 degrees/sec ) απαιτεί delay 1 ms για ακρίβεια 1 μοίρας , και τα πράγματα γίνονται χειρότερα προσθέτοντας και το βάρος..

Παρ`όλα αυτά τα προγράμματα που γίνονται compile μέσω του LabView (*.rxe) επειδή εκτελούνται τοπικά και όλοι οι έλεγχοι γίνονται απευθείας από τον ARM7 επεξεργαστή , έχουν την καλύτερη δυνατή επίδοση..

Έτσι λοιπόν με περιφάνεια παρουσιάζω το motor_control.rxe
Τρέχοντας το στο Mindstorm το τοποθετείτε σε κατάσταση αναμονής για οδηγίες ακριβείας..
Μπορείτε να το ανεβάσετε στο Mindstorm χρησιμοποιώντας το NXTExplorer

Σημειωτέον οτι τα Mailboxes στο SendMessage γίνονται address με πρώτο το 0 , δηλαδή το Mailbox 1 έχει αριθμό 0 , το Mailbox 2 αριθμό 1 κτλ..
Mailbox // Variable Type // Label
1 -> True/False - Mprosta/Pisw
2 -> Integer - Moires strofis
3 -> Integer - Dynami Peristrofis ( 0 - 100 )
4 -> Integer - Motor Port ( 1=A , 2=B , 3=C )
5 -> True/False - Next Action ( true=brake , false=coast )
6 -> Integer - Action ( 0 = Constant , 1 = Ramp Up ,2 = Ramp Down )
7 -> True/False - Control Motor Power ( True on , False off)
8 -> True/False - Wait for completion ( true on , false off)

9 -> String - ‘ok’ ektelei tin entoli
10 -> String - ‘ok’ kleinei to programma

Για να στείλει κανείς ένα μήνυμα , μπορεί να χρησιμοποιήσει κάποιος τον παρακάτω κώδικα (όποιος έχει ασχοληθεί με Direct Commands Θα καταλάβει :) )..

Code:

void LoadSendMessageCommand(unsigned char mailbox,string msg)
{  
  int str_size=(int)strlen(msg.c_str());
  mess_str[0]=0x09; //Send msg
  mess_str[1]=(char) (mailbox);
  mess_str[2]=(char) (str_size+1);
  
  int i=0;
  while (i<str_size)
   {
     mess_str[3+i]=msg[i];    
     ++i;
   }
   mess_str[4+i]=0;
   mess_str_len=4+str_size; //  the last of the mess_str array
   if (mess_str_len>59) { mess_str_len=59; mess_str[58]=0; }
    
  return;
  
}
 
 
void LoadSendMessageCommandint(unsigned char mailbox,unsigned int msg)
{  
  mess_str[0]=0x09; //Send msg
  mess_str[1]=(char) (mailbox);
  mess_str[2]=(char) (4+1);
  for (char offset = 0; offset <= 3; offset++)
            {
                mess_str[3 + offset] = (char) (msg % 0x100);
                msg >>= 8;
            };
  mess_str[7]=0;  
  mess_str_len=8;  
  return;  
}
 
 
void LoadSendMessageCommandbool(unsigned char mailbox,bool msg)
{  
  mess_str[0]=0x09; //Send msg
  mess_str[1]=(char) (mailbox);
  mess_str[2]=(char) (1+1);
  if (msg) { mess_str[3]=(char) (0x01); } else
           { mess_str[3]=(char) (0x00); }
  mess_str[4]=0;  
  mess_str_len=5;  
  return;  
}

Το Project αποκτά και καινούγιο σώμα , γιατί Νούς υγιής εν σώματι υγιή :)

February 21st, 2008

Ανέβασα στο Youtube το παρακάτω Video

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

Ορίστε και φωτογραφίες , πρώτα ένα close up και μετά μια πιο απομακρυσμένη που δίχνει το μέγεθος του robot σε σχέση με τον περιβάλλοντα χώρο..


Μένει λοιπόν η τροφοδοσία από μπαταρία και φυσικά ο προγραμματισμός του robot.. &amp;#58;&amp;#41;