Αισθητήρας όρασης#
Εισαγωγή#
Η κλάση vision χρησιμοποιείται για τον έλεγχο και την πρόσβαση σε δεδομένα από τον αισθητήρα όρασης V5. Αυτός ο αισθητήρας ανιχνεύει και παρακολουθεί χρωματικές υπογραφές εντός του οπτικού του πεδίου, επιτρέποντας στο ρομπότ σας να αναγνωρίζει στόχους και να ανταποκρίνεται σε οπτικές πληροφορίες σε πραγματικό χρόνο.
Ο αισθητήρας όρασης μπορεί να ανιχνεύσει ταυτόχρονα πολλά αντικείμενα-υπογραφές και παρέχει πληροφορίες όπως η θέση του αντικειμένου, το πλάτος, το ύψος και οι κεντρικές συντεταγμένες.
Κατασκευαστές κλάσεων#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
Καταστροφέας κλάσης#
Καταστρέφει το αντικείμενο vision και απελευθερώνει τους σχετικούς πόρους.
~vision();
Παράμετροι#
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Η Έξυπνη Θύρα στην οποία είναι συνδεδεμένος ο Αισθητήρας Όρασης, γράφεται ως |
|
|
Το επίπεδο φωτεινότητας του αισθητήρα όρασης. |
|
|
Ένα ή περισσότερα αντικείμενα |
Παραδείγματα#
// 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.
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 );
Parameters6 — Λαμβάνει ένα στιγμιότυπο και αποθηκεύει μόνο τον μεγαλύτερο καθορισμένο αριθμό αντικειμένων που ταιριάζουν με το καθορισμένο αντικείμενο
vision::signature.int32_t takeSnapshot( signature &sig, uint32_t count );
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Ο αριθμός αναγνώρισης υπογραφής που θα αναζητηθεί. |
|
|
Μια αναφορά σε ένα αντικείμενο |
|
|
Μια αναφορά σε ένα αντικείμενο |
|
|
Ο μέγιστος αριθμός αντικειμένων προς ανίχνευση. |
Επιστρέφει μια τιμή int32_t που αντιπροσωπεύει τον αριθμό των αντικειμένων που εντοπίστηκαν και ταιριάζουν.
Ο αισθητήρας όρασης πρέπει να τραβήξει ένα στιγμιότυπο πριν είναι δυνατή η πρόσβαση στα δεδομένα του αντικειμένου.
Όταν καθορίζεται η τιμή
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 Functionsbool installed();
Αυτή η συνάρτηση δεν δέχεται καμία παράμετρο.
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 χωρίς να καθορίζεται δείκτης.
VisionSensor.largestObject
Συστατικό |
Περιγραφή |
|---|---|
|
Το όνομα της παρουσίας του 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 ως ακέραιο αριθμό.
VisionSensor.objectCount
Συστατικό |
Περιγραφή |
|---|---|
|
Το όνομα της παρουσίας του 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.
VisionSensor.objects[index].property
Συστατικό |
Περιγραφή |
|---|---|
|
Το όνομα της παρουσίας του Vision Sensor. |
|
Ο δείκτης αντικειμένου στον πίνακα. Ο δείκτης ξεκινά από |
|
Μία από τις διαθέσιμες ιδιότητες αντικειμένου. |
.υπάρχει#
Η συνάρτηση .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);
}