Αισθητήρας όρασης#

Εισαγωγή#

Η κλάση vision χρησιμοποιείται για τον έλεγχο και την πρόσβαση σε δεδομένα από τον αισθητήρα όρασης V5. Αυτός ο αισθητήρας ανιχνεύει και παρακολουθεί χρωματικές υπογραφές εντός του οπτικού του πεδίου, επιτρέποντας στο ρομπότ σας να αναγνωρίζει στόχους και να ανταποκρίνεται σε οπτικές πληροφορίες σε πραγματικό χρόνο.

Ο αισθητήρας όρασης μπορεί να ανιχνεύσει ταυτόχρονα πολλά αντικείμενα-υπογραφές και παρέχει πληροφορίες όπως η θέση του αντικειμένου, το πλάτος, το ύψος και οι κεντρικές συντεταγμένες.

Κατασκευαστές κλάσεων#

vision(
  int32_t  index,
  uint8_t  bright,
  Args&... sigs );

Καταστροφέας κλάσης#

Καταστρέφει το αντικείμενο vision και απελευθερώνει τους σχετικούς πόρους.

~vision();

Παράμετροι#

Παράμετρος

Τύπος

Περιγραφή

index

int32_t

Η Έξυπνη Θύρα στην οποία είναι συνδεδεμένος ο Αισθητήρας Όρασης, γράφεται ως PORTx, όπου x είναι ο αριθμός θύρας (για παράδειγμα, PORT1).

bright

uint8_t

Το επίπεδο φωτεινότητας του αισθητήρα όρασης.

sigs

vision::signature or vision::code objects

Ένα ή περισσότερα αντικείμενα vision::signature ή vision::code για καταχώρηση στον αισθητήρα.

Παραδείγματα#

// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

Συναρτήσεις Μελών#

Η κλάση vision περιλαμβάνει τις ακόλουθες συναρτήσεις-μέλη:

  • takeSnapshot — Καταγράφει δεδομένα για μια συγκεκριμένη Υπογραφή Χρώματος ή Κωδικό Χρώματος.

  • installed — Εάν ο αισθητήρας όρασης είναι συνδεδεμένος στον εγκέφαλο V5.

Για να αποκτήσετε πρόσβαση στα δεδομένα ανιχνευμένων αντικειμένων μετά την κλήση της συνάρτησης takeSnapshot, χρησιμοποιήστε τις διαθέσιμες Ιδιότητες.

Πριν από την κλήση οποιασδήποτε συνάρτησης μέλους vision , πρέπει να δημιουργηθεί μια παρουσία vision , όπως φαίνεται παρακάτω:

/* This constructor is required when using VS Code.
Vision Sensor configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */


// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

takeSnapshot#

Καταγράφει μια εικόνα από τον Αισθητήρα Όρασης, την επεξεργάζεται με βάση την υπογραφή και ενημερώνει τον πίνακα objects Αυτή η μέθοδος μπορεί επίσης να περιορίσει τον αριθμό των αντικειμένων που καταγράφονται στο στιγμιότυπο.

The objects array stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. If no matching objects are detected, objectCount will be 0 and objects[i].exists will be false.

Available Functions

1 — Λαμβάνει ένα στιγμιότυπο και αναζητά αντικείμενα που ταιριάζουν με το καθορισμένο αναγνωριστικό υπογραφής.

int32_t takeSnapshot( uint32_t id );

2 — Λαμβάνει ένα στιγμιότυπο και αναζητά αντικείμενα που ταιριάζουν με το καθορισμένο αντικείμενο vision::code.

int32_t takeSnapshot( code &cc );

3 — Λαμβάνει ένα στιγμιότυπο και αναζητά αντικείμενα που ταιριάζουν με το καθορισμένο αντικείμενο vision::signature.

int32_t takeSnapshot( signature &sig );

4 — Λαμβάνει ένα στιγμιότυπο και αποθηκεύει μόνο τον μεγαλύτερο καθορισμένο αριθμό αντικειμένων που ταιριάζουν με το αναγνωριστικό υπογραφής.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Λαμβάνει ένα στιγμιότυπο και αποθηκεύει μόνο τον μεγαλύτερο καθορισμένο αριθμό αντικειμένων που ταιριάζουν με το καθορισμένο αντικείμενο vision::code.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Λαμβάνει ένα στιγμιότυπο και αποθηκεύει μόνο τον μεγαλύτερο καθορισμένο αριθμό αντικειμένων που ταιριάζουν με το καθορισμένο αντικείμενο vision::signature.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Παράμετρος

Τύπος

Περιγραφή

id

uint32_t

Ο αριθμός αναγνώρισης υπογραφής που θα αναζητηθεί.

cc

code &

Μια αναφορά σε ένα αντικείμενο vision::code για αναζήτηση.

sig

signature &

Μια αναφορά σε ένα αντικείμενο vision::signature για αναζήτηση.

count

uint32_t

Ο μέγιστος αριθμός αντικειμένων προς ανίχνευση.

Return Values

Επιστρέφει μια τιμή int32_t που αντιπροσωπεύει τον αριθμό των αντικειμένων που εντοπίστηκαν και ταιριάζουν.

