13.1.9. Prikaz Kanali#
Međuspremnik slike prikazuje što kamera vidi; prikaz Kanali prikazuje što skripta mjeri i odlučuje. Skripta objavljuje imenovane vrijednosti preko protokola za ispravljanje pogrešaka – temperaturu, broj detekcija, valni oblik mikrofona, time-of-flight kartu dubine ili kontrolu koju želi da korisnik može mijenjati – a IDE svaku od njih iscrtava uživo kao widget, graf ili kartu u oknu ispod međuspremnika slike. Ništa se ne mora crtati na slici ni parsirati iz terminala. Na strani kamere to je nekoliko redaka s protocol.CBORChannel; na strani IDE-a to je stavka Kanali birača okna.

Kontrole skripte termalne kamere: dva očitanja temperature, prekidači za načine mjerenja i klizači za raspon temperature. Promjena bilo koje od njih šalje novu vrijednost skripti.#
Prikaz je organiziran po kanalima. Svaki kanal koji skripta registrira postaje odjeljak s nazivom kanala kao naslovom, a svaki zapis u kanalu postaje redak ispod njega, redoslijedom kojim ih je skripta dodala. Kada skripta registrira kanal ili promijeni oblik nekog, prikaz se ponovno izgrađuje; kada se skripta zaustavi, posljednje vrijednosti ostaju na zaslonu, s onemogućenim kontrolama, dok ne krene sljedeća skripta.
13.1.9.1. Widgeti#
Očitanja i kontrole imaju očekivane oblike. label je vrijednost samo za čitanje sa svojom jedinicom; zapis text je blok statičnog obogaćenog teksta za naslove i objašnjenja. Vrste u koje se može pisati šalju svoju novu vrijednost natrag skripti čim ih promijenite, gdje on_write povratni poziv skripte prima naziv zapisa i vrijednost: toggle je prekidač, slider i spinbox postavljaju broj unutar raspona i koraka skripte (brojčani okvir za precizan unos), radio gumbi i select biraju jednu od opcija skripte, lineedit je polje za slobodan unos teksta, a pushbutton okida trenutnu radnju. Prikaz zadržava vašu izmjenu na zaslonu umjesto da je vraća na posljednju objavljenu vrijednost kamere dok je zapisivanje u tijeku.
Na strani skripte cijeli skup je protocol.CBORChannel s jednim add po widgetu i povratnim pozivom za zapisivanja:
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)
Pokrenite je i prebacite okno na Kanali: pojavljuje se odjeljak nazvan controls s pet widgeta, a pomicanje klizača ispisuje u terminal. Ostale vrste widgeta – spinbox, radio, lineedit, text – svaka je još jedan add; poglavlje o host protokolu prolazi kroz sve njih.
13.1.9.2. Grafovi valnih oblika#
Zapis waveform je blok isprepletenih uzoraka s brzinom uzorkovanja – zvuk, osi akcelerometra, ADC trag – a prikaz ga iscrtava kao pomični graf, jedan niz po osi, s nazivima koje daje skripta. Kontrole grafa nalaze se u njegovoj alatnoj traci i na samom grafu:
Povucite za pomicanje i vrtite kotačić za zumiranje; dvaput kliknite za povratak na praćenje ruba uživo. Povijest postavlja koliko se prošlih podataka čuva da biste se mogli pomicati unatrag kroz njih.
Automatsko skaliranje prilagođava okomitu os podacima; isključeno, os je raspon koji je skripta deklarirala.
Desnim klikom na graf postavite marker i očitajte točno vrijeme i vrijednost uzorka, ili postavite razinu okidanja. S aktiviranim Okidanje graf miruje dok signal ne prijeđe razinu na rastućem ili padajućem bridu – osciloskopski način hvatanja prijelazne pojave – a Ponovno aktiviraj čeka sljedeću.
Spektar prebacuje graf na frekvencijski prikaz istih podataka, s izborom prozora (Hann, Hamming, Blackman, pravokutni), Usrednjavanje i Zadržavanje vrha preko sličica te osi Log. frekvencija. Očitanje ispod grafa imenuje vršnu frekvenciju i njezinu razinu.
Pauza zamrzava graf bez utjecaja na snimanje; Statistika dodaje redak min / maks / RMS; a izbornik desnog klika sprema graf kao sliku.

Dva zapisa valnih oblika koji se pomiču uživo: trag mikrofona i IMU trag s tri niza.#
Polje valnog oblika uzima brzinu uzorkovanja i, za više signala odjednom, broj isprepletenih series i njihove nazive; svako ažuriranje su sirovi bajtovi array polja uzoraka u typecode tog polja:
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. Karte dubine#
Zapis depth je mreža udaljenosti – sličice koje proizvodi time-of-flight senzor – a prikaz ga crta kao kartu u lažnim bojama uvećanu na visinu grafa. Alatna traka bira iscrtavanje: paletu (vlastite palete kamere Depth, Rainbow i Ironbow, plus svijetla i tamna paleta za kamere događaja), filtar skaliranja koji uvećava malu mrežu senzora (bicubic za glatku površinu, bilinear ili nearest za jedan blok po pikselu senzora) te mapiranje tonova koje udaljenost pretvara u boju: Raspon skripte koristi raspon koji je skripta deklarirala, Auto raspon rasteže boje preko udaljenosti stvarno prisutnih u svakoj sličici (zanemarujući nekoliko posto krajnjih vrijednosti), a Izjednači ih raspoređuje prema raspodjeli sličice tako da i ravna scena pokazuje svoje detalje. Zaglavlje prijavljuje veličinu karte, deklarirani raspon te minimum, maksimum i srednju vrijednost sličice; prelazak pokazivačem preko karte očitava udaljenost pod pokazivačem, a Spremiti sliku zapisuje iscrtanu kartu u PNG.

Time-of-flight karta dubine ruke ispred senzora, s biračima palete, skaliranja i mapiranja tonova u alatnoj traci.#
Polje dubine deklarira veličinu svoje mreže i raspon; svako ažuriranje je mreža kao pakirani 32-bitni floatovi, što je upravo ono što proizvodi čitač modula 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. Snimanje#
Svaki graf i karta imaju gumb Snimi, a kanal s više njih ima traku Snimi sve koja ih pokreće zajedno. Snimanje zapisuje podatke kako stižu – ne iscrtavanje – u datoteku čiji format slijedi ekstenziju koju odaberete u dijalogu za spremanje: CSV za proračunske tablice i alate za iscrtavanje, WAV za jednokanalne zvučne valne oblike, NumPy .npy polja za Python te Edge Impulse JSON ili CBOR za izravno prenošenje u Edge Impulse projekt kao podatke za treniranje, s neobaveznom oznakom koja imenuje datoteke. Nude se samo formati koji mogu sadržavati podatke zapisa; karta dubine, na primjer, ne može biti WAV datoteka. Dugo snimanje dijeli se na numerirane dijelove da nijedna datoteka ne naraste nezgrapno, a snimanje preživljava ponovnu registraciju kanala od strane skripte. Očitanje pored gumba prati koliko je uzoraka zapisano i veličinu datoteke.
Interval Channel Polling okna, u odjeljku protokola u postavkama, postavlja koliko često IDE traži od kamere nove podatke kanala; zadana vrijednost odgovara skriptama koje objavljuju nekoliko puta u sekundi, a skripti koja struji zvuk koristi kraći interval.
Više informacija
protocol.CBORChannel za stranu skripte – vrste zapisa, njihovi argumenti i on_write povratni poziv – te 12-Protocol primjeri pod File → Examples za radne skripte koje objavljuju očitanja, kontrole i kartu dubine.