Látóérzékelő#

Bevezetés#

A Vision Sensor egy kamerán alapuló érzékelő, amely képes érzékelni és nyomon követni a színazonosítást és a színkódokat. Lehetővé teszi a robot számára, hogy elemezze a környezetét és reagáljon a vizuális bemenetre.

Az alábbi példákban a konfigurált Vision Sensor neve vision_1lesz, és a konfigurált Color Signature objektumokat, például RED_BOXobjektumot, az API dokumentáció összes további példájában használjuk, amikor Vision osztálymetódusokra hivatkozunk.

Az alábbiakban felsoroljuk az összes módszert:

Getterek – Adatok lekérése a vizuális érzékelőről.

  • take_snapshot — Egy adott aláírás adatait rögzíti.

  • installed — Azt jelzi, hogy a látásérzékelő csatlakozik-e az IQ (2. generációs) agyhoz.

Tulajdonságok — A take_snapshot függvényből visszaadott objektumadatok.

  • largest_object — Azonnal kiválasztja a legnagyobb objektumot a Vision Sensor pillanatképéből.

  • .exists — Meghatározza, hogy az objektum létezik-e az aktuális detektálásban.

  • .width — A detektált objektum szélessége.

  • .height — Az érzékelt objektum magassága.

  • .centerX — Az objektum középpontjának X pozíciója.

  • .centerY — Az objektum középpontjának Y pozíciója.

  • .angle — A színkód orientációja.

  • .originX — Az objektum bal felső sarkának X pozíciója.

  • .originY — Az objektum bal felső sarkának Y pozíciója.

Konstruktorok – Az érzékelők manuális inicializálása és konfigurálása.

  • Vision — Létrehoz egy Vision Sensort.

  • Signature — Színaláírást hoz létre.

  • Code — Színkódot hoz létre.

Getterek#

take_snapshot#

take_snapshot A Vision Sensor keretrendszeréből származó adatokat egyetlen aláírásra szűri – egy mentett leírásra, ami az érzékelő által felismerhető, például egy konfigurált színaláírásra vagy színkódra –, és egy tuple-t ad vissza.

A Színaláírások és Színkódok beállításokat először a Vision Utility programban kell konfigurálni, mielőtt ezzel a módszerrel használhatók lennének.

A tuple a 0 indexszel kezdődően, szélesség szerint a legnagyobbtól a legkisebbig rendezve tárolja az objektumokat. Minden objektum properties tulajdonsága a hozzá tartozó index segítségével érhető el. Ha nem található egyező objektum, akkor egy üres tuple kerül visszaadásra.

Usage:
vision_1.take_snapshot(SIGNATURE)

Paraméterek

Leírás

SIGNATURE

Úgy szűri az adathalmazt, hogy csak az adott aláírás adatait tartalmazza. Az elérhető aláírások a következők:

  • Színaláírások vagy színkódok - A vizuális érzékelő neve, két aláhúzásjel, majd a színaláírás vagy színkód neve. Például: 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)

Színaláírások#

A színaláírás egy egyedi szín, amelyet a vizuális érzékelő felismer. Ezek az aláírások lehetővé teszik a vizuális érzékelő számára, hogy a színük alapján érzékelje és kövesse a tárgyakat. A színaláírás konfigurálása után az érzékelő képes azonosítani a látóterében található adott színű tárgyakat. A színaláírásokat a take_snapshot metódussal együtt használják a színes objektumok valós idejű feldolgozásához és érzékeléséhez.

Ahhoz, hogy egy konfigurált színjelzést használhassunk egy projektben, a nevének a vizuális érzékelő nevéből, két aláhúzásjelből, majd a színjelzés nevéből kell állnia. Például: 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)

Színkódok#

A színkód egy strukturált minta, amely meghatározott sorrendben elrendezett színaláírásokból áll. Ezek a kódok lehetővé teszik a vizuális érzékelő számára, hogy felismerje az előre meghatározott színmintákat. A színkódok hasznosak összetett objektumok azonosítására vagy egyedi jelölők létrehozására az autonóm navigációhoz.

Ahhoz, hogy egy konfigurált színkódot egy projektben használhassunk, a nevének a szenzor nevéből, két aláhúzásjelből, majd a színkód nevéből kell állnia. Például: 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 egy logikai értéket ad vissza, amely azt jelzi, hogy a Vision Sensor jelenleg csatlakozik-e az IQ (2. generációs) agyhoz.

  • True — A látásérzékelő az IQ (2. generációs) agyhoz csatlakozik.

  • False — A látásérzékelő nincs csatlakoztatva az IQ (2. generációs) agyhoz.

