Látóérzékelő#

Bevezetés#

A vision osztály az EXP Vision Sensor adatainak vezérlésére és elérésére szolgál. Ez az érzékelő a látóterében lévő színaláírásokat érzékeli és követi nyomon, lehetővé téve a robot számára, hogy valós időben azonosítsa a célpontokat és reagáljon a vizuális információkra.

A vizuális érzékelő több jellegzetes objektumot képes egyszerre érzékelni, és olyan információkat szolgáltat, mint az objektum pozíciója, szélessége, magassága és középpontjának koordinátái.

Osztálykonstruktorok#

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

Osztálydestruktor#

Megsemmisíti a vision objektumot és felszabadítja a hozzá tartozó erőforrásokat.

~vision();

Paraméterek#

Paraméter

Típus

Leírás

index

int32_t

Az az intelligens port, amelyhez a vizuális érzékelő csatlakozik, PORTxformátumban írva, ahol x a port száma (például PORT1).

bright

uint8_t

A vizuális érzékelő fényerőszintje.

sigs

vision::signature or vision::code objects

Egy vagy több vision::signature vagy vision::code objektum regisztrálása a szenzorral.

Példák#

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

Tagfüggvények#

A vision osztály a következő tagfüggvényeket tartalmazza:

  • takeSnapshot — Egy adott színaláíráshoz vagy színkódhoz tartozó adatokat rögzít.

  • installed — Azt jelzi, hogy a vizuális érzékelő csatlakoztatva van-e az EXP agyhoz.

A takeSnapshot meghívása után az észlelt objektumadatok eléréséhez használd a rendelkezésre álló Properties tulajdonságot.

Bármely vision tagfüggvény meghívása előtt létre kell hozni egy vision példányt, az alábbiak szerint:

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

Képet rögzít a vizuális érzékelőről, feldolgozza azt az aláírás alapján, és frissíti a objects tömböt. Ez a metódus korlátozhatja a pillanatképben rögzített objektumok számát is.

A objects tömb a 0 indexszel kezdődően szélesség szerint a legnagyobbtól a legkisebbig rendezett objektumokat tárolja. Minden objektum properties tulajdonsága a saját indexével érhető el. Ha nem található egyező objektum, akkor a objectCount értéke 0, az objects[i].exists pedig hamis lesz.

Available Functions

1 — Pillanatképet készít, és megkeresi a megadott aláírás-azonosítónak megfelelő objektumokat.

int32_t takeSnapshot( uint32_t id );

2 — Pillanatképet készít, és megkeresi a megadott vision::code objektumnak megfelelő objektumokat.

int32_t takeSnapshot( code &cc );

3 — Pillanatképet készít, és megkeresi a megadott vision::signature objektumnak megfelelő objektumokat.

int32_t takeSnapshot( signature &sig );

4 — Pillanatképet készít, és csak a megadott számú, az aláírás-azonosítónak megfelelő objektumot tárolja.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Pillanatképet készít, és csak a megadott vision::code objektumnak megfelelő objektumok legnagyobb megadott számú elemét tárolja.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Pillanatképet készít, és csak a megadott vision::signature objektumnak megfelelő objektumok legnagyobb megadott számú elemét tárolja.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Paraméter

Típus

Leírás

id

uint32_t

A keresendő aláírás-azonosító szám.

cc

code &

Egy vision::code objektumra mutató hivatkozás a kereséshez.

sig

signature &

Egy vision::signature objektumra mutató hivatkozás a kereséshez.

count

uint32_t

Az észlelendő objektumok maximális száma.

Return Values

Egy int32_t értéket ad vissza, amely az észlelt egyező objektumok számát jelöli.

Notes
  • A vizuális érzékelőnek pillanatképet kell készítenie, mielőtt hozzáférhetne az objektumadatokhoz.

  • Ha count értéket adjuk meg, akkor csak a legnagyobb észlelt objektumok (a megadott mennyiségig) kerülnek tárolásra.

Példa

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#

Visszaadja, hogy a Vision Sensor csatlakoztatva van-e az EXP Brainhez.

Available Functions
bool installed();

Parameters

Ez a függvény nem fogad el paramétereket.

Return Values

Egy logikai értéket ad vissza, amely jelzi, hogy a Vision Sensor csatlakoztatva van-e:

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

Tulajdonságok#

A takeSnapshot meghívása frissíti a Vision Sensor érzékelési eredményeit. Minden pillanatfelvétel frissíti a objects tömböt, amely a kért színaláíráshoz vagy színkódhoz tartozó érzékelt objektumokat tartalmazza.

A Vision Sensor adataihoz Vision1.objects[index]mappában tárolt objektumok tulajdonságain keresztül lehet hozzáférni, ahol index index 0 -nél kezdődik.

