Датчик зору#
Вступ#
Датчик зору — це датчик на основі камери, який може виявляти та відстежувати колірні сигнатури та колірні коди. Він дозволяє роботу аналізувати своє оточення та реагувати на візуальні сигнали.
У наведених нижче прикладах налаштований датчик зору (Vision Sensor) матиме назву vision_1, а налаштовані об’єкти кольорової сигнатури (Color Signature), такі як RED_BOX, будуть використовуватися у всіх наступних прикладах цієї документації API під час посилання на Vision.
Нижче наведено список усіх методів:
Отримувачі — Отримання даних із датчика зору.
take_snapshot— Збирає дані для певного підпису.installed— Чи підключено датчик зору до мозку IQ (2-го покоління).
Властивості — Дані об’єкта, повернуті з take_snapshot.
largest_object— Негайно вибрати найбільший об’єкт зі знімка Vision Sensor..exists— Чи існує об’єкт у поточному виявленні..width— Ширина виявленого об’єкта..height— Висота виявленого об’єкта..centerX— Положення центру об’єкта по осі X..centerY— Положення центру об’єкта по осі Y..angle— Орієнтація колірного коду..originX— Позиція верхнього лівого кута об’єкта по осі X..originY— Позиція верхнього лівого кута об’єкта по осі Y.
Конструктори — ініціалізують та налаштовують датчики вручну.
Геттери#
take_snapshot#
take_snapshot фільтрує дані з кадру датчика зору до єдиної сигнатури — збереженого опису чогось, що датчик може розпізнати, наприклад, налаштованої колірної сигнатури або колірного коду — та повертає кортеж.
Кольорові підписи та Кольорові коди необхідно спочатку налаштувати в утиліті Vision, перш ніж їх можна буде використовувати з цим методом.
Кортеж зберігає об’єкти, відсортовані від найбільшого до найменшого за шириною, починаючи з індексу 0. Доступ до properties кожного об’єкта можна отримати за його індексом. Якщо не виявлено відповідних об’єктів, повертається порожній кортеж.
Usage:
vision_1.take_snapshot(SIGNATURE)
Параметри |
Опис |
|---|---|
|
Фільтрує набір даних, щоб включити лише дані заданого підпису. Доступні підписи:
|
# 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)
Кольорові підписи#
Колірна сигнатура – це унікальний колір, який може розпізнати датчик зору. Ці сигнатури дозволяють датчику зору виявляти та відстежувати об’єкти на основі їхнього кольору. Після налаштування колірної сигнатури датчик може ідентифікувати об’єкти з цим певним кольором у своєму полі зору. Колірні сигнатури використовуються разом з take_snapshot для обробки та виявлення кольорових об’єктів у режимі реального часу.
Щоб використовувати налаштований колірний підпис у проєкті, його назва має бути назвою датчика Vision Sensor, двома символами підкреслення, а потім назвою колірного підпису. Наприклад: 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)
Колірні коди#
Колірний код – це структурований візерунок, що складається з колірних сигнатур, розташованих у певному порядку. Ці коди дозволяють датчику зору розпізнавати заздалегідь визначені колірні візерунки. Колірні коди корисні для ідентифікації складних об’єктів або створення унікальних маркерів для автономної навігації.
Щоб використовувати налаштований колірний код у проєкті, його назва має бути назвою датчика, двома символами підкреслення, а потім назвою колірного коду. Наприклад: 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 повертає логічне значення, яке вказує, чи підключено сенсор зору до IQ (2-го покоління) Brain.
True— Датчик зору підключено до мозку IQ (2-го покоління).False— Датчик зору не підключений до мозку IQ (2-го покоління).
Usage:
vision_1.installed()
Параметри |
Опис |
|---|---|
Цей метод не має параметрів. |
# Display a message if the Vision Sensor is connected
if vision_1.installed():
brain.screen.print("Installed!")
Властивості#
largest_object#
largest_object отримує найбільший виявлений об’єкт для отримання даних з кортежу, повернутого з останнього використання take_snapshot.
Цей метод можна використовувати для того, щоб завжди отримувати найбільший об’єкт з кортежу без вказівки індексу.
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#
Існує вісім властивостей, які додаються до кожного об’єкта, що зберігається в кортежі після використання take_snapshot.
Усі значення властивостей описують положення та розмір виявленого об’єкта в області зору датчика зору в момент використання take_snapshot Ці значення вимірюються в пікселях, виходячи з роздільної здатності датчика 316 на 212 пікселів.
.існує#
.exists повертає логічне значення, яке вказує, чи існує індекс у кортежі чи ні.
True— Індекс існує.False— Індекс не існує.
# 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)
.width#
.width повертає ширину виявленого об’єкта в пікселях, що є цілим числом від 1 до 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 повертає висоту виявленого об’єкта в пікселях, що є цілим числом від 1 до 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 повертає x-координату центру виявленого об’єкта в пікселях, яка є цілим числом від 0 до 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 повертає y-координату центру виявленого об’єкта в пікселях, яка є цілим числом від 0 до 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 повертає орієнтацію виявленого об’єкта в градусах, що є цілим числом від 0 до 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 повертає x-координату верхнього лівого кута рамки визначення виявленого об’єкта в пікселях, яка є цілим числом від 0 до 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 повертає y-координату верхнього лівого кута рамки визначення виявленого об’єкта в пікселях, що є цілим числом від 0 до 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)
Конструктори#
Конструктори використовуються для ручного створення об’єктів Vision, Signatureта Code , які необхідні для налаштування датчиків поза VEXcode.
Vision Sensor#
Vision створює Датчик Зору.
Використання
Vision(port, brightness, sigs)
Параметри |
Опис |
|---|---|
|
До якого смарт-порту підключено датчик зору, від 1 до 12. |
|
Необов’язково. Значення яскравості для датчика зору, від 1 до 100. |
|
Необов’язково. Назва одного або кількох об’єктів Колірний підпис або Код кольору. |
Приклад
# 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 створює колірний підпис. На датчику зору можна одночасно зберігати до семи різних колірних підписів.
Використання:
Signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)
Параметр |
Опис |
|---|---|
|
Індекс об’єкта |
|
Значення від |
|
Значення від |
|
Значення від |
|
Значення від |
|
Значення від |
|
Значення від |
|
Значення від |
|
Значення від |
Щоб отримати значення для створення колірного підпису, перейдіть до Vision Utility. Після налаштування колірного підпису скопіюйте значення параметрів з вікна конфігурації.
Приклад
# 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 створює колірний код. Для його використання потрібні щонайменше дві вже визначені колірні сигнатури. На датчику зору можна одночасно зберігати до восьми різних колірних кодів.
Використання:
Code(sig1, sig2, sig3, sig4, sig5)
Параметр |
Опис |
|---|---|
|
Раніше створений Кольоровий підпис. |
|
Раніше створений Кольоровий підпис. |
|
Необов’язково. Раніше створений Кольоровий підпис. |
|
Необов’язково. Раніше створений Кольоровий підпис. |
|
Необов’язково. Раніше створений Кольоровий підпис. |
Приклад
# 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)