Senzor pro vidění s umělou inteligencí#

Zavedení#

Třída aivision se používá k ovládání a přístupu k datům ze senzoru EXP AI Vision. Senzor AI Vision dokáže detekovat:

  • Klasifikace umělé inteligence (například herní objekty)

  • ID tagů April

  • Vlastní barevné podpisy

  • Vlastní barevné kódy

Poskytuje data o objektu včetně polohy, velikosti, orientace, ID klasifikace a skóre spolehlivosti.

Senzor zpracovává vizuální informace pomocí integrovaného modelu umělé inteligence vybraného v nástroji AI Vision Utility v rámci VEXcode. Vybraný model určuje, které klasifikace umělé inteligence senzor dokáže detekovat. Při použití VS Code musí být model umělé inteligence nejprve nakonfigurován ve VEXcode, než jej lze použít ve vašem programu. Detekované objekty jsou vráceny prostřednictvím pole objects po volání funkce takeSnapshot.

Konstruktory tříd#

aivision(
  int32_t index,
  Args&... sigs );

Parametry#

Parametr

Typ

Popis

index

int32_t

Inteligentní port, ke kterému je připojen senzor AI Vision, zapsaný jako PORTx, kde x je číslo portu (například PORT1).

sigs

colordesc, codedesc, or AI constants

Jeden nebo více typů detekce, které mají být registrovány senzorem:

  • aivision::ALL_AIOBJS — Všechny klasifikace AI
  • aivision::ALL_TAGS — Všechna ID AprilTag
  • aivision::colordesc — Vlastní barevný podpis
  • aivision::codedesc — Vlastní barevný kód

Modely a klasifikace umělé inteligence#

Senzor AI Vision dokáže detekovat různé objekty s určitými klasifikacemi AI. V závislosti na modelu klasifikace AI vybraném při konfiguraci senzoru AI Vision v okně Zařízení lze detekovat různé objekty. Aktuálně dostupné modely jsou:

Prvky pro učebnu

Číslo průkazu totožnosti

Klasifikace umělé inteligence

0

blueBall

1

greenBall

2

redBall

3

blueRing

4

greenRing

5

redRing

6

blueCube

7

greenCube

8

redCube

Vysoké sázky v robotické soutěži VEX V5

Číslo průkazu totožnosti

Klasifikace umělé inteligence

0

mobileGoal

1

redRing

2

blueRing

Odpor vůči soutěži v robotice VEX V5

Číslo průkazu totožnosti

Klasifikace umělé inteligence

0

blueBlock

1

redBlock

Přerušení robotické soutěže VEX V5

Číslo průkazu totožnosti

Klasifikace umělé inteligence

0

redBluePin

1

blueYellowPin

2

redYellowPin

3

yellowPin

4

cup

Příklady#

// Create Color Signatures
aivision::colordesc AIVision1__greenBox(
    1,      // index
    85,     // red
    149,    // green
    46,     // blue
    23,     // hangle
    0.23 ); // hdsat

aivision::colordesc AIVision1__blueBox(
    2,      // index
    77,     // red
    135,    // green
    125,    // blue
    27,     // hangle
    0.29 ); // hdsat

// Create a Color Code from two color signatures
aivision::codedesc AIVision1__greenBlue(
    1,                    // code index
    AIVision1__greenBox,  // first color signature
    AIVision1__blueBox ); // second color signature

// Create the AI Vision Sensor instance
aivision AIVision1(
    PORT11,                  // Smart Port
    AIVision1__greenBlue,    // color code
    aivision::ALL_AIOBJS );  // enable AI Classifications

Členské funkce#

Třída aivision obsahuje následující členské funkce:

  • takeSnapshot — Zachycuje data pro konkrétní barevný podpis, barevný kód, skupinu klasifikace AI nebo skupinu ID AprilTag.

  • installed — Vrátí, zda je AI Vision Sensor připojen k EXP Brain.

Pro přístup k datům detekovaného objektu po volání takeSnapshot použijte dostupné Properties.

Před voláním jakékoli členské funkce aivision je nutné vytvořit instanci aivision , jak je znázorněno níže:

/* This constructor is required when using VS Code.
AI Vision Sensor configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */


// Create Color Signatures
aivision::colordesc AIVision1__greenBox(
    1,      // index
    85,     // red
    149,    // green
    46,     // blue
    23,     // hangle
    0.23 ); // hdsat

