Cảm biến thị giác AI#

Giới thiệu#

Lớp aivision được sử dụng để điều khiển và truy cập dữ liệu từ Cảm biến Thị giác AI EXP. Cảm biến Thị giác AI có thể phát hiện:

  • Phân loại AI (ví dụ như các đối tượng trong trò chơi)

  • Mã định danh AprilTag

  • Chữ ký màu sắc tùy chỉnh

  • Mã màu tùy chỉnh

Nó cung cấp dữ liệu về đối tượng bao gồm vị trí, kích thước, hướng, mã định danh phân loại và điểm tin cậy.

Cảm biến xử lý thông tin hình ảnh bằng cách sử dụng mô hình AI tích hợp được chọn trong Tiện ích Tầm nhìn AI trong VEXcode. Mô hình được chọn sẽ xác định Phân loại AI nào mà cảm biến có thể phát hiện. Khi sử dụng VS Code, mô hình AI phải được cấu hình trước trong VEXcode trước khi có thể sử dụng trong chương trình của bạn. Các đối tượng được phát hiện sẽ được trả về thông qua mảng objects sau khi takeSnapshot được gọi.

Hàm tạo lớp#

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

Thông số#

Tham số

Kiểu

Sự miêu tả

index

int32_t

Cổng thông minh mà Cảm biến Thị giác AI được kết nối, được viết dưới dạng PORTx, trong đó x là số cổng (ví dụ: PORT1).

sigs

colordesc, codedesc, or AI constants

Một hoặc nhiều loại phát hiện để đăng ký với cảm biến:

  • aivision::ALL_AIOBJS — Tất cả phân loại AI
  • aivision::ALL_TAGS — Tất cả ID AprilTag
  • aivision::colordesc — Chữ ký màu tùy chỉnh
  • aivision::codedesc — Mã màu tùy chỉnh

Mô hình và phân loại AI#

Cảm biến thị giác AI có thể phát hiện các đối tượng khác nhau với các phân loại AI nhất định. Tùy thuộc vào mô hình phân loại AI được chọn khi cấu hình Cảm biến thị giác AI trong cửa sổ Thiết bị, các đối tượng khác nhau có thể được phát hiện. Các mô hình hiện có sẵn là:

Các yếu tố trong lớp học

Số ID

Phân loại AI

0

blueBall

1

greenBall

2

redBall

3

blueRing

4

greenRing

5

redRing

6

blueCube

7

greenCube

8

redCube

Cuộc thi robot VEX V5 đầy kịch tính

Số ID

Phân loại AI

0

mobileGoal

1

redRing

2

blueRing

Phản hồi về cuộc thi robot VEX V5

Số ID

Phân loại AI

0

blueBlock

1

redBlock

Chế độ ghi đè cuộc thi robot VEX V5

Số ID

Phân loại AI

0

redBluePin

1

blueYellowPin

2

redYellowPin

3

yellowPin

4

cup

Ví dụ#

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

Chức năng thành viên#

Lớp aivision bao gồm các hàm thành viên sau:

  • takeSnapshot — Thu thập dữ liệu cho Chữ ký màu, Mã màu, nhóm Phân loại AI hoặc nhóm ID AprilTag cụ thể.

  • installed — Trả về trạng thái Cảm biến Thị giác AI có được kết nối với EXP Brain hay không.

Để truy cập dữ liệu đối tượng được phát hiện sau khi gọi takeSnapshot, hãy sử dụng Properties.

Trước khi gọi bất kỳ hàm thành viên aivision , phải tạo một thể hiện aivision , như được hiển thị bên dưới:

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

Chụp ảnh từ Cảm biến Thị giác AI, xử lý ảnh bằng mô hình AI đã chọn hoặc các chữ ký màu đã cấu hình, và cập nhật mảng objects.

Mỗi lần gọi sẽ làm mới mảng objects với kết quả phát hiện gần đây nhất. Các đối tượng được sắp xếp từ lớn nhất đến nhỏ nhất (theo chiều rộng), bắt đầu từ chỉ mục 0Nếu không có đối tượng nào được phát hiện, objectCount sẽ là 0 và objects[i].exists sẽ là false.

1 — Chụp ảnh bằng cách sử dụng ID đối tượng và loại đối tượng.

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

2 — Chụp ảnh bằng cách sử dụng Chữ ký màu.

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

3 — Chụp ảnh bằng cách sử dụng Mã màu.

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

4 — Chụp ảnh bằng cách sử dụng ID AprilTag.

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

5 — Chụp ảnh bằng cách sử dụng Phân loại AI.

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

6 — Chụp ảnh bằng cách sử dụng Mô tả Đối tượng.

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

Parameters

Tham số

Kiểu

Sự miêu tả

id

uint32_t

