Czujnik wizji#
Wstęp#
Klasa wizji vision służy do sterowania i dostępu do danych z czujnika wizyjnego EXP. Czujnik ten wykrywa i śledzi sygnatury kolorów w swoim polu widzenia, umożliwiając robotowi identyfikację celów i reagowanie na informacje wizualne w czasie rzeczywistym.
Czujnik wizyjny może wykrywać wiele obiektów jednocześnie i dostarcza informacji, takich jak położenie obiektu, jego szerokość, wysokość i współrzędne środka.
Konstruktory klas#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
Destruktor klasy#
Niszczy obiekt o wizji vision i uwalnia powiązane zasoby.
~vision();
Parametry#
Parametr |
Typ |
Opis |
|---|---|---|
|
|
Inteligentny port, do którego podłączony jest czujnik wizyjny, zapisany jako |
|
|
Poziom jasności czujnika wizyjnego. |
|
|
Jeden lub więcej obiektów |
Przykłady#
// 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
Funkcje członkowskie#
Klasa wizji vision zawiera następujące funkcje członkowskie:
takeSnapshot— Przechwytuje dane dla określonego podpisu koloru lub kodu koloru.zainstalowano
installed— Czy czujnik wizyjny jest podłączony do mózgu EXP.
Aby uzyskać dostęp do danych wykrytego obiektu po wywołaniu takeSnapshot, należy użyć dostępnych Właściwości.
Przed wywołaniem jakiejkolwiek funkcji członkowskiej wizji vision należy utworzyć instancję wizji vision , jak pokazano poniżej:
/* 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#
Przechwytuje obraz z czujnika wizyjnego, przetwarza go na podstawie sygnatury i aktualizuje tablicę objects Ta metoda może również ograniczyć liczbę obiektów przechwyconych w migawce.
Tablica objects przechowuje obiekty uporządkowane według szerokości od największego do najmniejszego, zaczynając od indeksu 0. Dostęp do właściwości każdego obiektu można uzyskać za pomocą jego indeksu. Jeśli nie zostaną wykryte żadne pasujące obiekty, objectCount będzie równe 0, a objects[i].exists będzie równe false.
1 — Wykonuje migawkę i wyszukuje obiekty pasujące do określonego identyfikatora podpisu.
int32_t takeSnapshot( uint32_t id );
2 — Wykonuje migawkę i wyszukuje obiekty pasujące do określonego obiektu
vision::codeo kodzie .int32_t takeSnapshot( code &cc );
3 — Wykonuje migawkę i wyszukuje obiekty pasujące do określonego obiektu
vision::signatureint32_t takeSnapshot( signature &sig );
4 — Wykonuje migawkę i zapisuje tylko największą określoną liczbę obiektów pasujących do identyfikatora podpisu.
int32_t takeSnapshot( uint32_t id, uint32_t count );
5 — Wykonuje migawkę i zapisuje tylko największą określoną liczbę obiektów pasujących do określonego obiektu
vision::codeo kodzie .int32_t takeSnapshot( code &cc, uint32_t count );
Parameters6 — Wykonuje migawkę i zapisuje tylko największą określoną liczbę obiektów pasujących do
vision::signature.int32_t takeSnapshot( signature &sig, uint32_t count );
Parametr |
Typ |
Opis |
|---|---|---|
|
|
Numer identyfikacyjny podpisu, którego należy szukać. |
|
|
Odwołanie do obiektu |
|
|
Odwołanie do obiektu |
|
|
Maksymalna liczba obiektów do wykrycia. |
Zwraca wartość int32_t reprezentującą liczbę wykrytych pasujących obiektów.
Czujnik wizyjny musi wykonać migawkę, zanim będzie można uzyskać dostęp do danych obiektu.
Jeśli określono wartość
count, przechowywane są tylko największe wykryte obiekty (do określonej liczby).
Przykładów
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#
Zwraca informację, czy czujnik wizyjny jest podłączony do mózgu EXP.
Available Functionsbool installed();
Funkcja ta nie przyjmuje żadnych parametrów.
Return ValuesZwraca wartość logiczną wskazującą, czy czujnik wizyjny jest podłączony:
-
true— The Vision Sensor is connected. -
false— The Vision Sensor is not connected.
Właściwości#
Wywołanie funkcji takeSnapshot aktualizuje wyniki detekcji czujnika wizyjnego. Każda migawka odświeża tablicę objects , która zawiera wykryte obiekty dla żądanego podpisu koloru lub kodu koloru.
Dostęp do danych czujnika wizyjnego uzyskuje się poprzez właściwości obiektów zapisanych w Vision1.objects[index], gdzie indeks index zaczyna się od 0.
Rozdzielczość obrazu czujnika wizyjnego wynosi 316 na 212 pikseli. Położenie i rozmiar obiektu są podawane w pikselach względem bieżącego widoku czujnika.
Dostępne są następujące właściwości:
largestObject— Wybiera największy wykryty obiekt z ostatniej migawki.objectCount— Zwraca liczbę prawidłowych obiektów zapisanych wobjects.objects— Tablica wykrytych obiektów zaktualizowana przeztakeSnapshot..exists— Czy wpis obiektu zawiera prawidłowe dane..width— Szerokość wykrytego obiektu w pikselach..height— Wysokość wykrytego obiektu w pikselach..centerX— Pozycja X środka obiektu w pikselach..centerY— Pozycja Y środka obiektu w pikselach..originX— Pozycja X lewego górnego rogu obiektu w pikselach..originY— Pozycja Y lewego górnego rogu obiektu w pikselach..angle— Orientacja wykrytego kodu koloru w stopniach (jeśli ma zastosowanie).
largestObject#
Pobiera największy wykryty obiekt z tablicy objects.
Tę metodę można stosować zawsze w celu uzyskania największego obiektu spośród objects bez konieczności określania indeksu.
VisionSensor.largestObject
Część |
Opis |
|---|---|
|
Nazwa Twojej instancji czujnika wizyjnego. |
Przykładów
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#
Zwraca liczbę elementów znajdujących się w tablicy objects jako liczbę całkowitą.
VisionSensor.objectCount
Część |
Opis |
|---|---|
|
Nazwa Twojej instancji czujnika wizyjnego. |
Przykładów
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 to tablica zawierająca wykryte obiekty z ostatniego wywołania takeSnapshot.
Każdy element w tablicy reprezentuje wykryty obiekt i zapewnia dostęp do jego właściwości, takich jak width, height, centerX i inne.
Obiekty są uporządkowane od największego do najmniejszego (według szerokości), zaczynając od indeksu 0.
VisionSensor.objects[index].property
Część |
Opis |
|---|---|
|
Nazwa Twojej instancji czujnika wizyjnego. |
|
Indeks obiektu w tablicy. Indeks zaczyna się od |
|
Jedna z dostępnych właściwości obiektu. |
.istnieje#
.exists zwraca informację, czy określony indeks obiektu zawiera prawidłowy wykryty obiekt.
Dostęp
SensorName.objects[index].exists
wartości zwracanych
Zwraca wartość logiczną wskazującą, czy określony indeks obiektu zawiera prawidłowy wykryty obiekt:
-
true— A valid object exists at the specified index. -
false— No object exists at the specified index.
Przykładów
// 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);
}
.szerokość#
.width zwraca szerokość wykrytego obiektu.
Dostęp
SensorName.objects[index].width
wartości zwracanych
Zwraca wartość int int reprezentującą szerokość wykrytego obiektu w pikselach. Zakres wartości wynosi od 1 do 316.
Przykładów
// 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);
}
.wysokość#
.height zwraca wysokość wykrytego obiektu.
Dostęp
SensorName.objects[index].height
wartości zwracanych
Zwraca wartość int int reprezentującą wysokość wykrytego obiektu w pikselach. Zakres wartości wynosi od 1 do 212.
Przykładów
// 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 zwraca współrzędną x środka wykrytego obiektu.
Dostęp
SensorName.objects[index].centerX
wartości zwracanych
Zwraca wartość typu int int reprezentującą współrzędną x środka obiektu w pikselach. Zakres wartości wynosi od 0 do 316.
Przykładów
// 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 zwraca współrzędną y środka wykrytego obiektu.
Dostęp
SensorName.objects[index].centerY
wartości zwracanych
Zwraca wartość int int reprezentującą współrzędną y środka obiektu w pikselach. Zakres wartości wynosi od 0 do 212.
Przykładów
// 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 zwraca współrzędną x lewego górnego rogu pola ograniczającego wykryty obiekt.
Dostęp
SensorName.objects[index].originX
wartości zwracanych
Zwraca wartość int int reprezentującą współrzędną x lewego górnego rogu pola ograniczającego obiekt w pikselach. Zakres wartości wynosi od 0 do 316.
Przykładów
// 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 zwraca współrzędną y lewego górnego rogu pola ograniczającego wykryty obiekt.
Dostęp
SensorName.objects[index].originY
wartości zwracanych
Zwraca wartość int int reprezentującą współrzędną y lewego górnego rogu pola ograniczającego obiekt w pikselach. Zakres wartości wynosi od 0 do 212.
Przykładów
// 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);
}
.kąt#
.angle zwraca orientację wykrytego kodu koloru.
Dostęp
SensorName.objects[index].angle
wartości zwracanych
Zwraca wartość double reprezentującą orientację wykrytego kodu koloru w stopniach. Zakres wartości wynosi od 0 do 359.9.
Przykładów
// 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);
}