A Vision Sensor képfelbontása 316 x 212 pixel. Az objektum pozícióját és méretét a rendszer pixelegységben adja meg az érzékelő aktuális nézetéhez viszonyítva.

A következő ingatlanok érhetők el:

  • largestObject — Kiválasztja a legutóbbi pillanatképből a legnagyobb észlelt objektumot.

  • objectCount — Visszaadja a objects.

  • objects — takeSnapshot által frissített, észlelt objektumok tömbje.

  • .exists — Azt jelzi, hogy az objektumbejegyzés érvényes adatokat tartalmaz-e.

  • .width — A detektált objektum szélessége pixelben.

  • .height — A detektált objektum magassága pixelben.

  • .centerX — Az objektum középpontjának X pozíciója pixelben.

  • .centerY — Az objektum középpontjának Y pozíciója pixelben.

  • .originX — Az objektum bal felső sarkának X pozíciója pixelben.

  • .originY — Az objektum bal felső sarkának Y pozíciója pixelben.

  • .angle — A detektált színkód tájolása fokban (ha alkalmazható).

largestObject#

A legnagyobb észlelt objektumot kéri le a objects tömbből.

Ez a metódus arra használható, hogy mindig a legnagyobb objektumot kapjuk meg objects közül index megadása nélkül.

Syntax
VisionSensor.largestObject

Components

Összetevő

Leírás

VisionSensor

A Vision Sensor példány neve.

Példa

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#

Visszaadja a objects tömbben lévő elemek számát egész számként.

Syntax
VisionSensor.objectCount

Components

Összetevő

Leírás

VisionSensor

A Vision Sensor példány neve.

Példa

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 egy tömb, amely a takeSnapshot legutóbbi hívásából származó észlelt objektumokat tartalmazza.

A tömb minden eleme egy detektált objektumot jelöl, és hozzáférést biztosít annak tulajdonságaihoz, például a width, height, centerX és egyebekhez.

Az objektumok a legnagyobbtól a legkisebbig vannak rendezve (szélesség szerint), 0 indextől kezdve.

Syntax
VisionSensor.objects[index].property

Components

Összetevő

Leírás

VisionSensor

A Vision Sensor példány neve.

index

Az objektum indexe a tömbben. Az index 0 -gyel kezdődik.

property

Az elérhető objektumtulajdonságok egyike.

.létezik#

.exists függvény visszaadja, hogy a megadott objektumindex tartalmaz-e érvényes észlelt objektumot.

Hozzáférés

SensorName.objects[index].exists

Visszatérési értékek

Egy logikai értéket ad vissza, amely jelzi, hogy a megadott objektumindex tartalmaz-e érvényes észlelt objektumot:

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

Példa

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

.szélesség#

.width visszaadja az észlelt objektum szélességét.

Hozzáférés

SensorName.objects[index].width

Visszatérési értékek

Egy int értéket ad vissza, amely a detektált objektum szélességét jelöli pixelben. Az érték 1 és 316 között lehet.

Példa

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

.magasság#

.height visszaadja az észlelt objektum magasságát.

Hozzáférés

SensorName.objects[index].height

Visszatérési értékek

Egy int értéket ad vissza, amely a detektált objektum magasságát jelöli pixelben. Az érték 1 és 212 között lehet.

Példa

// 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 visszaadja a detektált objektum középpontjának x koordinátáját.

Hozzáférés

SensorName.objects[index].centerX

Visszatérési értékek

Egy int értéket ad vissza, amely az objektum középpontjának x koordinátáját jelöli pixelben. Az érték 0 és 316 között lehet.

Példa

// 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 visszaadja a detektált objektum középpontjának y koordinátáját.

Hozzáférés

SensorName.objects[index].centerY

Visszatérési értékek

Egy int értéket ad vissza, amely az objektum középpontjának y koordinátáját jelöli pixelben. Az érték 0 és 212 között lehet.

Példa

// 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 visszaadja az észlelt objektum határolókeretének bal felső sarkának x koordinátáját.

Hozzáférés

SensorName.objects[index].originX

Visszatérési értékek

Egy int értéket ad vissza, amely az objektum határolókeretének bal felső sarkának x koordinátáját jelöli pixelben. Az érték 0 és 316 között lehet.

Példa

// 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 visszaadja a detektált objektum határolókeretének bal felső sarkának y koordinátáját.

Hozzáférés

SensorName.objects[index].originY

Visszatérési értékek

Egy int értéket ad vissza, amely az objektum határolókeretének bal felső sarkának y koordinátáját jelöli pixelben. Az érték 0 és 212 között lehet.

Példa

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

.szög#

.angle visszaadja a detektált színkód orientációját.

Hozzáférés

SensorName.objects[index].angle

Visszatérési értékek

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

Példa

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