13.1.9. Tampilan Kanal#

Buffer bingkai menampilkan apa yang dilihat kamera; tampilan Kanal menampilkan apa yang diukur dan diputuskan skrip. Skrip memublikasikan nilai bernama melalui protokol debug -- suhu, jumlah deteksi, bentuk gelombang mikrofon, peta kedalaman time-of-flight, atau kontrol yang ingin dapat diubah oleh pengguna -- dan IDE merender masing-masing secara langsung sebagai widget, grafik, atau peta di panel di bawah buffer bingkai. Tidak ada yang perlu digambar pada citra atau diurai dari terminal. Di sisi kamera hanya beberapa baris dengan protocol.CBORChannel; di sisi IDE adalah entri Kanal dari pemilih panel.

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

Kontrol skrip kamera termal: dua pembacaan suhu, toggle untuk mode pengukuran, dan slider untuk rentang suhu. Mengubah salah satunya mengirimkan nilai baru ke skrip.#

Tampilan diatur berdasarkan kanal. Setiap kanal yang didaftarkan skrip menjadi sebuah bagian dengan nama kanal sebagai judulnya, dan setiap record dalam kanal menjadi baris di bawahnya, dalam urutan skrip menambahkannya. Saat skrip mendaftarkan kanal atau mengubah bentuk salah satunya, tampilan membangun ulang dirinya; saat skrip berhenti, nilai terakhir tetap di layar, dengan kontrol dinonaktifkan, hingga skrip berikutnya dimulai.

13.1.9.1. Widget#

Pembacaan dan kontrol mengambil bentuk yang sudah jelas. label adalah nilai hanya-baca beserta satuannya; record text adalah blok rich text statis untuk judul dan penjelasan. Jenis yang dapat ditulis mengirimkan nilai barunya kembali ke skrip begitu Anda mengubahnya, dan callback on_write skrip menerima nama record beserta nilainya: toggle adalah sakelar, slider dan spinbox menetapkan angka dalam rentang dan langkah yang ditentukan skrip (spin box untuk entri yang presisi), tombol radio dan select memilih salah satu opsi skrip, lineedit adalah kolom teks bebas, dan pushbutton memicu aksi sesaat. Tampilan mempertahankan suntingan Anda di layar alih-alih mengembalikannya ke nilai terakhir yang dipublikasikan kamera selama penulisan masih berlangsung.

Di sisi skrip, keseluruhan set tersebut adalah sebuah protocol.CBORChannel dengan satu add per widget dan sebuah callback untuk penulisan:

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)

Jalankan dan alihkan panel ke Kanal: bagian bernama controls muncul dengan kelima widget, dan menggerakkan slider mencetak ke terminal. Tipe widget lainnya -- spinbox, radio, lineedit, text -- masing-masing hanya satu add lagi; bab protokol host membahas semuanya.

13.1.9.2. Grafik bentuk gelombang#

Record waveform adalah blok sampel yang disisipkan (interleaved) dengan laju sampel -- audio, sumbu akselerometer, jejak ADC -- dan tampilan memplotnya sebagai grafik bergulir, satu seri per sumbu, dinamai oleh skrip. Kontrol grafik ada di bilah alatnya dan pada plot itu sendiri:

  • Seret untuk menggeser dan gulir untuk zoom; klik dua kali untuk kembali mengikuti tepi langsung. Riwayat mengatur seberapa banyak data lampau yang disimpan sehingga Anda dapat menggeser kembali melewatinya.

  • Skala Otomatis menyesuaikan sumbu vertikal dengan data; saat nonaktif, sumbunya adalah rentang yang dideklarasikan skrip.

  • Klik kanan plot untuk meletakkan penanda dan membaca waktu dan nilai persis sebuah sampel, atau untuk mengatur level pemicu. Dengan Pemicu yang disiagakan, grafik diam hingga sinyal melewati level tersebut pada tepi naik atau turun -- cara osiloskop menangkap transien -- dan Siagakan Ulang menunggu yang berikutnya.

  • Spektrum mengalihkan grafik ke plot frekuensi dari data yang sama, dengan pilihan jendela (Hann, Hamming, Blackman, persegi), Perataan dan Tahan Puncak lintas bingkai, serta sumbu Frekuensi Log. Pembacaan di bawah plot menyebutkan frekuensi puncak dan levelnya.

  • Jeda membekukan grafik tanpa memengaruhi perekaman; Stat menambahkan baris min / maks / RMS; dan menu klik kanan menyimpan plot sebagai gambar.

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

