Regėjimo jutiklis#

Įvadas#

vision klasė naudojama duomenims iš „V5 Vision Sensor“ valdyti ir gauti prieigą prie jų. Šis jutiklis aptinka ir seka spalvų parašus savo matymo lauke, leisdamas jūsų robotui atpažinti taikinius ir reaguoti į vaizdinę informaciją realiuoju laiku.

Regėjimo jutiklis gali vienu metu aptikti kelis objektus ir pateikti tokią informaciją kaip objekto padėtis, plotis, aukštis ir centro koordinatės.

Klasės konstruktoriai#

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

Klasės destruktorius#

Sunaikina vision objektą ir išlaisvina susijusius išteklius.

~vision();

Parametrai#

Parametras

Tipas

Aprašymas

index

int32_t

Išmanusis prievadas, prie kurio prijungtas regėjimo jutiklis, užrašomas kaip PORTx, kur x yra prievado numeris (pavyzdžiui, PORT1).

bright

uint8_t

Regėjimo jutiklio ryškumo lygis.

sigs

vision::signature or vision::code objects

Vienas ar keli vision::signature arba vision::code objektai, kuriuos reikia užregistruoti jutiklyje.

Pavyzdžiai#

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

Narių funkcijos#

vision klasė apima šias narines funkcijas:

  • takeSnapshot – fiksuoja duomenis, skirtus konkrečiam spalvos parašui arba spalvos kodui.

  • installed — Ar regėjimo jutiklis prijungtas prie „V5 Brain“.

Norėdami pasiekti aptiktų objektų duomenis iškvietę takeSnapshot, naudokite Properties.

Prieš iškviečiant bet kokias vision narių funkcijas, reikia sukurti vision egzempliorių, kaip parodyta žemiau:

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

Užfiksuoja vaizdą iš regėjimo jutiklio, apdoroja jį pagal parašą ir atnaujina objects masyvą. Šis metodas taip pat gali apriboti momentinėje nuotraukoje užfiksuotų objektų skaičių.

Masyve objects objektai saugomi išdėstyti nuo didžiausio iki mažiausio pagal plotį, pradedant indeksu 0. Kiekvieno objekto properties galima pasiekti naudojant jo indeksą. Jei nerandama jokių atitinkančių objektų, objectCount bus 0, o objects[i].exists bus „false“.

Available Functions

1 — Padaro momentinę kopiją ir ieško objektų, atitinkančių nurodytą parašo ID.

int32_t takeSnapshot( uint32_t id );

2 — Padaro momentinę kopiją ir ieško objektų, atitinkančių nurodytą vision::code objektą.

int32_t takeSnapshot( code &cc );

3 — Padaro momentinę kopiją ir ieško objektų, atitinkančių nurodytą vision::signature objektą.

int32_t takeSnapshot( signature &sig );

4 — Padaro momentinę kopiją ir išsaugo tik didžiausią nurodytą objektų, atitinkančių parašo ID, skaičių.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Padaro momentinę kopiją ir išsaugo tik didžiausią nurodytą objektų, atitinkančių nurodytą vision::code objektą, skaičių.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Padaro momentinę kopiją ir išsaugo tik didžiausią nurodytą objektų, atitinkančių nurodytą vision::signature objektą, skaičių.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parametras

Tipas

Aprašymas

id

uint32_t

Parašo ID numeris, kurio reikia ieškoti.

cc

code &

Nuoroda į vision::code objektą, kurio reikia ieškoti.

sig

signature &

Nuoroda į vision::signature objektą, kurio reikia ieškoti.

count

uint32_t

Didžiausias aptinkamų objektų skaičius.

Return Values

Grąžina int32_t , nurodantį aptiktų sutampančių objektų skaičių.

Notes
  • Prieš pasiekiant objekto duomenis, vaizdo jutiklis turi padaryti momentinę kopiją.

  • Kai nurodyta count , saugomi tik didžiausi aptikti objektai (iki nurodyto kiekio).

Pavyzdžių

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#

Grąžina, ar regėjimo jutiklis prijungtas prie „V5 Brain“.

Available Functions
bool installed();

Parameters

Ši funkcija nepriima jokių parametrų.

Return Values

Grąžina loginę reikšmę, nurodančią, ar prijungtas regėjimo jutiklis:

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

Ypatybės#

Iškviečiant takeSnapshot, atnaujinami regėjimo jutiklio aptikimo rezultatai. Kiekviena momentinė kopija atnaujina objects masyvą, kuriame yra aptikti objektai pagal prašomą spalvos parašą arba spalvos kodą.

„Vision Sensor“ duomenys pasiekiami per objektų, saugomų faile Vision1.objects[index], savybes, kur index prasideda nuo 0.

