رؤية الذكاء الاصطناعي#
مقدمة#
يكتشف مستشعر الرؤية المدعوم بالذكاء الاصطناعي في روبوت VEX AIM Coding Robot ويتتبع الأجسام والألوان ومعرفات AprilTag. وهذا يسمح للروبوت بتحليل محيطه، ومتابعة الأجسام، والتفاعل بناءً على البيانات المرئية المكتشفة.
يتمتع مستشعر الرؤية المدعوم بالذكاء الاصطناعي بدقة 320×240 بكسل. تقع نقطة الأصل (0، 0) في الزاوية العلوية اليسرى، مما يجعل مركز المستشعر عند (160، 120)، كما هو موضح في الرسم البياني أدناه:

فيما يلي قائمة بجميع الطرق والخصائص:
الإجراءات — إظهار أو إخفاء بث كاميرا الرؤية بالذكاء الاصطناعي.
show_aivision— يعرض تغذية AI Vision على شاشة الروبوت.hide_aivision— يخفي تغذية AI Vision من الشاشة.tag_detection— تشغيل أو إيقاف تشغيل اكتشاف معرف AprilTag.
المُستقبِلون — اكتشاف ما إذا كان الروبوت يحمل شيئًا ما.
get_data— تُرجع مجموعة من الكائنات المكتشفة لتوقيع معين.has_sports_ball— تُرجع ما إذا كان الروبوت يمتلك كرة رياضية.has_any_barrel— تُرجع ما إذا كان الروبوت يمتلك أي نوع من البراميل.has_blue_barrel— تُرجع ما إذا كان الروبوت يمتلك برميلًا أزرق.has_orange_barrel— تُرجع ما إذا كان الروبوت يمتلك برميلًا برتقاليًا.
الخصائص — بيانات الكائن المُعادة من get_data.
exists— ما إذا كان الكائن موجودًا في عملية الكشف الحالية كقيمة منطقية.width— عرض الكائن المكتشف.height— ارتفاع الكائن المكتشف.centerX— موضع مركز الكائن على المحور X.centerY— موضع مركز الكائن على المحور Y.bearing— الزاوية الأفقية بالنسبة إلى مقدمة الروبوت.rotation— اتجاه الكائن.originX— موضع الزاوية العلوية اليسرى للكائن X.originY— موضع Y للزاوية العلوية اليسرى للكائن.id— تصنيف أو معرف علامة الكائن.score— درجة الثقة لتصنيفات الذكاء الاصطناعي.type— يُرجع نوع الكائن (AI أو Tag أو Color أو Code).
المنشئون — حددوا توقيعات الألوان ورموزها.
إنشاء توقيع لوني — يقوم بإنشاء توقيع لوني جديد بناءً على نطاقات RGB ودرجة اللون/التشبع.
إنشاء رمز لوني — يجمع بين عدة توقيعات لونية في رمز لوني واحد.
الإجراءات#
show_aivision#
يعرض الأمر show_aivision بيانات مستشعر الرؤية بالذكاء الاصطناعي مباشرةً على شاشة الروبوت. وستغطي هذه البيانات أي صور أو نصوص أخرى معروضة على الشاشة.
ملاحظة: لن تعرض الشاشة أي صور أو نصوص أخرى إلا إذا تم استخدام hide_aivision لإخفاء التغذية.
Usage:
robot.screen.show_aivision()
حدود |
وصف |
|---|---|
لا تحتوي هذه الطريقة على أي معلمات. |
# Watch the AI Vision Sensor detect AI Classifications
# and AprilTag IDs as you move the robot
robot.screen.show_aivision()
hide_aivision#
hide_aivision يزيل تغذية البيانات المباشرة لمستشعر الرؤية بالذكاء الاصطناعي من شاشة الروبوت.
Usage:
robot.screen.hide_aivision()
حدود |
وصف |
|---|---|
لا تحتوي هذه الطريقة على أي معلمات. |
# View the AI Vision Sensor's feed for five seconds
robot.screen.show_aivision()
wait(5, SECONDS)
robot.screen.hide_aivision()
tag_detection#
tag_detection تمكين أو تعطيل اكتشاف معرف AprilTag، حيث تكون الحالة قيمة منطقية.
يمكن للمستشعر اكتشاف معرفات AprilTag من 0 إلى 36 من عائلة Circle21h7.
Usage:
robot.vision.tag_detection(state)
حدود |
وصف |
|---|---|
|
القيم هي: |
robot.screen.set_font(PROP30)
# Cut off AprilTag ID detection after 5 seconds
while True:
if timer.time(SECONDS) > 5:
robot.vision.tag_detection(False)
robot.screen.clear_screen()
robot.screen.set_cursor(3, 1)
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
robot.screen.print("AprilTag ID detected!")
else:
robot.screen.print("Nothing detected!")
wait(0.1, SECONDS)
المحصلون#
get_data#
get_data تقوم بتصفية البيانات من إطار مستشعر الرؤية AI إلى توقيع واحد - وصف محفوظ لشيء يمكن للمستشعر التعرف عليه، مثل كائن مدرب مسبقًا، أو معرف AprilTag، أو توقيع لوني أو رمز لوني تم تكوينه - وتعيد tuple.
يجب أولاً تكوين توقيعات الألوان و رموز الألوان في أداة AI Vision Utility قبل أن يتم استخدامها مع هذه الطريقة.
يخزن tuple الكائنات مرتبة من الأكبر إلى الأصغر حسب العرض، بدءًا من الفهرس 0. ويمكن الوصول إلى properties لكل كائن باستخدام فهرسه. ويتم إرجاع tuple فارغ في حال عدم العثور على أي كائنات مطابقة.
Usage:
robot.vision.get_data(signature, count)
حدود |
وصف |
|---|---|
|
يقوم بتصفية مجموعة البيانات بحيث لا تتضمن إلا البيانات ذات التوقيع المحدد. التوقيعات المتاحة هي:
|
|
اختياري. يحدد الحد الأقصى لعدد العناصر التي يمكن إرجاعها من 1 إلى 24 (الافتراضي: 8). |
ملاحظة: يمكن الحصول على معرفات AprilTag من 5 إلى 37 باستخدام معرفات AprilTag المطبوعة من AIM Printables.
# Move forward if a sports ball is detected
while True:
ball = robot.vision.get_data(SPORTS_BALL)
if ball[0].exists:
robot.move_for(10, 0)
wait(50, MSEC)
Note: The returned tuple can be sorted by any property, not just width, using Python’s sorted function. For example, sorting by AprilTag ID:
# Print each detected AprilTag ID in ascending order by ID
while True:
apriltags = sorted(robot.vision.get_data(ALL_TAGS), key=id)
for tag in apriltags:
print(tag.id)
wait(1, SECONDS)
أو الترتيب حسب الطول بدلاً من ذلك:
# Print each detected AprilTag ID in ascending order by height
while True:
apriltags_by_height = sorted(robot.vision.get_data(ALL_TAGS), key=lambda tag: tag.height)
for tag in apriltags_by_height:
print(tag.height)
wait(1, SECONDS)
عرض البيانات#
طباعة المجموعة التي تم إرجاعها بواسطة get_data تعرض قائمة بجميع خصائص جميع الكائنات التي تم اكتشافها:
# Display properties of all detected AprilTag IDs
while True:
vision_data = robot.vision.get_data(ALL_TAGS)
if vision_data[0].exists:
break
wait(0.25, SECONDS)
print(vision_data)