aivision::colordesc AIVision1__blueBox(
    2,      // index
    77,     // red
    135,    // green
    125,    // blue
    27,     // hangle
    0.29 ); // hdsat

// Create a Color Code from two color signatures
aivision::codedesc AIVision1__greenBlue(
    1,                    // code index
    AIVision1__greenBox,  // first color signature
    AIVision1__blueBox ); // second color signature

// Create the AI Vision Sensor instance
aivision AIVision1(
    PORT1,                   // Smart Port
    AIVision1__greenBlue,    // color code
    aivision::ALL_AIOBJS );  // enable AI Classifications

takeSnapshot#

Zachytí obrázek ze senzoru AI Vision, zpracuje ho pomocí vybraného modelu AI nebo nakonfigurovaných barevných podpisů a aktualizuje pole objects.

Každé volání aktualizuje pole objects nejnovějšími výsledky detekce. Objekty jsou seřazeny od největšího po nejmenší (podle šířky), počínaje indexem 0Pokud nejsou detekovány žádné objekty, bude objectCount mít 0 a objects[i].exists bude mít false.

1 — Pořídí snímek pomocí ID objektu a typu objektu.

int32_t takeSnapshot(
  uint32_t id,
  objectType type,
  uint32_t count );

2 — Pořídí snímek s použitím Barevného podpisu.

int32_t takeSnapshot(
  const colordesc &desc,
  int32_t count = 8 );

3 — Pořídí snímek pomocí Barevného kódu.

int32_t takeSnapshot(
  const codedesc &desc,
  int32_t count = 8 );

4 — Pořídí snímek s použitím AprilTag ID.

int32_t takeSnapshot(
  const tagdesc &desc,
  int32_t count = 8 );

5 — Pořídí snímek pomocí klasifikace umělé inteligence.

int32_t takeSnapshot(
  const aiobjdesc &desc,
  int32_t count = 8 );

6 — Pořídí snímek pomocí deskriptoru objektu.

int32_t takeSnapshot(
  const objdesc &desc,
  int32_t count = 8 );

Parameters

Parametr

Typ

Popis

id

uint32_t

The identifier of the object to detect when using the (id, type, count) function. The meaning depends on type:

  • colorObject — Color Descriptor index (1–7)
  • codeObject — Color Code index (1–8)
  • modelObject — AI Classification ID
  • tagObject — AprilTag ID (0–36)

Note: In VEXcode, AI Classification names (such as blueBall) may be used directly. In VS Code, the numeric ID must be used.

type

objectType

Určuje kategorii objektu přidruženého k id:

  • objectType::tagObject — Detekuje ID AprilTag
  • objectType::colorObject — Detekuje Barevné podpisy
  • objectType::codeObject — Detekuje Barevné kódy
  • objectType::modelObject — Detekuje Klasifikace AI
  • objectType::allObject — Detekuje vše, co senzor dokáže rozpoznat

desc

colordesc &, codedesc &, tagdesc &, aiobjdesc &, or objdesc &

Deskriptor používaný k detekci specifického objektu. Předává se přímo na takeSnapshot, například:

  • AIVision1.takeSnapshot(AIVision1__greenBox);
  • AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
Předdefinované konstanty deskriptoru:
  • aivision::ALL_TAGS — Detekuje všechna ID AprilTag
  • aivision::ALL_COLORS — Detekuje všechny nakonfigurované Barevné podpisy
  • aivision::ALL_CODES — Detekuje všechny nakonfigurované Barevné kódy
  • aivision::ALL_AIOBJS — Detekuje všechny Klasifikace AI
  • aivision::ALL_OBJECTS — Detekuje vše, co senzor dokáže rozpoznat

count

uint32_t / int32_t

Maximální počet objektů uložených ze snímku. Výchozí hodnota je 8.

Návratové hodnoty

Vrací hodnotu int32_t představující počet detekovaných objektů odpovídajících zadanému typu signatury nebo detekce.

poznámek

  • Před přístupem k datům objektu musí senzor s umělou inteligencí pořídit snímek.

  • Pole objects se obnovuje při každém volání.

  • Pokud je zadána hodnota count , ukládají se pouze největší detekované objekty (do zadaného počtu).

Klasifikace AI závisí na modelu vybraném v nástroji AI Vision Utility ve VEXcode.

Příklady

// Move forward if an object is detected
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    Drivetrain.driveFor(forward, 50, mm);
  }
  wait(50, msec);
}

installed#

Vrací, zda je senzor AI Vision připojen k EXP Brain.

