Vidění#

Zavedení#

Vizuální senzor pro VEX EXP detekuje a sleduje barevné podpisy a barevné kódy. To umožňuje vizuálnímu senzoru analyzovat okolí a reagovat na základě detekovaných vizuálních dat.

Tato stránka používá vision_1, RED_BOXa BOX_CODE jako příklady názvů senzoru Vision, barevného podpisu a barevného kódu. V případě potřeby je nahraďte vlastními nakonfigurovanými názvy.

Níže je uveden seznam všech metod:

Získávání dat – Získávání dat z vizuální sondy.

  • take_snapshot – Zachytí data pro konkrétní barevný podpis nebo barevný kód.

  • largest_object – Vybere největší objekt ze snímku.

  • installed – Zda je Vision Sensor připojen k EXP Brain.

Vlastnosti – Data objektu vrácená z take_snapshot.

  • .exists – Zda objekt existuje v aktuální detekci.

  • .width – Width of the detected object.

  • .height – Height of the detected object.

  • .centerX – Pozice středu objektu na souřadnici X.

  • .centerY – Pozice středu objektu v ose Y.

  • .angle – Orientace barevného kódu.

  • .originX – Pozice X levého horního rohu objektu.

  • .originY – Pozice Y levého horního rohu objektu.

Konstruktory – Ručně inicializují a konfigurují kamerový senzor a jeho signatury.

  • Vision – Vytvoří senzor vidění.

  • Signature – Vytvoří barevný podpis.

  • Code – Vytvoří barevný kód.

Gettery#

take_snapshot#

Funkce take_snapshot filtruje data z rámce senzoru Vision do jediného podpisu – uloženého popisu něčeho, co senzor dokáže rozpoznat, například nakonfigurovaného barevného podpisu nebo barevného kódu – a vrací n-tici.

Barevné podpisy a Barevné kódy musí být nejprve nakonfigurovány v nástroji Vision Utility, než je lze použít s touto metodou.

N-tice ukládá objekty seřazené od největší po nejmenší podle šířky, počínaje indexem 0. K vlastnostem properties každého objektu lze přistupovat pomocí jeho indexu. Pokud nejsou detekovány žádné odpovídající objekty, vrátí se prázdná n-tice.

Usage:
vision_1.take_snapshot(SIGNATURE)

Parametry

Popis

SIGNATURE

Filtruje datovou sadu tak, aby obsahovala pouze data daného podpisu. Dostupné podpisy jsou:

  • Barevné podpisy nebo barevné kódy – Název kamerového senzoru, dvě podtržítka a poté název barevného podpisu nebo barevného kódu. Například: 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)

Barevné podpisy#

Barevná signatura je jedinečná barva, kterou dokáže vizuální senzor rozpoznat. Tyto signatury umožňují senzoru detekovat a sledovat objekty na základě jejich barvy. Jakmile je barevná signatura nakonfigurována, senzor dokáže identifikovat objekty s danou barvou ve svém zorném poli. Barevné signatury se používají s take_snapshot ke zpracování a detekci barevných objektů v reálném čase.

Aby bylo možné v projektu použít nakonfigurovaný barevný podpis, musí být jeho název složený z názvu kamerového senzoru, dvou podtržítek a poté názvu barevného podpisu. Například: 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)

Barevné kódy#

Barevný kód je strukturovaný vzor složený z barevných podpisů uspořádaných v určitém pořadí. Tyto kódy umožňují vizuálnímu senzoru rozpoznávat předdefinované barevné vzory. Barevné kódy jsou užitečné pro identifikaci složitých objektů nebo vytváření jedinečných značek pro autonomní navigaci.

Aby bylo možné v projektu použít nakonfigurovaný barevný kód, musí být jeho název složený z názvu kamerového senzoru, dvou podtržítek a poté názvu barevného kódu. Například: 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 načte největší detekovaný objekt, ze kterého se mají získat data v n-tici vrácené z posledního použití take_snapshot.

