13.1.9. Kanallar görünümü#

Çerçeve arabelleği kameranın gördüğünü gösterir; Kanallar görünümü betiğin ölçtüğünü ve karar verdiğini gösterir. Bir betik, hata ayıklama protokolü üzerinden adlandırılmış değerler yayımlar – bir sıcaklık, bir algılama sayısı, bir mikrofon dalga biçimi, bir uçuş süresi derinlik haritası ya da kullanıcının değiştirebilmesini istediği bir denetim – ve IDE her birini çerçeve arabelleğinin altındaki bölmede bir pencere öğesi, bir grafik ya da bir harita olarak canlı işler. Hiçbir şeyin görüntü üzerine çizilmesi ya da terminalden ayrıştırılması gerekmez. Kamera tarafında bu, protocol.CBORChannel ile birkaç satırdır; IDE tarafında ise bölme seçicisinin Kanallar girişidir.

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

Bir termal kamera betiğinin denetimleri: iki sıcaklık göstergesi, ölçüm modları için anahtarlar ve sıcaklık aralığı için kaydırıcılar. Herhangi birini değiştirmek yeni değeri betiğe gönderir.#

Görünüm kanala göre düzenlenir. Betiğin kaydettiği her kanal, kanalın adını başlık olarak taşıyan bir bölüm olur ve kanaldaki her kayıt, betiğin eklediği sırayla onun altında bir satır olur. Betik bir kanal kaydettiğinde ya da birinin biçimini değiştirdiğinde görünüm kendini yeniden oluşturur; betik durduğunda son değerler, bir sonraki betik başlayana kadar denetimler devre dışı olarak ekranda kalır.

13.1.9.1. Pencere öğeleri#

Göstergeler ve denetimler beklenen biçimleri alır. Bir label, birimiyle birlikte salt okunur bir değerdir; bir text kaydı, başlıklar ve açıklamalar için statik bir zengin metin bloğudur. Yazılabilir türler, onları değiştirdiğiniz anda yeni değerlerini betiğe geri gönderir; betiğin on_write geri çağırması kayıt adını ve değeri alır: bir toggle bir anahtardır, bir slider ve bir spinbox betiğin aralığı ve adımı içinde bir sayı ayarlar (hassas giriş için döndürme kutusu), radio düğmeleri ve bir select betiğin seçeneklerinden birini seçer, bir lineedit serbest metin alanıdır ve bir pushbutton anlık bir eylemi tetikler. Görünüm, yazma devam ederken düzenlemenizi kameranın son yayımladığı değere geri çekmek yerine ekranda tutar.

Betik tarafında kümenin tamamı, pencere öğesi başına bir add ve yazmalar için bir geri çağırma içeren bir protocol.CBORChannel nesnesidir:

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)

Çalıştırın ve bölmeyi Kanallar görünümüne geçirin: beş pencere öğesiyle controls adlı bir bölüm belirir ve kaydırıcıyı hareket ettirmek terminale yazdırır. Diğer pencere öğesi türleri – spinbox, radio, lineedit, text – her biri bir add daha gerektirir; ana bilgisayar protokolü bölümü hepsinin üzerinden geçer.

13.1.9.2. Dalga biçimi grafikleri#

Bir waveform kaydı, örnekleme hızı olan, serpiştirilmiş örneklerden oluşan bir bloktur – ses, ivmeölçer eksenleri, bir ADC izi – ve görünüm bunu, betik tarafından adlandırılan, eksen başına bir seri olmak üzere kayan bir grafik olarak çizer. Grafik denetimleri araç çubuğunda ve grafiğin kendisindedir:

  • Kaydırmak için sürükleyin, yakınlaştırmak için kaydırma tekerleğini kullanın; canlı kenarı izlemeye geri dönmek için çift tıklayın. Geçmiş, geçmişe doğru kaydırabilmeniz için ne kadar geçmiş verinin tutulacağını ayarlar.

  • Otomatik Ölçek dikey ekseni verilere sığdırır; kapalıyken eksen, betiğin bildirdiği aralıktır.

  • Bir işaretçi bırakıp bir örneğin tam zamanını ve değerini okumak ya da bir tetikleme düzeyi ayarlamak için grafiğe sağ tıklayın. Bir Tetikleyici kuruluyken grafik, sinyal düzeyi yükselen ya da düşen bir kenarda geçene kadar sabit durur – bir geçici olayı yakalamanın osiloskop yolu – ve Yeniden Kur bir sonrakini bekler.

  • Spektrum grafiği aynı verilerin frekans grafiğine geçirir; pencere seçimi (Hann, Hamming, Blackman, dikdörtgen), çerçeveler arasında Ortalama Alma ve Tepe Tutma ve bir Logaritmik Frekans ekseni sunar. Grafiğin altındaki okuma, tepe frekansını ve düzeyini adlandırır.

  • Duraklat grafiği bir kaydı etkilemeden dondurur; İstatistik bir min / max / RMS satırı ekler; sağ tık menüsü ise grafiği bir görüntü olarak kaydeder.

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

