13.1.9. Kanavat-näkymä#
Kehyspuskuri näyttää, mitä kamera näkee; Kanavat-näkymä näyttää, mitä skripti mittaa ja päättää. Skripti julkaisee nimettyjä arvoja virheenkorjausprotokollan yli – lämpötilan, havaintojen määrän, mikrofonin aaltomuodon, lentoaikasyvyyskartan tai säätimen, jota se haluaa käyttäjän voivan muuttaa – ja IDE piirtää jokaisen reaaliaikaisesti widgettinä, kuvaajana tai karttana kehyspuskurin alapuoliseen ruutuun. Mitään ei tarvitse piirtää kuvaan tai jäsentää päätteestä. Kameran puolella se on muutama rivi luokalla protocol.CBORChannel; IDE:n puolella se on ruudun valitsimen Kanavat-kohta.

Lämpökameraskriptin säätimet: kaksi lämpötilalukemaa, kytkimet mittaustiloille ja liukusäätimet lämpötila-alueelle. Minkä tahansa niistä muuttaminen lähettää uuden arvon skriptille.#
Näkymä on järjestetty kanavoittain. Jokaisesta skriptin rekisteröimästä kanavasta tulee osio, jonka otsikkona on kanavan nimi, ja jokaisesta kanavan tietueesta tulee rivi sen alle siinä järjestyksessä, jossa skripti lisäsi ne. Kun skripti rekisteröi kanavan tai muuttaa kanavan muotoa, näkymä rakentaa itsensä uudelleen; kun skripti pysähtyy, viimeiset arvot pysyvät näytöllä säätimet poistettuina käytöstä, kunnes seuraava skripti käynnistyy.
13.1.9.1. Widgetit#
Lukemat ja säätimet saavat ilmeiset muotonsa. label on vain luettava arvo yksikköineen; text-tietue on lohko staattista muotoiltua tekstiä otsikoita ja selityksiä varten. Kirjoitettavat tyypit lähettävät uuden arvonsa takaisin skriptille heti, kun muutat niitä, ja skriptin on_write-takaisinkutsu vastaanottaa tietueen nimen ja arvon: toggle on kytkin, slider ja spinbox asettavat luvun skriptin alueen ja askeleen sisällä (askelluskenttä tarkkaa syöttöä varten), radio-napit ja select valitsevat yhden skriptin vaihtoehdoista, lineedit on vapaa tekstikenttä, ja pushbutton laukaisee hetkellisen toiminnon. Näkymä pitää muokkauksesi näytöllä sen sijaan, että palauttaisi sen kameran viimeksi julkaisemaan arvoon kirjoituksen ollessa matkalla.
Skriptin puolella koko joukko on protocol.CBORChannel, jossa on yksi add widgettiä kohti ja takaisinkutsu kirjoituksille:
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)
Suorita se ja vaihda ruutu Kanavat-näkymään: controls-niminen osio ilmestyy viidellä widgetillä, ja liukusäätimen liikuttaminen tulostaa päätteeseen. Muut widgettityypit – spinbox, radio, lineedit, text – ovat kukin yksi add lisää; isäntäprotokollan luku käy ne kaikki läpi.
13.1.9.2. Aaltomuotokuvaajat#
Aaltomuoto-tietue (waveform) on lohko lomitettuja näytteitä näytteenottotaajuuksineen – ääntä, kiihtyvyysanturin akseleita, ADC-jälki – ja näkymä piirtää sen vierivänä kuvaajana, yksi sarja akselia kohti, skriptin nimeäminä. Kuvaajan säätimet ovat sen työkalupalkissa ja itse kuvaajassa:
Vedä panoroidaksesi ja vieritä zoomataksesi; kaksoisnapsauta palataksesi seuraamaan reaaliaikaista reunaa. Historia asettaa, kuinka paljon aiempaa dataa säilytetään, jotta voit panoroida takaisin sen läpi.
Automaattinen skaalaus sovittaa pystyakselin dataan; pois päältä akseli on skriptin ilmoittama alue.
Napsauta kuvaajaa hiiren oikealla painikkeella pudottaaksesi merkin ja lukeaksesi näytteen tarkan ajan ja arvon tai asettaaksesi liipaisutason. Kun Liipaisu on viritetty, kuvaaja pysyy paikallaan, kunnes signaali ylittää tason nousevalla tai laskevalla reunalla – oskilloskoopin tapa napata transientti – ja Viritä uudelleen odottaa seuraavaa.
Spektri vaihtaa kuvaajan saman datan taajuuskuvaajaksi, jossa on valittavissa ikkuna (Hann, Hamming, Blackman, suorakulmainen), Keskiarvoistus ja Huipun pito kehysten yli sekä Logaritminen taajuus -akseli. Kuvaajan alla oleva lukema nimeää huipputaajuuden ja sen tason.
Tauko jäädyttää kuvaajan vaikuttamatta tallennukseen; Tilastot lisää min / max / RMS -rivin; ja hiiren oikean painikkeen valikko tallentaa kuvaajan kuvaksi.

