Visiesensor#
Invoering#
De vision klasse wordt gebruikt om de gegevens van de V5 Vision Sensor te besturen en te benaderen. Deze sensor detecteert en volgt kleursignaturen binnen zijn gezichtsveld, waardoor uw robot doelen kan identificeren en in realtime op visuele informatie kan reageren.
De visionsensor kan meerdere objecten tegelijk detecteren en levert informatie zoals de positie, breedte, hoogte en middelpuntcoördinaten van het object.
Klasseconstructors#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
Klasse-destructor#
Vernietigt het vision object en geeft de bijbehorende resources vrij.
~vision();
Parameters#
Parameter |
Type |
Beschrijving |
|---|---|---|
|
|
De slimme poort waarop de visionsensor is aangesloten, wordt weergegeven als |
|
|
Het helderheidsniveau van de beeldsensor. |
|
|
Een of meer |
Voorbeelden#
// 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
Lidfuncties#
De klasse vision omvat de volgende lidfuncties:
takeSnapshot— Legt gegevens vast voor een specifieke kleursignatuur of kleurcode.installed— Of de Vision Sensor is verbonden met de V5 Brain.
Om toegang te krijgen tot de gedetecteerde objectgegevens na het aanroepen van takeSnapshot, gebruikt u de beschikbare Properties.
Voordat er lidfuncties van vision kunnen worden aangeroepen, moet er een instantie van vision worden aangemaakt, zoals hieronder wordt weergegeven:
/* 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#
Legt een afbeelding vast met de Vision Sensor, verwerkt deze op basis van de signatuur en werkt de array met objects object bij. Deze methode kan ook het aantal objecten beperken dat in de momentopname wordt vastgelegd.
De array objects slaat objecten op, geordend van groot naar klein op basis van breedte, beginnend bij index 0. De eigenschappen van elk object kunnen worden benaderd via de index. Als er geen overeenkomende objecten worden gevonden, zal objectCount 0 zijn en objects[i].exists zal onwaar zijn.
1 — Maakt een momentopname en zoekt naar objecten die overeenkomen met de opgegeven handtekening-ID.
int32_t takeSnapshot( uint32_t id );
2 — Maakt een momentopname en zoekt naar objecten die overeenkomen met het opgegeven
vision::codeobject.int32_t takeSnapshot( code &cc );
3 — Maakt een momentopname en zoekt naar objecten die overeenkomen met het opgegeven
vision::signatureobject.int32_t takeSnapshot( signature &sig );
4 — Maakt een momentopname en slaat alleen het grootste opgegeven aantal objecten op dat overeenkomt met de handtekening-ID.
int32_t takeSnapshot( uint32_t id, uint32_t count );
5 — Maakt een momentopname en slaat alleen het grootste opgegeven aantal objecten op dat overeenkomt met het opgegeven
vision::codeobject.int32_t takeSnapshot( code &cc, uint32_t count );
Parameters6 — Maakt een momentopname en slaat alleen het grootste opgegeven aantal objecten op dat overeenkomt met het opgegeven
vision::signatureobject.int32_t takeSnapshot( signature &sig, uint32_t count );
Parameter |
Type |
Beschrijving |
|---|---|---|
|
|
Het te zoeken handtekening-ID-nummer. |
|
|
Een verwijzing naar een |
|
|
Een verwijzing naar een object met |
|
|
Het maximale aantal te detecteren objecten. |
Retourneert een int32_t die het aantal gevonden overeenkomende objecten weergeeft.
De beeldsensor moet een momentopname maken voordat objectgegevens kunnen worden opgevraagd.
Als
countis opgegeven, worden alleen de grootste gedetecteerde objecten (tot het opgegeven aantal) opgeslagen.
Voorbeelden
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#
Geeft aan of de Vision Sensor is verbonden met de V5 Brain.
Available Functionsbool installed();
Deze functie accepteert geen parameters.
Return ValuesGeeft een Booleaanse waarde terug die aangeeft of de Vision Sensor is aangesloten:
-
true— The Vision Sensor is connected. -
false— The Vision Sensor is not connected.
Eigenschappen#
Het aanroepen van takeSnapshot werkt de detectieresultaten van de Vision Sensor bij. Elke snapshot vernieuwt de array objects , die de gedetecteerde objecten bevat voor de gevraagde kleursignatuur of kleurcode.
De gegevens van de Vision Sensor worden benaderd via eigenschappen van objecten die zijn opgeslagen in Vision1.objects[index], waarbij index begint bij 0.
De beeldresolutie van de Vision Sensor is 316 bij 212 pixels. De positie en grootte van objecten worden weergegeven in pixels ten opzichte van het huidige gezichtsveld van de sensor.
De volgende eigenschappen zijn beschikbaar:
largestObject— Selecteert het grootste gedetecteerde object uit de meest recente momentopname.objectCount— Retourneert het aantal geldige objecten dat is opgeslagen inobjects.objects— Array van gedetecteerde objecten bijgewerkt doortakeSnapshot..exists— Of de objectvermelding geldige gegevens bevat..width— Breedte van het gedetecteerde object in pixels..height— Hoogte van het gedetecteerde object in pixels..centerX— X-positie van het middelpunt van het object in pixels..centerY— Y-positie van het middelpunt van het object in pixels..originX— X-positie van de linkerbovenhoek van het object in pixels..originY— Y-positie van de linkerbovenhoek van het object in pixels..angle— Oriëntatie van de gedetecteerde kleurcode in graden (indien van toepassing).
largestObject#
Haalt het grootste gedetecteerde object op uit de array met objects object.
Deze methode kan worden gebruikt om altijd het grootste object te verkrijgen uit objects zonder een index op te geven.
VisionSensor.largestObject
component |
Beschrijving |
|---|---|
|
De naam van uw Vision Sensor-instantie. |
Voorbeelden
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#
Geeft het aantal items in de array objects terug als een geheel getal.
VisionSensor.objectCount
component |
Beschrijving |
|---|---|
|
De naam van uw Vision Sensor-instantie. |
Voorbeelden
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 is een array met de gedetecteerde objecten van de meest recente aanroep van takeSnapshot.
Elk element in de array vertegenwoordigt een gedetecteerd object en biedt toegang tot de eigenschappen ervan, zoals width, height, centerX, en meer.
De objecten zijn gesorteerd van groot naar klein (op basis van breedte), beginnend bij index 0.
VisionSensor.objects[index].property
component |
Beschrijving |
|---|---|
|
De naam van uw Vision Sensor-instantie. |
|
De objectindex in de array. Index begint bij |
|
Een van de beschikbare objecteigenschappen. |
.bestaat#
.exists retourneert of de opgegeven objectindex een geldig gedetecteerd object bevat.
Toegang
SensorName.objects[index].exists
retourwaarden
Retourneert een Booleaanse waarde die aangeeft of de opgegeven objectindex een geldig gedetecteerd object bevat:
-
true— A valid object exists at the specified index. -
false— No object exists at the specified index.
Voorbeelden
// 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);
}
.breedte#
.width geeft de breedte van het gedetecteerde object terug.
Toegang
SensorName.objects[index].width
retourwaarden
Retourneert een int die de breedte van het gedetecteerde object in pixels weergeeft. De waarde varieert van 1 tot 316.
Voorbeelden
// 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);
}
.hoogte#
.height geeft de hoogte van het gedetecteerde object terug.
Toegang
SensorName.objects[index].height
retourwaarden
Retourneert een int die de hoogte van het gedetecteerde object in pixels weergeeft. De waarde varieert van 1 tot 212.
Voorbeelden
// 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 retourneert de x-coördinaat van het middelpunt van het gedetecteerde object.
Toegang
SensorName.objects[index].centerX
retourwaarden
Retourneert een int die de x-coördinaat van het middelpunt van het object in pixels vertegenwoordigt. De waarde ligt tussen 0 en 316.
Voorbeelden
// 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 retourneert de y-coördinaat van het middelpunt van het gedetecteerde object.
Toegang
SensorName.objects[index].centerY
retourwaarden
Retourneert een int die de y-coördinaat van het middelpunt van het object in pixels voorstelt. De waarde varieert van 0 tot 212.
Voorbeelden
// 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 retourneert de x-coördinaat van de linkerbovenhoek van het begrenzingskader van het gedetecteerde object.
Toegang
SensorName.objects[index].originX
retourwaarden
Retourneert een int die de x-coördinaat van de linkerbovenhoek van de begrenzingsbox van het object in pixels weergeeft. De waarde ligt tussen 0 en 316.
Voorbeelden
// 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 retourneert de y-coördinaat van de linkerbovenhoek van het begrenzingskader van het gedetecteerde object.
Toegang
SensorName.objects[index].originY
retourwaarden
Retourneert een int die de y-coördinaat van de linkerbovenhoek van de begrenzingsbox van het object in pixels weergeeft. De waarde ligt tussen 0 en 212.
Voorbeelden
// 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);
}
.hoek#
.angle geeft de oriëntatie van de gedetecteerde kleurcode terug.
Toegang
SensorName.objects[index].angle
retourwaarden
Retourneert een double die de oriëntatie van de gedetecteerde kleurcode in graden weergeeft. De waarde varieert van 0 tot 359.9.
Voorbeelden
// 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);
}