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ả |
|---|---|---|
|
|
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 |
|
|
Một hoặc nhiều loại phát hiện để đăng ký với cảm biến:
|
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 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
Cuộc thi robot VEX V5 đầy kịch tính
Số ID |
Phân loại AI |
|---|---|
0 |
|
1 |
|
2 |
|
Phản hồi về cuộc thi robot VEX V5
Số ID |
Phân loại AI |
|---|---|
0 |
|
1 |
|
Chế độ ghi đè cuộc thi robot VEX V5
Số ID |
Phân loại AI |
|---|---|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
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 );
Parameters6 — 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 );
Tham số |
Kiểu |
Sự miêu tả |
|---|---|---|
|
|
Mã định danh của đối tượng cần phát hiện khi sử dụng hàm
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ố. |
|
|
Chỉ định danh mục đối tượng được liên kết với
|
|
|
Descriptor used to detect a specific object. Passed directly to
|
|
|
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ởitakeSnapshot..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.
AIVisionSensor.objectCount
Thành phần |
Sự miêu tả |
|---|---|
|
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.
AIVisionSensor.largestObject
Thành phần |
Sự miêu tả |
|---|---|
|
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.
AIVisionSensor.objects[index].property
Thành phần |
Sự miêu tả |
|---|---|
|
Tên của phiên bản Cảm biến Thị giác AI của bạn. |
|
Chỉ số của đối tượng trong mảng. Chỉ số bắt đầu từ |
|
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);
}