Kaksi aaltomuototietuetta vierimässä reaaliaikaisesti: mikrofonijälki ja kolmisarjainen IMU-jälki.#
Aaltomuotokenttä ottaa näytteenottotaajuuden ja, useaa signaalia varten kerralla, lomitettujen series-sarjojen määrän ja niiden nimet; jokainen päivitys on array-taulukon näytteiden raakatavut kentän typecode-tyyppikoodissa:
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. Syvyyskartat#
Syvyys-tietue (depth) on etäisyyksien ruudukko – kehykset, joita lentoaika-anturi tuottaa – ja näkymä piirtää sen väärävärikarttana, joka on skaalattu kuvaajan korkeuteen. Työkalupalkki valitsee piirtotavan: paletin (kameran omat Depth-, Rainbow- ja Ironbow-paletit sekä vaalea ja tumma paletti tapahtumakameroille), skaalaussuodattimen, joka suurentaa pienen anturiruudukon (bikuubinen sileää pintaa varten, bilineaarinen tai lähin yhden lohkon anturipikseliä kohti), ja sävykartoituksen, joka muuntaa etäisyyden väriksi: Skriptin alue käyttää skriptin ilmoittamaa aluetta, Automaattialue venyttää värit kussakin kehyksessä todella esiintyvien etäisyyksien yli (jättäen huomiotta äärimmäiset muutamat prosentit), ja Tasaa levittää ne kehyksen jakauman mukaan, jotta tasainen näkymä näyttää yhä yksityiskohtansa. Otsake ilmoittaa kartan koon, ilmoitetun alueen sekä kehyksen minimin, maksimin ja keskiarvon; osoittimen vieminen kartan päälle lukee osoittimen alla olevan etäisyyden, ja Tallenna kuva kirjoittaa piirretyn kartan PNG-tiedostoon.

Lentoaika-anturin syvyyskartta anturin edessä olevasta kädestä, työkalupalkissa paletti-, skaalaus- ja sävykartoitusvalitsimet.#
Syvyyskenttä ilmoittaa ruudukkonsa koon ja alueen; jokainen päivitys on ruudukko pakattuina 32-bittisinä liukulukuina, mitä tof-moduulin lukija tuottaa:
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. Tallennus#
Jokaisella kuvaajalla ja kartalla on Record-painike, ja kanavalla, jolla on useampi kuin yksi niistä, on Record All -palkki, joka käynnistää ne yhdessä. Tallennus kirjoittaa datan sellaisena kuin se saapuu – ei piirrosta – tiedostoon, jonka muoto seuraa tallennusvalintaikkunassa valitsemaasi tiedostopäätettä: CSV taulukkolaskenta- ja piirto-ohjelmille, WAV yksikanavaisille ääniaaltomuodoille, NumPy .npy-taulukot Pythonille sekä Edge Impulse JSON tai CBOR ladattavaksi suoraan Edge Impulse -projektiin opetusdataksi, valinnaisella luokkanimellä, joka nimeää tiedostot. Vain ne muodot tarjotaan, jotka voivat sisältää tietueen datan; syvyyskartta ei esimerkiksi voi olla WAV-tiedosto. Pitkä kaappaus jaetaan numeroituihin osiin, jottei yksikään tiedosto kasva kohtuuttomaksi, ja tallennus selviää siitä, että skripti rekisteröi kanavansa uudelleen. Painikkeen vieressä oleva lukema seuraa, kuinka monta näytettä on kirjoitettu, ja tiedostokokoa.
Ruudun Channel Polling -väli asetusten protokollaosiossa määrää, kuinka usein IDE pyytää kameralta uutta kanavadataa; oletus sopii skripteille, jotka julkaisevat muutaman kerran sekunnissa, ja ääntä suoratoistava skripti hyötyy lyhyemmästä välistä.
Katso myös
protocol.CBORChannel skriptin puolelle – tietuetyypit, niiden argumentit ja on_write-takaisinkutsu – sekä 12-Protocol-esimerkit kohdassa File → Examples toimivina skripteinä, jotka julkaisevat lukemia, säätimiä ja syvyyskartan.