tof — Драйвер датчика часу прольоту

Модуль tof керує датчиками вимірювання відстані методом часу прольоту (ToF), підключеними до OpenMV Cam через I2C. Кожен кадр повертає значення глибини в міліметрах для кожного пікселя у сітці зон 8x8 (VL53L5CX / VL53L8CX), яке може бути відображено як окреме зображення глибини за допомогою snapshot() або накладено на кадр видимого світла від датчика CSI за допомогою draw_depth(), як правило, через кольорову палітру, наприклад image.PALETTE_DEPTH.

Приклад використання:

import csi
import tof

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)

tof.init()

while True:
    img = csi0.snapshot()
    depth, depth_min, depth_max = tof.read_depth()
    tof.draw_depth(img, depth)
    print("====================")
    print("Min depth in mm seen: %0.2f" % depth_min)
    print("Max depth in mm seen: %0.2f" % depth_max)

Якщо потрібно обертати масив/зображення глибини кратно 90 градусам, передайте такі комбінації hmirror/vflip/transpose до read_depth, draw_depth або snapshot:

  • vflip=False, hmirror=False, transpose=False -> поворот на 0 градусів

  • vflip=True,  hmirror=False, transpose=True -> поворот на 90 градусів

  • vflip=True,  hmirror=True,  transpose=False -> поворот на 180 градусів

  • vflip=False, hmirror=True,  transpose=True -> поворот на 270 градусів

Функції

tof.init(type: int = -1) None

Ініціалізує вбудований датчик глибини.

type вказує тип TOF-датчика:

За замовчуванням type дорівнює -1, що змушує tof.init() автоматично виявляти та ініціалізувати підключений TOF-датчик за його I2C-адресою.

tof.reset() None

Скидає стан датчика глибини.

tof.deinit() None

Деініціалізує датчик глибини та звільняє ресурси.

tof.width() int

Повертає ширину (горизонтальну роздільну здатність) датчика глибини, що використовується. Генерує RuntimeError, якщо датчик не ініціалізовано.

tof.height() int

Повертає висоту (вертикальну роздільну здатність) датчика глибини, що використовується. Генерує RuntimeError, якщо датчик не ініціалізовано.

tof.type() int

Повертає тип датчика глибини, що використовується:

Генерує RuntimeError, якщо датчик не ініціалізовано.

tof.refresh() int

Повертає частоту оновлення (у Гц) датчика глибини, що використовується:

Генерує RuntimeError, якщо датчик не ініціалізовано.

tof.read_depth(hmirror: bool = False, vflip: bool = False, transpose: bool = False, timeout: int = 100) Tuple[List[float], float, float]

Повертає кортеж, що містить список глибин (width * height значень типу float у мм), мінімальну виміряну глибину та максимальну виміряну глибину.

hmirror якщо True, відображає масив глибин горизонтально.

vflip якщо True, перевертає масив глибин вертикально.

transpose якщо True, транспонує масив глибин.

timeout — кількість мілісекунд очікування нового кадру перед генерацією RuntimeError. Якщо 0, чекає нескінченно.

tof.draw_depth(image: image.Image, depth: List[float], x: int = 0, y: int = 0, x_scale: float | None = None, y_scale: float | None = None, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: int = image.PALETTE_DEPTH, alpha_palette: int | None = None, hint: int = 0, scale: Tuple[float, float] | None = None) None

Малює масив depth (повернутий read_depth) на зображенні image, лівий верхній кут якого починається в точці x, y.

x_scale визначає масштабування відображуваного зображення по осі x (число з плаваючою точкою). Від’ємне значення горизонтально відображає зображення. Якщо не вказано, відповідає y_scale для збереження пропорцій.

y_scale визначає масштабування відображуваного зображення по осі y (число з плаваючою точкою). Від’ємне значення вертикально перевертає зображення. Якщо не вказано, відповідає x_scale для збереження пропорцій.

roi — кортеж прямокутника області інтересу (x, y, w, h) вихідного масиву глибин для відображення.

rgb_channel — канал RGB (0=R, 1=G, 2=B) для витягнення з джерела. -1 (за замовчуванням) використовує всі канали.

alpha визначає, яка частина джерела змішується з цільовим зображенням. 255 — непрозоре, 0 — без змін. Діапазон: 0-255.

color_palette — перелік кольорової палітри (наприклад, image.PALETTE_DEPTH, image.PALETTE_RAINBOW) або 256-піксельне зображення RGB565, що використовується як таблиця відповідності кольорів для значення глибини у відтінках сірого.

alpha_palette якщо не None, — 256-піксельне зображення GRAYSCALE, що використовується як таблиця відповідності альфа-каналу для модуляції alpha на кожен піксель.

