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

Giới thiệu#

Lớp vision được sử dụng để điều khiển và truy cập dữ liệu từ Cảm biến Thị giác IQ (thế hệ thứ 2). Cảm biến này phát hiện và theo dõi các Dấu hiệu Màu sắc trong tầm nhìn của nó, cho phép robot của bạn xác định mục tiêu và phản hồi thông tin hình ảnh trong thời gian thực.

Cảm biến thị giác có thể phát hiện nhiều đối tượng đặc trưng cùng lúc và cung cấp thông tin như vị trí, chiều rộng, chiều cao và tọa độ tâm của đối tượng.

Hàm tạo lớp#

vision(
  int32_t  index,
  uint8_t  bright,
  Args&... sigs );

Lớp Destructor#

Phá hủy đối tượng vision và giải phóng các tài nguyên liên quan.

~vision();

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 được kết nối, được viết dưới dạng PORTx, trong đó x là số cổng (ví dụ: PORT1).

bright

uint8_t

Mức độ sáng của cảm biến thị giác.

sigs

vision::signature or vision::code objects

Một hoặc nhiều đối tượng vision::signature hoặc vision::code để đăng ký với cảm biến.

Ví dụ#

// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

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

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

  • takeSnapshot — Thu thập dữ liệu cho Chữ ký màu hoặc Mã màu cụ thể.

  • installed — Cảm biến thị giác có được kết nối với bộ não IQ (thế hệ thứ 2) 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 nào của vision , cần phải tạo một thể hiện vision , như được hiển thị bên dưới:

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


// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

takeSnapshot#

Phương pháp này thu thập hình ảnh từ Cảm biến Thị giác, xử lý hình ảnh dựa trên chữ ký và cập nhật mảng objects Phương pháp này cũng có thể giới hạn số lượng đối tượng được chụp trong ảnh chụp nhanh.

Mảng objects lưu trữ 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 0. thuộc tính của mỗi đối tượng có thể được truy cập bằng chỉ mục của nó. Nếu không tìm thấy đối tượng phù hợp, objectCount sẽ là 0 và objects[i].exists sẽ là false.

Available Functions

1 — Chụp ảnh nhanh và tìm kiếm các đối tượng khớp với ID chữ ký được chỉ định.

int32_t takeSnapshot( uint32_t id );

2 — Chụp ảnh nhanh và tìm kiếm các đối tượng khớp với đối tượng được chỉ định là vision::code.

int32_t takeSnapshot( code &cc );

3 — Chụp ảnh nhanh và tìm kiếm các đối tượng khớp với đối tượng được chỉ định vision::signature.

int32_t takeSnapshot( signature &sig );

4 — Chụp ảnh nhanh và chỉ lưu trữ số lượng đối tượng lớn nhất được chỉ định khớp với ID chữ ký.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Chụp ảnh nhanh và chỉ lưu trữ số lượng đối tượng lớn nhất được chỉ định khớp với đối tượng vision::code được chỉ định.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Chụp ảnh nhanh và chỉ lưu trữ số lượng đối tượng lớn nhất được chỉ định khớp với đối tượng vision::signature được chỉ định.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Tham số

Kiểu

Sự miêu tả

id

uint32_t

Mã số định danh chữ ký cần tìm kiếm.

cc

code &

Tham chiếu đến một đối tượng vision::code cần tìm kiếm.

sig

signature &

Tham chiếu đến một đối tượng vision::signature cần tìm kiếm.

count

uint32_t

Số lượng tối đa các đối tượng cần phát hiện.

Return Values

Trả về một giá trị int32_t biểu thị số lượng đối tượng phù hợp được phát hiện.

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

  • 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ữ.

Ví dụ

while (true) {
  // Display if a blue object is detected
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Blue detected");
  } 
  else {
    Brain.Screen.print("No blue");
  }

  wait(0.5, seconds);
}

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, msec); 
}

// Display when BOXCODE is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BOXCODE);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Code detected!");
  }
  wait( 100, msec);
}

installed#

Trả về trạng thái cho biết Cảm biến Thị giác có được kết nối với bộ xử lý IQ (thế hệ thứ nhất) hay không.

Available Functions
bool installed();