Usage:
vision_1.installed()

Paraméterek

Leírás

Ennek a metódusnak nincsenek paraméterei.

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

Tulajdonságok#

largest_object#

largest_object lekéri a take_snapshot metódus legutóbbi használata által visszaadott tuple-ben található legnagyobb észlelt objektumot, amelyből adatokat lehet kinyerni.

Ez a metódus arra használható, hogy mindig a legnagyobb objektumot kapjuk meg egy tuple-ből index megadása nélkül.

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#

Nyolc tulajdonság van, amelyek minden egyes objektumhoz hozzáadódnak, miután a take_snapshot metódust használtuk egy tuple-ben.

Minden tulajdonságérték a detektált objektum pozícióját és méretét írja le a vizuális érzékelő nézetében take_snapshot használatának pillanatában. Ezeket az értékeket pixelben mérik, az érzékelő 316 x 212 pixeles felbontása alapján.

.létezik#

.exists függvény egy logikai értéket ad vissza, amely jelzi, hogy az index létezik-e a tuple-ben vagy sem.

  • True — Az index létezik.

  • False — Az index nem létezik.

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

.szélesség#

.width Visszaadja a detektált objektum szélességét pixelben, ami egy 1 és 316 közötti egész szám.

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

.magasság#

.height A detektált objektum magasságát adja vissza pixelben, ami egy 1 és 212 közötti egész szám.

# 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 Visszaadja a detektált objektum középpontjának x koordinátáját pixelben, ami egy 0 és 316 közötti egész szám.

# 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 Visszaadja a detektált objektum középpontjának y koordinátáját pixelben, ami egy 0 és 212 közötti egész szám.

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

.szög#

.angle függvény visszaadja a detektált objektum orientációját fokban, ami egy 0 és 359 közötti egész szám.

# 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 visszaadja a detektált objektum határolókeretének bal felső sarkának x koordinátáját pixelben, ami egy 0 és 316 közötti egész szám.

# 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 visszaadja a detektált objektum határolókeretének bal felső sarkának y koordinátáját pixelben, ami egy 0 és 212 közötti egész szám.

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

Konstruktorok#

A konstruktorok segítségével manuálisan hozhatók létre Vision, Signatureés Code objektumok, amelyek a szenzorok VEXcode-on kívüli konfigurálásához szükségesek.

Vision Sensor#

Vision létrehoz egy Vision érzékelőt.

Használat

Vision(port, brightness, sigs)

Paraméterek

Leírás

port

Melyik intelligens porthoz van csatlakoztatva a vizuális érzékelő, 1-től 12-ig.

brightness

Opcionális. A vizuális érzékelő fényerőértéke 1-től 100-ig.

sigs

Opcionális. Egy vagy több Color Signature vagy Color Code objektum neve.

Példa

# 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 aláírás színaláírást hoz létre. Egyszerre akár hét különböző színaláírás is tárolható egy vizuális érzékelőn.

Használat:

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

Paraméter

Leírás

index

A Signature objektum indexe 1-től 7-ig. Megjegyzés: Két azonos indexszámú Signature objektum létrehozása azt eredményezi, hogy a másodikként létrehozott objektum felülírja az elsőt.

uMin

A Vision Utility uMin es értékének megadása.

uMax

A Vision Utility uMax közötti értéke.

uMean

A Vision Utility programban uMean közötti érték.

vMin

A Vision Utility vMin értékének megadása.

vMax

A Vision Utility vMax értékének megadása.

vMean

A Vision Utility vMean értékének megadása.

rgb

A Vision Utility rgb értékének megadása.

type

A type be írandó érték a Vision Utility programban.

A színaláírás létrehozásához szükséges értékek megszerzéséhez lépjen a Vision Utility programba. Miután a színaláírás konfigurálva van, másolja ki a paraméterértékeket a konfigurációs ablakból.

Példa

# 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 kód színkódot hoz létre. Használatához legalább két már definiált színaláírás szükséges. Egyszerre akár nyolc különböző színkód is tárolható egy vizuális érzékelőn.

Használat:

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

Paraméter

Leírás

sig1

Egy korábban létrehozott Color Signature.

sig2

Egy korábban létrehozott Color Signature.

sig3

Választható. Egy korábban létrehozott Színaláírás.

sig4

Választható. Egy korábban létrehozott Színaláírás.

sig5

Választható. Egy korábban létrehozott Színaláírás.

Példa

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