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 พิกเซล)