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ů.
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 |
|---|---|
|
Filtruje datovou sadu tak, aby obsahovala pouze data daného podpisu. Dostupné podpisy jsou:
|
# 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 |
|---|---|
|
Ke kterému inteligentnímu portu je připojen kamerový senzor, od 1 do 12. |
|
Volitelné. Hodnota jasu pro vizuální senzor, od 1 do 100. |
|
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 objektu |
|
Hodnota od |
|
Hodnota od |
|
Hodnota od |
|
Hodnota od |
|
Hodnota od |
|
Hodnota od |
|
Hodnota od |
|
Hodnota od |
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 |
|---|---|
|
Dříve vytvořený Barevný podpis. |
|
Dříve vytvořený Barevný podpis. |
|
Volitelné. Dříve vytvořený Barevný podpis. |
|
Volitelné. Dříve vytvořený Barevný podpis. |
|
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)