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 );
매개변수#
매개변수 |
유형 |
설명 |
|---|---|---|
|
|
AI 비전 센서가 연결된 스마트 포트는 |
|
|
센서에 등록할 하나 이상의 감지 유형:
|
AI 모델 및 분류#
AI 비전 센서는 특정 AI 분류를 통해 다양한 객체를 감지할 수 있습니다. 장치 창에서 AI 비전 센서를 구성할 때 선택한 AI 분류 모델에 따라 감지 가능한 객체가 달라집니다. 현재 사용 가능한 모델은 다음과 같습니다.
교실 구성 요소
신분증 번호 |
AI 분류 |
|---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
VEX V5 로봇 경진대회, 치열한 경쟁 속에서 펼쳐지는 대회
신분증 번호 |
AI 분류 |
|---|---|
0 |
|
1 |
|
2 |
|
VEX V5 로봇 경진대회 연기
신분증 번호 |
AI 분류 |
|---|---|
0 |
|
1 |
|
VEX V5 로봇 경진대회 재정의
신분증 번호 |
AI 분류 |
|---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
예시#
// 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 );
Parameters6 — 객체 디스크립터를 사용하여 스냅샷을 찍습니다.
int32_t takeSnapshot( const objdesc &desc, int32_t count = 8 );
매개변수 |
유형 |
설명 |
|---|---|---|
|
|
참고: VEXcode에서는 AI 분류 이름(예: blueBall)을 직접 사용할 수 있습니다. VS Code에서는 숫자 ID를 사용해야 합니다. |
|
|
|
|
|
Descriptor used to detect a specific object. Passed directly to
|
|
|
스냅샷에서 저장할 수 있는 최대 객체 수입니다. 기본값은 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 배열 안에 있는 항목의 개수를 정수로 반환합니다.
AIVisionSensor.objectCount
요소 |
설명 |
|---|---|
|
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 객체 중 가장 큰 객체를 항상 가져오는 데 사용할 수 있습니다.
AIVisionSensor.largestObject
요소 |
설명 |
|---|---|
|
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 픽셀 해상도를 기준으로 픽셀 단위로 측정됩니다.
AIVisionSensor.objects[index].property
요소 |
설명 |
|---|---|
|
AI 비전 센서 인스턴스의 이름입니다. |
|
The object index in the array. Index begins at |
|
사용 가능한 객체 속성 중 하나입니다. |
.존재합니다#
.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 을 반환합니다.
예시
// 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);
}