تصنيفات الذكاء الاصطناعي#
يستطيع مستشعر الرؤية بتقنية الذكاء الاصطناعي من AIM اكتشاف تصنيفات الذكاء الاصطناعي التالية:
رقم الهوية |
تصنيف الذكاء الاصطناعي |
إمضاء |
|---|---|---|
0 |
كرة |
|
1 |
بلو باريل |
|
2 |
برميل برتقالي |
|
3 |
روبوت AIM |
|
التوقيعات اللونية#
التوقيع اللوني هو لون فريد يمكن لمستشعر الرؤية المدعوم بالذكاء الاصطناعي التعرف عليه. تُمكّن هذه التوقيعات المستشعر من اكتشاف الأجسام وتتبعها بناءً على لونها. بمجرد إعداد التوقيع اللوني، يستطيع المستشعر تحديد الأجسام التي تحمل هذا اللون المحدد ضمن مجال رؤيته. تُستخدم التوقيعات اللونية مع get_data لمعالجة الأجسام الملونة واكتشافها في الوقت الفعلي.

# Display if any objects match the Red_Box signature
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Signature
ai_objects = robot.vision.get_data(Red_Box)
if ai_objects[0].exists:
robot.screen.print("Color signature detected!")
رموز الألوان#
رمز اللون هو نمط منظم يتكون من 2 إلى 4 رموز لونية مرتبة بترتيب محدد. تُمكّن هذه الرموز مستشعر الرؤية المدعوم بالذكاء الاصطناعي من التعرف على أنماط الألوان المُحددة مسبقًا. تُعد رموز الألوان مفيدة لتحديد الأجسام المعقدة أو إنشاء علامات فريدة للملاحة الذاتية.