Dostupné funkce

bool installed();

Parametry

Tato funkce nepřijímá žádné parametry.

Návratové hodnoty

Vrací booleovskou hodnotu označující, zda je připojen senzor AI Vision:

  • true — Snímač AI Vision je připojen.

  • false — Snímač AI Vision není připojen.

// Display a message if the AI Vision Sensor is connected
if (AIVision1.installed()){
  Brain.Screen.print("Installed!");
}

Nemovitosti#

Voláním takeSnapshot se aktualizují výsledky detekce senzoru AI Vision. Každý snímek aktualizuje pole objects , které obsahuje detekované objekty pro požadovanou klasifikaci AI, barevný podpis, barevný kód nebo ID AprilTag.

K datům AI Vision se přistupuje prostřednictvím vlastností objektů uložených v AIVisionSensor.objects[index], kde index začíná na 0.

Objekty jsou seřazeny od největšího po nejmenší (podle plochy).

Rozlišení obrazu z AI Vision Sensor je 320 × 240 pixelů1Hodnoty polohy a velikosti objektu jsou uváděny v pixelech vzhledem k aktuálnímu pohledu senzoru.

K dispozici jsou následující vlastnosti:

  • objectCount — Vrátí počet detekovaných objektů z nejnovějšího snímku.

  • largestObject — Vybere největší detekovaný objekt z nejnovějšího snímku.

  • objects — Pole obsahující detekované objekty aktualizované funkcí takeSnapshot.

  • .exists — Zda položka objektu obsahuje platná data.

  • .width — Šířka detekovaného objektu v pixelech.

  • .height — Výška detekovaného objektu v pixelech.

  • .centerX — Pozice středu objektu na souřadnici X v pixelech.

  • .centerY — Pozice středu objektu na souřadnici Y v pixelech.

  • .originX — Pozice levého horního rohu objektu na souřadnici X v pixelech.

  • .originY — Pozice Y levého horního rohu objektu v pixelech.

  • .angle — Orientace barevného kódu nebo ID AprilTag ve stupních.

  • .id — ID klasifikace nebo ID AprilTag.

  • .score — Skóre spolehlivosti pro klasifikace umělé inteligence.

objectCount#

Funkce objectCount vrací počet položek v poli objects jako celé číslo.

Syntax
AIVisionSensor.objectCount

Components

Komponent

Popis

AIVisionSensor

Název vaší instance senzoru AI Vision.

Příklady

// Display the number of detected objects
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    Brain.Screen.print("%d", AIVision1.objectCount);
  }
  wait(50, msec);
}

largestObject#

largestObject načte největší detekovaný objekt z pole objects.

Tuto metodu lze použít k tomu, aby se z objects vždy získal největší objekt bez zadání indexu.

Syntax
AIVisionSensor.largestObject

Components

Komponent

Popis

AIVisionSensor

Název vaší instance senzoru AI Vision.

Příklady

// Display the closest AprilTag ID
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);
  AIVision1.takeSnapshot(aivision::ALL_TAGS);
  if (AIVision1.objects[0].exists) {
    Brain.Screen.print("%d", AIVision1.largestObject.id);
  }
  wait(50, msec);
}

objects#

objects vrací pole detekovaných vlastností objektů. Pole se používá pro přístup ke specifickým hodnotám property jednotlivých objektů.

There are ten properties that are included with each object stored in the objects array after takeSnapshot is used.

Všechny hodnoty vlastností kromě id a score popisují polohu a velikost detekovaného objektu v pohledu senzoru AI Vision v okamžiku, kdy byl použit takeSnapshot Tyto hodnoty se měří v pixelech na základě rozlišení senzoru 320 x 240 pixelů.

Syntax
AIVisionSensor.objects[index].property

Components

Komponent

Popis

AIVisionSensor

Název vaší instance senzoru AI Vision.

index

Index objektu v poli. Index začíná na 0.

property

Jedna z dostupných vlastností objektu.

.existuje#

.exists vrací, zda zadaný index objektu obsahuje platný detekovaný objekt.

Přístup

SensorName.objects[index].exists

Návratové hodnoty

Vrací booleovskou hodnotu označující, zda zadaný index objektu obsahuje platný detekovaný objekt:

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

Příklady

// Move forward if an object is detected
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    Drivetrain.driveFor(forward, 50, mm);
  }
  wait(50, msec);
}

.šířka#

.width vrací šířku detekovaného objektu.

