13.1.9. Zobrazení Channels#

Snímkový buffer ukazuje, co kamera vidí; zobrazení Channels ukazuje, co skript měří a rozhoduje. Skript publikuje přes ladicí protokol pojmenované hodnoty – teplotu, počet detekcí, průběh z mikrofonu, time-of-flight hloubkovou mapu nebo ovládací prvek, který chce dát uživateli ke změně – a IDE každou z nich vykresluje živě jako widget, graf nebo mapu v panelu pod snímkovým bufferem. Nic se nemusí kreslit do obrazu ani vytahovat z terminálu. Na straně kamery je to několik řádků s protocol.CBORChannel; na straně IDE je to položka Channels voliče panelu.

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

Ovládací prvky skriptu termokamery: dva odečty teploty, přepínače režimů měření a posuvníky teplotního rozsahu. Změna kteréhokoli z nich odešle novou hodnotu skriptu.#

Zobrazení je uspořádáno podle kanálů. Každý kanál, který skript zaregistruje, se stane sekcí s názvem kanálu jako nadpisem a každý záznam v kanálu se stane řádkem pod ním, v pořadí, v jakém je skript přidal. Když skript zaregistruje kanál nebo změní tvar některého z nich, zobrazení se znovu sestaví; když se skript zastaví, poslední hodnoty zůstanou na obrazovce s vypnutými ovládacími prvky, dokud se nespustí další skript.

13.1.9.1. Widgety#

Odečty a ovládací prvky mají zřejmé podoby. label je hodnota jen pro čtení se svou jednotkou; záznam text je blok statického formátovaného textu pro nadpisy a vysvětlivky. Zapisovatelné druhy pošlou novou hodnotu zpět skriptu v okamžiku, kdy ji změníte, a zpětné volání on_write skriptu obdrží název záznamu a hodnotu: toggle je přepínač, slider a spinbox nastavují číslo v rozsahu a kroku skriptu (číselník pro přesné zadání), tlačítka radio a select vybírají jednu z možností skriptu, lineedit je volné textové pole a pushbutton spouští okamžitou akci. Zobrazení ponechá vaši úpravu na obrazovce, místo aby ji během probíhajícího zápisu vracelo na poslední hodnotu publikovanou kamerou.

Na straně skriptu je celá sada jedním protocol.CBORChannel s jedním add na widget a zpětným voláním pro zápisy:

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)

Spusťte jej a přepněte panel na Channels: objeví se sekce s názvem controls s pěti widgety a pohyb posuvníku vypisuje do terminálu. Ostatní typy widgetů – spinbox, radio, lineedit, text – jsou každý o jedno add navíc; kapitola o hostitelském protokolu je probírá všechny.

13.1.9.2. Grafy průběhů#

Záznam waveform je blok prokládaných vzorků se vzorkovací frekvencí – zvuk, osy akcelerometru, průběh z ADC – a zobrazení jej vykresluje jako rolující graf, jednu řadu na osu, pojmenovanou skriptem. Ovládací prvky grafu jsou v jeho panelu nástrojů a na samotném grafu:

  • Tažením posouváte a kolečkem přibližujete; dvojklikem se vrátíte ke sledování živého okraje. History nastavuje, kolik minulých dat se uchovává, abyste se jimi mohli posouvat zpět.

  • Auto Scale přizpůsobí svislou osu datům; vypnuto, osa je rozsah deklarovaný skriptem.

  • Kliknutím pravým tlačítkem na graf umístíte značku a odečtete přesný čas a hodnotu vzorku, nebo nastavíte úroveň spouště. S aktivovaným Trigger graf stojí, dokud signál nepřekročí úroveň na náběžné nebo sestupné hraně – osciloskopový způsob zachycení přechodového jevu – a Re-arm čeká na další.

  • Spectrum přepne graf na frekvenční graf týchž dat, s volbou okna (Hann, Hamming, Blackman, obdélníkové), Averaging a Peak Hold napříč snímky a osou Log Frequency. Odečet pod grafem uvádí špičkovou frekvenci a její úroveň.

  • Pause zmrazí graf, aniž by ovlivnil nahrávání; Stats přidá řádek s min / max / RMS; a nabídka pravého tlačítka uloží graf jako obrázek.

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

Dva záznamy průběhů rolující živě: stopa mikrofonu a třířadá stopa IMU.#

Pole průběhu přebírá vzorkovací frekvenci a pro několik signálů najednou počet prokládaných series a jejich názvy; každá aktualizace jsou surové bajty array vzorků v typecode daného pole:

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. Hloubkové mapy#

Záznam depth je mřížka vzdáleností – snímky, které produkuje time-of-flight senzor – a zobrazení ji vykresluje jako mapu v nepravých barvách zvětšenou na výšku grafu. Panel nástrojů volí vykreslení: paletu (vlastní palety kamery Depth, Rainbow a Ironbow plus světlou a tmavou paletu pro událostní kamery), škálovací filtr, který malou mřížku senzoru zvětšuje (bicubic pro hladký povrch, bilinear, nebo nearest pro jeden blok na pixel senzoru), a mapování tónů, které převádí vzdálenost na barvu: Script Range používá rozsah deklarovaný skriptem, Auto Range roztáhne barvy přes vzdálenosti skutečně přítomné v každém snímku (s ignorováním několika odlehlých procent) a Equalize je rozprostře přes rozdělení snímku, takže i plochá scéna ukáže své detaily. Záhlaví uvádí velikost mapy, deklarovaný rozsah a minimum, maximum a průměr snímku; najetí myší na mapu odečte vzdálenost pod kurzorem a Save Image zapíše vykreslenou mapu do 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

Time-of-flight hloubková mapa ruky před senzorem, s voliči palety, škálování a mapování tónů v panelu nástrojů.#

Pole hloubky deklaruje velikost mřížky a rozsah; každá aktualizace je mřížka jako sbalené 32bitové floaty, což je to, co produkuje čtečka modulu 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. Nahrávání#

Každý graf a mapa má tlačítko Record a kanál s více než jedním z nich má lištu Record All, která je spustí společně. Nahrávání zapisuje data tak, jak přicházejí – ne vykreslení – do souboru, jehož formát se řídí příponou zvolenou v dialogu uložení: CSV pro tabulkové procesory a nástroje na vykreslování grafů, WAV pro jednokanálové zvukové průběhy, pole NumPy .npy pro Python a Edge Impulse JSON nebo CBOR pro nahrání přímo do projektu Edge Impulse jako trénovací data, s volitelným štítkem, který soubory pojmenuje. Nabízejí se jen formáty, které dokážou data záznamu pojmout; hloubková mapa například nemůže být soubor WAV. Dlouhý záznam se dělí na číslované části, aby žádný soubor nenarostl do nezvladatelné velikosti, a nahrávání přežije i opětovnou registraci kanálů skriptem. Odečet vedle tlačítka sleduje, kolik vzorků bylo zapsáno, a velikost souboru.

Interval Channel Polling panelu, v sekci protokolu v předvolbách, určuje, jak často se IDE ptá kamery na nová data kanálů; výchozí hodnota vyhovuje skriptům, které publikují několikrát za sekundu, a skriptu streamujícímu zvuk prospívá kratší interval.

Viz také

protocol.CBORChannel pro stranu skriptu – typy záznamů, jejich argumenty a zpětné volání on_write – a příklady 12-Protocol pod File → Examples jako funkční skripty, které publikují odečty, ovládací prvky a hloubkovou mapu.