Canlı kayan iki dalga biçimi kaydı: bir mikrofon izi ve üç serili bir IMU izi.#

Bir dalga biçimi alanı, örnekleme hızını ve aynı anda birden fazla sinyal için serpiştirilmiş series sayısını ve adlarını alır; her güncelleme, alanın typecode değerindeki örneklerden oluşan bir array nesnesinin ham baytlarıdır:

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. Derinlik haritaları#

Bir depth kaydı, bir mesafe ızgarasıdır – bir uçuş süresi (time-of-flight) sensörünün ürettiği çerçeveler – ve görünüm bunu grafik yüksekliğine büyütülmüş sahte renkli bir harita olarak çizer. Araç çubuğu işlemeyi seçer: palet (kameranın kendi Depth, Rainbow ve Ironbow paletleri, artı olay kameraları için açık ve koyu paletler), küçük sensör ızgarasını büyüten ölçekleme filtresi (pürüzsüz bir yüzey için çift kübik, çift doğrusal ya da sensör pikseli başına bir blok için en yakın) ve mesafeyi renge dönüştüren ton eşleme: Betik Aralığı betiğin bildirdiği aralığı kullanır, Otomatik Aralık renkleri her çerçevede gerçekten bulunan mesafelere yayar (aykırı birkaç yüzdeyi yok sayarak) ve Eşitle onları çerçevenin dağılımına yayar, böylece düz bir sahne bile ayrıntısını gösterir. Başlık, haritanın boyutunu, bildirilen aralığı ve çerçevenin en küçük, en büyük ve ortalama değerlerini bildirir; haritanın üzerine gelmek imlecin altındaki mesafeyi okur ve Resmi Kaydet işlenmiş haritayı bir PNG’ye yazar.

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

Sensörün önündeki bir elin uçuş süresi derinlik haritası; araç çubuğunda palet, ölçekleme ve ton eşleme seçicileriyle.#

Bir derinlik alanı ızgara boyutunu ve aralığını bildirir; her güncelleme, tof modülünün okuyucusunun ürettiği şey olan paketlenmiş 32 bit kayan noktalı sayılar hâlindeki ızgaradır:

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. Kayıt#

Her grafik ve haritanın bir Kayıt düğmesi vardır ve birden fazlasına sahip bir kanalın, hepsini birlikte başlatan bir Tümünü Kaydet çubuğu vardır. Kayıt, verileri – işlenmiş görüntüyü değil – geldiği gibi, biçimi kaydetme iletişim kutusunda seçtiğiniz uzantıyı izleyen bir dosyaya yazar: elektronik tablolar ve çizim araçları için CSV, tek kanallı ses dalga biçimleri için WAV, Python için NumPy .npy dizileri ve dosyaları adlandıran isteğe bağlı bir etiketle, doğrudan bir Edge Impulse projesine eğitim verisi olarak yüklemek için Edge Impulse JSON ya da CBOR. Yalnızca bir kaydın verilerini tutabilen biçimler sunulur; örneğin bir derinlik haritası bir WAV dosyası olamaz. Uzun bir yakalama, hiçbir dosya hantallaşmasın diye numaralı bölümlere ayrılır ve bir kayıt, betiğin kanallarını yeniden kaydetmesinden sağ çıkar. Düğmenin yanındaki okuma, kaç örneğin yazıldığını ve dosya boyutunu izler.

Tercihlerin protokol bölümündeki bölmenin Kanal Yoklama aralığı, IDE’nin kameradan ne sıklıkla yeni kanal verisi isteyeceğini ayarlar; varsayılan, saniyede birkaç kez yayımlayan betiklere uygundur ve ses akıtan bir betik daha kısa bir aralıktan yararlanır.

Ayrıca bakınız

Betik tarafı için protocol.CBORChannel – kayıt türleri, bağımsız değişkenleri ve on_write geri çağırması – ve göstergeler, denetimler ve bir derinlik haritası yayımlayan çalışır betikler için File → Examples altındaki 12-Protocol örnekleri.