tof --- ไดรเวอร์เซนเซอร์วัดระยะ time-of-flight

โมดูล tof ขับเคลื่อนเซนเซอร์วัดระยะ time-of-flight (ToF) ที่เชื่อมต่อกับ OpenMV Cam ผ่าน I2C แต่ละเฟรมจะคืนค่าความลึกต่อพิกเซลเป็นมิลลิเมตรสำหรับกริด 8x8 โซน (VL53L5CX / VL53L8CX) ซึ่งสามารถแสดงผลเป็นภาพความลึกแบบเดี่ยวด้วย snapshot() หรือซ้อนทับลงบนเฟรมแสงที่มองเห็นได้จากเซนเซอร์ CSI ด้วย draw_depth() โดยปกติผ่าน colour palette เช่น 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

คืนค่าความกว้าง (ความละเอียดแนวนอน) ของเซนเซอร์ความลึกที่ใช้งานอยู่ จะ raise RuntimeError หากเซนเซอร์ไม่ได้ถูกกำหนดค่า

tof.height() int

คืนค่าความสูง (ความละเอียดแนวตั้ง) ของเซนเซอร์ความลึกที่ใช้งานอยู่ จะ raise RuntimeError หากเซนเซอร์ไม่ได้ถูกกำหนดค่า

tof.type() int

คืนค่าประเภทของเซนเซอร์ความลึกที่ใช้งานอยู่:

จะ raise RuntimeError หากเซนเซอร์ไม่ได้ถูกกำหนดค่า

tof.refresh() int

คืนค่าอัตรารีเฟรช (เป็น Hz) ของเซนเซอร์ความลึกที่ใช้งานอยู่:

จะ raise RuntimeError หากเซนเซอร์ไม่ได้ถูกกำหนดค่า

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

คืนค่าทูเพิลที่ประกอบด้วยรายการความลึก (width * height ค่า float เป็น mm) ความลึกต่ำสุด และความลึกสูงสุดที่พบ

hmirror ถ้าเป็น True จะกระจกอาร์เรย์ความลึกในแนวนอน

vflip ถ้าเป็น True จะพลิกอาร์เรย์ความลึกในแนวตั้ง

transpose ถ้าเป็น True จะสลับตำแหน่งอาร์เรย์ความลึก

timeout จำนวนมิลลิวินาทีที่รอเฟรมใหม่ก่อน raise 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 (float) ถ้าค่านี้เป็นลบ ภาพจะถูกกระจกในแนวนอน ถ้าไม่ระบุจะตรงกับ y_scale เพื่อรักษาอัตราส่วน

y_scale ควบคุมการขยายภาพที่แสดงในทิศทาง y (float) ถ้าค่านี้เป็นลบ ภาพจะถูกพลิกในแนวตั้ง ถ้าไม่ระบุจะตรงกับ x_scale เพื่อรักษาอัตราส่วน

roi คือทูเพิลสี่เหลี่ยมบริเวณที่สนใจ (ROI) (x, y, w, h) ของอาร์เรย์ความลึกต้นทางที่จะวาด

rgb_channel คือช่อง RGB (0=R, 1=G, 2=B) ที่จะดึงจากต้นทาง -1 (ค่าเริ่มต้น) ใช้ทุกช่อง

alpha ควบคุมปริมาณต้นทางที่ผสมเข้าไปในภาพปลายทาง 255 คือทึบแสง 0 ไม่มีการแก้ไข ช่วง: 0-255

color_palette คือ enum ของ color palette (เช่น image.PALETTE_DEPTH, image.PALETTE_RAINBOW) หรือภาพ RGB565 ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหาสีบนค่าความลึกระดับสีเทา

alpha_palette ถ้าไม่ใช่ None คือภาพ GRAYSCALE ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหา alpha ที่ปรับ alpha ต่อพิกเซล

hint คือ OR แบบลอจิกของ:

scale คือทูเพิลสองค่า (min, max) ที่ควบคุมความลึกต่ำสุดและสูงสุด (เป็น mm) ที่ใช้ปรับขนาดภาพความลึก ค่าเริ่มต้นคือค่าต่ำสุดและสูงสุดจริงของอาร์เรย์ความลึก

Note

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 (float) ค่าลบจะกระจกในแนวนอน ถ้าไม่ระบุจะตรงกับ y_scale

y_scale ควบคุมการขยายภาพในทิศทาง y (float) ค่าลบจะพลิกในแนวตั้ง ถ้าไม่ระบุจะตรงกับ x_scale

roi คือทูเพิลสี่เหลี่ยมบริเวณที่สนใจ (ROI) (x, y, w, h) ของต้นทางที่จะดึง

rgb_channel คือช่อง RGB (0=R, 1=G, 2=B) ที่จะดึง -1 (ค่าเริ่มต้น) ใช้ทุกช่อง

alpha ควบคุมการผสมต้นทางถึงปลายทาง 255 คือทึบแสง 0 ทิ้งปลายทางไว้ไม่เปลี่ยนแปลง ช่วง: 0-255

color_palette คือ enum ของ color palette (เช่น image.PALETTE_DEPTH) หรือภาพ RGB565 ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหาสี

alpha_palette ถ้าไม่ใช่ None คือภาพ GRAYSCALE ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหา alpha

hint คือ OR แบบลอจิกของ:

scale คือทูเพิลสองค่า (min, max) ที่ควบคุมความลึกต่ำสุดและสูงสุด (เป็น mm) ที่ใช้ปรับขนาดภาพ ค่าเริ่มต้นคือค่าต่ำสุด/สูงสุดจริงของเฟรม

pixformat ควบคุมรูปแบบพิกเซลของภาพสุดท้าย ต้องเป็น image.GRAYSCALE หรือ image.RGB565

copy_to_fb ถ้าเป็น True จะเขียนภาพใหม่ลงในบัฟเฟอร์เฟรมแทนการจัดสรรบน MicroPython heap

timeout จำนวนมิลลิวินาทีที่รอเฟรมใหม่ก่อน raise RuntimeError ถ้าเป็น 0 จะรอตลอดไป

ค่าคงที่

tof.TOF_VL53LX: int

เซนเซอร์ TOF รุ่น VL53L5CX หรือ VL53L8CX (8x8 พิกเซล)