วิสัยทัศน์#

การแนะนำ#

เซ็นเซอร์ตรวจจับภาพสำหรับ 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 กรองข้อมูลจากเฟรมเซ็นเซอร์การมองเห็นให้เหลือเพียงลายเซ็นเดียว ซึ่งเป็นคำอธิบายที่บันทึกไว้ของสิ่งที่เซ็นเซอร์สามารถจดจำได้ เช่น ลายเซ็นสีหรือรหัสสีที่กำหนดค่าไว้ และส่งคืนค่าทูเปิล

ลายเซ็นสี และ รหัสสี จะต้องได้รับการกำหนดค่าใน Vision Utility ก่อนจึงจะสามารถใช้กับวิธีนี้ได้

ทูเพิลนี้เก็บวัตถุที่เรียงลำดับจากใหญ่ที่สุดไปเล็กที่สุดตามความกว้าง โดยเริ่มต้นที่ดัชนี 0 สามารถเข้าถึง คุณสมบัติ ของแต่ละวัตถุได้โดยใช้ดัชนี หากไม่พบวัตถุที่ตรงกัน จะส่งคืนทูเพิลว่างเปล่า

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 Brain แล้ว

  • False – เซ็นเซอร์ตรวจจับภาพไม่ได้เชื่อมต่อกับ EXP Brain

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 x 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 ที่ตรวจพบในหน่วยพิกเซล ซึ่งเป็นจำนวนเต็มระหว่าง 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 วัตถุที่ตรวจพบในหน่วยพิกเซล ซึ่งเป็นจำนวนเต็มระหว่าง 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 ใน Vision Utility

uMax

ค่าตั้งแต่ uMax ใน Vision Utility

uMean

ค่าตั้งแต่ uMean ใน Vision Utility

vMin

ค่าตั้งแต่ vMin ใน Vision Utility

vMax

ค่าตั้งแต่ vMax ใน Vision Utility

vMean

ค่าตั้งแต่ vMean ใน Vision Utility

rgb

ค่าตั้งแต่ rgb ใน Vision Utility

type

ค่าตั้งแต่ type ใน Vision Utility

เพื่อให้ได้ค่าสำหรับการสร้างลายเซ็นสี ให้ไปที่ Vision Utility เมื่อกำหนดค่าลายเซ็นสีเสร็จแล้ว ให้คัดลอกค่าพารามิเตอร์จากหน้าต่างการกำหนดค่า

"""
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

ไม่บังคับ ลายเซ็นสี ที่สร้างไว้ก่อนหน้านี้

sig4

ไม่บังคับ ลายเซ็นสี ที่สร้างไว้ก่อนหน้านี้

sig5

ไม่บังคับ ลายเซ็นสี ที่สร้างไว้ก่อนหน้านี้

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