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:tof.TOF_VL53LX: 8x8 พิกเซล
ตามค่าเริ่มต้น
typeคือ-1ซึ่งทำให้tof.init()สแกนและกำหนดค่าเซนเซอร์ TOF ที่เชื่อมต่ออยู่โดยอัตโนมัติตามที่อยู่ I2C
- tof.width() int¶
คืนค่าความกว้าง (ความละเอียดแนวนอน) ของเซนเซอร์ความลึกที่ใช้งานอยู่ จะ raise
RuntimeErrorหากเซนเซอร์ไม่ได้ถูกกำหนดค่า
- tof.height() int¶
คืนค่าความสูง (ความละเอียดแนวตั้ง) ของเซนเซอร์ความลึกที่ใช้งานอยู่ จะ raise
RuntimeErrorหากเซนเซอร์ไม่ได้ถูกกำหนดค่า
- tof.type() int¶
คืนค่าประเภทของเซนเซอร์ความลึกที่ใช้งานอยู่:
จะ raise
RuntimeErrorหากเซนเซอร์ไม่ได้ถูกกำหนดค่า
- tof.refresh() int¶
คืนค่าอัตรารีเฟรช (เป็น Hz) ของเซนเซอร์ความลึกที่ใช้งานอยู่:
tof.TOF_VL53LX: 15 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จำนวนมิลลิวินาทีที่รอเฟรมใหม่ก่อน raiseRuntimeErrorถ้าเป็น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,yx_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-255color_paletteคือ enum ของ color palette (เช่นimage.PALETTE_DEPTH,image.PALETTE_RAINBOW) หรือภาพ RGB565 ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหาสีบนค่าความลึกระดับสีเทาalpha_paletteถ้าไม่ใช่Noneคือภาพ GRAYSCALE ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหา alpha ที่ปรับalphaต่อพิกเซลhintคือ OR แบบลอจิกของ:image.AREA: ใช้การปรับขนาดแบบ area เมื่อลดขนาดimage.BILINEAR: ใช้การปรับขนาดแบบ bilinearimage.BICUBIC: ใช้การปรับขนาดแบบ bicubicimage.CENTER: จัดกึ่งกลางภาพบนปลายทางimage.HMIRROR: กระจกในแนวนอนimage.VFLIP: พลิกในแนวตั้งimage.TRANSPOSE: สลับตำแหน่ง (swap x/y)image.EXTRACT_RGB_CHANNEL_FIRST: ดึงช่อง rgb_channel ก่อนการปรับขนาดimage.APPLY_COLOR_PALETTE_FIRST: ใช้ color palette ก่อนการปรับขนาด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)ที่ควบคุมความลึกต่ำสุดและสูงสุด (เป็น 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.RGB565hmirrorถ้าเป็นTrueจะกระจกภาพใหม่ในแนวนอนvflipถ้าเป็นTrueจะพลิกภาพใหม่ในแนวตั้งtransposeถ้าเป็นTrueจะสลับตำแหน่งภาพใหม่x_scaleควบคุมการขยายภาพในทิศทาง x (float) ค่าลบจะกระจกในแนวนอน ถ้าไม่ระบุจะตรงกับy_scaley_scaleควบคุมการขยายภาพในทิศทาง y (float) ค่าลบจะพลิกในแนวตั้ง ถ้าไม่ระบุจะตรงกับx_scaleroiคือทูเพิลสี่เหลี่ยมบริเวณที่สนใจ (ROI)(x, y, w, h)ของต้นทางที่จะดึงrgb_channelคือช่อง RGB (0=R, 1=G, 2=B) ที่จะดึง-1(ค่าเริ่มต้น) ใช้ทุกช่องalphaควบคุมการผสมต้นทางถึงปลายทาง255คือทึบแสง0ทิ้งปลายทางไว้ไม่เปลี่ยนแปลง ช่วง: 0-255color_paletteคือ enum ของ color palette (เช่นimage.PALETTE_DEPTH) หรือภาพ RGB565 ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหาสีalpha_paletteถ้าไม่ใช่Noneคือภาพ GRAYSCALE ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหา alphahintคือ OR แบบลอจิกของ:image.AREA: ใช้การปรับขนาดแบบ area เมื่อลดขนาดimage.BILINEAR: ใช้การปรับขนาดแบบ bilinearimage.BICUBIC: ใช้การปรับขนาดแบบ bicubicimage.CENTER: จัดกึ่งกลางภาพบนปลายทางimage.HMIRROR: กระจกในแนวนอนimage.VFLIP: พลิกในแนวตั้งimage.TRANSPOSE: สลับตำแหน่ง (swap x/y)image.EXTRACT_RGB_CHANNEL_FIRST: ดึงช่อง rgb_channel ก่อนการปรับขนาดimage.APPLY_COLOR_PALETTE_FIRST: ใช้ color palette ก่อนการปรับขนาด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)ที่ควบคุมความลึกต่ำสุดและสูงสุด (เป็น mm) ที่ใช้ปรับขนาดภาพ ค่าเริ่มต้นคือค่าต่ำสุด/สูงสุดจริงของเฟรมpixformatควบคุมรูปแบบพิกเซลของภาพสุดท้าย ต้องเป็นimage.GRAYSCALEหรือimage.RGB565copy_to_fbถ้าเป็นTrueจะเขียนภาพใหม่ลงในบัฟเฟอร์เฟรมแทนการจัดสรรบน MicroPython heaptimeoutจำนวนมิลลิวินาทีที่รอเฟรมใหม่ก่อน raiseRuntimeErrorถ้าเป็น0จะรอตลอดไป