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.

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.

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.

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.