視覺感測器#
介紹#
vision 類別用於控制和存取來自 IQ(第二代)視覺感測器的資料。此感測器可偵測並追蹤其視野內的顏色特徵,使您的機器人能夠識別目標並即時回應視覺訊息。
視覺感測器可以同時偵測多個特徵物體,並提供物體位置、寬度、高度和中心座標等資訊。
類別建構函數#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
類別析構函數#
摧毀 vision 對象並釋放相關資源。
~vision();
參數#
範圍 |
類型 |
描述 |
|---|---|---|
|
|
視覺感測器連接的智慧型端口,記為 |
|
|
視覺感測器的亮度等級。 |
|
|
要向感測器註冊的一個或多個 |
範例#
// 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
成員功能#
vision 類別包含下列成員函數:
takeSnapshot— 擷取特定顏色簽名或顏色代碼的資料。installed— 視覺感測器是否連接到 IQ(第二代)大腦。
在呼叫 takeSnapshot 後,要存取偵測到的物件數據,請使用可用的 Properties。
在呼叫任何 vision 成員函數之前,必須先建立一個 vision 實例,如下所示:
/* 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#
從視覺感測器擷取影像,根據特徵碼處理影像,並更新物件數量為 objects 陣列。此方法還可以限制快照中捕獲的物件數量。
The objects array stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. If no matching objects are detected, objectCount will be 0 and objects[i].exists will be false.
1 — 拍攝快照並搜尋與指定簽章 ID 相符的物件。
int32_t takeSnapshot( uint32_t id );
2 — 拍攝快照並蒐索與指定的
vision::code物件相符的物件。int32_t takeSnapshot( code &cc );
3 — 拍攝快照並搜尋與指定的
vision::signature物件相符的物件。int32_t takeSnapshot( signature &sig );
4 — 拍攝快照,並僅儲存與簽署 ID 相符的最大指定數量的物件。
int32_t takeSnapshot( uint32_t id, uint32_t count );
5 — 拍攝快照,並僅儲存與指定的
vision::code物件相符的最大指定數量的物件。int32_t takeSnapshot( code &cc, uint32_t count );
Parameters6 — 拍攝快照,並僅儲存與指定的
vision::signature物件相符的最大指定數量的物件。int32_t takeSnapshot( signature &sig, uint32_t count );
範圍 |
類型 |
描述 |
|---|---|---|
|
|
要尋找的簽章ID號碼。 |
|
|
引用要搜尋的 vision::code 為 |
|
|
引用要搜尋的 |
|
|
要檢測的最大物件數量。 |
傳回 int32_t ,表示偵測到的符合物件的數量。
視覺感測器必須先拍攝快照,才能存取物體資料。
當指定
count,僅儲存偵測到的最大物件(最多指定數量)。
範例
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#
返回視覺感測器是否已連接到 IQ(第二代)大腦。
Available Functionsbool installed();
此函數不接受任何參數。
Return Values傳回布林值,指示視覺感測器是否已連接:
-
true— The Vision Sensor is connected. -
false— The Vision Sensor is not connected.
特性#
呼叫 takeSnapshot 會更新視覺感測器的偵測結果。每次快照都會刷新包含所請求的顏色簽名或顏色代碼的檢測到的物件數組 objects。
Vision Sensor data is accessed through properties of objects stored in Vision1.objects[index], where index begins at 0.
視覺感測器的影像解析度為 316×212 像素。物體位置和大小屬性以像素為單位,相對於感測器的當前視野進行報告。
以下房源可供選擇:
largestObject— 從最近的快照中選擇偵測到的最大物件。objectCount— 傳回儲存在objects。objects— 由 takeSnapshottakeSnapshot偵測到的物件陣列。.exists— 物件條目是否包含有效資料。.width— 偵測到的物件寬度(以像素為單位)。.height— 偵測到的物體的高度(以像素為單位)。.centerX— 物件中心的 X 座標(以像素為單位)。.centerY— 物件中心的 Y 座標(以像素為單位)。.originX— 物件左上角的 X 座標(以像素為單位)。.originY— 物件左上角的 Y 座標(以像素為單位)。.angle— 偵測到的顏色代碼的方向(以度為單位)(如果適用)。
largestObject#
從 objects 物件的陣列中檢索偵測到的最大物件。
此方法可用於始終從 objects 而無需指定索引。
VisionSensor.largestObject
成分 |
描述 |
|---|---|
|
您的視覺感測器實例的名稱。 |
範例
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#
傳回包含 objects 元素的陣列中的元素數量,以整數形式傳回。
VisionSensor.objectCount
成分 |
描述 |
|---|---|
|
您的視覺感測器實例的名稱。 |
範例
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 是一個數組,其中包含最近一次呼叫 takeSnapshot 偵測到的物件。
陣列中的每個元素代表一個偵測到的對象,並提供對其屬性的訪問,例如 width、height、centerX 等。
物件依寬度由大到小排序,從索引 0開始。
VisionSensor.objects[index].property
成分 |
描述 |
|---|---|
|
您的視覺感測器實例的名稱。 |
|
數組中的物件索引。索引從 |
|
可用的物件屬性。 |
存在#
.exists 傳回指定的物件索引是否包含有效的偵測到的物件。
訪問
SensorName.objects[index].exists
傳回值
傳回布林值,指示指定的物件索引是否包含有效的偵測到的物件:
-
true— A valid object exists at the specified index. -
false— No object exists at the specified index.
範例
// 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);
}
。寬度#
.width 傳回偵測到的物件的寬度。
訪問
SensorName.objects[index].width
傳回值
傳回一個 int 之間的整數,表示偵測到的物件以像素為單位的寬度。該值的範圍從 1 到 316。
範例
// 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);
}
。高度#
.height 傳回偵測到的物件的高度。
訪問
SensorName.objects[index].height
傳回值
傳回一個 int 之間的整數,表示偵測到的物件的高度(以像素為單位)。該值的範圍從 1 到 212。
範例
// 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 傳回偵測到的物件中心的 x 座標。
訪問
SensorName.objects[index].centerX
傳回值
傳回一個 int 整數,表示物件中心的 x 座標(以像素為單位)。該值的範圍從 0 到 316。
範例
// 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 傳回偵測到的物件的中心的 y 座標。
訪問
SensorName.objects[index].centerY
傳回值
傳回 int 整數,表示物件中心的 y 座標(以像素為單位)。該值的範圍從 0 到 212。
範例
// 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 傳回偵測到的物件邊界框左上角的 x 座標。
訪問
SensorName.objects[index].originX
傳回值
傳回一個 int 整數,表示物件邊界框左上角的 x 座標(以像素為單位)。該值的範圍從 0 到 316。
範例
// 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 傳回偵測到的物件邊界框左上角的 y 座標。
訪問
SensorName.objects[index].originY
傳回值
傳回一個 int 整數,表示物件邊界框左上角的 y 座標(以像素為單位)。該值的範圍從 0 到 212。
範例
// 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);
}
。角度#
.angle 傳回偵測到的顏色代碼的方向。
訪問
SensorName.objects[index].angle
傳回值
傳回一個 double 值,表示偵測到的顏色代碼的方向(以度為單位)。該值的範圍從 0 到 359.9。
範例
// 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);
}