Synsensor#

Introduktion#

Vision vision används för att styra och komma åt data från IQ (2:a generationen) Vision Sensor. Denna sensor detekterar och spårar färgsignaturer inom sitt synfält, vilket gör att din robot kan identifiera mål och reagera på visuell information i realtid.

Visionsensorn kan detektera flera signaturobjekt samtidigt och tillhandahåller information såsom objektets position, bredd, höjd och centrumkoordinater.

Klasskonstruktörer#

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

Klassförstörare#

Förstör vision vision objektet och frigör tillhörande resurser.

~vision();

Parametrar#

Parameter

Typ

Beskrivning

index

int32_t

Den smarta porten som visionssensorn är ansluten till, skriven som PORTx, där x är portnumret (till exempel PORT1).

bright

uint8_t

Visionsensorns ljusstyrka.

sigs

vision::signature or vision::code objects

Ett eller flera vision::signature eller vision::code objekt som ska registreras hos sensorn.

Exempel#

// 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

Medlemsfunktioner#

Klassen vision innehåller följande medlemsfunktioner:

  • takeSnapshot — Samlar in data för en specifik färgsignatur eller färgkod.

  • installed — Om synsensorn är ansluten till IQ-hjärnan (2:a generationen).

För att komma åt detekterade objektdata efter att ha anropat takeSnapshot, använd de tillgängliga Egenskaper.

Innan några vision medlemsfunktioner anropas måste en vision instans skapas, som visas nedan:

/* 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#

Tar en bild från visionssensorn, bearbetar den baserat på signaturen och uppdaterar matrisen objects Den här metoden kan också begränsa antalet objekt som tas i ögonblicksbilden.

Matrisen objects lagrar objekt sorterade från störst till minst efter bredd, med början vid index 0. Varje objekts properties kan nås med hjälp av dess index. Om inga matchande objekt upptäcks kommer objectCount att vara 0 och objects[i].exists kommer att vara falskt.

Available Functions

1 — Tar en ögonblicksbild och söker efter objekt som matchar det angivna signatur-ID:t.

int32_t takeSnapshot( uint32_t id );

2 — Tar en ögonblicksbild och söker efter objekt som matchar det angivna vision::code objektet.

int32_t takeSnapshot( code &cc );

3 — Tar en ögonblicksbild och söker efter objekt som matchar det angivna vision::signature objektet.

int32_t takeSnapshot( signature &sig );

4 — Tar en ögonblicksbild och lagrar endast det största angivna antalet objekt som matchar signatur-ID:t.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Tar en ögonblicksbild och lagrar endast det största angivna antalet objekt som matchar det angivna vision::code objektet.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Tar en ögonblicksbild och lagrar endast det största angivna antalet objekt som matchar det angivna vision::signature objektet.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parameter

Typ

Beskrivning

id

uint32_t

Signatur-ID-numret att söka efter.

cc

code &

En referens till ett vision::code -objekt att söka efter.

sig

signature &

En referens till ett vision::signature objekt att söka efter.

count

uint32_t

Det maximala antalet objekt att detektera.

Return Values

Returnerar int32_t som representerar antalet matchande objekt som upptäckts.

Notes
  • Visionsensorn måste ta en ögonblicksbild innan objektdata kan nås.

  • När count anges lagras endast de största detekterade objekten (upp till den angivna mängden).

Exempel

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#

Returnerar om synsensorn är ansluten till IQ-hjärnan (2:a generationen).

Available Functions
bool installed();

Parameters

Den här funktionen tar inga parametrar.

Return Values

Returnerar ett booleskt värde som anger om visionssensorn är ansluten:

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

Fastigheter#

Calling takeSnapshot updates the Vision Sensor’s detection results. Each snapshot refreshes the objects array, which contains the detected objects for the requested Color Signature or Color Code.

Visionsensordata nås via egenskaper hos objekt som lagras i Vision1.objects[index], där index börjar vid 0.

Visionsensorns bildupplösning är 316 x 212 pixlar. Objektets position och storleksegenskaper rapporteras i pixelenheter i förhållande till sensorns aktuella vy.

Följande fastigheter är tillgängliga:

  • largestObject — Väljer det största detekterade objektet från den senaste ögonblicksbilden.

  • objectCount — Returnerar antalet giltiga objekt som lagrats i objects

  • objects — Matris med detekterade objekt uppdaterad av takeSnapshot.

  • .exists — Om objektposten innehåller giltiga data.

  • .width — Width of the detected object in pixels.

  • .height — Height of the detected object in pixels.

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

  • .centerY — Y position of the object’s center in pixels.

  • .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 — Orientering av den detekterade färgkoden i grader (i förekommande fall).

largestObject#

Hämtar det största detekterade objektet från matrisen objects.

Den här metoden kan användas för att alltid hämta det största objektet från objects utan att ange ett index.

Syntax
VisionSensor.largestObject

Components

Komponent

Beskrivning

VisionSensor

Namnet på din Vision Sensor-instans.

Exempel

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#

Returnerar antalet objekt i arrayen objects som ett heltal.

Syntax
VisionSensor.objectCount

Components

Komponent

Beskrivning

VisionSensor

Namnet på din Vision Sensor-instans.

Exempel

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 är en array som innehåller de upptäckta objekten från det senaste anropet till takeSnapshot.

Varje element i arrayen representerar ett detekterat objekt och ger åtkomst till dess egenskaper, såsom width, height, centerX med flera.

Objekt är ordnade från störst till minst (efter bredd), med början vid index 0.

Syntax
VisionSensor.objects[index].property

Components

Komponent

Beskrivning

VisionSensor

Namnet på din Vision Sensor-instans.

index

Objektindexet i arrayen. Indexet börjar vid 0.

property

En av de tillgängliga objektegenskaperna.

.existerar#

.exists returnerar om det angivna objektindexet innehåller ett giltigt detekterat objekt.

Åtkomst

SensorName.objects[index].exists

Returvärden

Returnerar ett booleskt värde som anger om det angivna objektindexet innehåller ett giltigt detekterat objekt:

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

Exempel

// 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); 
}

.bredd#

.width returnerar bredden på det detekterade objektet.

Åtkomst

SensorName.objects[index].width

Returvärden

Returnerar ett int som representerar bredden på det detekterade objektet i pixlar. Värdet varierar från 1 till 316.

Exempel

// 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);
}

.höjd#

.height returnerar höjden på det detekterade objektet.

Åtkomst

SensorName.objects[index].height

Returvärden

Returnerar ett int som representerar höjden på det detekterade objektet i pixlar. Värdet varierar från 1 till 212.

Exempel

// 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 returnerar x-koordinaten för centrum av det detekterade objektet.

Åtkomst

SensorName.objects[index].centerX

Returvärden

Returns an int representing the x-coordinate of the object’s center in pixels. The value ranges from 0 to 316.

Exempel

// 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 returnerar y-koordinaten för det detekterade objektets centrum.

Åtkomst

SensorName.objects[index].centerY

Returvärden

Returns an int representing the y-coordinate of the object’s center in pixels. The value ranges from 0 to 212.

Exempel

// 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 returnerar x-koordinaten för det övre vänstra hörnet av det detekterade objektets avgränsningsram.

Åtkomst

SensorName.objects[index].originX

Returvärden

Returnerar ett int som representerar x-koordinaten för det övre vänstra hörnet av objektets avgränsningsram i pixlar. Värdet varierar från 0 till 316.

Exempel

// 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); 
}

.ursprungY#

.originY returnerar y-koordinaten för det övre vänstra hörnet av det detekterade objektets avgränsningsram.

Åtkomst

SensorName.objects[index].originY

Returvärden

Returnerar ett int som representerar y-koordinaten för det övre vänstra hörnet av objektets avgränsningsram i pixlar. Värdet varierar från 0 till 212.

Exempel

// 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);
}

.vinkel#

.angle returnerar orienteringen för den detekterade färgkoden.

Åtkomst

SensorName.objects[index].angle

Returvärden

Returns a double representing the orientation of the detected Color Code in degrees. The value ranges from 0 to 359.9.

Exempel

// 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);
}