Mã định danh của đối tượng cần phát hiện khi sử dụng hàm (id, type, count) Ý nghĩa phụ thuộc vào type:

  • colorObject — Chỉ số mô tả màu (1–7)
  • codeObject — Chỉ số mã màu (1–8)
  • modelObject — ID phân loại AI
  • tagObject — ID AprilTag (0–36)

Lưu ý: Trong VEXcode, tên phân loại AI (chẳng hạn như blueBall) có thể được sử dụng trực tiếp. Trong VS Code, phải sử dụng ID số.

type

objectType

Chỉ định danh mục đối tượng được liên kết với id:

  • objectType::tagObject — Phát hiện ID AprilTag
  • objectType::colorObject — Phát hiện Chữ ký màu
  • objectType::codeObject — Phát hiện Mã màu
  • objectType::modelObject — Phát hiện Phân loại AI
  • objectType::allObject — Phát hiện mọi thứ mà cảm biến có thể nhận ra

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

Số lượng tối đa các đối tượng được lưu trữ từ ảnh chụp nhanh. Mặc định là 8.

Giá trị trả về

Trả về một giá trị int32_t biểu thị số lượng đối tượng được phát hiện phù hợp với chữ ký hoặc loại phát hiện được chỉ định.

Ghi chú

  • Cảm biến thị giác AI phải chụp ảnh trước khi có thể truy cập dữ liệu đối tượng.

  • Mảng objects được làm mới mỗi khi gọi hàm.

  • Khi tham số count được chỉ định, chỉ những đối tượng được phát hiện lớn nhất (tối đa số lượng được chỉ định) mới được lưu trữ.

Việc phân loại bằng AI phụ thuộc vào mô hình được chọn trong Tiện ích Thị giác AI trong VEXcode.

Ví dụ

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

Trả về trạng thái cho biết Cảm biến Thị giác AI có được kết nối với Bộ não EXP hay không.

Chức năng khả dụng

bool installed();

Tham số

Hàm này không nhận tham số nào.

Giá trị trả về

Trả về giá trị Boolean cho biết cảm biến thị giác AI có được kết nối hay không:

  • true — Cảm biến thị giác AI đã được kết nối.

  • false — Cảm biến thị giác AI chưa được kết nối.

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

Của cải#

Gọi takeSnapshot cập nhật kết quả phát hiện của Cảm biến Thị giác AI. Mỗi ảnh chụp nhanh làm mới mảng objects , chứa các đối tượng được phát hiện cho Phân loại AI, Chữ ký màu, Mã màu hoặc ID AprilTag được yêu cầu.

Dữ liệu AI Vision được truy cập thông qua các thuộc tính của các đối tượng được lưu trữ trong AIVisionSensor.objects[index], trong đó index bắt đầu tại 0.

Các vật thể được sắp xếp từ lớn nhất đến nhỏ nhất (theo diện tích).

Độ phân giải hình ảnh của Cảm biến Thị giác AI là × 240 pixelVị trí và kích thước của vật thể được báo cáo bằng đơn vị pixel so với góc nhìn hiện tại của cảm biến.

Các bất động sản sau đây hiện có sẵn:

  • objectCount — Trả về số lượng đối tượng được phát hiện từ ảnh chụp nhanh gần đây nhất.

  • largestObject — Chọn đối tượng được phát hiện lớn nhất từ ​​ảnh chụp nhanh gần đây nhất.

  • objects — Mảng chứa các đối tượng được phát hiện được cập nhật bởi takeSnapshot.

  • .exists — Liệu mục nhập đối tượng có chứa dữ liệu hợp lệ hay không.

  • .width — Chiều rộng của đối tượng được phát hiện tính bằng pixel.

  • .height — Chiều cao của đối tượng được phát hiện tính bằng pixel.

  • .centerX — Vị trí X của tâm đối tượng tính bằng pixel.

  • .centerY — Vị trí Y của tâm đối tượng tính bằng pixel.

  • .originX — Vị trí X của góc trên bên trái của đối tượng tính bằng pixel.

  • .originY — Vị trí Y của góc trên bên trái của đối tượng tính bằng pixel.

  • .angle — Hướng của Mã màu hoặc ID AprilTag theo độ.

  • .id — ID phân loại hoặc ID AprilTag.

  • .score — Điểm tin cậy cho Phân loại AI.

objectCount#

objectCount trả về số lượng mục bên trong mảng objects dưới dạng số nguyên.

Syntax
AIVisionSensor.objectCount

Components

Thành phần

Sự miêu tả

AIVisionSensor

Tên của phiên bản Cảm biến Thị giác AI của bạn.

Ví dụ

// 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 truy xuất đối tượng được phát hiện lớn nhất từ ​​mảng objects.

Phương pháp này có thể được sử dụng để luôn lấy đối tượng lớn nhất từ objects không cần chỉ định chỉ mục.

Syntax
AIVisionSensor.largestObject

Components

Thành phần

Sự miêu tả

AIVisionSensor

Tên của phiên bản Cảm biến Thị giác AI của bạn.

Ví dụ