Přístup

SensorName.objects[index].width

Návratové hodnoty

Vrací hodnotu int16_t představující šířku detekovaného objektu v pixelech. Hodnota se pohybuje od 1 do 320.

Příklady

// Approach an object until it's at least 100 pixels wide
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].width < 100) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.výška#

.height vrací výšku detekovaného objektu.

Přístup

SensorName.objects[index].height

Návratové hodnoty

Vrací hodnotu int16_t představující výšku detekovaného objektu v pixelech. Hodnota se pohybuje v rozmezí od 1 do 240.

Příklady

// Approach an object until it's at least 90 pixels tall
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].height < 90) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.centerX#

.centerX vrací souřadnici x středu detekovaného objektu.

Přístup

SensorName.objects[index].centerX

Návratové hodnoty

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

Příklady

// Turn until an object is directly in front of the sensor
Drivetrain.setTurnVelocity(10, percent);
Drivetrain.turn(right);
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].centerX > 140 && AIVision1.objects[0].centerX < 180) {
      Drivetrain.stop();
    }
  }
  wait(10, msec);
}

.centerY#

.centerY vrací souřadnici y středu detekovaného objektu.

Přístup

SensorName.objects[index].centerY

Návratové hodnoty

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

Příklady

// Approach an object until it's close to the sensor
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].centerY < 150) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.úhel#

.angle vrací orientaci detekovaného barevného kódu nebo ID AprilTag.

Přístup

SensorName.objects[index].angle

Návratové hodnoty

Returns a float representing the rotation of the detected Color Code or AprilTag ID in degrees. The value ranges from 0 to 359.9.

Příklady

// Turn left or right depending on how a configured
// Color Code is rotated
while (true) {
  AIVision1.takeSnapshot(AIVision1__redBlue);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].angle > 50 && AIVision1.objects[0].angle < 100) {
      Drivetrain.turn(right);
    }
    else if (AIVision1.objects[0].angle > 270 && AIVision1.objects[0].angle < 330) {
      Drivetrain.turn(left);
    }
    else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.originX#

.originX vrací souřadnici x levého horního rohu ohraničujícího rámečku detekovaného objektu.

Přístup

SensorName.objects[index].originX

Návratové hodnoty

Returns an int16_t representing the x-coordinate of the object’s bounding box origin in pixels. The value ranges from 0 to 320.

Příklady

// Display if an object is to the left or the right
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].originX < 120) {
      Brain.Screen.print("To the left!");
    } else {
      Brain.Screen.print("To the right!");
    }
  } else {
    Brain.Screen.print("No objects");
  }
  wait(100, msec);
}

.originY#

.originY vrací souřadnici y levého horního rohu ohraničujícího rámečku detekovaného objektu.

Přístup

SensorName.objects[index].originY

Návratové hodnoty

Returns an int16_t representing the y-coordinate of the object’s bounding box origin in pixels. The value ranges from 0 to 240.

Příklady

// Display if an object is close or far
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].originY < 110) {
      Brain.Screen.print("Close");
    } else {
      Brain.Screen.print("Far");
    }
  }
  wait(100, msec);
}

.id#

.id vrací detekované ID AprilTag nebo ID klasifikace AI.

Přístup

SensorName.objects[index].id

Návratové hodnoty

Vrací hodnotu int32_t představující ID detekovaného objektu:

Příklady

// Move forward when AprilTag ID 1 is detected
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_TAGS);
  if (AIVision1.objects[0].exists) {
    if (AIVision1.objects[0].id == 1) {
      Drivetrain.drive(forward);
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.skóre#

.score vrací skóre spolehlivosti detekované klasifikace AI.

Přístup

SensorName.objects[index].score

Návratové hodnoty

Vrací hodnotu int16_t , která označuje skóre spolehlivosti detekované klasifikace AI mezi 1 a 100.

Nižší skóre znamená, že si je senzor méně jistý detekovaným objektem, zatímco vyšší skóre znamená, že si je senzor jistější.

Příklady

// Display if a score is confident
while (true) {
  AIVision1.takeSnapshot(aivision::ALL_AIOBJS);

  if (AIVision1.objects[0].exists) {
    Brain.screen.clearScreen();
    Brain.screen.setCursor(1, 1);

    if (AIVision1.objects[0].score > 95) {
      Brain.Screen.print("Confident");
    } else {
      Brain.Screen.print("Not confident");
    }
  }
  wait(50, msec);
}