13.1.9. Chế độ xem Kênh#

Bộ đệm khung hình hiển thị những gì camera nhìn thấy; chế độ xem Kênh hiển thị những gì tập lệnh đo và quyết định. Một tập lệnh công bố các giá trị có tên qua giao thức gỡ lỗi -- một nhiệt độ, một số lượng phát hiện, một dạng sóng micrô, một bản đồ độ sâu thời gian bay, hoặc một điều khiển mà nó muốn người dùng có thể thay đổi -- và IDE hiển thị trực tiếp mỗi giá trị thành một widget, một đồ thị hoặc một bản đồ trong khung bên dưới bộ đệm khung hình. Không cần vẽ gì lên ảnh hay phân tích gì từ terminal. Ở phía camera, đó là vài dòng với protocol.CBORChannel; ở phía IDE, đó là mục Kênh của bộ chọn khung.

The Channels view showing a thermal camera script's controls channel: FPA and AUX temperature readouts with their unit, Measurement and High Temp toggles, Temp Min and Temp Max sliders, and H-Mirror and V-Flip toggles

Các điều khiển của một tập lệnh camera nhiệt: hai giá trị đọc nhiệt độ, công tắc cho các chế độ đo, và thanh trượt cho dải nhiệt độ. Thay đổi bất kỳ điều khiển nào sẽ gửi giá trị mới đến tập lệnh.#

Chế độ xem được tổ chức theo kênh. Mỗi kênh mà tập lệnh đăng ký trở thành một mục với tên kênh làm tiêu đề, và mỗi bản ghi trong kênh trở thành một hàng bên dưới, theo thứ tự tập lệnh đã thêm. Khi tập lệnh đăng ký một kênh hoặc thay đổi hình dạng của một kênh, chế độ xem tự xây dựng lại; khi tập lệnh dừng, các giá trị cuối cùng vẫn ở trên màn hình, với các điều khiển bị vô hiệu hóa, cho đến khi tập lệnh tiếp theo bắt đầu.

13.1.9.1. Widget#

Các giá trị đọc và điều khiển có dạng hiển nhiên. Một label là giá trị chỉ đọc kèm đơn vị; một bản ghi text là khối văn bản phong phú tĩnh cho tiêu đề và giải thích. Các loại ghi được gửi giá trị mới của chúng về tập lệnh ngay khi bạn thay đổi, nơi callback on_write của tập lệnh nhận tên bản ghi và giá trị: một toggle là công tắc, một slider và một spinbox đặt một số trong dải và bước của tập lệnh (ô số để nhập chính xác), các nút radio và một select chọn một trong các tùy chọn của tập lệnh, một lineedit là trường văn bản tự do, và một pushbutton kích hoạt một hành động tức thời. Chế độ xem giữ chỉnh sửa của bạn trên màn hình thay vì bật ngược về giá trị camera công bố gần nhất trong khi lần ghi đang được gửi.

Ở phía tập lệnh, toàn bộ tập hợp là một protocol.CBORChannel với một add cho mỗi widget và một callback cho các lần ghi:

import time
import protocol
from protocol import CBORChannel

def on_write(ch, name, value):
    print(name, "=", value)      # every change lands here

ch = CBORChannel(on_write=on_write)
ch.add("Status", type="label", value="starting")
ch.add("Enable", type="toggle", value=True)
ch.add("Threshold", type="slider", min=0, max=100,
       step=1, value=50, unit="%")
ch.add("Mode", type="select",
       options=["Idle", "Track", "Record"], value="Idle")
ch.add("Calibrate", type="pushbutton")
protocol.register(name="controls", backend=ch)

while True:
    if ch["Enable"]:                   # read a control back
        ch["Status"] = "threshold %d%%" % ch["Threshold"]
    time.sleep_ms(100)

