مستشعر الرؤية#
مقدمة#
مستشعر الرؤية هو مستشعر يعتمد على الكاميرا، ويمكنه اكتشاف وتتبع الإشارات اللونية والرموز اللونية. يسمح هذا المستشعر للروبوت بتحليل محيطه والاستجابة للمدخلات البصرية.
بالنسبة للأمثلة أدناه، سيتم تسمية مستشعر الرؤية المُكوّن vision_1، وسيتم استخدام كائنات توقيع اللون المُكوّنة، مثل RED_BOX، في جميع الأمثلة اللاحقة في جميع أنحاء وثائق واجهة برمجة التطبيقات هذه عند الإشارة إلى Vision.
فيما يلي قائمة بجميع الطرق:
أجهزة الاستقبال — الحصول على البيانات من مستشعر الرؤية.
take_snapshot— يلتقط البيانات لتوقيع معين.installed— ما إذا كان مستشعر الرؤية متصلاً بدماغ IQ (الجيل الثاني).
الخصائص — بيانات الكائن المُعادة من take_snapshot.
largest_object— تحديد أكبر كائن على الفور من لقطة مستشعر الرؤية..exists— ما إذا كان الكائن موجودًا في عملية الكشف الحالية..width— عرض الكائن المكتشف..height— ارتفاع الكائن المكتشف..centerX— موضع مركز الكائن على المحور X..centerY— موضع مركز الكائن على المحور Y..angle— اتجاه رمز اللون..originX— موضع X للزاوية العلوية اليسرى للكائن..originY— موضع Y للزاوية العلوية اليسرى للكائن.
المنشئات — قم بتهيئة وتكوين المستشعرات يدويًا.
المحصلون#
take_snapshot#
take_snapshot يقوم بتصفية البيانات من إطار مستشعر الرؤية إلى توقيع واحد - وهو وصف محفوظ لشيء يمكن للمستشعر التعرف عليه، مثل توقيع اللون أو رمز اللون المُكوّن - ويعيد مجموعة.
يجب أولاً تكوين توقيعات الألوان و رموز الألوان في أداة الرؤية قبل أن يتم استخدامها مع هذه الطريقة.
The tuple stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. An empty tuple is returned if no matching objects are detected.
Usage:
vision_1.take_snapshot(SIGNATURE)
حدود |
وصف |
|---|---|
|
يقوم هذا الإجراء بتصفية مجموعة البيانات بحيث لا تتضمن إلا البيانات التي تحمل التوقيع المحدد. التوقيعات المتاحة هي:
|
# Move forward if a red object is detected
while True:
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
drivetrain.drive_for(FORWARD, 10, MM)
wait(5, MSEC)
التوقيعات اللونية#
التوقيع اللوني هو لون فريد يمكن لمستشعر الرؤية التعرف عليه. تُمكّن هذه التوقيعات مستشعر الرؤية من اكتشاف الأجسام وتتبعها بناءً على لونها. بمجرد تهيئة التوقيع اللوني، يستطيع المستشعر تحديد الأجسام التي تحمل هذا اللون المحدد ضمن مجال رؤيته. تُستخدم التوقيعات اللونية مع take_snapshot لمعالجة الأجسام الملونة واكتشافها في الوقت الفعلي.
لاستخدام توقيع لوني مُهيأ في مشروع، يجب أن يكون اسمه اسم مستشعر الرؤية، متبوعًا بشرطتين سفليتين، ثم اسم التوقيع اللوني. على سبيل المثال: vision_1__RED_BOX.
# Display if any objects match the RED_BOX signature
while True:
brain.screen.set_cursor(1, 1)
brain.screen.clear_row(1)
# Change to any configured Color Signature
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
brain.screen.print("Color signature detected!")
wait(100, MSEC)
رموز الألوان#
رمز اللون هو نمط منظم يتكون من رموز لونية مرتبة بترتيب محدد. تُمكّن هذه الرموز مستشعر الرؤية من التعرف على أنماط الألوان المُحددة مسبقًا. تُعد رموز اللون مفيدة لتحديد الأجسام المعقدة أو إنشاء علامات فريدة للملاحة الذاتية.
لاستخدام رمز لوني مُعدّ مسبقًا في مشروع، يجب أن يكون اسمه اسم المستشعر، متبوعًا بشرطتين سفليتين، ثم اسم الرمز اللوني. على سبيل المثال: vision_1__BOX_CODE.
# Display if any objects match the BOX_CODE code
while True:
brain.screen.set_cursor(1, 1)
brain.screen.clear_row(1)
# Change to any configured Color Code
box_code = vision_1.take_snapshot(vision_1__BOX_CODE)
if box_code[0].exists:
brain.screen.print("Color code detected!")
wait(100, MSEC)
installed#
installed يعيد قيمة منطقية تشير إلى ما إذا كان مستشعر الرؤية متصلاً حاليًا بدماغ IQ (الجيل الثاني).
True— مستشعر الرؤية متصل بدماغ IQ (الجيل الثاني).False— مستشعر الرؤية غير متصل بدماغ IQ (الجيل الثاني).
Usage:
vision_1.installed()
حدود |
وصف |
|---|---|
لا تحتوي هذه الطريقة على أي معلمات. |
# Display a message if the Vision Sensor is connected
if vision_1.installed():
brain.screen.print("Installed!")
ملكيات#
largest_object#
largest_object يسترجع أكبر كائن تم اكتشافه للحصول على البيانات منه في المجموعة التي تم إرجاعها من آخر استخدام لـ take_snapshot.
يمكن استخدام هذه الطريقة للحصول دائمًا على أكبر عنصر من مجموعة دون تحديد فهرس.
Usage:
vision_1.largest_object()
# Turn slowly until the largest object is centered in
# front of the Vision Sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)
while True:
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
if 140 < vision_1.largest_object().centerX < 180:
drivetrain.stop()
wait(10,MSEC)
Tuple Properties#
هناك ثماني خصائص يتم تضمينها مع كل كائن مخزن في مجموعة بعد استخدام take_snapshot.
تصف جميع قيم الخصائص موضع وحجم الجسم المكتشف في مجال رؤية مستشعر الرؤية لحظة استخدام الأمر take_snapshot تُقاس هذه القيم بالبكسل، بناءً على دقة المستشعر البالغة 316 × 212 بكسل.
موجود#
.exists تُرجع قيمة منطقية تشير إلى ما إذا كان الفهرس موجودًا في المجموعة أم لا.
True— الفهرس موجود.False— الفهرس غير موجود.
# Check if at least one red objects is detected
# You will receive an error if no objects are detected
while True:
brain.screen.clear_screen()
brain.screen.set_cursor(1, 1)
red_objects = vision_1.take_snapshot(vision_1__RED_BOX)
if red_objects[0].exists:
brain.screen.print("At least 1")
else:
brain.screen.print("No red objects")
wait(0.5, SECONDS)
.عرض#
.width تُرجع عرض الكائن المكتشف بالبكسل، وهو عدد صحيح بين 1 و 316.
# Move towards a blue object until its width is
# larger than 100 pixels
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if blue_box[0].width < 100:
drivetrain.drive_for(FORWARD, 10, MM)
else:
drivetrain.stop()
wait(50, MSEC)
.ارتفاع#
.height تُرجع ارتفاع الكائن المكتشف بالبكسل، وهو عدد صحيح بين 1 و 212.
# Move towards a blue object until its height is
# larger than 100 pixels
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if blue_box[0].height < 100:
drivetrain.drive_for(FORWARD, 10, MM)
else:
drivetrain.stop()
wait(50, MSEC)
.centerX#
.centerX تُرجع الإحداثي السيني لمركز الكائن المكتشف بالبكسل، وهو عدد صحيح بين 0 و 316.
# Turn slowly until the largest blue object is centered
# in front of the Vision Sensor.
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if 140 < vision_1.largest_object().centerX < 180:
drivetrain.stop()
wait(10,MSEC)
.centerY#
.centerY تُرجع إحداثيات y لمركز الكائن المكتشف بالبكسل، وهو عدد صحيح بين 0 و 212.
# Move towards a blue object until its
# center y-coordinate is more than 140 pixels
while True:
blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)
if blue_box[0].exists:
if blue_box[0].centerY < 140:
drivetrain.drive(FORWARD)
else:
drivetrain.stop()
wait(50, MSEC)
.زاوية#
.angle تُرجع اتجاه الكائن المكتشف بالدرجات، وهو عدد صحيح بين 0 و 359.
# Turn left or right depending on how a
# configured box code is rotated
while True:
box_code = vision_1.take_snapshot(vision_1__BOX_CODE)
if box_code[0].exists:
if 50 < box_code[0].angle < 100:
drivetrain.turn(RIGHT)
elif 270 < box_code[0].angle < 330:
drivetrain.turn(LEFT)
else:
drivetrain.stop()
else:
drivetrain.stop()
wait(50, MSEC)
.originX#
.originX تُرجع الإحداثي السيني للزاوية العلوية اليسرى من المربع المحيط بالكائن المكتشف بالبكسل، وهو عدد صحيح بين 0 و 316.
# Display if a red object is to the
# left or the right
while True:
brain.screen.clear_screen()
brain.screen.set_cursor(1,1)
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
if red_box[0].originX < 160:
brain.screen.print("To the left!")
else:
brain.screen.print("To the right!")
wait(50, MSEC)
.originY#
.originY تُرجع إحداثيات y للزاوية العلوية اليسرى للمربع المحيط بالكائن المكتشف بالبكسل، وهو عدد صحيح بين 0 و 212.
# Display if a red object is close or far
# from the robot
while True:
brain.screen.clear_screen()
brain.screen.set_cursor(1,1)
red_box = vision_1.take_snapshot(vision_1__RED_BOX)
if red_box[0].exists:
if red_box[0].originY < 80:
brain.screen.print("Far")
else:
brain.screen.print("Close")
wait(50, MSEC)
المُنشئون#
تُستخدم أدوات الإنشاء لإنشاء Vision Signatureو Code Code وهي ضرورية لتكوين أجهزة الاستشعار خارج VEXcode.
Vision Sensor#
Vision يقوم بإنشاء مستشعر رؤية.
طريقة الاستخدام
Vision(port, brightness, sigs)
حدود |
وصف |
|---|---|
|
ما هو المنفذ الذكي الذي يتصل به مستشعر الرؤية، من 1 إلى 12. |
|
اختياري. قيمة السطوع لمستشعر الرؤية، من 1 إلى 100. |
|
اختياري. اسم واحد أو أكثر من كائنات توقيع اللون أو رمز اللون. |
مثال
# Create a new Signature "RED_BOX" with the Signature class
RED_BOX = Signature(1, -3911, -3435, -3673,10879, 11421, 11150,2.5, 0)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the "RED_BOX" Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)
# Move forward if a red object is detected
while True:
red_object = vision_1.take_snapshot(RED_BOX)
if red_object[0].exists:
drivetrain.drive_for(FORWARD, 10, MM)
wait(5, MSEC)
Color Signature#
يُنشئ التوقيع Signature توقيعًا لونيًا. ويمكن تخزين ما يصل إلى سبعة توقيعات لونية مختلفة على مستشعر الرؤية في وقت واحد.
طريقة الاستخدام:
Signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)
المعلمة |
وصف |
|---|---|
|
فهرس الكائن ذي التوقيع |
|
القيمة من |
|
القيمة من |
|
القيمة من |
|
القيمة من |
|
القيمة من |
|
القيمة من |
|
القيمة من |
|
القيمة من |
للحصول على القيم اللازمة لإنشاء توقيع لوني، انتقل إلى أداة الرؤية. بعد تكوين التوقيع اللوني، انسخ قيم المعلمات من نافذة التكوين.
مثال
# Create a new Signature RED_BOX with the Signature class
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the RED_BOX Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)
# Move forward if a red object is detected
while True:
red_object = vision_1.take_snapshot(RED_BOX)
if red_object[0].exists:
drivetrain.drive_for(FORWARD, 10, MM)
wait(5, MSEC)
Color Code#
يُنشئ الرمز Code ويتطلب استخدامه وجود توقيعين لونيين مُعرّفين مسبقًا على الأقل. ويمكن تخزين ما يصل إلى ثمانية رموز لونية مختلفة على مستشعر الرؤية في آنٍ واحد.
طريقة الاستخدام:
Code(sig1, sig2, sig3, sig4, sig5)
المعلمة |
وصف |
|---|---|
|
تم إنشاء توقيع اللون. |
|
تم إنشاء توقيع اللون. |
|
Optional. A previously created Color Signature. |
|
Optional. A previously created Color Signature. |
|
Optional. A previously created Color Signature. |
مثال
# Create two new Signatures for a red and blue box
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(2, -4443, -3373, -3908,6253, 7741, 6997, 2.5, 1)
# Create a Color Code for a red box to the left of a blue box
RED_BLUE = Code(RED_BOX, BLUE_BOX)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the red_box and blue_box Signatures.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX, BLUE_BOX)
# Display a message if Color Code is detected
while True:
brain.screen.set_cursor(1, 1)
brain.screen.clear_row(1)
# Change to any configured Color Code
box_code = vision_1.take_snapshot(RED_BLUE)
if box_code[0].exists:
brain.screen.print("Color code detected!")
wait(100, MSEC)