Οραμα#

Εισαγωγή#

Ο αισθητήρας όρασης του VEX AIR Drone ανιχνεύει και παρακολουθεί τα AprilTag IDs. Αυτό επιτρέπει στο drone να αναλύει το περιβάλλον του, να ακολουθεί αντικείμενα και να αντιδρά με βάση τα ανιχνευμένα οπτικά δεδομένα. Παρακάτω είναι μια λίστα με όλες τις διαθέσιμες μεθόδους και ιδιότητες:

Getters – Εντοπίζει εάν το drone κρατάει κάποιο αντικείμενο.

  • get_data – Επιστρέφει μια πλειάδα ανιχνευμένων αντικειμένων για μια συγκεκριμένη υπογραφή.

Ιδιότητες – Δεδομένα αντικειμένου που επιστρέφονται από get_data.

  • exists – Εάν το αντικείμενο υπάρχει στην τρέχουσα ανίχνευση.

  • width – Πλάτος του ανιχνευμένου αντικειμένου.

  • height – Ύψος του ανιχνευμένου αντικειμένου.

  • centerX – Θέση X του κέντρου του αντικειμένου.

  • centerY – Θέση Y του κέντρου του αντικειμένου.

  • bearing – Η γωνία του αντικειμένου σε σχέση με τον μπροστινό αισθητήρα όρασης ή οι μοίρες που απαιτούνται για να στραφεί το drone προς το αντικείμενο.

  • rotation – Προσανατολισμός του αντικειμένου.

  • originX – Θέση X της επάνω αριστερής γωνίας του αντικειμένου.

  • originY – Θέση Y της επάνω αριστερής γωνίας του αντικειμένου.

  • id – Αναγνωριστικό ετικέτας του αντικειμένου.

  • type – Επιστρέφει τον τύπο του αντικειμένου.

Αποκτητές#

get_data#

get_data φιλτράρει δεδομένα από το πλαίσιο του Vision Sensor σε μια μοναδική υπογραφή — μια αποθηκευμένη περιγραφή κάποιου στοιχείου που μπορεί να αναγνωρίσει ο αισθητήρας, όπως ένα AprilTag ID — και επιστρέφει μια πλειάδα.

Η πλειάδα αποθηκεύει αντικείμενα ταξινομημένα από το μεγαλύτερο στο μικρότερο κατά πλάτος, ξεκινώντας από τον δείκτη 0. Η πρόσβαση στις ιδιότητες κάθε αντικειμένου είναι δυνατή χρησιμοποιώντας τον δείκτη του. Επιστρέφεται μια κενή πλειάδα εάν δεν εντοπιστούν αντικείμενα που να ταιριάζουν.

Usage:
drone.vision.get_data(camera, signature, count)

Παράμετροι

Περιγραφή

camera

Η κάμερα από την οποία θα ανακτηθούν δεδομένα: είτε η DOWNWARD_CAMERA είτε η FORWARD_CAMERA.

signature

Φιλτράρει το σύνολο δεδομένων ώστε να περιλαμβάνει μόνο δεδομένα της δεδομένης υπογραφής. Οι διαθέσιμες υπογραφές είναι:

  • ALL_TAGS - Όλα τα αναγνωριστικά AprilTag
  • TAG0 έως TAG37 - Ένα μόνο αναγνωριστικό AprilTag από 0 έως 37

count

Προαιρετικό. Ορίζει τον μέγιστο αριθμό αντικειμένων που μπορούν να επιστραφούν από 1 έως 24 (προεπιλογή: 8).

# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        drone.climb_for(direction=UP, distance=200)

Σκηνικά θέατρου#

Υπάρχουν πολλαπλές ιδιότητες που περιλαμβάνονται σε κάθε αντικείμενο που αποθηκεύεται σε μια tuple μετά τη χρήση της get_data.

Όλες οι τιμές ιδιοτήτων εκτός από .id και .type περιγράφουν τη θέση, το μέγεθος, τον προσανατολισμό ή την κατεύθυνση του ανιχνευμένου αντικειμένου τη στιγμή που χρησιμοποιήθηκε το get_data. Αυτές οι τιμές μετριούνται σε pixel ή μοίρες. Κάθε αισθητήρας όρασης έχει διαφορετική ανάλυση:

  • Μπροστινή όψη: 640 x 480 pixel

  • Προς τα κάτω: 640 x 400 pixel

.exists#

.exists επιστρέφει μια λογική τιμή που υποδεικνύει εάν ο δείκτης υπάρχει στην πλειάδα. Επιστρέφει ένα σφάλμα εάν δεν έχουν εντοπιστεί αντικείμενα.

  • True – Ο δείκτης υπάρχει.

  • False – Ο δείκτης δεν υπάρχει.

# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        drone.climb_for(direction=UP, distance=200)

.width#

Η συνάρτηση .width επιστρέφει το πλάτος του ανιχνευμένου αντικειμένου σε pixel ως ακέραιο αριθμό από 1 έως 640.

# Show if the AprilTag ID appears large or small
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    clear_console()
    if vision_data[0].exists:
        if vision_data[0].width > 100:
            print("Large")
        else:
            print("Small")
    wait(0.2, SECONDS)

.height#

Η συνάρτηση .height επιστρέφει το ύψος του ανιχνευμένου αντικειμένου σε pixel ως ακέραιο αριθμό από 1 έως 480.

