مستشعر الرؤية#
مقدمة#
تُستخدم فئة الرؤية 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 — يأخذ لقطة ويبحث عن الكائنات التي تطابق معرف التوقيع المحدد.
int32_t takeSnapshot( uint32_t id );
2 — يأخذ لقطة ويبحث عن الكائنات التي تطابق الكائن المحدد
vision::code.int32_t takeSnapshot( code &cc );
3 — يأخذ لقطة ويبحث عن الكائنات التي تطابق الكائن المحدد
vision::signature.int32_t takeSnapshot( signature &sig );
4 — يأخذ لقطة ويخزن فقط أكبر عدد محدد من الكائنات التي تطابق معرف التوقيع.
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 );
المعلمة |
يكتب |
وصف |
|---|---|---|
|
|
رقم تعريف التوقيع المطلوب البحث عنه. |
|
|
مرجع إلى كائن |
|
|
مرجع إلى كائن |
|
|
الحد الأقصى لعدد الأجسام المراد اكتشافها. |
Returns an int32_t representing the number of matching objects detected.
يجب على مستشعر الرؤية التقاط صورة قبل أن يتمكن من الوصول إلى بيانات الكائن.
عند تحديد العدد
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— مصفوفة الكائنات المكتشفة التي تم تحديثها بواسطةtakeSnapshot..exists— ما إذا كان إدخال الكائن يحتوي على بيانات صالحة..width— عرض الكائن المكتشف بالبكسل..height— ارتفاع الكائن المكتشف بالبكسل..centerX— موضع مركز الكائن على المحور X بالبكسل..centerY— موضع مركز الكائن على المحور Y بالبكسل..originX— موضع X للزاوية العلوية اليسرى للكائن بالبكسل..originY— موضع الزاوية العلوية اليسرى للكائن بالبكسل..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
عنصر |
وصف |
|---|---|
|
اسم مثيل مستشعر الرؤية الخاص بك. |
|
فهرس العنصر في المصفوفة. يبدأ الفهرس من |
|
One of the available object properties. |
موجود#
.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) تتراوح بين 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) تتراوح بين 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 تُرجع الإحداثي السيني لمركز الكائن المكتشف.
الوصول
SensorName.objects[index].centerX
قيم الإرجاع
Returns an int representing the x-coordinate of the object’s center in pixels. The value ranges from 0 to 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
قيم الإرجاع
Returns an int representing the y-coordinate of the object’s center in pixels. The value ranges from 0 to 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 تُرجع الإحداثي السيني للزاوية العلوية اليسرى من المربع المحيط بالكائن المكتشف.
الوصول
SensorName.objects[index].originX
قيم الإرجاع
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.
أمثلة
// 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) تتراوح 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
قيم الإرجاع
Returns a double representing the orientation of the detected Color Code in degrees. The value ranges from 0 to 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);
}