Vizuální senzor#

Zavedení#

Vizuální senzor je senzor založený na kameře, který dokáže detekovat a sledovat barevné podpisy a barevné kódy. Umožňuje robotovi analyzovat své okolí a reagovat na vizuální vstupy.

V níže uvedených příkladech bude nakonfigurovaný Vision Sensor pojmenován vision_1a nakonfigurované objekty Color Signature, jako například RED_BOX, budou použity ve všech následujících příkladech v této dokumentaci k API při odkazování na Vision.

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

Gettery – Získávají data z vizuální sondy.

  • take_snapshot — Zachytí data pro konkrétní podpis.

  • installed — Zda je senzor Vision připojen k IQ (2. generace) Brain.

Vlastnosti — Data objektu vrácená z take_snapshot.

  • largest_object — Okamžitě vybere největší objekt ze snímku Vision Sensor.

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

  • .width — Šířka detekovaného objektu.

  • .height — Výška detekovaného objektu.

  • .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í inicializace a konfigurace senzorů.

  • 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ý podpis je jedinečná barva, kterou dokáže vizuální senzor rozpoznat. Díky těmto podpisům dokáže vizuální senzor detekovat a sledovat objekty na základě jejich barvy. Jakmile je barevný podpis nakonfigurován, může senzor identifikovat objekty s danou barvou ve svém zorném poli. Barevné podpisy 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, jeho název musí být název senzoru, dvě podtržítka a poté název 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)

installed#

installed vrací booleovskou hodnotu označující, zda je Vision Sensor aktuálně připojen k IQ (2. generace) Brain.

  • True — Senzor vidění je připojen k mozku IQ (2. generace).

  • False — Senzor vidění není připojen k mozku IQ (2. generace).

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("Installed!")

Nemovitosti#

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)

Tuple Properties#

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

.existuje#

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

.šířka#

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

.výška#

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

.úhel#

.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 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 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 senzorů mimo VEXcode.

Vision Sensor#

Vision vytvoří Vision Sensor.

Používání

Vision(port, brightness, sigs)

Parametry

Popis

port

Ke kterému inteligentnímu portu je připojen kamerový senzor, od 1 do 12.

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.

Příklad

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

Příklad

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

Příklad

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