Regėjimo jutiklio vaizdo skiriamoji geba yra 316 x 212 pikselių. Objekto padėties ir dydžio savybės pateikiamos pikselių vienetais, atsižvelgiant į dabartinį jutiklio vaizdą.

Galima įsigyti šias savybes:

  • largestObject – Pasirenka didžiausią aptiktą objektą iš naujausios momentinės kopijos.

  • objectCount — Grąžina galiojančių objektų, saugomų objects skaičių.

  • objects — Aptiktų objektų masyvas, atnaujintas naudojant takeSnapshot.

  • .exists — Ar objekto įraše yra galiojančių duomenų.

  • .width — Aptikto objekto plotis pikseliais.

  • .height — Aptikto objekto aukštis pikseliais.

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

  • .centerY — objekto centro Y padėtis pikseliais.

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

  • .originY — objekto viršutinio kairiojo kampo Y padėtis pikseliais.

  • .angle — Orientation of the detected Color Code in degrees (when applicable).

largestObject#

Iš masyvo objects gauna didžiausią aptiktą objektą.

Šis metodas gali būti naudojamas norint visada gauti didžiausią objektą iš objects , nenurodant indekso.

Syntax
VisionSensor.largestObject

Components

Komponentas

Aprašymas

VisionSensor

Jūsų „Vision Sensor“ egzemplioriaus pavadinimas.

Pavyzdžių

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#

Grąžina elementų skaičių masyve objects kaip sveikąjį skaičių.

Syntax
VisionSensor.objectCount

Components

Komponentas

Aprašymas

VisionSensor

Jūsų „Vision Sensor“ egzemplioriaus pavadinimas.

Pavyzdžių

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 yra masyvas, kuriame yra aptikti objektai iš paskutinio takeSnapshot iškvietimo.

Kiekvienas masyvo elementas atitinka aptiktą objektą ir suteikia prieigą prie jo savybių, tokių kaip width, height, centerX ir kt.

Objektai yra rūšiuojami nuo didžiausio iki mažiausio (pagal plotį), pradedant nuo indekso 0.

Syntax
VisionSensor.objects[index].property

Components

Komponentas

Aprašymas

VisionSensor

Jūsų „Vision Sensor“ egzemplioriaus pavadinimas.

index

Objekto indeksas masyve. Indeksas prasideda nuo 0.

property

Viena iš galimų objekto savybių.

.egzistuoja#

.exists grąžina, ar nurodytame objekto indekse yra galiojantis aptiktas objektas.

Prieiga

SensorName.objects[index].exists

Grąžinamosios reikšmės

Grąžina loginę reikšmę, nurodančią, ar nurodytame objekto indekse yra galiojantis aptiktas objektas:

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

Pavyzdžių

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

.plotis#

.width grąžina aptikto objekto plotį.

Prieiga

SensorName.objects[index].width

Grąžinamosios reikšmės

Grąžina int nurodantį aptikto objekto plotį pikseliais. Reikšmė svyruoja nuo 1 iki 316.

Pavyzdžių

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

.aukštis#

.height grąžina aptikto objekto aukštį.

Prieiga

SensorName.objects[index].height

Grąžinamosios reikšmės

Grąžina int nurodantį aptikto objekto aukštį pikseliais. Reikšmė svyruoja nuo 1 iki 212.

Pavyzdžių

// 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 grąžina aptikto objekto centro x koordinatę.

Prieiga

SensorName.objects[index].centerX

Grąžinamosios reikšmės

Grąžina int reiškiantį objekto centro x koordinatę pikseliais. Reikšmė svyruoja nuo 0 iki 316.

Pavyzdžių

// 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 grąžina aptikto objekto centro y koordinatę.

Prieiga

SensorName.objects[index].centerY

Grąžinamosios reikšmės

Grąžina int reiškiantį objekto centro y koordinatę pikseliais. Reikšmė svyruoja nuo 0 iki 212.

Pavyzdžių

// 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 grąžina aptikto objekto ribojančio langelio viršutinio kairiojo kampo x koordinatę.

Prieiga

SensorName.objects[index].originX

Grąžinamosios reikšmės

Grąžina int reiškiantį objekto ribojančio langelio viršutinio kairiojo kampo x koordinatę pikseliais. Reikšmė svyruoja nuo 0 iki 316.

Pavyzdžių

// 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 grąžina aptikto objekto ribojančio langelio viršutinio kairiojo kampo y koordinatę.

Prieiga

SensorName.objects[index].originY

Grąžinamosios reikšmės

Grąžina int reiškiantį objekto ribojančio langelio viršutinio kairiojo kampo y koordinatę pikseliais. Reikšmė svyruoja nuo 0 iki 212.

Pavyzdžių

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

.kampas#

.angle grąžina aptikto spalvos kodo orientaciją.

Prieiga

SensorName.objects[index].angle

Grąžinamosios reikšmės

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

Pavyzdžių

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