Ingenuity: Το πρώτο drone στον Άρη!
Φαντάσου ένα μικρό ελικόπτερο που πετάει όχι στη Γη, αλλά στον Άρη, έναν πλανήτη εκατομμύρια χιλιόμετρα μακριά! Αυτό το μικρό προηγμένο drone ονομάζεται Ingenuity και έχει γράψει ιστορία ως το πρώτο αεροσκάφος που πέταξε σε έναν άλλο πλανήτη. Η NASA το έστειλε στον Άρη μαζί με το rover Perseverance, και τον Φεβρουάριο του 2021 προσεδαφίστηκαν επιτυχώς στην επιφάνεια του κόκκινου πλανήτη.
Το Perseverance εξερευνά την επιφάνεια του Άρη αναζητώντας σημάδια πρώιμης ζωής ενώ το Ingenuity σχεδιάστηκε για να πραγματοποιεί πτήσεις στην αρειανή ατμόσφαιρα, φωτογραφίζοντας περιοχές που το rover δεν μπορεί να προσεγγίσει. Μέσα σε δυόμισι χρόνια, το Ingenuity πέταξε συνολικά 128 λεπτά, διανύοντας 17,2 km. Ωστόσο, ακινητοποιήθηκε οριστικά μετά την πτήση 72, στις 18 Ιανουαρίου 2024, όταν ένα πτερύγιο του ρότορα έσπασε και άλλα μέρη υπέστησαν ζημιά κατά την τελευταία του προσεδάφιση.
CoDrone EDU: Το δικό σου Ingenuity!
Το Ingenuity είναι το πιο περίπλοκο και προηγμένο drone που έχει κατασκευαστεί, λόγω των ιδιαίτερων συνθηκών του Άρη. Η ατμόσφαιρα του Άρη είναι πολύ αραιή – η πυκνότητά της είναι μόλις το 1% της γήινης- γεγονός που απαιτεί ειδικό σχεδιασμό ώστε να μπορεί να δημιουργήσει επαρκή άνωση. Επιπλέον, οι ακραίες θερμοκρασίες, η περιορισμένη ηλιακή ενέργεια που φτάνει στον πλανήτη -και συνεπακόλουθα στους ηλιακούς συλλέκτες του drone- και το σκονισμένο έδαφος του Άρη, έκαναν το έργο της πτήσης ακόμα πιο δύσκολο.
Παρά τις αναμενόμενες διαφορές, το Ingenuity έχει αρκετές ομοιότητες με τα drones της Γης, καθώς πετούν με βάση τις ίδιες αρχές: χρησιμοποιούν περιστρεφόμενους έλικες και διαθέτουν επεξεργαστές που αξιοποιούν τα δεδομένα των αισθητήρων για την πλοήγηση και τη σταθεροποίηση κατά την πτήση.
Το CoDrone EDU είναι εξοπλισμένο με πληθώρα αισθητήρων και έχει τη δυνατότητα να μεταδώσει τα δεδομένα που συλλέγει, ακόμα και κατά τη διάρκεια της πτήσης του.
Διαθέτει γυροσκόπιο και επιταχυνσιόμετρο για να πετάει με ακρίβεια, IR αισθητήρες απόστασης για τον υπολογισμό του ύψους και την ανίχνευση εμποδίων, αισθητήρες ανίχνευσης χρωμάτων και μετατόπισης (optical flow sensor), ακόμα και αισθητήρες μέτρησης ατμοσφαιρικών μεγεθών όπως η θερμοκρασία και ατμοσφαιρική πίεση.
Μπορεί τα ραδιοκύματα να διαδίδονται με την ταχύτητα του φωτός, ωστόσο η μεγάλη απόσταση ανάμεσα στη Γη και στον Άρη καθιστά τον άμεσο χειρισμό των ρομπότ αδύνατο. Η πληροφορία χρειάζεται από 4 έως 24 λεπτά περίπου για να φτάσει από τη Γη στον Άρη, καθώς ο χρόνος εξαρτάται από τη σχετική θέση των δύο πλανητών. Συνεπώς, οι επιστήμονες της αποστολής προκαθόριζαν την πτήση και μετέδιδαν τις προγραμματισμένες εντολές στο drone για να τις εκτελέσει στον κατάλληλο χρόνο.
Στη Γη η παραπάνω δυσκολία δεν υφίσταται, συνεπώς, για όλα τα γήινα drone υπάρχει η δυνατότητα ελέγχου σε πραγματικό χρόνο. Το ίδιο μπορείς να κάνεις και με το CoDrone EDU χρησιμοποιώντας το εντυπωσιακό χειριστήριο που διαθέτει με την οθόνη πολλαπλών ενδείξεων! Όμως στη συνέχεια του οδηγού, το χειριστήριο θα χρησιμοποιηθεί απλώς ως αναμεταδότης των προγραμμάτων από τον υπολογιστή προς το CoDrone EDU, ακριβώς όπως γινόταν και με το rover Perseverance που αναμετέδιδε τον κώδικα των αποστολών προς το Ingenuity!
Ώρα να ξεκινήσεις! Βρες κι άλλους επίδοξους επιστήμονες και δημιουργήστε το δικό σας κέντρο επιχειρήσεων για να σχεδιάσετε τις επόμενες αποστολές εξερεύνησης! Ποιος ξέρει; Ίσως κάποια μέρα κατασκευάσετε το δικό σας drone που θα εξερευνά μακρινούς κόσμους!
Εφαρμογές και γλώσσες προγραμματισμού
Μπορείς να προγραμματίσεις το CoDrone EDU με την εκπαιδευτική γλώσσα προγραμματισμού Blockly ή με Python! Μάλιστα με την Blockly έχεις στη διάθεσή σου δύο κατηγορίες block για να χτίσεις το πρόγραμμά σου, τις junior και senior. Οι junior εντολές είναι παρόμοιες με αυτές που ίσως έχεις συναντήσει σε αντίστοιχες εκπαιδευτικές γλώσσες (Scratch, MakeCode κ.ά.), ενώ η κατηγορία senior περιλαμβάνει blocks που αναγράφουν τις εντολές σε Python, για μια ομαλότερη μετάβαση στη σύνταξη κώδικα με text-base γλώσσες.
Στο τέλος του οδηγού θα βρεις χρήσιμα links με πλούσιο υλικό και περιεκτικούς οδηγούς προγραμματισμού από τη Robolink, καθώς και αναλυτική παρουσίαση του CoDrone EDU από την ομάδα της GRobotronics.
Στα παραδείγματα με τη Blockly που ακολουθούν, έχουν προστεθεί αρκετές καθυστερήσεις του ενός δευτερολέπτου, χωρίς ωστόσο να είναι απαραίτητες σε όλα τα σημεία που προστέθηκαν. Η επιλογή αυτή έγινε γιατί παρατηρήθηκε ότι ορισμένες φορές κάποιες εντολές παρακάμπτονται κατά την εκτέλεση του προγράμματος. Αυτό σχετίζεται με την εκτέλεση του κώδικα στον υπολογιστή και όχι στο drone, με την online εφαρμογή της Robolink, μέσω του Chrome -ή άλλου browser που διαθέτει WebUSB API (π.χ. Edge).
Αν θέλεις να προγραμματίσεις το CoDrone EDU με Python, είναι προτιμότερο να χρησιμοποιήσεις το PyCharm. Βεβαίως, υπάρχει και για την Python αντίστοιχη online εφαρμογή από την Robolink, όμως ενδέχεται ορισμένες από τις εντολές που θα χρησιμοποιήσεις να μην αναγνωρίζονται, καθώς η βιβλιοθήκη δεν είναι ενημερωμένη στην ποιο πρόσφατη έκδοση (την περίοδο που γράφτηκε ο παρών οδηγός).
Κινήσεις κατά την πτήση
Ο έλεγχος των κινήσεων ενός drone διαφέρει σημαντικά από εκείνον ενός ρομπότ που διαθέτει ρόδες. Οι τέσσερις παράμετροι που παρουσιάζονται παρακάτω, καθορίζουν τον τρόπο που θα κινηθεί το CoDrone EDU στον τρισδιάστατο χώρο και συμβάλουν στην τελική συμπεριφορά του.
Roll
Ελέγχει την οριζόντια ή πλάγια κίνηση του CoDrone EDU. Το θετικό roll θα κάνει το drone να γείρει και να μετακινηθεί προς τα δεξιά και το αρνητικό το γέρνει και το μετατοπίζει προς τα αριστερά.
Pitch
Ορίζει την κλίση του CoDrone EDU προς τα εμπρός και προς τα πίσω. Το θετικό pitch θα κάνει το drone να γείρει και να κινηθεί προς τα εμπρός, ενώ το αρνητικό το γέρνει και το κινεί προς τα πίσω.
Yaw
Ελέγχει την περιστροφή του drone. Το θετικό yaw θα κάνει το drone να περιστραφεί προς τα αριστερά και το αρνητικό θα το στρίψει προς τα δεξιά.
Throttle
Ελέγχει την κατακόρυφη κίνηση του CoDrone EDU. Το θετικό throttle θα ανυψώσει το drone, ενώ το αρνητικό το κατεβάζει σε χαμηλότερο ύψος.
Πρώτη πτήση (19 Απριλίου 2021)
Η ιστορική 1η πτήση του Ingenuity είχε ως κύριο στόχο να αποδείξει ότι είναι εφικτή η ελεγχόμενη πτήση σε έναν άλλον πλανήτη με αραιή ατμόσφαιρα. Αυτή η πτήση ήταν καθοριστική για να επιβεβαιωθεί η λειτουργία των συστημάτων του drone και να ελεγχθούν τα αεροδυναμικά χαρακτηριστικά του. Η πτήση δεν περιλάμβανε οριζόντια μετατόπιση του drone και ήταν μια απλή άνοδος και κάθοδος στον ίδιο σημείο.
Το Ingenuity ανυψώθηκε στα 3m πάνω από την επιφάνεια του Άρη και αιωρήθηκε σταθερά για 39,1 δευτερόλεπτα. Παράλληλα, εκτελώντας μία ακόμα προγραμματισμένη μανούβρα περιστράφηκε κατά 96 μοίρες.
Ώρα να προγραμματίσεις το CoDrone EDU να εκτελέσει αυτή την ξεχωριστή δοκιμαστική πτήση! Οι δύο σημαντικότερες εντολές είναι αυτές που ξεκινούν και τερματίζουν την πτήση. Με την εντολή takeoff το drone ανυψώνεται περίπου ένα μέτρο πάνω από το έδαφος ενώ με τη land προσεδαφίζεται ομαλά. Μην παραλήψεις να δοκιμάσεις τα RGB LED του drone και να τα προγραμματίσεις να φωτίζουν με διαφορετικό χρώμα σε κάθε φάση της πτήσης!
Χρησιμοποίησε την turn_degree για να περιστρέψεις το drone στις 96 μοίρες, όπως ακριβώς έκανε και το Ingenuity στη δική του πρώτη δοκιμαστική πτήση. Στη διπλανή εικόνα θα παρατηρήσεις ότι οι μοίρες ορίζονται μηδέν στο μπροστινό μέρος του drone και αυξάνονται αριστερόστροφα.
Φτιάξε δύο συναρτήσεις που όταν θα καλούνται θα στέλνουν δεδομένα από τους αισθητήρες για να τις συνθήκες που επικρατούν στον πλανήτη, αλλά και για την κατάσταση του drone. Με την check_conditions εμφανίζονται στην οθόνη του υπολογιστή πληροφορίες για τις ατμοσφαιρικές συνθήκες που επικρατούν στον πλανήτη και άλλες βασικές μετρήσεις. Η δεύτερη συνάρτηση είναι η check_telemetry και δίνει σημαντικά στοιχεία που αφορούν την πτήση. Κάλεσέ τη στη μέση και στο τέλος της αποστολής για να διαβάσεις τα δεδομένα της πτήσης. Αν το drone βρίσκεται σε οριζόντια θέση, οι τιμές για τη γωνία (κλίση) στους άξονες x και y αναμένονται κοντά στο μηδέν. Μηδενικές αναμένεται να είναι και οι τιμές για τη γωνιακή ταχύτητα στους άξονες x-y-z, όταν το drone παραμένει ακίνητο.
Παρακάτω μπορείς να δεις πως θα εμφανίζονται τα δεδομένα στην οθόνη του υπολογιστή σου προγραμματίζοντας με Blockly (αριστερά) και με Python στο περιβάλλον του PyCharm (δεξιά). Στο παράδειγμα της αριστερής εικόνας συμπεραίνουμε ότι υπήρξε αποτυχημένη προσεδάφιση, καθώς όταν το drone βρέθηκε στο έδαφος (Height=0), η κλίση που έχει στον y-άξονα απέχει πολύ από την τιμή που θα είχε αν προσεδαφίζονταν παράλληλα με το έδαφος. Επίσης στη περίπτωση της δεξιάς εικόνας, θα έπρεπε να αναβληθεί προσωρινά η πτήση καθώς καταγράφηκε ασυνήθιστη τιμή από τον αισθητήρα θερμοκρασίας! Τροποποίησε το προτεινόμενο πρόγραμμα και προγραμμάτισε το drone να ξεκινά τις προγραμματισμένες αποστολές μόνο αν τα δεδομένα των αισθητήρων είναι τα αναμενόμενα!
Υλοποίηση με Blockly
Υλοποίηση με Python
from codrone_edu.drone import *
import time
drone = Drone()
drone.pair()
def check_conditions():
print('Martian conditions...')
print("Temperature: ", drone.get_temperature("Celsius"), "°C")
print("Pressure: ", drone.get_pressure("Pa"), "Pa")
print("Elevation: ", drone.get_elevation("m"), "m")
print("Battery: ", drone.get_battery(), "%")
print("")
def check_telemetry():
print('Telemetry data....')
print("Height: ", drone.get_height("m"), "m")
print("Angle: ", "x=", drone.get_x_angle(), ", y=", drone.get_y_angle())
print("Angular speed: ", 'x=', drone.get_angular_speed_x(), ", y=", drone.get_angular_speed_y(), ", z=", drone.get_angular_speed_z())
print("")
check_conditions()
drone.set_drone_LED(255, 0, 255, 255)
drone.takeoff()
time.sleep(3)
check_telemetry()
drone.set_drone_LED(0, 255, 255, 255)
drone.turn_degree(96)
time.sleep(3)
drone.set_drone_LED(255, 255, 0, 255)
drone.land()
check_telemetry()
drone.drone_LED_off()
drone.close()
Δεύτερη πτήση (22 Απριλίου 2022)
Η 2η πτήση είχε διάρκεια 51,9 δευτερόλεπτα και στόχευε στη δοκιμή της ελεγχόμενης μετατόπισης, καθώς και στη σταθεροποίηση κατά τη διάρκεια της πτήσης. Μετά την επιτυχημένη κατακόρυφη άνοδο και κάθοδο της πρώτης πτήσης, αυτή τη φορά το Ingenuity επρόκειτο να μετακινηθεί οριζόντια για πρώτη φορά.
Μετά την αρχική ανύψωση και αιώρηση στα 5m, το drone έγειρε 5 μοίρες και πέταξε πλάγια για 2m με ταχύτητα 0,5m/s. Έπειτα, αιωρήθηκε για λίγο στη νέα θέση και έκανε διαδοχικές περιστροφές με βήμα 90 μοιρών, στρέφοντας με αυτόν τον τρόπο την κάμερά του σε διάφορες κατευθύνσεις για να τραβήξει φωτογραφίες. Τελικά επέστρεψε πάλι πίσω στο σημείο που ξεκίνησε και προσεδαφίστηκε με επιτυχία.
Το CoDrone EDU θα πρέπει να ανέλθει κι αυτό σε μεγαλύτερο ύψος μετά την αρχική ανύψωση. Χρησιμοποίησε την εντολή while ώστε να αυξάνει το ύψος του μέχρι να φτάσει σε απόσταση 150cm από το έδαφος. Αποθήκευσε στη μεταβλητή “y_start”, την τιμή που επιστρέφει σε εκείνο το σημείο ο optical flow sensor για τη θέση του drone στον y-άξονα, ώστε να υπάρχει μια τιμή αναφοράς κατά την απομάκρυνση του drone και κατά την επιστροφή του. Έπειτα, προγραμμάτισε το drone να κινηθεί 50cm πλάγια ώστε να φτάσει να αιωρείται σε νέο σημείο.
Το δικό σου drone δεν διαθέτει τις κάμερες του Ingenuity, μπορείς ωστόσο να καταγράψεις τα δεδομένα από τον μπροστινό αισθητήρα απόστασης.
Για να πραγματοποιήσει το CoDrone EDU τις διαδοχικές περιστροφές που έκανε το Ingenuity, χρησιμοποίησε στην Blockly την εντολή “count with i from 1 to 4 by 1” και στην Python την “for i in range(1, 5, 1)”. Και στις δύο περιπτώσεις θα πραγματοποιηθούν 4 επαναλήψεις.
Σε κάθε επανάληψη το drone θα περιστρέφεται αριστερά κατά 90 μοίρες και θα στέλνει την απόσταση που κατέγραψε ο αισθητήρας του.
Στην τελική φάση της πτήσης, το CoDrone EDU θα επιστρέψει και πάλι πάνω από το σημείο που ξεκίνησε, για να προσεδαφιστεί τελικά και πάλι στην αρχική του θέση, όπως ακριβώς έκανε και το Ingenuity στη δεύτερη πτήση του!
Υλοποίηση με Blockly
Υλοποίηση με Python
from codrone_edu.drone import *
import time
drone = Drone()
drone.pair()
drone.takeoff()
while drone.get_height("cm") < 150:
drone.set_throttle(30)
drone.move()
drone.set_throttle(0)
drone.move()
time.sleep(0.5)
y_start = drone.get_pos_y("cm")
while drone.get_pos_y("cm") < y_start + 50:
drone.set_roll(-20)
drone.move()
drone.set_throttle(0)
drone.move()
time.sleep(0.5)
for i in range(1, 5, 1):
drone.turn_left(90)
time.sleep(1)
print("Distance at ", i*90, " degrees: ", drone.get_front_range("cm"), "cm")
while drone.get_pos_y("cm") > y_start:
drone.set_roll(20)
drone.move()
drone.set_throttle(0)
drone.move()
time.sleep(0.5)
drone.land()
drone.close()
Πέμπτη πτήση (7 Μαΐου 2021)
Η 5η πτήση του Ingenuity είχε διάρκεια 108,2 δευτερόλεπτα και ήταν η πρώτη πτήση μονής διαδρομής, δηλαδή η πρώτη πτήση όπου το ιπτάμενο ρομπότ ανυψώθηκε από μία τοποθεσία και προσεδαφίστηκε σε μια νέα, αντί να επιστρέψει στην αρχική του θέση. Ο στόχος ήταν να εξερευνήσει μια νέα περιοχή και να συλλέξει πληροφορίες για το έδαφος, που θα βοηθούσαν τους επιστήμονες να σχεδιάσουν τις επόμενες κινήσεις του rover Perseverance.
Αυτή τη φορά το drone κινήθηκε 130,8m νότια με ταχύτητα 2m/s. Φτάνοντας πάνω από τον τελικό προορισμό, αύξησε κι άλλο το ύψος πτήσης του και αιωρήθηκε στα 10m απαθανατίζοντας έγχρωμες εικόνες εδάφους, προτού τελικά προσεδαφιστεί στη νέα τοποθεσία.
Το CoDrone EDU θα μετατοπιστεί κι αυτό ταχύτερα αυτή τη φορά, κινούμενο ευθεία μπροστά για 2 δευτερόλεπτα. Έπειτα θα σταματήσει και στην αμέσως επόμενη φάση θα ανέλθει κάθετα 2 μέτρα πάνω από το έδαφος. Μπορεί το CoDrone EDU να μη διαθέτει στο κάτω μέρος του την κάμερα του Ingenuity για να στείλει φωτογραφίες της νέας τοποθεσίας, μπορεί ωστόσο να κάνει backflip και αυτό είναι cool!
Στη συνέχεια προσεδάφισε το drone στη νέα του θέση και πάρε δεδομένα από τους δύο αισθητήρες χρώματος που διαθέτει. Οι αισθητήρες αυτοί είναι ενεργοί μόνο αν το drone βρίσκεται στο έδαφος. Τα χρώματα που βλέπουν οι αισθητήρες μπορούν να δώσουν χρήσιμες πληροφορίες για τη σύσταση του εδάφους στη νέα θέση! Στείλε ένα ρομπότ εδάφους στο σημείο που έφτασε το drone για περαιτέρω εξερεύνηση!
Υλοποίηση με Blockly
Υλοποίηση με Python
from codrone_edu.drone import *
import time
drone = Drone()
drone.pair()
drone.takeoff()
drone.set_pitch(60)
drone.move()
time.sleep(2)
drone.hover(2)
while drone.get_height("cm") < 200:
drone.set_throttle(30)
drone.move()
drone.hover(2)
drone.flip("back")
drone.hover(2)
drone.land()
print('Front color sensor: ', drone.get_front_color())
print('Back color sensor: ', drone.get_back_color())
drone.close()
Αρχεία
Σύνδεσμοι
Εισαγωγή στο CoDrone EDU: Ένα Εκπαιδευτικό Drone για STEAM! – GRobotronics
Blockly with CoDrone EDU – Robolink Basecamp
Python with CoDrone EDU – Robolink Basecamp
Getting Started with CoDrone EDU – Robolink Basecamp