Sensor de visão#
Introdução#
A classe vision é utilizada para controlar e aceder aos dados do sensor de visão IQ (2ª geração). Este sensor deteta e rastreia assinaturas de cores dentro do seu campo de visão, permitindo que o seu robô identifique alvos e responda a informações visuais em tempo real.
O sensor de visão pode detetar vários objetos em simultâneo e fornece informações como a posição, largura, altura e coordenadas do centro do objeto.
Construtores de Classes#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
Destrutor de classes#
Destroys the vision object and releases associated resources.
~vision();
Parâmetros#
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
A porta inteligente à qual o sensor de visão está ligado é escrita como |
|
|
Nível de brilho do sensor de visão. |
|
|
Um ou mais objetos |
Exemplos#
// 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
Funções de membro#
A classe vision inclui as seguintes funções membro:
takeSnapshot— Captura os dados para uma assinatura de cor ou código de cor específico.installed— Se o sensor de visão está ligado ao cérebro IQ (2. ª geração).
Para aceder aos dados do objeto detetado após a chamada takeSnapshot, utilize as Propriedades disponíveis.
Before calling any vision member functions, a vision instance must be created, as shown below:
/* 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#
Captura uma imagem do sensor de visão, processa-a com base na assinatura e atualiza a matriz de objects objeto. Este método pode também limitar a quantidade de objetos captados na imagem.
O array objects armazena os objetos ordenados do maior para o menor por largura, começando no índice 0. As propriedades de cada objeto podem ser acedidas utilizando o seu índice. Se não for detetado nenhum objeto correspondente, objectCount será 0 e objects[i].exists será falso.
1 — Tira uma fotografia instantânea e procura objetos que correspondam ao ID de assinatura especificado.
int32_t takeSnapshot( uint32_t id );
2 — Tira uma fotografia e procura objetos que correspondam ao objeto especificado
vision::code.int32_t takeSnapshot( code &cc );
3 — Tira uma fotografia e procura objetos que correspondam ao objeto
vision::signatureespecificado.int32_t takeSnapshot( signature &sig );
4 — Captura um instantâneo e armazena apenas o maior número especificado de objetos que correspondam ao ID da assinatura.
int32_t takeSnapshot( uint32_t id, uint32_t count );
5 — Tira um instantâneo e armazena apenas o maior número especificado de objetos que correspondam ao objeto
vision::codeespecificado.int32_t takeSnapshot( code &cc, uint32_t count );
Parameters6 — Tira um instantâneo e armazena apenas o maior número especificado de objetos que correspondam ao objeto
vision::signatureespecificado.int32_t takeSnapshot( signature &sig, uint32_t count );
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
O número de identificação da assinatura a pesquisar. |
|
|
Uma referência a um objeto |
|
|
Uma referência a um objeto |
|
|
Número máximo de objetos a detetar. |
Retorna um valor do tipo int32_t int32_t que representa o número de objetos correspondentes detetados.
O sensor de visão precisa de tirar uma fotografia antes que os dados do objeto possam ser acedidos.
Quando a contagem
counté especificada, apenas os maiores objetos detetados (até à quantidade especificada) são armazenados.
Exemplos
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#
Retorna se o sensor de visão está ligado ao cérebro IQ (2ª geração).
Available Functionsbool installed();
Esta função não recebe qualquer parâmetro.
Return ValuesRetorna um valor booleano indicando se o sensor de visão está ligado:
-
true— The Vision Sensor is connected. -
false— The Vision Sensor is not connected.
Propriedades#
Chamar takeSnapshot actualiza os resultados de detecção do sensor de visão. Cada snapshot atualiza o array objects , que contém os objetos detetados para a assinatura de cor ou código de cor solicitado.
Os dados do sensor de visão são acedidos através das propriedades dos objetos armazenados em Vision1.objects[index], onde index começa em 0.
A resolução da imagem do sensor de visão é de 316 por 212 pixéis. As propriedades de posição e tamanho do objeto são reportadas em unidades de pixel em relação à vista atual do sensor.
As seguintes propriedades estão disponíveis:
largestObject— Seleciona o maior objeto detetado no instantâneo mais recente.objectCount— Retorna o número de objetos válidos armazenados emobjects.objects— Matriz de objetos detetados atualizada portakeSnapshot..exists— Se a entrada do objeto contém dados válidos..width— Largura do objeto detetado em pixéis..height— Altura do objeto detetado em pixéis..centerX— Posição X do centro do objecto em pixéis..centerY— Posição Y do centro do objecto em pixéis..originX— Posição X do canto superior esquerdo do objeto em pixéis..originY— Posição Y do canto superior esquerdo do objeto em pixéis..angle— Orientação do código de cor detectado em graus (quando aplicável).
largestObject#
Recupera o maior objeto detetado da matriz de objects objeto.
Este método pode ser utilizado para obter sempre o maior objeto de entre objects sem especificar um índice.
VisionSensor.largestObject
Componente |
Descrição |
|---|---|
|
O nome da sua instância do Sensor de Visão. |
Exemplos
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#
Retorna o número de itens dentro do array de objects como um número inteiro.
VisionSensor.objectCount
Componente |
Descrição |
|---|---|
|
O nome da sua instância do Sensor de Visão. |
Exemplos
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 é um array contendo os objetos detetados da chamada mais recente para takeSnapshot.
Cada elemento da matriz representa um objeto detetado e fornece acesso às suas propriedades, tais como width, height, centerX, e mais.
Os objetos estão ordenados do maior para o mais pequeno (por largura), começando no índice 0.
VisionSensor.objects[index].property
Componente |
Descrição |
|---|---|
|
O nome da sua instância do Sensor de Visão. |
|
O índice do objeto na matriz. O índice começa em |
|
Uma das propriedades do objeto disponíveis. |
. existe#
.exists retorna se o índice de objeto especificado contém um objeto válido detetado.
Acesso
SensorName.objects[index].exists
Valores de retorno
Retorna um valor booleano indicando se o índice do objeto especificado contém um objeto detetado válido:
-
true— A valid object exists at the specified index. -
false— No object exists at the specified index.
Exemplos
// 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);
}
.largura#
.width devolve a largura do objeto detetado.
Acesso
SensorName.objects[index].width
Valores de retorno
Retorna um número inteiro int que representa a largura do objeto detetado em pixéis. O valor varia de 1 a 316.
Exemplos
// 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);
}
.altura#
.height devolve a altura do objeto detetado.
Acesso
SensorName.objects[index].height
Valores de retorno
Retorna um número inteiro int que representa a altura do objeto detetado em pixéis. O valor varia de 1 a 212.
Exemplos
// 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 devolve a coordenada x do centro do objecto detectado.
Acesso
SensorName.objects[index].centerX
Valores de retorno
Retorna um número inteiro int que representa a coordenada x do centro do objeto em pixéis. O valor varia de 0 a 316.
Exemplos
// 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 devolve a coordenada y do centro do objecto detectado.
Acesso
SensorName.objects[index].centerY
Valores de retorno
Retorna um número inteiro int que representa a coordenada y do centro do objeto em pixéis. O valor varia de 0 a 212.
Exemplos
// 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);
}
. origemX#
.originX devolve a coordenada x do canto superior esquerdo da caixa delimitadora do objecto detectado.
Acesso
SensorName.objects[index].originX
Valores de retorno
Retorna um número inteiro int que representa a coordenada x do canto superior esquerdo da caixa delimitadora do objeto em pixéis. O valor varia de 0 a 316.
Exemplos
// 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);
}
. origemY#
.originY devolve a coordenada y do canto superior esquerdo da caixa delimitadora do objecto detectado.
Acesso
SensorName.objects[index].originY
Valores de retorno
Retorna um número inteiro int que representa a coordenada y do canto superior esquerdo da caixa delimitadora do objeto em pixéis. O valor varia de 0 a 212.
Exemplos
// 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);
}
.ângulo#
.angle devolve a orientação do código de cor detectado.
Acesso
SensorName.objects[index].angle
Valores de retorno
Retorna um valor double que representa a orientação do código de cor detectado em graus. O valor varia de 0 a 359.9.
Exemplos
// 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);
}