Notes
  • Ο αισθητήρας όρασης πρέπει να τραβήξει ένα στιγμιότυπο πριν είναι δυνατή η πρόσβαση στα δεδομένα του αντικειμένου.

  • Όταν καθορίζεται η τιμή count , αποθηκεύονται μόνο τα μεγαλύτερα ανιχνευμένα αντικείμενα (μέχρι την καθορισμένη ποσότητα).

Παραδείγματα

while (true) {
  // Display if a blue object is detected
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Blue detected");
  } 
  else {
    Brain.Screen.print("No blue");
  }

  wait(0.5, seconds);
}

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, msec); 
}

// Display when BOXCODE is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BOXCODE);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Code detected!");
  }
  wait( 100, msec);
}

installed#

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

Available Functions
bool installed();

Parameters

Αυτή η συνάρτηση δεν δέχεται καμία παράμετρο.

Return Values

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

  • true — The Vision Sensor is connected.
  • false — The Vision Sensor is not connected.

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

Η κλήση της συνάρτησης takeSnapshot ενημερώνει τα αποτελέσματα ανίχνευσης του αισθητήρα όρασης. Κάθε στιγμιότυπο ανανεώνει τον πίνακα objects , ο οποίος περιέχει τα ανιχνευμένα αντικείμενα για την ζητούμενη Υπογραφή Χρώματος ή Κωδικό Χρώματος.

Η πρόσβαση στα δεδομένα του αισθητήρα όρασης γίνεται μέσω των ιδιοτήτων των αντικειμένων που είναι αποθηκευμένα στο Vision1.objects[index], όπου index ξεκινά από το 0.

Η ανάλυση εικόνας του αισθητήρα όρασης είναι 316 επί 212 pixel. Οι ιδιότητες θέσης και μεγέθους αντικειμένου αναφέρονται σε μονάδες pixel σε σχέση με την τρέχουσα προβολή του αισθητήρα.

Διατίθενται τα ακόλουθα ακίνητα:

  • largestObject — Επιλέγει το μεγαλύτερο ανιχνευμένο αντικείμενο από το πιο πρόσφατο στιγμιότυπο.

  • objectCount — Επιστρέφει τον αριθμό των έγκυρων αντικειμένων που είναι αποθηκευμένα σε objects.

  • objects — Πίνακας ανιχνευμένων αντικειμένων που ενημερώθηκε από takeSnapshot.

  • .exists — Εάν η καταχώρηση αντικειμένου περιέχει έγκυρα δεδομένα.

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

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

  • .centerX — X position of the object’s center in pixels.

  • .centerY — Η θέση Y του κέντρου του αντικειμένου σε pixel.

  • .originX — X position of the object’s top-left corner in pixels.

  • .originY — Y position of the object’s top-left corner in pixels.

  • .angle — Προσανατολισμός του ανιχνευμένου Χρωματικού Κώδικα σε μοίρες (όταν ισχύει).

largestObject#

Ανακτά το μεγαλύτερο ανιχνευμένο αντικείμενο από τον πίνακα objects.

Αυτή η μέθοδος μπορεί να χρησιμοποιηθεί για να λαμβάνεται πάντα το μεγαλύτερο αντικείμενο από objects χωρίς να καθορίζεται δείκτης.

Syntax
VisionSensor.largestObject

Components

Συστατικό

Περιγραφή

VisionSensor

Το όνομα της παρουσίας του Vision Sensor.

Παραδείγματα

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display the largest detected object's width
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    if (Vision1.objects[0].exists) {
      Brain.Screen.print("%d", Vision1.largestObject.width);
    } 
    wait(0.5, seconds);
  }
}

objectCount#

Επιστρέφει τον αριθμό των στοιχείων μέσα στον πίνακα objects ως ακέραιο αριθμό.

Syntax
VisionSensor.objectCount

Components

Συστατικό

Περιγραφή

VisionSensor

Το όνομα της παρουσίας του Vision Sensor.

Παραδείγματα

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display how many blue objects are detected
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    Brain.Screen.print("Object Count: %d", Vision1.objectCount);

    wait(0.5, seconds);
  }
}

objects#

objects είναι ένας πίνακας που περιέχει τα ανιχνευμένα αντικείμενα από την πιο πρόσφατη κλήση στο takeSnapshot.

Κάθε στοιχείο στον πίνακα αντιπροσωπεύει ένα ανιχνευμένο αντικείμενο και παρέχει πρόσβαση στις ιδιότητές του, όπως width, height, centerX και άλλα.

Τα αντικείμενα ταξινομούνται από το μεγαλύτερο στο μικρότερο (κατά πλάτος), ξεκινώντας από τον δείκτη 0.

Syntax
VisionSensor.objects[index].property

Components

Συστατικό

Περιγραφή

VisionSensor

Το όνομα της παρουσίας του Vision Sensor.

index

Ο δείκτης αντικειμένου στον πίνακα. Ο δείκτης ξεκινά από 0.

property

Μία από τις διαθέσιμες ιδιότητες αντικειμένου.