hint — логічне АБО з:

  • image.AREA: Використовувати масштабування по площі при зменшенні.

  • image.BILINEAR: Використовувати білінійне масштабування.

  • image.BICUBIC: Використовувати бікубічне масштабування.

  • image.CENTER: Центрувати зображення на цільовому.

  • image.HMIRROR: Горизонтально відобразити.

  • image.VFLIP: Вертикально перевернути.

  • image.TRANSPOSE: Транспонувати (поміняти x/y).

  • image.EXTRACT_RGB_CHANNEL_FIRST: Застосувати витягнення rgb_channel перед масштабуванням.

  • image.APPLY_COLOR_PALETTE_FIRST: Застосувати кольорову палітру перед масштабуванням.

  • image.SCALE_ASPECT_KEEP: Вписати у ціль зі збереженням пропорцій.

  • image.SCALE_ASPECT_EXPAND: Заповнити ціль зі збереженням пропорцій (з обрізанням).

  • image.SCALE_ASPECT_IGNORE: Заповнити ціль без збереження пропорцій (з розтягуванням).

  • image.ROTATE_90: Повернути на 90 градусів.

  • image.ROTATE_180: Повернути на 180 градусів.

  • image.ROTATE_270: Повернути на 270 градусів.

scale — кортеж з двох значень (min, max), що визначає мінімальну та максимальну глибину (у мм) для масштабування зображення глибини. За замовчуванням використовуються фактичні мінімум та максимум масиву глибин.

Примітка

read_depth запам’ятовує, чи було його викликано з transpose=True, і draw_depth використовує це внутрішньо для визначення розміру вихідного масиву.

tof.snapshot(hmirror: bool = False, vflip: bool = False, transpose: bool = False, x_scale: float | None = None, y_scale: float | None = None, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: int = image.PALETTE_DEPTH, alpha_palette: int | None = None, hint: int = 0, scale: Tuple[float, float] | None = None, pixformat: int = image.RGB565, copy_to_fb: bool = False, timeout: int = 100) image.Image

Зчитує кадр із датчика глибини та повертає новий об’єкт image.Image у форматі image.GRAYSCALE або image.RGB565.

hmirror якщо True, горизонтально відображає нове зображення.

vflip якщо True, вертикально перевертає нове зображення.

transpose якщо True, транспонує нове зображення.

x_scale визначає масштабування зображення по осі x (число з плаваючою точкою). Від’ємні значення перевертають горизонтально. Якщо не вказано, відповідає y_scale.

y_scale визначає масштабування зображення по осі y (число з плаваючою точкою). Від’ємні значення перевертають вертикально. Якщо не вказано, відповідає x_scale.

roi — кортеж прямокутника області інтересу (x, y, w, h) джерела для витягнення.

rgb_channel — канал RGB (0=R, 1=G, 2=B) для витягнення. -1 (за замовчуванням) використовує всі канали.

alpha визначає змішування джерела з ціллю. 255 — непрозоре, 0 — ціль залишається незміненою. Діапазон: 0-255.

color_palette — перелік кольорової палітри (наприклад, image.PALETTE_DEPTH) або 256-піксельне зображення RGB565, що використовується як таблиця відповідності кольорів.

alpha_palette якщо не None, — 256-піксельне зображення GRAYSCALE, що використовується як таблиця відповідності альфа-каналу.

hint — логічне АБО з:

  • image.AREA: Використовувати масштабування по площі при зменшенні.

  • image.BILINEAR: Використовувати білінійне масштабування.

  • image.BICUBIC: Використовувати бікубічне масштабування.

  • image.CENTER: Центрувати зображення на цільовому.

  • image.HMIRROR: Горизонтально відобразити.

  • image.VFLIP: Вертикально перевернути.

  • image.TRANSPOSE: Транспонувати (поміняти x/y).

  • image.EXTRACT_RGB_CHANNEL_FIRST: Застосувати витягнення rgb_channel перед масштабуванням.

  • image.APPLY_COLOR_PALETTE_FIRST: Застосувати кольорову палітру перед масштабуванням.

  • image.SCALE_ASPECT_KEEP: Вписати у ціль зі збереженням пропорцій.

  • image.SCALE_ASPECT_EXPAND: Заповнити ціль зі збереженням пропорцій (з обрізанням).

  • image.SCALE_ASPECT_IGNORE: Заповнити ціль без збереження пропорцій (з розтягуванням).

  • image.ROTATE_90: Повернути на 90 градусів.

  • image.ROTATE_180: Повернути на 180 градусів.

  • image.ROTATE_270: Повернути на 270 градусів.

scale — кортеж з двох значень (min, max), що визначає мінімальну та максимальну глибину (у мм) для масштабування зображення. За замовчуванням використовуються фактичні мінімум/максимум кадру.

pixformat визначає кінцевий формат пікселів зображення. Має бути image.GRAYSCALE або image.RGB565.

copy_to_fb якщо True, записує нове зображення у кадровий буфер замість виділення пам’яті на купі MicroPython.

timeout — кількість мілісекунд очікування нового кадру перед генерацією RuntimeError. Якщо 0, чекає нескінченно.

Константи

tof.TOF_VL53LX: int

TOF-датчик VL53L5CX або VL53L8CX (8x8 пікселів).