# Display if any objects match the BlueRed code
while True:
robot.screen.set_cursor(1, 1)
robot.screen.clear_row(1)
# Change to any configured Color Code
ai_objects = robot.vision.get_data(BlueRed)
if ai_objects[0].exists:
robot.screen.print("Color code detected!")
has_sports_ball#
has_sports_ball تُرجع قيمة منطقية تشير إلى ما إذا كان الروبوت يمتلك كرة رياضية حاليًا.
True— الروبوت لديه كرة رياضية.False— الروبوت لا يملك كرة رياضية.
Usage:
robot.has_sports_ball()
حدود |
وصف |
|---|---|
لا تحتوي هذه الطريقة على أي معلمات. |
# Kick when the robot has a sports ball
while True:
if robot.has_sports_ball():
robot.kicker.kick(MEDIUM)
wait(50, MSEC)
has_any_barrel#
has_any_barrel تُرجع قيمة منطقية تشير إلى ما إذا كان الروبوت يمتلك حاليًا أي نوع من البراميل.
True— الروبوت لديه برميل.False— الروبوت ليس لديه برميل.
Usage:
robot.has_any_barrel()
حدود |
وصف |
|---|---|
لا تحتوي هذه الطريقة على أي معلمات. |
# Push a barrel away when detected
while True:
if robot.has_any_barrel():
robot.kicker.place()
wait(50, MSEC)
has_blue_barrel#
has_blue_barrel تُرجع قيمة منطقية تشير إلى ما إذا كان الروبوت يمتلك حاليًا برميلًا أزرق.
True— الروبوت لديه برميل أزرق.False— الروبوت ليس لديه برميل أزرق.
Usage:
robot.has_blue_barrel()
حدود |
وصف |
|---|---|
لا تحتوي هذه الطريقة على أي معلمات. |
# Push a blue barrel away when detected
while True:
if robot.has_blue_barrel():
robot.kicker.place()
wait(50, MSEC)
has_orange_barrel#
has_orange_barrel تُرجع قيمة منطقية تشير إلى ما إذا كان الروبوت يمتلك برميلًا برتقاليًا حاليًا.
True— الروبوت لديه برميل برتقالي.False— الروبوت ليس لديه برميل برتقالي.
Usage:
robot.has_orange_barrel()
حدود |
وصف |
|---|---|
لا تحتوي هذه الطريقة على أي معلمات. |
# Push an orange barrel away when detected
while True:
if robot.has_orange_barrel():
robot.kicker.place()
wait(50, MSEC)
ملكيات#
هناك اثنتا عشرة خاصية يتم تضمينها مع كل كائن مخزن في مجموعة بعد استخدام طريقة robot.vision.get_data.
تصف جميع قيم الخصائص، باستثناء .idو .scoreو .type ، موضع الجسم المكتشف وحجمه واتجاهه وزاويته لحظة استخدام robot.vision.get_data تُقاس هذه القيم بالبكسل أو الدرجات، بناءً على دقة المستشعر البالغة 320 × 240 بكسل.