Parameters

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

Return Values

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

  • true — The Vision Sensor is connected.
  • false — The Vision Sensor is not connected.

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. Mỗi lần chụp ảnh làm mới mảng objects , chứa các đối tượng được phát hiện cho Chữ ký Màu hoặc Mã Màu được yêu cầu.

Dữ liệu cảm biến thị giác đượ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 Vision1.objects[index], trong đó index bắt đầu tại 0.

Độ phân giải hình ảnh của cảm biến thị giác là 316 x 212 pixel. Vị trí và kích thước của đối tượng đượ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:

  • 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.

  • objectCount — Trả về số lượng đối tượng hợp lệ được lưu trữ trong objects.

  • objects — Mảng 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 được phát hiện theo độ (nếu có).

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
VisionSensor.largestObject

Components

Thành phần

Sự miêu tả

VisionSensor

Tên của thể hiện Vision Sensor của bạn.

Ví dụ

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display the largest detected object's width
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    if (Vision1.objects[0].exists) {
      Brain.Screen.print("%d", Vision1.largestObject.width);
    } 
    wait(0.5, seconds);
  }
}

objectCount#

Trả về số lượng phần tử bên trong mảng objects dưới dạng số nguyên.

Syntax
VisionSensor.objectCount

Components

Thành phần

Sự miêu tả

VisionSensor

Tên của thể hiện Vision Sensor của bạn.

Ví dụ

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display how many blue objects are detected
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    Brain.Screen.print("Object Count: %d", Vision1.objectCount);

    wait(0.5, seconds);
  }
}

objects#

objects là một mảng chứa các đối tượng được phát hiện từ lần gọi gần đây nhất tới takeSnapshot.

Mỗi phần tử trong mảng đại diện cho một đối tượng được phát hiện và cung cấp quyền truy cập vào các thuộc tính của nó, chẳng hạn như width, height, centerX, và nhiều hơn nữa.

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ỉ số 0.

Syntax
VisionSensor.objects[index].property

Components

Thành phần

Sự miêu tả

VisionSensor

Tên của thể hiện Vision Sensor 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ụ

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, 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 số nguyên int 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 316.

Ví dụ

// Approach an object until it's at least 100 pixels wide
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists && Vision1.objects[0].width < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);
}

.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 số nguyên int 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 212.

Ví dụ

// Approach an object until it's at least 100 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists && Vision1.objects[0].height < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);  // Avoid over-processing
}

.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ề

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

Ví dụ

// Turn until an object is directly in front of the sensor
Drivetrain.setTurnVelocity(10, percent);
Drivetrain.turn(right);
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    int centerX = Vision1.largestObject.centerX;
    if (140 < centerX && centerX < 180) {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}

.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ề

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

Ví dụ

// Approach an object until it's at least 90 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].centerY < 90) {
      Drivetrain.drive(forward);
    } 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ề

Returns an int representing the x-coordinate of the top-left corner of the object’s bounding box in pixels. The value ranges from 0 to 316.

Ví dụ

// Display if an object is to the left or the right
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originX < 160) {
      Brain.Screen.print("To the left!");
    }
    else {
      Brain.Screen.print("To the right!");
    }
  }
  wait(0.5, seconds); 
}

.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ề

Returns an int representing the y-coordinate of the top-left corner of the object’s bounding box in pixels. The value ranges from 0 to 212.

Ví dụ

// Display if an object is close or far
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originY < 80) {
      Brain.Screen.print("Far");
    } else {
      Brain.Screen.print("Close");
    }
  }
  wait(0.5, seconds);
}

.góc#

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

Truy cập

SensorName.objects[index].angle

Giá trị trả về

Trả về một giá double biểu thị hướng của Mã màu được phát hiện tính bằng độ. 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) {
  Vision1.takeSnapshot(Vision1__BOXCODE);
  if (Vision1.objects[0].exists) {
    double angle = Vision1.objects[0].angle;
    if (70 < angle && angle < 110) {
      Drivetrain.turnFor(right, 45, degrees);
    }
    else if (250 < angle && angle < 290) {
      Drivetrain.turnFor(left, 45, degrees);
    }
    else {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}