AI 비전 센서#

소개#

클래스 aivision 은 EXP AI 비전 센서의 데이터를 제어하고 액세스하는 데 사용됩니다. AI 비전 센서는 다음을 감지할 수 있습니다.

  • AI 분류 (예: 게임 오브젝트)

  • AprilTag ID

  • 맞춤형 색상 시그니처

  • 사용자 지정 색상 코드

이 기능은 위치, 크기, 방향, 분류 ID 및 신뢰도 점수를 포함한 객체 데이터를 제공합니다.

센서는 VEXcode 내의 AI Vision Utility에서 선택한 온보드 AI 모델을 사용하여 시각 정보를 처리합니다. 선택된 모델은 센서가 감지할 수 있는 AI 분류를 결정합니다. VS Code를 사용하는 경우 프로그램에서 사용하기 전에 먼저 VEXcode에서 AI 모델을 구성해야 합니다. 감지된 객체는 objects가 호출된 후 takeSnapshot 배열을 통해 반환됩니다.

클래스 생성자#

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

매개변수#

매개변수

유형

설명

index

int32_t

AI 비전 센서가 연결된 스마트 포트는 PORTx형식으로 표기되며, 여기서 x 포트 번호입니다(예: PORT1).

sigs

colordesc, codedesc, or AI constants

센서에 등록할 하나 이상의 감지 유형:

  • aivision::ALL_AIOBJS — 모든 AI 분류
  • aivision::ALL_TAGS — 모든 AprilTag ID
  • aivision::colordesc — 사용자 지정 색상 시그니처
  • aivision::codedesc — 사용자 지정 색상 코드

AI 모델 및 분류#

AI 비전 센서는 특정 AI 분류를 통해 다양한 객체를 감지할 수 있습니다. 장치 창에서 AI 비전 센서를 구성할 때 선택한 AI 분류 모델에 따라 감지 가능한 객체가 달라집니다. 현재 사용 가능한 모델은 다음과 같습니다.

교실 구성 요소

신분증 번호

AI 분류

0

blueBall

1

greenBall

2

redBall

3

blueRing

4

greenRing

5

redRing

6

blueCube

7

greenCube

8

redCube

VEX V5 로봇 경진대회, 치열한 경쟁 속에서 펼쳐지는 대회

신분증 번호

AI 분류

0

mobileGoal

1

redRing

2

blueRing

VEX V5 로봇 경진대회 연기

신분증 번호

AI 분류

0

blueBlock

1

redBlock

VEX V5 로봇 경진대회 재정의

신분증 번호

AI 분류

0

redBluePin

1

blueYellowPin

2

redYellowPin

3

yellowPin

4

cup

예시#

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

회원 기능#

aivision 클래스는 다음과 같은 멤버 함수를 포함합니다.

  • takeSnapshot — 특정 색상 서명, 색상 코드, AI 분류 그룹 또는 AprilTag ID 그룹에 대한 데이터를 캡처합니다.

  • installed — AI 비전 센서가 EXP 브레인에 연결되어 있는지 여부를 반환합니다.

takeSnapshot를 호출한 후 감지된 객체 데이터에 액세스하려면 사용 가능한 Properties를 사용합니다.

aivision 멤버 함수를 호출하기 전에 아래와 같이 aivision 인스턴스를 생성해야 합니다.

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

AI 비전 센서에서 이미지를 캡처하고, 선택한 AI 모델 또는 구성된 색상 특징을 사용하여 처리한 다음, objects 배열을 업데이트합니다.

각 호출은 가장 최근의 감지 결과로 objects 객체 배열을 새로 고칩니다. 객체는 인덱스 0부터 시작하여 가장 큰 것부터 가장 작은 것 순으로 정렬됩니다. 객체가 감지되지 않으면 objectCount 는 0 되고 objects[i].exists false 됩니다.

1 — 객체 ID와 객체 유형을 사용하여 스냅샷을 생성합니다.

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

2 — 색상 서명을 사용하여 스냅샷을 찍습니다.

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

3 — 색상 코드를 사용하여 스냅샷을 찍습니다.

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

4 — AprilTag ID를 사용하여 스냅샷을 찍습니다.

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

5 — AI 분류를 사용하여 스냅샷을 찍습니다.

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

6 — 객체 디스크립터를 사용하여 스냅샷을 찍습니다.

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

Parameters

매개변수

유형

설명

id

uint32_t

(id, type, count) 함수를 사용할 때 감지할 객체의 식별자입니다. 의미는 type에 따라 다릅니다.

  • colorObject — 색상 설명자 인덱스(1–7)
  • codeObject — 색상 코드 인덱스(1–8)
  • modelObject — AI 분류 ID
  • tagObject — AprilTag ID(0–36)