Chạy nó và chuyển khung sang Kênh: một mục tên controls xuất hiện với năm widget, và di chuyển thanh trượt sẽ in ra terminal. Các kiểu widget khác -- spinbox, radio, lineedit, text -- mỗi kiểu thêm một add; chương giao thức máy chủ trình bày tất cả chúng.

13.1.9.2. Đồ thị dạng sóng#

Một bản ghi waveform là một khối mẫu xen kẽ với tốc độ lấy mẫu -- âm thanh, các trục gia tốc kế, một vết ADC -- và chế độ xem vẽ nó thành đồ thị cuộn, mỗi trục một chuỗi, được tập lệnh đặt tên. Các điều khiển đồ thị nằm trên thanh công cụ của nó và ngay trên đồ thị:

  • Kéo để dịch chuyển và cuộn để thu phóng; nhấp đúp để quay lại theo dõi mép dữ liệu trực tiếp. Lịch sử đặt lượng dữ liệu quá khứ được giữ lại để bạn có thể kéo ngược lại xem.

  • Tự động co giãn khớp trục dọc với dữ liệu; khi tắt, trục là dải mà tập lệnh đã khai báo.

  • Nhấp chuột phải vào đồ thị để đặt một điểm đánh dấu và đọc thời gian và giá trị chính xác của một mẫu, hoặc để đặt mức kích hoạt. Khi Kích hoạt được bật sẵn, đồ thị đứng yên cho đến khi tín hiệu vượt qua mức theo sườn lên hoặc sườn xuống -- cách bắt một xung thoáng qua của máy hiện sóng -- và Kích hoạt lại chờ lần tiếp theo.

  • Phổ chuyển đồ thị sang đồ thị tần số của cùng dữ liệu, với lựa chọn cửa sổ (Hann, Hamming, Blackman, chữ nhật), Lấy trung bình và Giữ đỉnh qua các khung, và trục Tần số log. Dòng đọc dưới đồ thị nêu tần số đỉnh và mức của nó.

  • Tạm dừng đóng băng đồ thị mà không ảnh hưởng đến bản ghi; Thống kê thêm một dòng min / max / RMS; và menu chuột phải lưu đồ thị thành ảnh.

The Channels view with two waveform records scrolling live: a 16 kHz microphone trace and a three-series accelerometer trace with its X, Y, and Z legend, each with its Record, Spectrum, Pause, and Stats buttons

Hai bản ghi dạng sóng cuộn trực tiếp: một vết micrô và một vết IMU ba chuỗi.#

Một trường waveform nhận tốc độ lấy mẫu và, với nhiều tín hiệu cùng lúc, số series xen kẽ và tên của chúng; mỗi lần cập nhật là các byte thô của một array mẫu theo typecode của trường:

import math
import time
import protocol
from array import array
from protocol import CBORChannel

RATE, CHUNK = 1000, 100            # 1 kHz, 100 ms per update

ch = CBORChannel()
ch.add("IMU", type="waveform", sample_rate=RATE, series=3,
       typecode="f", min=-2.0, max=2.0,
       options=["X", "Y", "Z"], unit="g")
protocol.register(name="signals", backend=ch)

t = 0
while True:
    block = array("f")
    for i in range(CHUNK):
        phase = 2 * math.pi * 2 * (t + i) / RATE
        block.extend((math.sin(phase), math.cos(phase), 1.0))
    ch["IMU"] = bytes(block)        # interleaved X, Y, Z
    t += CHUNK
    time.sleep_ms(100)

13.1.9.3. Bản đồ độ sâu#