# Show if the AprilTag ID appears large or small
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    clear_console()
    if vision_data[0].exists:
        if vision_data[0].height > 100:
            print("Large")
        else:
            print("Small")
    wait(0.2, SECONDS)

.centerX#

.centerX επιστρέφει τη συντεταγμένη x του κέντρου του ανιχνευμένου αντικειμένου σε pixel ως ακέραιο αριθμό από 1 έως 640.

# Show if an AprilTag ID is to the left or the right of the camera
while True:
    clear_console()
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if vision_data[0].centerX < 320:
            print("To the left!")
        else:
            print("To the right!")
    wait(0.2, SECONDS)

.centerY#

.centerY επιστρέφει τη συντεταγμένη y του κέντρου του ανιχνευμένου αντικειμένου σε pixel ως ακέραιο αριθμό από 1 έως 480.

# Take off and align drone with AprilTag ID on wall
# Change drone.take_off parameter to see different results
drone.take_off(climb_to=800)
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
    if vision_data[0].centerY < 240:
        print("Below the target!")
    else:
        print("Above the target!")
else:
    print("No target found!")

.bearing#

.bearing επιστρέφει μια γωνία που υποδεικνύει τη θέση ενός αντικειμένου σε σχέση με το drone. Η συμπεριφορά εξαρτάται από το ποιος αισθητήρας όρασης χρησιμοποιείται.

Μια τιμή 0° υποδεικνύει ότι το κέντρο του αντικειμένου και ο αισθητήρας είναι ευθυγραμμισμένα. Θετικές τιμές σημαίνουν ότι το αντικείμενο βρίσκεται στα δεξιά, ενώ αρνητικές τιμές σημαίνουν ότι το αντικείμενο βρίσκεται στα αριστερά.

Αισθητήρας

Επιστροφές

Προς τα κάτω

Μοίρες που πρέπει να περιστραφεί το μπροστινό μέρος του drone για να ευθυγραμμιστεί με το κέντρο του αντικειμένου, από –180º έως 180º.

Προς τα εμπρός

Μοίρες κατά τις οποίες το αντικείμενο είναι μετατοπισμένο αριστερά ή δεξιά από το κέντρο του αισθητήρα όρασης από –180º έως 180º.

# Align the front of the drone to an AprilTag ID
drone.set_turn_velocity(15)
drone.take_off(climb_to=500)
while True:
    vision_data = drone.vision.get_data(DOWNWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if -20 < vision_data[0].bearing < 20:
            # Hover once sensor is centered on AprilTag ID
            drone.hover()
            controller.sound.play(SUCCESS)
            while controller.sound.is_active():
                wait(50, MSEC)
        elif vision_data[0].bearing < -21:
            drone.turn(LEFT)
        else:
            drone.turn(RIGHT)
    wait(5, MSEC)

.rotation#

Η συνάρτηση .rotation επιστρέφει τον προσανατολισμό του αναγνωριστικού AprilTag που εντοπίστηκε ως ακέραιο αριθμό σε μοίρες από 1 έως 359.

# Turn left or right based on the rotation of an AprilTag ID
drone.take_off(climb_to=1000)
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if 240 < vision_data[0].rotation < 300:
            drone.turn_for(LEFT, 90)
        elif 60 < vision_data[0].rotation < 120:
            drone.turn_for(RIGHT, 90)
        else:
            drone.hover()
    wait(0.2, SECONDS)

.originX#

.originX επιστρέφει τη συντεταγμένη x της επάνω αριστερής γωνίας του πλαισίου οριοθέτησης του ανιχνευμένου αντικειμένου σε pixel ως ακέραιο αριθμό από 1 έως 640.

# Draw lines to the AprilTag ID origin from all corners
while True:
    controller.screen.clear_screen()
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
    wait(0.2, SECONDS)

.originY#

.originY επιστρέφει τη συντεταγμένη y της επάνω αριστερής γωνίας του πλαισίου οριοθέτησης του ανιχνευμένου αντικειμένου σε pixel ως ακέραιο αριθμό από 1 έως 480.

# Draw lines to the AprilTag ID origin from all corners
while True:
    controller.screen.clear_screen()
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
        controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
    wait(0.2, SECONDS)

.id#

.id επιστρέφει τον αριθμό αναγνώρισης του αναγνωριστικού AprilTag που εντοπίστηκε ως ακέραιο αριθμό από 0 έως 37.

# Display the detected AprilTag ID
while True:
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    clear_console()
    if vision_data[0].exists:
        print(vision_data[0].id)
    wait(0.2, SECONDS)

.type#

Η συνάρτηση .type επιστρέφει τον τύπο του αντικειμένου που ανιχνεύεται. Θα επιστρέψει τα εξής:

Τύπος αντικειμένου

Αριθμητική τιμή

Συμπεριλαμβανόμενα αντικείμενα

drone.vision.TAG_OBJECT

8

Αναγνωριστικά ετικέτας AprilTag

drone.vision.COLOR_OBJECT

1

Χρωματικές υπογραφές - Σύντομα διαθέσιμο!

drone.vision.CODE_OBJECT

2

Κωδικοί χρωμάτων - Σύντομα διαθέσιμοι!

# Display what AprilTag ID is detected
while True:
    controller.screen.clear_screen()
    controller.screen.set_cursor(1, 1)
    vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
    if vision_data[0].exists:
        if vision_data[0].type == drone.vision.TAG_OBJECT:
            controller.screen.print("AprilTag ID: ")
            controller.screen.print(vision_data[0].id)

    wait(0.1, SECONDS)