.υπάρχει#

Η συνάρτηση .exists επιστρέφει εάν ο καθορισμένος δείκτης αντικειμένου περιέχει ένα έγκυρο ανιχνευμένο αντικείμενο.

Πρόσβαση

SensorName.objects[index].exists

Επιστρεφόμενες τιμές

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

  • true — A valid object exists at the specified index.
  • false — No object exists at the specified index.

Παραδείγματα

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, msec); 
}

.πλάτος#

Η συνάρτηση .width επιστρέφει το πλάτος του ανιχνευμένου αντικειμένου.

Πρόσβαση

SensorName.objects[index].width

Επιστρεφόμενες τιμές

Επιστρέφει έναν ακέραιο αριθμό int ο οποίος αντιπροσωπεύει το πλάτος του ανιχνευμένου αντικειμένου σε pixel. Η τιμή κυμαίνεται από 1 έως 316.

Παραδείγματα

// Approach an object until it's at least 100 pixels wide
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists && Vision1.objects[0].width < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);
}

.ύψος#

.height επιστρέφει το ύψος του ανιχνευμένου αντικειμένου.

Πρόσβαση

SensorName.objects[index].height

Επιστρεφόμενες τιμές

Επιστρέφει έναν ακέραιο αριθμό int ο οποίος αντιπροσωπεύει το ύψος του ανιχνευμένου αντικειμένου σε pixel. Η τιμή κυμαίνεται από 1 έως 212.

Παραδείγματα

// Approach an object until it's at least 100 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists && Vision1.objects[0].height < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);  // Avoid over-processing
}

.centerX#

.centerX επιστρέφει τη συντεταγμένη x του κέντρου του ανιχνευμένου αντικειμένου.

Πρόσβαση

SensorName.objects[index].centerX

Επιστρεφόμενες τιμές

Επιστρέφει έναν ακέραιο αριθμό int που αντιπροσωπεύει τη συντεταγμένη x του κέντρου του αντικειμένου σε pixel. Η τιμή κυμαίνεται από 0 έως 316.

Παραδείγματα

// Turn until an object is directly in front of the sensor
Drivetrain.setTurnVelocity(10, percent);
Drivetrain.turn(right);
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    int centerX = Vision1.largestObject.centerX;
    if (140 < centerX && centerX < 180) {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}

.centerY#

.centerY επιστρέφει τη συντεταγμένη y του κέντρου του ανιχνευμένου αντικειμένου.

Πρόσβαση

SensorName.objects[index].centerY

Επιστρεφόμενες τιμές

Επιστρέφει έναν ακέραιο αριθμό int ο οποίος αντιπροσωπεύει τη συντεταγμένη y του κέντρου του αντικειμένου σε pixel. Η τιμή κυμαίνεται από 0 έως 212.

Παραδείγματα

// Approach an object until it's at least 90 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].centerY < 90) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.originX#

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

Πρόσβαση

SensorName.objects[index].originX

Επιστρεφόμενες τιμές

Επιστρέφει έναν ακέραιο αριθμό int που αντιπροσωπεύει τη συντεταγμένη x της επάνω αριστερής γωνίας του πλαισίου οριοθέτησης του αντικειμένου σε pixel. Η τιμή κυμαίνεται από 0 έως 316.

Παραδείγματα

// Display if an object is to the left or the right
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originX < 160) {
      Brain.Screen.print("To the left!");
    }
    else {
      Brain.Screen.print("To the right!");
    }
  }
  wait(0.5, seconds); 
}

.originY#

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

Πρόσβαση

SensorName.objects[index].originY

Επιστρεφόμενες τιμές

Επιστρέφει έναν ακέραιο αριθμό int ο οποίος αντιπροσωπεύει τη συντεταγμένη y της επάνω αριστερής γωνίας του πλαισίου οριοθέτησης του αντικειμένου σε pixel. Η τιμή κυμαίνεται από 0 έως 212.

Παραδείγματα

// Display if an object is close or far
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originY < 80) {
      Brain.Screen.print("Far");
    } else {
      Brain.Screen.print("Close");
    }
  }
  wait(0.5, seconds);
}

.γωνία#

Η συνάρτηση .angle επιστρέφει τον προσανατολισμό του ανιχνευμένου Χρωματικού Κώδικα.

Πρόσβαση

SensorName.objects[index].angle

Επιστρεφόμενες τιμές

Επιστρέφει μια τιμή double που αντιπροσωπεύει τον προσανατολισμό του ανιχνευμένου Χρωματικού Κώδικα σε μοίρες. Η τιμή κυμαίνεται από 0 έως 359.9.

Παραδείγματα

// Turn left or right depending on how a configured
// Color Code is rotated
while (true) {
  Vision1.takeSnapshot(Vision1__BOXCODE);
  if (Vision1.objects[0].exists) {
    double angle = Vision1.objects[0].angle;
    if (70 < angle && angle < 110) {
      Drivetrain.turnFor(right, 45, degrees);
    }
    else if (250 < angle && angle < 290) {
      Drivetrain.turnFor(left, 45, degrees);
    }
    else {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}