Một bản ghi depth là một lưới các khoảng cách -- các khung hình mà cảm biến thời gian bay tạo ra -- và chế độ xem vẽ nó thành bản đồ màu giả được phóng to đến chiều cao đồ thị. Thanh công cụ chọn cách hiển thị: bảng màu (các bảng màu Depth, Rainbow và Ironbow riêng của camera, cộng với bảng màu sáng và tối cho camera sự kiện), bộ lọc co giãn phóng to lưới cảm biến nhỏ (bicubic cho bề mặt mượt, bilinear, hoặc nearest cho một khối trên mỗi điểm ảnh cảm biến), và ánh xạ tông màu biến khoảng cách thành màu: Dải của tập lệnh dùng dải mà tập lệnh đã khai báo, Dải tự động kéo giãn các màu trên các khoảng cách thực sự có trong mỗi khung hình (bỏ qua vài phần trăm ngoại lai), và Cân bằng trải chúng theo phân bố của khung hình để một cảnh phẳng vẫn hiện rõ chi tiết. Phần đầu báo cáo kích thước bản đồ, dải đã khai báo, và giá trị nhỏ nhất, lớn nhất và trung bình của khung hình; di chuột trên bản đồ đọc ra khoảng cách dưới con trỏ, và Lưu hình ảnh ghi bản đồ đã hiển thị ra tệp PNG.

The Channels view showing an 8 x 8 time-of-flight depth map scaled up smoothly with the Depth palette, the palette, scaling, and tone-mapping selectors in its toolbar, and the header reporting the size, declared range, and the frame's minimum, maximum, and mean

Bản đồ độ sâu thời gian bay của một bàn tay trước cảm biến, với các bộ chọn bảng màu, co giãn và ánh xạ tông màu trên thanh công cụ.#

Một trường depth khai báo kích thước lưới và dải của nó; mỗi lần cập nhật là lưới dưới dạng các số thực 32-bit đóng gói, chính là thứ mà bộ đọc của mô-đun tof tạo ra:

import struct
import time
import tof
import protocol
from protocol import CBORChannel

tof.init()
ch = CBORChannel()
ch.add("depth", type="depth", width=tof.width(),
       height=tof.height(), min=0, max=1000)
protocol.register(name="ToF", backend=ch)

while True:
    try:
        d, dmin, dmax = tof.read_depth(vflip=True, hmirror=True)
    except RuntimeError:
        continue
    ch["depth"] = struct.pack("<%df" % len(d), *d)
    time.sleep_ms(50)

13.1.9.4. Ghi#

Mỗi đồ thị và bản đồ có một nút Ghi, và một kênh có nhiều hơn một đồ thị hay bản đồ có thanh Ghi tất cả khởi động chúng cùng lúc. Ghi sẽ ghi dữ liệu khi nó đến -- không phải phần hiển thị -- vào một tệp có định dạng theo phần mở rộng bạn chọn trong hộp thoại lưu: CSV cho bảng tính và công cụ vẽ đồ thị, WAV cho dạng sóng âm thanh một kênh, mảng NumPy .npy cho Python, và Edge Impulse JSON hoặc CBOR để tải thẳng vào một dự án Edge Impulse làm dữ liệu huấn luyện, với nhãn tùy chọn dùng đặt tên tệp. Chỉ các định dạng có thể chứa dữ liệu của bản ghi mới được đưa ra; ví dụ, bản đồ độ sâu không thể là tệp WAV. Một lần ghi dài được chia thành các phần đánh số để không tệp nào trở nên quá lớn, và bản ghi vẫn tiếp tục khi tập lệnh đăng ký lại các kênh của nó. Dòng đọc bên cạnh nút theo dõi số mẫu đã ghi và kích thước tệp.

Khoảng thời gian Channel Polling của khung, trong phần giao thức của tùy chọn, đặt tần suất IDE hỏi camera dữ liệu kênh mới; mặc định phù hợp với các tập lệnh công bố vài lần mỗi giây, và một tập lệnh truyền phát âm thanh hưởng lợi từ khoảng thời gian ngắn hơn.

Xem thêm

protocol.CBORChannel cho phía tập lệnh -- các kiểu bản ghi, đối số của chúng và callback on_write -- và các ví dụ 12-Protocol trong File → Examples cho các tập lệnh hoạt động công bố giá trị đọc, điều khiển và một bản đồ độ sâu.