.exists#
.exists تُرجع قيمة منطقية تشير إلى ما إذا كان الفهرس موجودًا في المجموعة أم لا.
True— الفهرس موجود.False— الفهرس غير موجود.
# Check if at least two objects are detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
ai_objects = robot.vision.get_data(ALL_CARGO)
if ai_objects[0].exists:
if ai_objects[1].exists:
robot.screen.print("At least 2")
else:
robot.screen.print("Less than 2")
wait(0.1, SECONDS)
.width#
.width تُرجع عرض الكائن المكتشف بالبكسل، وهو عدد صحيح بين 1 و 320.
ملاحظة: قيم البكسل نسبية لنظام إحداثيات المستشعر. انظر الرسم التوضيحي في المقدمة للمزيد من المعلومات.

# Move towards a Blue Barrel until its width is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].width < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.height#
.height تُرجع ارتفاع الكائن المكتشف بالبكسل، وهو عدد صحيح بين 1 و 240.
ملاحظة: قيم البكسل نسبية لنظام إحداثيات المستشعر. انظر الرسم التوضيحي في المقدمة للمزيد من المعلومات.

# Move towards a Blue Barrel until its height is
# larger than 100 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].height < 100:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.centerX#
.centerX تُرجع الإحداثي السيني لمركز الكائن المكتشف بالبكسل، وهو عدد صحيح بين 0 و 320.
ملاحظة: قيم البكسل نسبية لنظام إحداثيات المستشعر. انظر الرسم التوضيحي في المقدمة للمزيد من المعلومات.

# Turn slowly until a Blue Barrel is centered in
# front of the robot
robot.set_turn_velocity(30)
robot.turn(RIGHT)
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if 140 < barrel[0].centerX < 180:
robot.stop_all_movement()
wait(10,MSEC)
.centerY#
.centerY تُرجع إحداثيات y لمركز الكائن المكتشف بالبكسل، وهو عدد صحيح بين 0 و 240.
ملاحظة: قيم البكسل نسبية لنظام إحداثيات المستشعر. انظر الرسم التوضيحي في المقدمة للمزيد من المعلومات.

# Move towards a Blue Barrel until its
# center y-coordinate is more than 140 pixels
while True:
barrel = robot.vision.get_data(BLUE_BARREL)
if barrel[0].exists:
if barrel[0].centerY < 140:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.bearing#
.bearing returns a decimal (float) representing how far an object is to the left or right of the center of the AI Vision Sensor’s view as a degree. A value of 0 means it’s centered, positive values mean the object is to the right, and negative values mean the object is to the left.
# Turn to keep the Blue Barrel directly in front
robot.set_turn_velocity(40)
while True:
vision_data = robot.vision.get_data(BLUE_BARREL)
if vision_data[0].exists:
if vision_data[0].bearing > 5:
robot.turn(RIGHT)
elif vision_data[0].bearing < -5:
robot.turn(LEFT)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(0.1, SECONDS)
.rotation#
تُعيد الدالة .rotation اتجاه الكائن على مستوى رؤية مستشعر الرؤية بالذكاء الاصطناعي، مُقاسًا بالدرجات من 0 إلى 359. يكون رمز اللون 0° عندما تكون ألوانه مُرتبة في خط أفقي (مثلًا، أحمر-أزرق). إذا تم تدوير الألوان، تتغير الزاوية (مثلًا، ترتيب الأزرق-الأحمر يُعطي 180°).
في المثال أدناه، تم تكوين رمز اللون بحيث يكون اللون الأحمر على اليسار والأزرق على اليمين.
في هذه الصورة، وضع اللون الأزرق فوق اللون الأحمر يعادل تدوير رمز اللون الأصلي 270 درجة إلى اليمين.

