رؤية#

مقدمة#

يكتشف مستشعر الرؤية الخاص بجهاز VEX EXP ويتتبع التوقيعات اللونية والرموز اللونية. وهذا يسمح لمستشعر الرؤية بتحليل محيطه والتفاعل بناءً على البيانات المرئية المكتشفة.

تستخدم هذه الصفحة الأسماء التالية كمثال على مستشعر الرؤية، وتوقيع اللون، ورمز اللون: vision_1، RED_BOX، و BOX_CODE استبدلها بالأسماء التي قمت بتكوينها حسب الحاجة.

فيما يلي قائمة بجميع الطرق:

أجهزة الاستقبال – الحصول على البيانات من مستشعر الرؤية.

  • take_snapshot – يلتقط البيانات لتوقيع لوني أو رمز لوني محدد.

  • largest_object – تحديد أكبر كائن من اللقطة.

  • installed – ما إذا كان مستشعر الرؤية متصلاً بـ EXP Brain.

الخصائص – بيانات الكائن المُعادة من take_snapshot.

  • .exists – ما إذا كان الكائن موجودًا في عملية الكشف الحالية.

  • .width – عرض الكائن المكتشف.

  • .height – ارتفاع الكائن المكتشف.

  • .centerX – موضع مركز الكائن على المحور X.

  • .centerY – موضع مركز الكائن على المحور Y.

  • .angle – اتجاه رمز اللون.

  • .originX – موضع X للزاوية العلوية اليسرى للكائن.

  • .originY – موضع Y للزاوية العلوية اليسرى للكائن.

المنشئات – قم بتهيئة وتكوين مستشعر الرؤية وتوقيعاته يدويًا.

  • Vision – إنشاء مستشعر رؤية.

  • Signature – إنشاء توقيع لوني.

  • Code – إنشاء رمز لوني.

المحصلون#

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)

حدود

وصف

SIGNATURE

يقوم هذا الإجراء بتصفية مجموعة البيانات بحيث لا تتضمن إلا البيانات التي تحمل التوقيع المحدد. التوقيعات المتاحة هي:

  • التوقيعات اللونية أو رموز الألوان - اسم مستشعر الرؤية، متبوعًا بشرطتين سفليتين، ثم اسم التوقيع اللوني أو رمز اللون. على سبيل المثال: vision_1__RED_BOX.

# 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)

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)

installed#

installed يعيد قيمة منطقية تشير إلى ما إذا كان مستشعر الرؤية متصلاً حاليًا بـ EXP Brain.

  • True – مستشعر الرؤية متصل بدماغ EXP.

  • False - مستشعر الرؤية غير متصل بدماغ EXP.

Usage:
vision_1.installed()

حدود

وصف

لا تحتوي هذه الطريقة على أي معلمات.

# Display a message if the Vision Sensor is connected
if vision_1.installed():
    brain.screen.print("Vision Sensor Installed!")

ملكيات#

هناك ثماني خصائص يتم تضمينها مع كل كائن مخزن في مجموعة بعد استخدام take_snapshot.

تصف جميع قيم الخصائص موضع وحجم الجسم المكتشف في مجال رؤية مستشعر الرؤية لحظة استخدام الأمر take_snapshot تُقاس هذه القيم بالبكسل، بناءً على دقة المستشعر البالغة 316 × 212 بكسل.

.exists#

.exists تُرجع قيمة منطقية تشير إلى ما إذا كان الفهرس موجودًا في المجموعة أم لا.

  • True - الفهرس موجود.

  • False - الفهرس غير موجود.

# Check if at least one red object 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#

.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#

.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#

.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 70 < box_code[0].angle < 110:
            drivetrain.turn_for(RIGHT, 45, DEGREES)
            
        elif 250 < box_code[0].angle < 290:
            drivetrain.turn_for(LEFT, 45, DEGREES)
        
        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)

المُنشئون#

Constructors are used to manually create Vision, Signature, and Code objects, which are necessary for configuring the Vision Sensor outside of VEXcode.

Vision#

Vision يقوم بإنشاء مستشعر رؤية.

طريقة الاستخدام

Vision(smartport, brightness, sigs)

حدود

وصف

smartport

المنفذ الذكي الذي يتصل به مستشعر الرؤية، مكتوبًا على النحو التالي: Ports.PORTx حيث x هو رقم المنفذ.

brightness

اختياري. قيمة السطوع لمستشعر الرؤية، من 1 إلى 100.

sigs

اختياري. اسم واحد أو أكثر من توقيع اللون أو رمز اللون مفصولة بفواصل (,).

# Create the Color Signatures
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 the Color Code
BOX_CODE = Code(RED_BOX, BLUE_BOX)

"""
Create a Vision Sensor with the following values:
- Port 1
- brightness: 80
- RED_BOX and BOX_CODE signatures
"""
vision_1 = Vision(Ports.PORT1, 80, RED_BOX, BOX_CODE)

Signature#

يُنشئ التوقيع Signature توقيعًا لونيًا. ويمكن تخزين ما يصل إلى سبعة توقيعات لونية مختلفة على مستشعر الرؤية في وقت واحد.

طريقة الاستخدام:

Signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)

المعلمة

وصف

index

فهرس الكائن ذي التوقيع Signature ، من 1 إلى 7. ملاحظة: سيؤدي إنشاء كائنين من نوع التوقيع Signature بنفس رقم الفهرس إلى استبدال الكائن الثاني بالكائن الأول.

uMin

القيمة من uMin في أداة الرؤية.

uMax

القيمة من uMax في أداة الرؤية.

uMean

القيمة من uMean في أداة الرؤية.

vMin

القيمة من vMin في أداة الرؤية.

vMax

القيمة من vMax في أداة الرؤية.

vMean

القيمة من vMean في أداة الرؤية.

rgb

القيمة من rgb في أداة الرؤية.

type

القيمة من type في أداة الرؤية.

للحصول على القيم اللازمة لإنشاء توقيع لوني، انتقل إلى أداة الرؤية. بعد تكوين التوقيع اللوني، انسخ قيم المعلمات من نافذة التكوين.

"""
Create a Color Signature with the following values:
- index: 1
- uMin: 10121
- uMax: 10757
- uMean: 10439
- vMin: -1657
- vMax: -1223
- vMean: -1440
- rgb: 2.5
- type: 1
"""
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)

Code#

يُنشئ الرمز Code ويتطلب استخدامه وجود توقيعين لونيين مُعرّفين مسبقًا على الأقل. ويمكن تخزين ما يصل إلى ثمانية رموز لونية مختلفة على مستشعر الرؤية في آنٍ واحد.

طريقة الاستخدام:

Code(sig1, sig2, sig3, sig4, sig5)

المعلمة

وصف

sig1

تم إنشاء توقيع اللون.

sig2

تم إنشاء توقيع اللون.

sig3

Optional. A previously created Color Signature.

sig4

Optional. A previously created Color Signature.

sig5

Optional. A previously created Color Signature.

# Create the Color Signatures
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 with the Color Signatures
BOX_CODE = Code(RED_BOX, BLUE_BOX)