Redzes sensors#

Ievads#

vision klase tiek izmantota, lai kontrolētu un piekļūtu datiem no IQ (2. paaudzes) redzes sensora. Šis sensors nosaka un izseko krāsu parakstus savā redzes laukā, ļaujot jūsu robotam identificēt mērķus un reaģēt uz vizuālo informāciju reāllaikā.

Redzes sensors var vienlaikus noteikt vairākus signatūrobjektus un sniegt informāciju, piemēram, par objekta atrašanās vietu, platumu, augstumu un centra koordinātām.

Klases konstruktori#

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

Klases iznīcinātājs#

Iznīcina vision objektu un atbrīvo saistītos resursus.

~vision();

Parametri#

Parametrs

Tips

Apraksts

index

int32_t

Viedports, kuram ir pievienots redzes sensors, kas tiek rakstīts kā PORTx, kur x ir porta numurs (piemēram, PORT1).

bright

uint8_t

Redzes sensora spilgtuma līmenis.

sigs

vision::signature or vision::code objects

Viens vai vairāki vision::signature vai vision::code objekti, kas jāreģistrē sensorā.

Piemēri#

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

Dalībnieku funkcijas#

vision klasē ir iekļautas šādas dalībfunkcijas:

  • takeSnapshot — Iegūst datus konkrētam krāsu parakstam vai krāsu kodam.

  • installed — Vai redzes sensors ir savienots ar IQ (2. paaudzes) smadzenēm.

Lai piekļūtu noteiktajiem objekta datiem pēc takeSnapshot izsaukšanas, izmantojiet pieejamās Properties īpašības.

Pirms jebkuru vision dalībfunkciju izsaukšanas ir jāizveido vision instance, kā parādīts zemāk:

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

Uztver attēlu no redzes sensora, apstrādā to, pamatojoties uz parakstu, un atjaunina masīvu objects Šī metode var arī ierobežot momentuzņēmumā uzņemto objektu skaitu.

Masīvs objects glabā objektus, kas sakārtoti no lielākā līdz mazākajam pēc platuma, sākot ar indeksu 0. Katra objekta properties var piekļūt, izmantojot tā indeksu. Ja netiek atrasti atbilstoši objekti, objectCount būs 0 un objects[i].exists būs false.

Available Functions

1 — Uzņem momentuzņēmumu un meklē objektus, kas atbilst norādītajam paraksta ID.

int32_t takeSnapshot( uint32_t id );

2 — Uzņem momentuzņēmumu un meklē objektus, kas atbilst norādītajam vision::code objektam.

int32_t takeSnapshot( code &cc );

3 — Uzņem momentuzņēmumu un meklē objektus, kas atbilst norādītajam vision::signature objektam.

int32_t takeSnapshot( signature &sig );

4 — Uzņem momentuzņēmumu un saglabā tikai lielāko norādīto objektu skaitu, kas atbilst paraksta ID.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Uzņem momentuzņēmumu un saglabā tikai lielāko norādīto objektu skaitu, kas atbilst norādītajam vision::code objektam.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Uzņem momentuzņēmumu un saglabā tikai lielāko norādīto objektu skaitu, kas atbilst norādītajam vision::signature objektam.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parametrs

Tips

Apraksts

id

uint32_t

Meklējamais paraksta ID numurs.

cc

code &

Atsauce uz vision::code objektu, ko meklēt.

sig

signature &

Atsauce uz vision::signature objektu, ko meklēt.

count

uint32_t

Maksimālais detektējamo objektu skaits.

Return Values

Atgriež int32_t , kas apzīmē atrasto atbilstošo objektu skaitu.

Notes
  • Pirms piekļuves objekta datiem redzes sensoram ir jāuzņem momentuzņēmums.

  • Ja ir norādīts count , tiek saglabāti tikai lielākie atklātie objekti (līdz norādītajam skaitam).

piemēri

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#

Atgriež, vai redzes sensors ir savienots ar IQ (2. paaudzes) smadzenēm.

Available Functions
bool installed();

Parameters

Šī funkcija nepieņem nekādus parametrus.

Return Values

Atgriež Būla vērtību, kas norāda, vai ir pievienots redzes sensors:

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

Īpašumi#

Izsaucot takeSnapshot, tiek atjaunināti redzes sensora noteikšanas rezultāti. Katrs momentuzņēmums atsvaidzina objects masīvu, kurā ir norādītie pieprasītā krāsu paraksta vai krāsu koda noteiktie objekti.

Redzes sensora datiem piekļūst, izmantojot objektu īpašības, kas saglabātas failā Vision1.objects[index], kur index sākas ar 0.