Tuto metodu lze použít k získání největšího objektu z n-tice bez zadání indexu.

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 vrací booleovskou hodnotu označující, zda je Vision Sensor aktuálně připojen k EXP Brain.

  • True – Vizuální senzor je připojen k EXP Brainu.

  • False – Vizuální senzor není připojen k EXP Brainu.

Usage:
vision_1.installed()

Parametry

Popis

Tato metoda nemá žádné parametry.

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

Nemovitosti#

Každý objekt uložený v n-tici po použití take_snapshot obsahuje osm vlastností.

Všechny hodnoty vlastností popisují polohu a velikost detekovaného objektu v pohledu senzoru v okamžiku použití vlastnosti take_snapshot Tyto hodnoty se měří v pixelech na základě rozlišení senzoru 316 x 212 pixelů.

.exists#

.exists vrací booleovskou hodnotu, která indikuje, zda index v n-tici existuje či nikoli.

  • True - Index existuje.

  • False - Index neexistuje.

# 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 vrací šířku detekovaného objektu v pixelech, což je celé číslo mezi 1 a 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 vrací výšku detekovaného objektu v pixelech, což je celé číslo mezi 1 a 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 vrací souřadnici x středu detekovaného objektu v pixelech, což je celé číslo mezi 0 a 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 vrací souřadnici y středu detekovaného objektu v pixelech, což je celé číslo mezi 0 a 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 vrací orientaci detekovaného objektu ve stupních, což je celé číslo mezi 0 a 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 vrací souřadnici x levého horního rohu ohraničovacího rámečku detekovaného objektu v pixelech, což je celé číslo mezi 0 a 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 vrací souřadnici y levého horního rohu ohraničovacího rámečku detekovaného objektu v pixelech, což je celé číslo mezi 0 a 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)

Konstruktéři#

Konstruktory se používají k ručnímu vytvoření Vision, Signaturea Code , které jsou nezbytné pro konfiguraci senzoru Vision mimo VEXcode.

Vision#

Vision vytvoří Vision Sensor.

Používání

Vision(smartport, brightness, sigs)

Parametry

Popis

smartport

Inteligentní port, ke kterému je připojen kamerový senzor, zapsaný jako Ports.PORTx , kde x je číslo portu.

brightness

Volitelné. Hodnota jasu pro vizuální senzor, od 1 do 100.

sigs

Volitelné. Název jednoho nebo více objektů Barevný podpis nebo Kód barvy oddělených čárkami (,).

# 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 vytváří barevný podpis. Na obrazovém senzoru lze uložit až sedm různých barevných podpisů najednou.

Používání:

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

Parametr

Popis

index

Index objektu Signature , od 1 do 7. Poznámka: Vytvoření dvou objektů Signature se stejným indexovým číslem způsobí, že druhý vytvořený objekt přepíše ten první.

uMin

Hodnota od uMin v nástroji Vision Utility.

uMax

Hodnota od uMax v nástroji Vision Utility.

uMean

Hodnota od uMean v nástroji Vision Utility.

vMin

Hodnota od vMin v nástroji Vision Utility.

vMax

Hodnota od vMax v nástroji Vision Utility.

vMean

Hodnota od vMean v nástroji Vision Utility.

rgb

Hodnota od rgb v nástroji Vision Utility.

type

Hodnota od type v nástroji Vision Utility.

Chcete-li získat hodnoty pro vytvoření barevného podpisu, přejděte do Vision Utility. Jakmile je barevný podpis nakonfigurován, zkopírujte hodnoty parametrů z okna Konfigurace.

"""
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 vytváří barevný kód. Pro jeho použití jsou nutné alespoň dvě již definované barevné signatury. Na obrazovém senzoru lze najednou uložit až osm různých barevných kódů.

Používání:

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

Parametr

Popis

sig1

Dříve vytvořený Barevný podpis.

sig2

Dříve vytvořený Barevný podpis.

sig3

Volitelné. Dříve vytvořený Barevný podpis.

sig4

Volitelné. Dříve vytvořený Barevný podpis.

sig5

Volitelné. Dříve vytvořený Barevný podpis.

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