참고: VEXcode에서는 AI 분류 이름(예: blueBall)을 직접 사용할 수 있습니다. VS Code에서는 숫자 ID를 사용해야 합니다.

type

objectType

id:

  • objectType::tagObject — AprilTag ID 감지
  • objectType::colorObject — 색상 특징 감지
  • objectType::codeObject — 색상 코드 감지
  • objectType::modelObject — AI 분류 감지
  • objectType::allObject — 센서가 인식할 수 있는 모든 항목 감지

desc

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

Descriptor used to detect a specific object. Passed directly to takeSnapshot, for example:

  • AIVision1.takeSnapshot(AIVision1__greenBox);
  • AIVision1.takeSnapshot(aivision::ALL_AIOBJS);
Predefined descriptor constants:
  • aivision::ALL_TAGS — Detects all AprilTag IDs
  • aivision::ALL_COLORS — Detects all configured Color Signatures
  • aivision::ALL_CODES — Detects all configured Color Codes
  • aivision::ALL_AIOBJS — Detects all AI Classifications
  • aivision::ALL_OBJECTS — Detects everything the sensor can recognize

count

uint32_t / int32_t

스냅샷에서 저장할 수 있는 최대 객체 수입니다. 기본값은 8입니다.

반환 값

지정된 시그니처 또는 탐지 유형과 일치하는 탐지된 객체의 수를 나타내는 int32_t 을 반환합니다.

개의 메모

  • AI 비전 센서는 객체 데이터에 접근하기 전에 먼저 스냅샷을 촬영해야 합니다.

  • objects 배열은 호출될 때마다 새로 고쳐집니다.

  • count 의 개수를 지정하면 감지된 객체 중 가장 큰 객체만 (지정된 개수까지) 저장됩니다.

AI 분류는 VEXcode의 AI 비전 유틸리티에서 선택한 모델에 따라 달라집니다.

예시

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

AI 비전 센서가 EXP 브레인에 연결되었는지 여부를 반환합니다.

사용 가능한 기능 개

bool installed();

매개변수

이 함수는 매개변수를 받지 않습니다.

반환 값

AI 비전 센서가 연결되었는지 여부를 나타내는 부울 값을 반환합니다.

  • true — AI 비전 센서가 연결되었습니다.

  • false — AI 비전 센서가 연결되지 않았습니다.

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

속성#

takeSnapshot 호출은 AI 비전 센서의 감지 결과를 업데이트합니다. 각 스냅샷은 요청된 AI 분류, 색상 서명, 색상 코드 또는 AprilTag ID에 대해 감지된 객체를 포함하는 objects 배열을 새로 고칩니다.

AI 비전 데이터는 AIVisionSensor.objects[index]에 저장된 객체의 속성을 통해 액세스되며, 여기서 index 0 에서 시작합니다.

물체는 면적이 큰 것부터 작은 것 순으로 정렬되어 있습니다.

AI 비전 센서 이미지 해상도는 320 × 240 픽셀 . 객체의 위치와 크기 값은 센서의 현재 시야를 기준으로 픽셀 단위로 보고됩니다.

다음과 같은 부동산을 이용하실 수 있습니다:

  • objectCount — 가장 최근 스냅샷에서 감지된 객체의 수를 반환합니다.

  • largestObject — 가장 최근 스냅샷에서 감지된 가장 큰 객체를 선택합니다.

  • objects — takeSnapshot에 의해 업데이트된 감지된 객체를 포함하는 배열.

  • .exists — 객체 항목에 유효한 데이터가 포함되어 있는지 여부.

  • .width — 감지된 객체의 너비(픽셀).

  • .height — 감지된 객체의 높이(픽셀 단위).

  • .centerX — 객체 중심의 X 위치(픽셀 단위).

  • .centerY — 객체 중심의 Y 위치(픽셀 단위).

  • .originX — 객체의 왼쪽 상단 모서리의 X 위치(픽셀 단위).

  • .originY — 객체의 왼쪽 상단 모서리의 Y 위치(픽셀 단위).

  • .angle — 색상 코드 또는 AprilTag ID의 방향(도).

  • .id — 분류 ID 또는 AprilTag ID.

  • .score — AI 분류에 대한 신뢰도 점수.

objectCount#

objectCount objects 배열 안에 있는 항목의 개수를 정수로 반환합니다.

Syntax
AIVisionSensor.objectCount

Components

요소

설명

AIVisionSensor

AI 비전 센서 인스턴스의 이름입니다.

예시