# Slide left or right depending on how a Color Code (BlueRed)
# is rotated on the vertical plane
while True:
# Original Color Code is Red to the left, Blue to the right
code = robot.vision.get_data(BlueRed)
if code[0].exists:
# Check if Color Code is now Red on top of Blue
if 50 < code[0].rotation < 100 :
robot.move_at(90)
# Check if Color Code is now Blue on top of Red
elif 270 < code[0].rotation < 330 :
robot.move_at(270)
else:
robot.stop_all_movement()
else:
robot.stop_all_movement()
wait(50, MSEC)
.originX#
.originX تُرجع الإحداثي السيني للزاوية العلوية اليسرى من المربع المحيط بالكائن المكتشف بالبكسل، وهو عدد صحيح بين 0 و 320.
ملاحظة: قيم البكسل نسبية لنظام إحداثيات المستشعر. انظر الرسم التوضيحي في المقدمة للمزيد من المعلومات.

# Display if an Orange Barrel is to the
# left or the right
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1,1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originX < 160:
robot.screen.print("To the left!")
else:
robot.screen.print("To the right!")
wait(50, MSEC)
.originY#
.originY تُرجع إحداثيات y للزاوية العلوية اليسرى للمربع المحيط بالكائن المكتشف بالبكسل، وهو عدد صحيح بين 0 و 240.
ملاحظة: قيم البكسل نسبية لنظام إحداثيات المستشعر. انظر الرسم التوضيحي في المقدمة للمزيد من المعلومات.

