Sensor Penglihatan#

Perkenalan#

Kelas vision digunakan untuk mengontrol dan mengakses data dari Sensor Visi EXP. Sensor ini mendeteksi dan melacak Tanda Warna dalam bidang pandangnya, memungkinkan robot Anda untuk mengidentifikasi target dan merespons informasi visual secara real time.

Sensor penglihatan dapat mendeteksi beberapa objek khas secara bersamaan dan memberikan informasi seperti posisi objek, lebar, tinggi, dan koordinat pusat.

Konstruktor Kelas#

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

Destruktor Kelas#

Menghancurkan objek vision dan melepaskan sumber daya terkait.

~vision();

Parameter#

Parameter

Jenis

Keterangan

index

int32_t

Port Pintar yang terhubung ke Sensor Penglihatan, ditulis sebagai PORTx, di mana x adalah nomor port (misalnya, PORT1).

bright

uint8_t

Tingkat kecerahan Sensor Penglihatan.

sigs

vision::signature or vision::code objects

Satu atau lebih objek vision::signature atau vision::code untuk didaftarkan ke sensor.

Contoh#

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

Fungsi Keanggotaan#

Kelas vision mencakup fungsi anggota berikut:

  • takeSnapshot — Mengambil data untuk Tanda Warna atau Kode Warna tertentu.

  • installed — Apakah Sensor Penglihatan terhubung ke EXP Brain.

Untuk mengakses data objek yang terdeteksi setelah memanggil takeSnapshot, gunakan Properti yang tersedia.

Sebelum memanggil fungsi anggota vision apa pun, sebuah instance vision harus dibuat, seperti yang ditunjukkan di bawah ini:

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

Mengambil gambar dari Sensor Penglihatan, memprosesnya berdasarkan tanda tangan, dan memperbarui array objects Metode ini juga dapat membatasi jumlah objek yang diambil dalam snapshot.

Array objects menyimpan objek yang diurutkan dari terbesar ke terkecil berdasarkan lebar, dimulai dari indeks 0. Properti setiap objek dapat diakses menggunakan indeksnya. Jika tidak ada objek yang cocok yang terdeteksi, objectCount akan menjadi 0 dan objects[i].exists akan menjadi false.

Available Functions

1 — Mengambil cuplikan dan mencari objek yang cocok dengan ID tanda tangan yang ditentukan.

int32_t takeSnapshot( uint32_t id );

2 — Mengambil cuplikan dan mencari objek yang cocok dengan objek vision::code yang ditentukan.

int32_t takeSnapshot( code &cc );

3 — Mengambil cuplikan dan mencari objek yang cocok dengan objek vision::signature yang ditentukan.

int32_t takeSnapshot( signature &sig );

4 — Mengambil cuplikan dan hanya menyimpan sejumlah objek terbesar yang sesuai dengan ID tanda tangan.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Mengambil cuplikan dan hanya menyimpan sejumlah objek terbesar yang sesuai dengan objek vision::code yang ditentukan.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Mengambil cuplikan dan hanya menyimpan sejumlah objek terbesar yang sesuai dengan objek vision::signature ditentukan.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parameter

Jenis

Keterangan

id

uint32_t

Nomor ID tanda tangan yang akan dicari.

cc

code &

Referensi ke objek vision::code untuk dicari.

sig

signature &

Referensi ke objek vision::signature untuk dicari.

count

uint32_t

Jumlah maksimum objek yang akan dideteksi.

Return Values

Mengembalikan nilai int32_t yang mewakili jumlah objek yang cocok yang terdeteksi.

Notes
  • Sensor penglihatan harus mengambil gambar terlebih dahulu sebelum data objek dapat diakses.

  • Saat nilai count ditentukan, hanya objek terbesar yang terdeteksi (hingga jumlah yang ditentukan) yang akan disimpan.

Contoh

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#

Mengembalikan nilai yang menunjukkan apakah Sensor Penglihatan terhubung ke EXP Brain.

Available Functions
bool installed();

Parameters

Fungsi ini tidak memerlukan parameter apa pun.

Return Values

Mengembalikan nilai Boolean yang menunjukkan apakah Sensor Penglihatan terhubung atau tidak:

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

Properti#

Memanggil takeSnapshot memperbarui hasil deteksi Sensor Visi. Setiap snapshot menyegarkan array objects , yang berisi objek yang terdeteksi untuk Tanda Warna atau Kode Warna yang diminta.

Data Sensor Penglihatan diakses melalui properti objek yang disimpan di Vision1.objects[index], di mana index dimulai pada 0.

