tof --- 飛時測距感測器驅動程式

tof 模組驅動透過 I2C 連接至 OpenMV Cam 的飛時測距(ToF)感測器。每個影格會回傳 8x8 區域網格(VL53L5CX / VL53L8CX)中以毫米為單位的每像素深度值,這些值可使用 snapshot() 算繪為獨立的深度影像,或使用 draw_depth() 合成至來自 CSI 感測器的可見光影格上,通常透過 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_depthdraw_depthsnapshot

  • 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() 根據 I2C 位址自動掃描並初始化所連接的 TOF 感測器。

tof.reset() None

重置深度感測器狀態。

tof.deinit() None

取消初始化深度感測器以釋放資源。

tof.width() int

回傳使用中深度感測器的寬度(水平解析度)。若感測器未初始化則引發 RuntimeError

tof.height() int

回傳使用中深度感測器的高度(垂直解析度)。若感測器未初始化則引發 RuntimeError

tof.type() int

回傳使用中深度感測器的類型:

若感測器未初始化則引發 RuntimeError

tof.refresh() int

回傳使用中深度感測器的重新整理率(以 Hz 為單位):

若感測器未初始化則引發 RuntimeError

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

回傳一個元組,包含深度清單(width * height 個以毫米為單位的浮點數)、所見的最小深度與所見的最大深度。

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 上,其左上角從位置 xy 開始。

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_DEPTHimage.PALETTE_RAINBOW),或一個 256 像素的 RGB565 影像,作為灰階深度值的色彩查詢表。

alpha_palette 若不為 None,則為一個 256 像素的 GRAYSCALE 影像,作為 alpha 查詢表,逐像素調節 alpha

hint 是下列各項的邏輯 OR:

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.GRAYSCALEimage.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 影像,作為 alpha 查詢表。

hint 是下列各項的邏輯 OR:

scale 是一個雙值元組 (min, max),控制用於縮放影像的最小與最大深度(以毫米為單位)。預設為影格實際的最小/最大值。

pixformat 控制最終影像的像素格式。必須為 image.GRAYSCALEimage.RGB565

copy_to_fb 若為 True,則將新影像寫入影格緩衝區,而非在 MicroPython 堆積上配置它。

timeout 在引發 RuntimeError 之前等待新影格的毫秒數。若為 0 則永久等待。

常數

tof.TOF_VL53LX: int

VL53L5CX 或 VL53L8CX TOF 感測器(8x8 像素)。