# Display if an Orange Barrel is close or far
# from the robot
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
orange_barrel = robot.vision.get_data(ORANGE_BARREL)
if orange_barrel[0].exists:
if orange_barrel[0].originY < 80:
robot.screen.print("Far")
else:
robot.screen.print("Close")
wait(50, MSEC)
.id#
.id تُرجع معرف تصنيف الذكاء الاصطناعي المكتشف أو معرف AprilTag كرقم صحيح.
بالنسبة لمعرف AprilTag، تمثل الخاصية .id رقم معرف AprilTag المكتشف في النطاق من 0 إلى 37. بالنسبة لتصنيف الذكاء الاصطناعي، تتوافق الخاصية .id مع المعرف المحدد مسبقًا في قسم تصنيفات الذكاء الاصطناعي.
# Move forward when AprilTag ID 1 is detected
while True:
apriltags = robot.vision.get_data(ALL_TAGS)
if apriltags[0].exists:
if apriltags[0].id == 1:
robot.move_at(0)
else:
robot.stop_all_movement()
wait(50, MSEC)
.score#
.score تُرجع درجة الثقة لتصنيف الذكاء الاصطناعي المكتشف كعدد صحيح بين 1 و 100.
تشير الدرجة المنخفضة إلى أن المستشعر أقل ثقة بشأن الجسم المكتشف، بينما تشير الدرجة الأعلى إلى أن المستشعر أكثر ثقة.
# Look confident if an Orange Barrel is detected
while True:
barrel = robot.vision.get_data(ORANGE_BARREL)
if barrel[0].exists:
if barrel[0].score > 95:
robot.screen.show_emoji(CONFIDENT)
else:
robot.screen.hide_emoji()
wait(50, MSEC)
.type#
تُعيد .type عددًا صحيحًا يُشير إلى نوع الكائن المُكتشف. يُمكنك مُقارنة هذه القيمة باستخدام رقم النوع أو الثابت المُسمى المُناسب.
نوع الكائن |
الكائنات المضمنة |
|---|---|
|
— كرات رياضية |
|
— معرّفات أبريل تاج |
|
— التوقيعات اللونية |
|
— رموز الألوان |
# Display if an AprilTag ID or AI Classification
# is detected
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
if vision_data[0].type == AiVision.AI_OBJECT:
robot.screen.print("AI Object!")
elif vision_data[0].type == AiVision.TAG_OBJECT:
robot.screen.print("AprilTag ID!")
wait(0.1, SECONDS)
# Display a list of all detected objects
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
vision_data = robot.vision.get_data(ALL_VISION)
if vision_data[0].exists:
for obj in vision_data:
if obj.type == AiVision.AI_OBJECT:
robot.screen.print("- AI Object")
elif obj.type == AiVision.TAG_OBJECT:
robot.screen.print("- AprilTag ID")
robot.screen.next_row()
wait(0.1, SECONDS)
المُنشئون#
Creating a Color Signature#
A new Color Signature is created using the Colordesc constructor and then registered with the AI Vision Sensor using the color_description method. A Colordesc object defines 1 of up to 7 detectable color signatures for the sensor, but it must be explicitly set using color_description to take effect.
استخدام Colordesc:
Colordesc(index, red, green, blue, hangle, hdsat)
المعلمة |
وصف |
|---|---|
|
عدد صحيح من 1 إلى 7 يمثل فهرس توقيع اللون. إذا استخدم توقيعان لونيان نفس الفهرس، فسيتم إلغاء الأول بالتوقيع الثاني. |
|
عدد صحيح من 0 إلى 255 للمكون الأحمر من اللون. |
|
عدد صحيح من 0 إلى 255 للمكون الأخضر من اللون. |
|
عدد صحيح من 0 إلى 255 للمكون الأزرق من اللون. |
|
قيمة عشرية من 1 إلى 40 تمثل نطاق اللون بالدرجات. |
|
قيمة عشرية من 0.10 إلى 1.00 تمثل نطاق التشبع. |
استخدام وصف اللون:
robot.vision.color_description(object)
المعلمة |
وصف |
|---|---|
|
العنصر |
# Detect a red object
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
robot.vision.color_description(red_box)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
red_boxes = robot.vision.get_data(red_box)
if red_boxes[0].exists:
robot.screen.print("Red detected!")
else:
robot.screen.print("No red detected.")
wait(0.2, SECONDS)
Creating a Color Code#
يتم إنشاء رمز لوني جديد باستخدام الدالة البانية Codedesc Codedesc ثم يتم تفعيله باستخدام الدالة code_description code_description code_description Colordesc
استخدام Codedesc:
Codedesc(index, c1, c2, c3, c4, c5)
المعلمة |
وصف |
|---|---|
|
فهرس رمز اللون، من 1 إلى 8. ملاحظة: إذا قمت بإنشاء كائنين |
|
|
|
الكائن الثاني |
|
اختياري. عنصر ثالث |
|
اختياري. عنصر رابع |
استخدام وصف الكود:
robot.vision.code_description(object)
المعلمة |
وصف |
|---|---|
|
كائن |
# Create Color Signatures
red_box = Colordesc(1, 207, 19, 25, 10.00, 0.20)
purple_box = Colordesc(2, 98, 18, 227, 10.00, 0.20)
robot.vision.color_description(red_box)
robot.vision.color_description(purple_box)
# Detect a red_purple Color Code
red_purple = Codedesc(1, red_box, purple_box)
robot.vision.code_description(red_purple)
while True:
robot.screen.clear_screen()
robot.screen.set_cursor(1, 1)
code_objects = robot.vision.get_data(red_purple)
if code_objects[0].exists:
robot.screen.print("Code detected!")
else:
robot.screen.print("No code detected.")
wait(0.2, SECONDS)