Resolusi gambar Sensor Penglihatan adalah 316 x 212 piksel. Posisi dan ukuran objek dilaporkan dalam satuan piksel relatif terhadap tampilan sensor saat ini.

Properti berikut tersedia:

  • largestObject — Memilih objek terbesar yang terdeteksi dari snapshot terbaru.

  • objectCount — Mengembalikan jumlah objek valid yang disimpan dalam objects.

  • objects — Array objek yang terdeteksi diperbarui oleh takeSnapshot.

  • .exists — Apakah entri objek berisi data yang valid.

  • .width — Lebar objek yang terdeteksi dalam piksel.

  • .height — Tinggi objek yang terdeteksi dalam piksel.

  • .centerX — Posisi X dari pusat objek dalam piksel.

  • .centerY — Posisi Y dari pusat objek dalam piksel.

  • .originX — Posisi X dari sudut kiri atas objek dalam piksel.

  • .originY — Posisi Y dari sudut kiri atas objek dalam piksel.

  • .angle — Orientasi Kode Warna yang terdeteksi dalam derajat (jika berlaku).

largestObject#

Mengambil objek terbesar yang terdeteksi dari array objects.

Metode ini dapat digunakan untuk selalu mendapatkan objek terbesar dari objects tanpa menentukan indeks.

Syntax
VisionSensor.largestObject

Components

Komponen

Keterangan

VisionSensor

Nama instance Vision Sensor Anda.

Contoh

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#

Mengembalikan jumlah item di dalam array objects sebagai bilangan bulat.

Syntax
VisionSensor.objectCount

Components

Komponen

Keterangan

VisionSensor

Nama instance Vision Sensor Anda.

Contoh

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 adalah array yang berisi objek yang terdeteksi dari panggilan terakhir ke takeSnapshot.

Setiap elemen dalam array mewakili objek yang terdeteksi dan menyediakan akses ke propertinya, seperti width, height, centerX, dan banyak lagi.

Objek diurutkan dari yang terbesar ke yang terkecil (berdasarkan lebar), dimulai dari indeks 0.

Syntax
VisionSensor.objects[index].property

Components

Komponen

Keterangan

VisionSensor

Nama instance Vision Sensor Anda.

index

Indeks objek dalam larik. Indeks dimulai dari 0.

property

Salah satu properti objek yang tersedia.

.ada#

.exists mengembalikan nilai boolean yang menunjukkan apakah indeks objek yang ditentukan berisi objek yang terdeteksi dan valid.

Akses

SensorName.objects[index].exists

Nilai Pengembalian

Mengembalikan nilai Boolean yang menunjukkan apakah indeks objek yang ditentukan berisi objek yang terdeteksi dan valid:

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

Contoh

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

.lebar#

.width mengembalikan lebar objek yang terdeteksi.

Akses

SensorName.objects[index].width

Nilai Pengembalian

Mengembalikan nilai integer int yang mewakili lebar objek yang terdeteksi dalam piksel. Nilainya berkisar dari 1 hingga 316.

Contoh

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

.tinggi#

.height mengembalikan tinggi objek yang terdeteksi.

Akses

SensorName.objects[index].height

Nilai Pengembalian

Mengembalikan nilai integer int yang mewakili tinggi objek yang terdeteksi dalam piksel. Nilainya berkisar dari 1 hingga 212.

Contoh

// 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 mengembalikan koordinat x dari pusat objek yang terdeteksi.

Akses

SensorName.objects[index].centerX

Nilai Pengembalian

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

Contoh

// 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 mengembalikan koordinat y dari pusat objek yang terdeteksi.

Akses

SensorName.objects[index].centerY

Nilai Pengembalian

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

Contoh

// 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 mengembalikan koordinat x dari sudut kiri atas kotak pembatas objek yang terdeteksi.

Akses

SensorName.objects[index].originX

Nilai Pengembalian

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.

Contoh

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

.asalY#

.originY mengembalikan koordinat y dari sudut kiri atas kotak pembatas objek yang terdeteksi.

Akses

SensorName.objects[index].originY

Nilai Pengembalian

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.

Contoh

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

.sudut#

.angle mengembalikan orientasi Kode Warna yang terdeteksi.

Akses

SensorName.objects[index].angle

Nilai Pengembalian

Mengembalikan nilai double yang mewakili orientasi Kode Warna yang terdeteksi dalam derajat. Nilainya berkisar dari 0 hingga 359.9.

Contoh

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