Πίνακας περιεχομένων:
- Προμήθειες
- Βήμα 1: Εγκατάσταση όλων
- Βήμα 2: Κατανόηση του τρόπου λειτουργίας του ελεγκτή
- Βήμα 3: Δημιουργία διεπαφής ROS-MATLAB
- Βήμα 4: Λήψη της διεύθυνσης IP
- Βήμα 5: Δημιουργήστε ένα GUI για τον ελεγκτή
- Βήμα 6: Προγραμματισμός των επεξεργάσιμων κουμπιών GUI
- Βήμα 7: Προγραμματισμός των πλήκτρων GUI
- Βήμα 8: Ρύθμιση παραμέτρων δικτύου σε υπολογιστή ROS (Linux)
- Βήμα 9: Εκτελέστε τον ελεγκτή
Βίντεο: Ρομποτικός ελεγκτής ROS με βάση Matlab: 9 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:34
Από τότε που ήμουν παιδί, πάντα ονειρευόμουν να γίνω Iron Man και το κάνω ακόμα. Ο Iron Man είναι ένας από αυτούς τους χαρακτήρες που είναι ρεαλιστικά εφικτός και απλά θέλω να γίνω Iron Man κάποια μέρα ακόμα κι αν οι άνθρωποι γελούν μαζί μου ή λένε ότι είναι αδύνατο επειδή "είναι αδύνατο μέχρι να το κάνει κάποιος"-Άρνολντ Σβαρτσενέγκερ.
Το ROS είναι ένα αναδυόμενο πλαίσιο που χρησιμοποιείται για την ανάπτυξη πολύπλοκων συστημάτων ρομποτικής. Οι εφαρμογές του περιλαμβάνουν: Αυτόματο σύστημα συναρμολόγησης, τηλελειτουργία, προσθετικά όπλα και βαριά μηχανήματα του βιομηχανικού τομέα.
Ερευνητές και μηχανικοί αξιοποιούν το ROS για την ανάπτυξη των πρωτότυπων, ενώ διαφορετικοί προμηθευτές το χρησιμοποιούν για τη δημιουργία των προϊόντων τους. Έχει μια πολύπλοκη αρχιτεκτονική που καθιστά δύσκολη τη διαχείριση από έναν κουτσό άντρα. Η χρήση του MATLAB για τη δημιουργία της σύνδεσης διεπαφής με το ROS είναι μια νέα προσέγγιση που μπορεί να βοηθήσει ερευνητές, μηχανικούς και προμηθευτές στην ανάπτυξη πιο ισχυρών λύσεων.
Αυτό το διδακτικό είναι για το πώς να φτιάξετε ένα ρομποτικό χειριστήριο ROS βασισμένο σε Matlab, αυτό θα είναι ένα από τα πολύ λίγα σεμινάρια για αυτό και μεταξύ των λίγων οδηγιών ROS. Ο στόχος αυτού του έργου είναι να σχεδιάσει έναν ελεγκτή που μπορεί να ελέγξει οποιοδήποτε ρομπότ ROS συνδεδεμένο στο δίκτυό σας. Ας ξεκινήσουμε λοιπόν!
πιστώσεις επεξεργασίας βίντεο: Ammar Akher, στο [email protected]
Προμήθειες
Τα ακόλουθα στοιχεία απαιτούνται για το έργο:
(1) ROS PC/Robot
(2) Δρομολογητής
(3) Η / Υ με MATLAB (έκδοση: 2014 ή νεότερη έκδοση)
Βήμα 1: Εγκατάσταση όλων
Για αυτό το διδάξιμο, χρησιμοποιώ το Ubuntu 16.04 για τον υπολογιστή μου linux και ros-kinetic, οπότε για να αποφύγω τη σύγχυση προτείνω τη χρήση ros kinetic και ubuntu 16.04 αφού έχει την καλύτερη υποστήριξη για ros-kinetic. Για περισσότερες πληροφορίες σχετικά με τον τρόπο εγκατάστασης του ros kinetic, επισκεφθείτε τη διεύθυνση https://wiki.ros.org/kinetic/Installation/Ubuntu. Για το MATLAB είτε αγοράζετε άδεια είτε κατεβάζετε μια έκδοση trail από εδώ.
Βήμα 2: Κατανόηση του τρόπου λειτουργίας του ελεγκτή
Ένας υπολογιστής τρέχει το ρομποτικό χειριστήριο στο MATLAB. Ο ελεγκτής λαμβάνει τη διεύθυνση IP και τη θύρα του ros pc/robot.
Ένα θέμα ros χρησιμοποιείται για επικοινωνία μεταξύ του ελεγκτή και του ros pc/robot, το οποίο λαμβάνεται επίσης ως είσοδος από τον ελεγκτή. Το μόντεμ απαιτείται για τη δημιουργία ενός LAN (τοπικό δίκτυο) και είναι αυτό που εκχωρεί τις διευθύνσεις IP σε όλες τις συσκευές που είναι συνδεδεμένες στο δίκτυό του. Επομένως, το ros pc/robot και ο υπολογιστής που εκτελεί τον ελεγκτή πρέπει να είναι και τα δύο συνδεδεμένα στο ίδιο δίκτυο (δηλ. Το δίκτυο του μόντεμ). Τώρα που ξέρετε "πώς λειτουργεί", ας πάμε στο "πώς είναι χτισμένο"…
Βήμα 3: Δημιουργία διεπαφής ROS-MATLAB
Το ROS-MATLABInterface είναι μια χρήσιμη διεπαφή για ερευνητές και φοιτητές για την πρωτοτυπία των αλγορίθμων ρομπότ τους στο MATLAB και τη δοκιμή τους σε ρομπότ συμβατά με ROS. Αυτή η διεπαφή μπορεί να δημιουργηθεί από την εργαλειοθήκη του συστήματος ρομποτικής στο matlab και μπορούμε να πρωτοτυπώσουμε τον αλγόριθμό μας και να τον δοκιμάσουμε ένα ρομπότ με δυνατότητα ROS ή σε προσομοιωτές ρομπότ όπως το Gazebo και το V-REP.
Για να εγκαταστήσετε την εργαλειοθήκη συστήματος ρομποτικής στο MATLAB, απλώς μεταβείτε στην επιλογή Πρόσθετα στη γραμμή εργαλείων και αναζητήστε τη ρομποτική εργαλειοθήκη στον πρόσθετο εξερευνητή. Χρησιμοποιώντας τη ρομποτική εργαλειοθήκη μπορούμε να δημοσιεύσουμε ή να εγγραφούμε σε ένα θέμα, όπως έναν κόμβο ROS, και μπορούμε να το κάνουμε κύριο ROS. Η διεπαφή MATLAB-ROS έχει τις περισσότερες λειτουργίες ROS που θα μπορούσατε να απαιτήσετε για τα έργα σας.
Βήμα 4: Λήψη της διεύθυνσης IP
Για να λειτουργήσει ο ελεγκτής είναι επιτακτική ανάγκη να γνωρίζετε τη διεύθυνση IP του ρομπότ/υπολογιστή σας ROS και τον υπολογιστή που εκτελεί τον ελεγκτή στο MATLAB.
Για να λάβετε το ip του υπολογιστή σας:
Στα Windows:
Ανοίξτε τη γραμμή εντολών και πληκτρολογήστε την εντολή ipconfig και σημειώστε τη διεύθυνση IPv4
Για Linux:
Πληκτρολογήστε την εντολή ifconfig και σημειώστε τη διεύθυνση inet. Τώρα που έχετε τη διεύθυνση IP, ήρθε η ώρα να δημιουργήσετε το GUI…
Βήμα 5: Δημιουργήστε ένα GUI για τον ελεγκτή
Για να δημιουργήσετε το GUI, ανοίξτε το MATLAB και πληκτρολογήστε οδηγό στο παράθυρο εντολών. Αυτό θα ανοίξει την εφαρμογή οδηγού, αν και θα δημιουργήσουμε το GUI μας. Μπορείτε επίσης να χρησιμοποιήσετε τον σχεδιαστή εφαρμογών στο MATLAB για να σχεδιάσετε το GUI σας.
Θα δημιουργήσουμε συνολικά 9 κουμπιά (όπως φαίνεται στο σχήμα):
6 κουμπιά: προς τα πίσω, προς τα πίσω, αριστερά, δεξιά, σύνδεση με ρομπότ, αποσύνδεση
3 Κουμπιά με δυνατότητα επεξεργασίας: Ros pp ip, port και όνομα θέματος.
Τα κουμπιά με δυνατότητα επεξεργασίας είναι τα κουμπιά που θα λάβουν το ip του υπολογιστή ROS, τη θύρα του και το όνομα του θέματος ως είσοδο. Το όνομα του θέματος είναι αυτό μέσω του οποίου επικοινωνούν ο ελεγκτής MATLAB και το ρομπότ/υπολογιστής ROS. Για να επεξεργαστείτε τη συμβολοσειρά στο επεξεργάσιμο κουμπί, κάντε δεξί κλικ στο κουμπί >> μεταβείτε στις ιδιότητες επιθεωρητή >> συμβολοσειρά και επεξεργαστείτε το κείμενο του κουμπιού.
Μόλις ολοκληρωθεί το GUI, μπορείτε να προγραμματίσετε τα κουμπιά. Εδώ ξεκινά η πραγματική διασκέδαση…
Βήμα 6: Προγραμματισμός των επεξεργάσιμων κουμπιών GUI
Το GUI αποθηκεύεται ως αρχείο.fig αλλά οι λειτουργίες κώδικα/επανάκλησης αποθηκεύονται σε μορφή.m. Το αρχείο.m περιέχει τον κώδικα για όλα τα κουμπιά σας. Για να προσθέσετε λειτουργίες επανάκλησης στα κουμπιά σας, κάντε δεξί κλικ στο κουμπί> > Προβολή επαναλήψεων >> επανάκληση. Αυτό θα ανοίξει το αρχείο.m για το GUI σας στο σημείο όπου έχει οριστεί το συγκεκριμένο κουμπί.
Η πρώτη επανάκληση που πρόκειται να κωδικοποιήσουμε είναι για το κουμπί επεξεργασίας IP ROS. Στην συνάρτηση edit1_Callback γράψτε τον ακόλουθο κώδικα:
λειτουργία edit1_Callback (hObject, datadata, λαβές)
παγκόσμιο ros_master_ip
ros_master_ip = get (hObject, 'String')
Εδώ η συνάρτηση ορίζεται ως edit1_Callback, η οποία αναφέρεται στο πρώτο κουμπί με δυνατότητα επεξεργασίας. Όταν εισάγουμε μια διεύθυνση IP από το δίκτυο ROS σε αυτό το επεξεργάσιμο κουμπί, θα αποθηκεύσει τη διεύθυνση IP ως συμβολοσειρά σε μια καθολική μεταβλητή που ονομάζεται ros_master_ip.
Στη συνέχεια, ακριβώς κάτω από το _OpeningFcn (hObject, eventdata, λαβές, varargin) ορίστε τα ακόλουθα (δείτε το σχήμα):
παγκόσμιο ros_master_ip
παγκόσμιο ros_master_port
παγκόσμιο teleop_topic_name
ros_master_ip = '192.168.1.102';
ros_master_port = '11311';
teleop_topic_name = '/cmd_vel_mux/input/teleop';
Απλώς παγκοσμιοποιήσατε σε παγκόσμιο επίπεδο το ros-pc ip (ros_master_ip), το port (ros_master_port) και το όνομα Teleop Topic. Αυτό που κάνει είναι ότι αν αφήσετε κενά τα επεξεργάσιμα κουμπιά, αυτές οι προκαθορισμένες τιμές θα χρησιμοποιηθούν όταν συνδέεστε.
Η επόμενη επανάκληση που πρόκειται να κωδικοποιήσουμε είναι για το κουμπί Port editable.
Στην συνάρτηση edit2_Callback γράψτε τον ακόλουθο κώδικα:
λειτουργία edit2_Callback (hObject, datadata, λαβές)
παγκόσμιο ros_master_port
ros_master_port = get (hObject, 'String')
Εδώ η συνάρτηση ορίζεται ως edit2_Callback, η οποία αναφέρεται στο δεύτερο κουμπί με δυνατότητα επεξεργασίας. Όταν εισάγουμε τη θύρα ros pc/robot εδώ από το δίκτυο ROS σε αυτό το επεξεργάσιμο κουμπί, θα αποθηκεύσει τη θύρα ως συμβολοσειρά σε μια καθολική μεταβλητή που ονομάζεται ros_master_port.
Ομοίως, η επόμενη επανάκληση που πρόκειται να κωδικοποιήσουμε είναι για το κουμπί επεξεργασίας ονόματος θέματος.
Στην συνάρτηση edit3_Callback γράψτε τον ακόλουθο κώδικα:
λειτουργία edit3_Callback (hObject, datadata, λαβές)
παγκόσμιο teleop_topic_name
teleop_topic_name = get (hObject, 'String')
Παρόμοια με το ros_master_port, αυτό επίσης αποθηκεύεται ως συμβολοσειρά σε μια καθολική μεταβλητή.
Στη συνέχεια, θα εξετάσουμε τις λειτουργίες κλήσης για τα κουμπιά…
Βήμα 7: Προγραμματισμός των πλήκτρων GUI
Τα κουμπιά που δημιουργήσαμε προηγουμένως είναι αυτά που θα χρησιμοποιήσουμε για να μετακινήσουμε, να συνδέσουμε και να αποσυνδέσουμε το ρομπότ από τον ελεγκτή. Οι κλήσεις του κουμπιού ορίζονται ως εξής:
π.χ. λειτουργία pushbutton6_Callback (hObject, eventdata, λαβές)
Σημείωση: ανάλογα με τη σειρά με την οποία δημιουργήσατε τα κουμπιά, θα αριθμούνται ανάλογα. Επομένως, η συνάρτηση pushbutton6 στο αρχείο μου.m θα μπορούσε να είναι Forward ενώ στο αρχείο.m σας θα μπορούσε να είναι προς τα πίσω, οπότε μην ξεχνάτε. Για να μάθετε ποια είναι η ακριβής λειτουργία για το κουμπί σας, απλώς κάντε δεξί κλικ στην επιλογή >> Προβολή επαναλήψεων >> κλήσεις και θα ανοίξει η λειτουργία για το κουμπί ώθησής σας, αλλά για αυτό το εκπαιδευτικό υποθέτω ότι είναι το ίδιο με το δικό μου.
Για το κουμπί Σύνδεση με ρομπότ:
Κάτω από τη λειτουργία pushbutton6_Callback (hObject, datadata, λαβές):
λειτουργία pushbutton6_Callback (hObject, eventdata, handles) καθολική ros_master_ip
παγκόσμιο ros_master_port
παγκόσμιο teleop_topic_name
παγκόσμιο ρομπότ
global velmsg
ros_master_uri = strcat ('https://', ros_master_ip, ':', ros_master_port)
setenv ('ROS_MASTER_URI', ros_master_uri)
rosinit
robot = rospublisher (teleop_topic_name, 'geometry_msgs/Twist');
velmsg = rosmessage (ρομπότ);
Αυτή η επανάκληση θα ορίσει τη μεταβλητή ROS_MASTER_URI συνδέοντας το ros_master_ip και τη θύρα. Στη συνέχεια, η εντολή rosinit θα αρχικοποιήσει τη σύνδεση. Μετά τη σύνδεση, θα δημιουργήσει έναν εκδότη του geometry_msgs/Twist, ο οποίος θα χρησιμοποιηθεί για την αποστολή της ταχύτητας εντολών. Το όνομα του θέματος είναι το όνομα που δίνουμε στο πλαίσιο επεξεργασίας. Μόλις η σύνδεση είναι επιτυχής, θα μπορούμε να χρησιμοποιούμε τα κουμπιά Εμπρός, Πίσω, Αριστερά, Δεξιά.
Πριν προσθέσουμε κλήσεις στα κουμπιά Forward, Backward push, πρέπει να αρχικοποιήσουμε τις ταχύτητες της γραμμικής και της γωνιακής ταχύτητας.
Επομένως, παρακάτω _OpeningFcn (hObject, eventdata, λαβές, varargin) ορίστε τα ακόλουθα (βλ. Σχήμα):
παγκόσμια left_spinVelocity παγκόσμια right_spinVelocity
παγκόσμιο forwardVelocity
παγκόσμια καθυστερημένη ταχύτητα
left_spinVelocity = 2;
right_spinVelocity = -2;
forwardVelocity = 3;
backwardVelocity = -3;
Σημείωση: όλες οι ταχύτητες είναι σε rad/s
Τώρα που ορίζονται οι καθολικές μεταβλητές, ας προγραμματίσουμε τα κουμπιά κίνησης.
Για το κουμπί προώθησης:
λειτουργία pushbutton4_Callback (hObject, eventdata, handles) global velmsg
παγκόσμιο ρομπότ
παγκόσμιο teleop_topic_name
παγκόσμιο forwardVelocity
velmsg. Angular. Z = 0;
velmsg. Linear. X = forwardVelocity;
αποστολή (ρομπότ, velmsg)
latchpub = rospublisher (teleop_topic_name, 'IsLatching', true);
Ομοίως και για το κουμπί Backward:
λειτουργία pushbutton5_Callback (hObject, datadata, λαβές)
global velmsg
παγκόσμιο ρομπότ
παγκόσμια καθυστερημένη ταχύτητα
παγκόσμιο teleop_topic_name
velmsg. Angular. Z = 0;
velmsg. Linear. X = backwardVelocity;
αποστολή (ρομπότ, velmsg)
latchpub = rospublisher (teleop_topic_name, 'IsLatching', true);
Παρομοίως για το αριστερό κουμπί: λειτουργία pushbutton3_Callback (hObject, datadata, λαβές)
παγκόσμιο velmsgglobal ρομπότ global left_spinVelocity
παγκόσμιο teleop_topic_name
velmsg. Angular. Z = left_spinVelocity;
velmsg. Linear. X = 0;
αποστολή (ρομπότ, velmsg)
latchpub = rospublisher (teleop_topic_name, 'IsLatching', true);
Ομοίως για το κουμπί Δεξιά:
παγκόσμιο velmsgglobal ρομπότ
παγκόσμια right_spinVelocity
παγκόσμιο teleop_topic_name
velmsg. Angular. Z = right_spinVelocity;
velmsg. Linear. X = 0;
αποστολή (ρομπότ, velmsg)
latchpub = rospublisher (teleop_topic_name, 'IsLatching', true);
Μόλις προστεθούν όλες οι λειτουργίες επανάκλησης και αποθηκευτούν τα αρχεία, μπορούμε να δοκιμάσουμε τον ελεγκτή μας.
Βήμα 8: Ρύθμιση παραμέτρων δικτύου σε υπολογιστή ROS (Linux)
Θα δοκιμάσουμε τον ελεγκτή σε έναν υπολογιστή ros (Linux), ο οποίος θα απαιτήσει τη ρύθμιση της διαμόρφωσης δικτύου. Εάν εκτελείτε επίσης τον ελεγκτή σε υπολογιστή Linux, θα πρέπει επίσης να ρυθμίσετε τη διαμόρφωση δικτύου εκεί.
Διαμόρφωση δικτύου:
Ανοίξτε το παράθυρο του τερματικού σας και πληκτρολογήστε gedit.bashrc
Μόλις ανοίξει το αρχείο προσθέστε τα εξής:
#Ρομπότ διαμόρφωση μηχανήματος
εξαγωγή ROS_MASTER_URI = https:// localhost: 11311
Διεύθυνση #IP του κύριου κόμβου ROS
εξαγωγή ROS_HOSTNAME =
εξαγωγή ROS_IP =
ηχώ "ROS_HOSTNAME:" $ ROS_HOSTNAME
ηχώ "ROS_IP:" $ ROS_IP
ηχώ "ROS_MASTER_URI:" $ ROS_MASTER_URI
Πρέπει να ακολουθείτε αυτό το βήμα κάθε φορά λόγω δυναμικής εκχώρησης IP.
Βήμα 9: Εκτελέστε τον ελεγκτή
Θα δοκιμάσουμε τον ελεγκτή μας σε ένα bot Turtle στο Gazebo.
Για να εγκαταστήσετε το Gazebo, ανατρέξτε στη διεύθυνση
Για να εγκαταστήσετε το bot Turtle, ανατρέξτε στη διεύθυνση
Ανοίξτε το φάκελο όπου αποθηκεύσατε τα αρχεία.fig και.m στο MATLAB και πατήστε Εκτέλεση (όπως φαίνεται στην εικόνα). Αυτό θα ανοίξει το χειριστήριο στον υπολογιστή. Πριν πατήσετε τη σύνδεση, βεβαιωθείτε ότι λειτουργεί ο προσομοιωτής χελώνας bot.
Για να δοκιμάσετε την προσομοίωση TurtleBot:
Ανοίξτε το Terminal στο Ros pc και πληκτρολογήστε: $ roslaunch turtlebot_gazebo turtlebot_world.launch. Αυτό θα ανοίξει μια προσομοίωση του Turtlebot σε αυτόν τον υπολογιστή. Το όνομα θέματος του TurtleBot είναι/cmd_vel_mux/input/teleop, το οποίο έχουμε ήδη δώσει στην εφαρμογή. Πληκτρολογήστε τη διεύθυνση ros pc Ip, τη θύρα και το όνομα του θέματος στα επεξεργάσιμα κουμπιά και πατήστε το. Συνδεθείτε στο κουμπί Robot. Το bot turtle θα πρέπει να αρχίσει να κινείται όταν πατάτε Forward, Backward κ.λπ.
Για να δείτε τις γραμμικές και γωνιακές ταχύτητες:
Ανοίξτε ένα νέο τερματικό και πληκτρολογήστε την εντολή: $ rostopic echo/cmd_vel_mux/input/teleop
Και εκεί έχετε, το δικό σας ρομποτικό χειριστήριο ROS με βάση το Matlab. Αν σας άρεσε το διδακτικό μου, δώστε του μια ψηφοφορία στον Διαγωνισμό Συγγραφέων για πρώτη φορά και μοιραστείτε το με όσο το δυνατόν περισσότερα άτομα. Σας ευχαριστώ.
Συνιστάται:
Ελεγκτής και ελεγκτής Arduino DMX 512: 19 βήματα
Arduino DMX 512 Tester and Controller: Actualizaciones, ficheros, códigos … Αγγλική έκδοσηFacebookHerramienta para pruebas y control de iluminación de prespectasculos a travelz del πρωτόκολλο DMX-512, ιδανικό για κάθε είδους ροπές και εγκαταστάσεις φωτισμού. Este p
Ελεγκτής εκκίνησης DOL με βάση IOT για αντλία ποτίσματος: 6 βήματα
IOT based DOL Starter Controller for Irrigation Pumpet: Hello Friends Αυτό το διδακτικό είναι πώς να παρακολουθείτε και να ελέγχετε εξ αποστάσεως μια αντλία άρδευσης που έχει ρυθμιστεί μέσω διαδικτύου. Ιστορία: Στο αγρόκτημά μου παίρνω τροφοδοσία από το τοπικό δίκτυο μόνο για περίπου 6 ώρες την ημέρα. Οι ώρες δεν είναι τακτικές, διαθεσιμότητα πό
Ρομποτικός βραχίονας ROS MoveIt: 4 βήματα
ROS MoveIt Robotic Arm: Αυτό θα είναι μια σειρά άρθρων σχετικά με την κατασκευή ενός ρομποτικού βραχίονα που ελέγχεται με ROS (Robotic Operating System) και MoveIt. Εάν ασχολείστε με τη ρομποτική, το ROS είναι ένα εξαιρετικό πλαίσιο που θα σας βοηθήσει να δημιουργήσετε καλύτερα ρομπότ γρηγορότερα. Σας επιτρέπει να χρησιμοποιήσετε ξανά
Δημιουργήστε μια βάση σύνδεσης IPod από μια μικρή βάση σύνδεσης IPod: 5 βήματα
Δημιουργήστε μια βάση σύνδεσης IPod από μια μίνι βάση σύνδεσης IPod: Εξηγεί πώς να μετατρέψετε εύκολα μια παλιά βάση σύνδεσης που προορίζεται για ένα ipod mini για χρήση με ένα ipod nano (και η πρώτη και η δεύτερη γενιά μία φορά). Γιατί; Αν σας αρέσει είχα ένα iPod μίνι και πήρε την αποβάθρα για αυτό, και τώρα αγόρασε ένα iPod nano και ειλικρινά λεπτό
Δωρεάν Diy Zune, IPod, IPhone, PDA, Cell Phone ή Gadget Holder/βάση σύνδεσης/βάση: 6 βήματα
Δωρεάν Diy Zune, IPod, IPhone, PDA, Cell Phone ή Gadget Holder/βάση/βάση: Έχει ειπωθεί ότι η ανάγκη είναι η μητέρα της εφεύρεσης. Έχω διαπιστώσει ότι είναι αλήθεια συχνά. Η περασμένη εβδομάδα δεν αποτελούσε εξαίρεση. Ξοδεύω άπειρο χρόνο στον υπολογιστή μου στο κυνήγι εργασίας. Δεδομένου ότι είχα αντικαταστήσει πρόσφατα τον υπολογιστή μου με διακομιστή