Redzes sensora attēla izšķirtspēja ir 316 x 212 pikseļi. Objekta pozīcijas un izmēra īpašības tiek ziņotas pikseļu vienībās attiecībā pret sensora pašreizējo skatu.

Ir pieejami šādi īpašumi:

  • largestObject — Atlasa lielāko noteikto objektu no jaunākā momentuzņēmuma.

  • objectCount — Atgriež derīgo objektu skaitu, kas saglabāti objects.

  • objects — Noteikto objektu masīvs, ko atjaunina takeSnapshot.

  • .exists — Vai objekta ieraksts satur derīgus datus.

  • .width — Noteiktā objekta platums pikseļos.

  • .height — Noteiktā objekta augstums pikseļos.

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

  • .centerY — objekta centra Y pozīcija pikseļos.

  • .originX — objekta augšējā kreisā stūra X pozīcija pikseļos.

  • .originY — objekta augšējā kreisā stūra Y pozīcija pikseļos.

  • .angle — Noteiktā krāsu koda orientācija grādos (ja piemērojams).

largestObject#

Izgūst lielāko noteikto objektu no objects masīva.

Šo metodi var izmantot, lai vienmēr iegūtu lielāko objektu no objects , nenorādot indeksu.

Syntax
VisionSensor.largestObject

Components

Komponents

Apraksts

VisionSensor

Jūsu redzes sensora instances nosaukums.

piemēri

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#

Atgriež elementu skaitu masīvā objects kā veselu skaitli.

Syntax
VisionSensor.objectCount

Components

Komponents

Apraksts

VisionSensor

Jūsu redzes sensora instances nosaukums.

piemēri

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 ir masīvs, kas satur no jaunākā takeSnapshot izsaukuma noteiktos objektus.

Katrs masīva elements attēlo noteiktu objektu un nodrošina piekļuvi tā īpašībām, piemēram, width, height, centerX un citām.

Objekti tiek sakārtoti no lielākā līdz mazākajam (pēc platuma), sākot ar indeksu 0.

Syntax
VisionSensor.objects[index].property

Components

Komponents

Apraksts

VisionSensor

Jūsu redzes sensora instances nosaukums.

index

Objekta indekss masīvā. Indekss sākas ar 0.

property

Viena no pieejamajām objekta īpašībām.

.pastāv#

.exists atgriež, vai norādītais objekta indekss satur derīgu noteiktu objektu.

Piekļuve

SensorName.objects[index].exists

Atgriešanas vērtības

Atgriež Būla vērtību, kas norāda, vai norādītais objekta indekss satur derīgu noteiktu objektu:

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

piemēri

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

.platums#

.width atgriež noteiktā objekta platumu.

Piekļuve

SensorName.objects[index].width

Atgriešanas vērtības

Atgriež skaitli int kas apzīmē noteiktā objekta platumu pikseļos. Vērtība ir no 1 līdz 316.

piemēri

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

.augstums#

.height atgriež noteiktā objekta augstumu.

Piekļuve

SensorName.objects[index].height

Atgriešanas vērtības

Atgriež skaitli int kas apzīmē noteiktā objekta augstumu pikseļos. Vērtība ir no 1 līdz 212.

piemēri

// 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 atgriež noteiktā objekta centra x koordinātu.

Piekļuve

SensorName.objects[index].centerX

Atgriešanas vērtības

Atgriež skaitli int kas apzīmē objekta centra x koordinātu pikseļos. Vērtība ir no 0 līdz 316.

piemēri

// 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 atgriež noteiktā objekta centra y koordinātu.

Piekļuve

SensorName.objects[index].centerY

Atgriešanas vērtības

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

piemēri

// 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 atgriež noteiktā objekta ierobežojošā lodziņa augšējā kreisā stūra x koordinātu.

Piekļuve

SensorName.objects[index].originX

Atgriešanas vērtības

Returns an int representing the x-coordinate of the top-left corner of the object’s bounding box in pixels. The value ranges from 0 to 316.

piemēri

// 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 atgriež noteiktā objekta ierobežojošā lodziņa augšējā kreisā stūra y koordinātu.

Piekļuve

SensorName.objects[index].originY

Atgriešanas vērtības

Returns an int representing the y-coordinate of the top-left corner of the object’s bounding box in pixels. The value ranges from 0 to 212.

piemēri

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

.leņķis#

.angle atgriež noteiktā krāsu koda orientāciju.

Piekļuve

SensorName.objects[index].angle

Atgriešanas vērtības

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

piemēri

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