// 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 trả về một mảng các thuộc tính đối tượng được phát hiện. Sử dụng mảng để truy cập các giá trị thuộc tính cụ thể của từng đối tượng.

Có mười thuộc tính được bao gồm trong mỗi đối tượng được lưu trữ trong mảng objects sau khi sử dụng phương thức takeSnapshot.

Tất cả các giá trị thuộc tính ngoại trừ id và score mô tả vị trí và kích thước của đối tượng được phát hiện trong tầm nhìn của Cảm biến Thị giác AI tại thời điểm takeSnapshot được sử dụng. Các giá trị này được đo bằng pixel, dựa trên độ phân giải 320 x 240 pixel của cảm biến.

Syntax
AIVisionSensor.objects[index].property

Components

Thành phần

Sự miêu tả

AIVisionSensor

Tên của phiên bản Cảm biến Thị giác AI của bạn.

index

Chỉ số của đối tượng trong mảng. Chỉ số bắt đầu từ 0.

property

One of the available object properties.

tồn tại#

.exists trả về liệu chỉ mục đối tượng được chỉ định có chứa một đối tượng được phát hiện hợp lệ hay không.

Truy cập

SensorName.objects[index].exists

Giá trị trả về

Trả về giá trị Boolean cho biết chỉ mục đối tượng được chỉ định có chứa đối tượng được phát hiện hợp lệ hay không:

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

Ví dụ

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

.chiều rộng#

.width trả về chiều rộng của đối tượng được phát hiện.

Truy cập

SensorName.objects[index].width

Giá trị trả về

Trả về một giá trị int16_t biểu thị chiều rộng của đối tượng được phát hiện tính bằng pixel. Giá trị nằm trong khoảng từ 1 đến 320.

Ví dụ

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

.chiều cao#

.height trả về chiều cao của đối tượng được phát hiện.

Truy cập

SensorName.objects[index].height

Giá trị trả về

Trả về một giá trị int16_t biểu thị chiều cao của vật thể được phát hiện tính bằng pixel. Giá trị nằm trong khoảng từ 1 đến 240.

Ví dụ

// 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 trả về tọa độ x của tâm đối tượng được phát hiện.

Truy cập

SensorName.objects[index].centerX

Giá trị trả về

Trả về một giá trị int16_t biểu thị tọa độ x của tâm đối tượng tính bằng pixel. Giá trị nằm trong khoảng từ 0 đến 320.

Ví dụ

// 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 trả về tọa độ y của tâm đối tượng được phát hiện.

Truy cập

SensorName.objects[index].centerY

Giá trị trả về

Trả về một giá trị int16_t biểu thị tọa độ y của tâm đối tượng tính bằng pixel. Giá trị nằm trong khoảng từ 0 đến 240.

Ví dụ

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

.góc#

.angle trả về hướng của Mã màu hoặc ID AprilTag được phát hiện.

Truy cập

SensorName.objects[index].angle

Giá trị trả về

Trả về một giá trị float float biểu thị độ xoay của Mã màu hoặc ID AprilTag được phát hiện. Giá trị nằm trong khoảng từ 0 đến 359.9.

Ví dụ

// 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 trả về tọa độ x của góc trên bên trái của khung bao quanh đối tượng được phát hiện.

Truy cập

SensorName.objects[index].originX

Giá trị trả về

Trả về một giá trị int16_t biểu thị tọa độ x của gốc hộp giới hạn của đối tượng tính bằng pixel. Giá trị nằm trong khoảng từ 0 đến 320.

Ví dụ

// 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 trả về tọa độ y của góc trên bên trái của khung bao quanh đối tượng được phát hiện.

Truy cập

SensorName.objects[index].originY

Giá trị trả về

Trả về một giá trị int16_t biểu thị tọa độ y của gốc hộp giới hạn của đối tượng tính bằng pixel. Giá trị nằm trong khoảng từ 0 đến 240.

Ví dụ

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

.nhận dạng#

.id trả về ID AprilTag hoặc ID Phân loại AI được phát hiện.

Truy cập

SensorName.objects[index].id

Giá trị trả về

Trả về một giá trị int32_t biểu thị ID của đối tượng được phát hiện:

  • Đối với Phân loại AI, điều này tương ứng với ID được xác định bởi mô hình AI đã chọn.

  • Đối với ID AprilTag, đây là số ID AprilTag được phát hiện (0–36).

Ví dụ

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

.điểm#

.score trả về điểm tin cậy của phân loại AI được phát hiện.

Truy cập

SensorName.objects[index].score

Giá trị trả về

Trả về một giá trị int16_t cho biết điểm tin cậy của phân loại AI được phát hiện, nằm trong khoảng từ 1 đến 100.

Điểm số thấp hơn có nghĩa là cảm biến ít tự tin hơn về vật thể được phát hiện, trong khi điểm số cao hơn có nghĩa là cảm biến tự tin hơn.

Ví dụ

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