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.
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 |
|---|---|
|
Úgy szűri az adathalmazt, hogy csak az adott aláírás adatait tartalmazza. Az elérhető aláírások a következők:
|
# 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 |
|---|---|
|
Melyik intelligens porthoz van csatlakoztatva a vizuális érzékelő, 1-től 12-ig. |
|
Opcionális. A vizuális érzékelő fényerőértéke 1-től 100-ig. |
|
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 |
|---|---|
|
A |
|
A Vision Utility |
|
A Vision Utility |
|
A Vision Utility programban |
|
A Vision Utility |
|
A Vision Utility |
|
A Vision Utility |
|
A Vision Utility |
|
A |
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 |
|---|---|
|
Egy korábban létrehozott Color Signature. |
|
Egy korábban létrehozott Color Signature. |
|
Választható. Egy korábban létrehozott Színaláírás. |
|
Választható. Egy korábban létrehozott Színaláírás. |
|
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)