// 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 objects 배열에서 감지된 가장 큰 객체를 검색합니다.

이 메서드는 인덱스를 지정하지 않고도 objects 객체 중 가장 큰 객체를 항상 가져오는 데 사용할 수 있습니다.

Syntax
AIVisionSensor.largestObject

Components

요소

설명

AIVisionSensor

AI 비전 센서 인스턴스의 이름입니다.

예시

// 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 감지된 객체 속성의 배열을 반환합니다. 배열을 사용하여 개별 객체의 특정 속성 값에 액세스합니다.

takeSnapshot 후 objects 배열에 저장된 각 객체에는 10개의 속성이 포함됩니다.

id , score 을 제외한 모든 속성 값은 takeSnapshot 사용된 시점에서 AI 비전 센서의 시야 내에서 감지된 객체의 위치와 크기를 나타냅니다. 이 값들은 센서의 320 x 240 픽셀 해상도를 기준으로 픽셀 단위로 측정됩니다.

Syntax
AIVisionSensor.objects[index].property

Components

요소

설명

AIVisionSensor

AI 비전 센서 인스턴스의 이름입니다.

index

The object index in the array. Index begins at 0.

property

사용 가능한 객체 속성 중 하나입니다.

.존재합니다#

.exists 지정된 객체 인덱스에 유효한 감지된 객체가 포함되어 있는지 여부를 반환합니다.

액세스

SensorName.objects[index].exists

반환 값

지정된 객체 인덱스에 유효한 감지된 객체가 포함되어 있는지 여부를 나타내는 부울 값을 반환합니다.

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

예시

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

.너비#

.width 감지된 객체의 너비를 반환합니다.

액세스

SensorName.objects[index].width

반환 값

감지된 객체의 너비를 픽셀 단위로 나타내는 int16_t 을 반환합니다. 값의 범위는 1 에서 320 까지입니다.

예시

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

.키#

.height 감지된 객체의 높이를 반환합니다.

액세스

SensorName.objects[index].height

반환 값

감지된 객체의 높이를 픽셀 단위로 나타내는 int16_t 을 반환합니다. 값의 범위는 1 에서 240 까지입니다.

예시

// 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 감지된 객체의 중심의 x 좌표를 반환합니다.

액세스

SensorName.objects[index].centerX

반환 값

객체 중심의 x 좌표를 픽셀 단위로 나타내는 int16_t 을 반환합니다. 값의 범위는 0 에서 320 까지입니다.

예시

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

.센터Y#

.centerY 감지된 객체의 중심의 y 좌표를 반환합니다.

액세스

SensorName.objects[index].centerY

반환 값

객체 중심의 y좌표를 픽셀 단위로 나타내는 int16_t 을 반환합니다. 값의 범위는 0 에서 240 까지입니다.

예시

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

.각도#

.angle 감지된 색상 코드 또는 AprilTag ID의 방향을 반환합니다.

액세스

SensorName.objects[index].angle

반환 값

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

예시

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

.오리진X#

.originX 감지된 객체의 경계 상자의 왼쪽 상단 모서리의 x 좌표를 반환합니다.

액세스

SensorName.objects[index].originX

반환 값

객체의 경계 상자 원점의 x 좌표를 픽셀 단위로 나타내는 int16_t 을 반환합니다. 값의 범위는 0 에서 320 까지입니다.

예시

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

.오리진Y#

.originY 감지된 객체의 경계 상자의 왼쪽 상단 모서리의 y 좌표를 반환합니다.

액세스

SensorName.objects[index].originY

반환 값

객체의 경계 상자 원점의 y 좌표를 픽셀 단위로 나타내는 int16_t 을 반환합니다. 값의 범위는 0 에서 240 까지입니다.

예시

// 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 감지된 AprilTag ID 또는 AI 분류 ID를 반환합니다.

액세스

SensorName.objects[index].id

반환 값

감지된 객체의 ID를 나타내는 int32_t 을 반환합니다.

  • AI 분류의 경우 이는 선택된 AI 모델에 의해 정의된 ID에 해당합니다.

  • AprilTag ID의 경우, 이는 감지된 AprilTag ID 번호(0~36)를 나타냅니다.

예시

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

.점수#

.score 감지된 AI 분류의 신뢰도 점수를 반환합니다.

액세스

SensorName.objects[index].score

반환 값

감지된 AI 분류의 신뢰도 점수를 1에서 100 사이의 값으로 나타내는 int16_t 을 반환합니다.

점수가 낮을수록 센서가 감지한 물체에 대해 확신도가 낮다는 의미이고, 점수가 높을수록 센서가 더 확신한다는 의미입니다.

예시

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