Dua record bentuk gelombang yang bergulir secara langsung: jejak mikrofon dan jejak IMU tiga seri.#

Bidang waveform mengambil laju sampel dan, untuk beberapa sinyal sekaligus, jumlah series yang disisipkan beserta namanya; setiap pembaruan adalah byte mentah dari sebuah array sampel dalam typecode bidang tersebut:

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. Peta kedalaman#

Record depth adalah kisi jarak -- bingkai yang dihasilkan sensor time-of-flight -- dan tampilan menggambarnya sebagai peta warna semu yang diperbesar hingga tinggi grafik. Bilah alat memilih penggambarannya: palet (palet Depth, Rainbow, dan Ironbow milik kamera sendiri, ditambah palet terang dan gelap untuk kamera event), filter penskalaan yang memperbesar kisi sensor yang kecil (bicubic untuk permukaan yang halus, bilinear, atau nearest untuk satu blok per piksel sensor), dan pemetaan tona yang mengubah jarak menjadi warna: Rentang Skrip menggunakan rentang yang dideklarasikan skrip, Rentang Otomatis merentangkan warna di atas jarak yang benar-benar ada di setiap bingkai (mengabaikan beberapa persen pencilan), dan Ekualisasi menyebarkannya di atas distribusi bingkai sehingga pemandangan yang datar tetap menampilkan detailnya. Header melaporkan ukuran peta, rentang yang dideklarasikan, serta nilai minimum, maksimum, dan rata-rata bingkai; mengarahkan kursor ke peta membaca jarak di bawah kursor, dan Simpan Gambar menulis peta yang dirender ke 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

Peta kedalaman time-of-flight dari sebuah tangan di depan sensor, dengan pemilih palet, penskalaan, dan pemetaan tona di bilah alat.#

Bidang depth mendeklarasikan ukuran kisi dan rentangnya; setiap pembaruan adalah kisi tersebut sebagai float 32-bit yang dikemas, yaitu apa yang dihasilkan pembaca modul tof:

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. Perekaman#

Setiap grafik dan peta memiliki tombol Rekam, dan kanal dengan lebih dari satu grafik atau peta memiliki bilah Rekam Semua yang memulai semuanya bersama-sama. Perekaman menulis data saat tiba -- bukan hasil rendernya -- ke file yang formatnya mengikuti ekstensi yang Anda pilih di dialog simpan: CSV untuk spreadsheet dan alat plot, WAV untuk bentuk gelombang audio satu kanal, array NumPy .npy untuk Python, dan JSON atau CBOR Edge Impulse untuk diunggah langsung ke proyek Edge Impulse sebagai data pelatihan, dengan label opsional yang menamai file-file tersebut. Hanya format yang dapat menampung data sebuah record yang ditawarkan; peta kedalaman, misalnya, tidak dapat menjadi file WAV. Tangkapan yang panjang dipecah menjadi bagian-bagian bernomor sehingga tidak ada satu file pun yang tumbuh terlalu besar, dan perekaman tetap bertahan saat skrip mendaftarkan ulang kanalnya. Pembacaan di samping tombol melacak berapa banyak sampel yang telah ditulis dan ukuran filenya.

Interval Channel Polling panel, di bagian protokol pada preferensi, mengatur seberapa sering IDE meminta data kanal baru dari kamera; nilai default cocok untuk skrip yang memublikasikan beberapa kali per detik, dan skrip yang melakukan streaming audio diuntungkan oleh interval yang lebih pendek.

Lihat juga

protocol.CBORChannel untuk sisi skrip -- tipe record, argumennya, dan callback on_write -- serta contoh 12-Protocol di bawah File → Contoh untuk skrip siap pakai yang memublikasikan pembacaan, kontrol, dan peta kedalaman.