protocol — OpenMV protokolni kanali¶
Modul protocol izlaže OpenMV host protokol Pythonu. Omogućuje inicijalizaciju i konfiguraciju protokolnog stoga na strani ugrađenog programa te dopušta korisničkom kodu da registrira prilagođene logičke kanale poduprte Python objektom koji implementira sučelje kanala (read, write, size, poll itd.). To je ono s čime razgovaraju popratni alati na računalu kada prenose podatke slike ili izlažu interaktivne widgete povezanoj kameri.
Primjeri¶
Prijenos RGB565 slike host alatu pomoću prilagođenog backenda koji implementira sirovo sučelje kanala (backend.size(), backend.shape(), backend.poll(), backend.read()):
import csi
import protocol
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.HD)
img = csi0.snapshot()
img_mv = memoryview(img.bytearray())
frame_ready = True
class FrameChannel:
def size(self):
return len(img_mv)
def shape(self):
return (img.height(), img.width(), len(img_mv))
def poll(self):
return frame_ready
def read(self, offset, size):
global frame_ready
end = offset + size
chunk = img_mv[offset:end]
if end >= len(img_mv):
frame_ready = False
return chunk
protocol.register(name="frame", backend=FrameChannel())
while True:
if not frame_ready:
img = csi0.snapshot()
img_mv = memoryview(img.bytearray())
frame_ready = True
Odgovarajuća skripta na strani hosta, koja koristi openmv Python paket (pip install openmv) za povezivanje, slanje skripte na kameru i dohvaćanje svake sličice:
import cv2
import numpy as np
from openmv.camera import Camera
# The on-cam script above, stored as a string (or read from a file).
SCRIPT = open("frame_streamer_on_cam.py").read()
with Camera("/dev/ttyACM0", baudrate=921600) as cam:
cam.stop()
cam.exec(SCRIPT)
while True:
status = cam.read_status()
if not cam.has_channel("frame") or not status.get("frame"):
continue
h, w, size = cam._channel_shape(cam.get_channel(name="frame"))
if cam.channel_size("frame") < size:
continue
data = cam.channel_read("frame", size)
rgb565 = np.frombuffer(data, dtype="<u2").reshape(h, w)
# Unpack RGB565 to an HxWx3 uint8 RGB image.
r = ((rgb565 >> 11) & 0x1F) << 3
g = ((rgb565 >> 5) & 0x3F) << 2
b = ( rgb565 & 0x1F) << 3
frame = np.dstack([r, g, b]).astype(np.uint8)
# Display with OpenCV (cv2 expects BGR, not RGB).
cv2.imshow("OpenMV", cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))
if cv2.waitKey(1) == ord("q"):
break
cv2.destroyAllWindows()
Zamijenite /dev/ttyACM0 serijskim priključkom kamere (npr. COM3 na Windowsu). Konstruktor openmv.camera.Camera prihvaća iste parametre protokola kao i init (crc / seq / ack / events / max_payload / max_retry / timeout) kada je stog na strani kamere ponovno konfiguriran tako da im odgovara.
Funkcije¶
- protocol.init(crc: bool = True, seq: bool = True, ack: bool = True, events: bool = True, max_payload: int = ..., rtx_retries: int = 3, rtx_timeout_ms: int = 500, lock_interval_ms: int = 10, poll_ms: int = 0) None¶
Inicijalizira (ili ponovno konfigurira) protokolni stog i registrira zadane logičke podatkovne kanale (
stdin,stdout,streamte, ako je ugrađen,profile). PodižeRuntimeErrorako inicijalizacija ne uspije. Ugrađeni program se pokreće sa zadanim USB protokolnim stogom koji već radi, pa je pozivanje ovoga potrebno samo za promjenu transporta ili nadjačavanje zadanih parametara uokvirivanja.crcomogućuje CRC provjeru na okvirima protokola.seqomogućuje praćenje rednih brojeva.ackomogućuje potvrde po okviru.eventsomogućuje obavijesti o događajima kanala.max_payloadje maksimalna veličina korisnog tereta u bajtovima. Ako se izostavi, koristi se zadana vrijednost po kameri navedena u nastavku; izvodi se iz veličine međuspremnika protokola svake pločice kaobuffer - 10 (header) - 4 (CRC).Kamera
Veličina međuspremnika
Maks. korisni teret
OpenMV Cam M4 (
OPENMV2)512
498
OpenMV Cam M7 (
OPENMV3)512
498
OpenMV Cam H7 (
OPENMV4)512
498
OpenMV Cam H7 Plus (
OPENMV4P)4096
4082
OpenMV Pure Thermal (
OPENMVPT)4096
4082
OpenMV Cam RT1062 (
OPENMV_RT1060)4096
4082
OpenMV Cam N6 (
OPENMV_N6)8192
8178
OpenMV AE3 (
OPENMV_AE3)8192
8178
Arduino Portenta H7 (
ARDUINO_PORTENTA_H7)4096
4082
Arduino Giga (
ARDUINO_GIGA)4096
4082
Arduino Nicla Vision (
ARDUINO_NICLA_VISION)4096
4082
rtx_retriesje broj pokušaja ponovnog prijenosa. Zadano3.rtx_timeout_msje vremensko ograničenje ponovnog prijenosa u milisekundama (udvostručuje se nakon svakog isteka). Zadano500.lock_interval_msje minimalni interval zaključavanja u milisekundama. Zadano10.poll_msje interval prozivanja u milisekundama.0(zadano) onemogućuje prozivanje pomoću mjerača vremena.
- protocol.is_active() bool¶
Vraća
Trueako je host trenutno povezan i protokolni stog aktivan, inačeFalse.
- protocol.register(name: str, *, backend: object, flags: int = 0) ProtocolChannel¶
Registrira Python
backendobjekt kao novi logički kanal i vraćaProtocolChannelrukovatelj. Dostupne metode objektabackend(vidi Backend sučelje u nastavku) određuju sposobnosti kanala;protocol.CHANNEL_FLAG_READ,protocol.CHANNEL_FLAG_WRITEiprotocol.CHANNEL_FLAG_LOCKautomatski se dodaju uflagskada su odgovarajuće metode implementirane.nameje naziv kanala kao niz znakova. Skraćuje se na veličinu međuspremnika naziva kanala u ugrađenom programu. Obavezno.backendje Python objekt koji implementira backend sučelje. Obavezno. Obično se prosljeđuje ključnom riječi (backend=...).flagssu dodatni bitovi zastavica kanala (vidi konstanteCHANNEL_FLAG_*). Neobavezno; zadano je0.Podiže
RuntimeErrorako se kanal ne može registrirati (npr. nema slobodnih mjesta za kanale).
Klase¶
- class protocol.ProtocolChannel¶
Rukovatelj koji vraća
protocol.register. Instance se ne konstruiraju izravno.
Backend sučelje¶
Backend objekt proslijeđen funkciji protocol.register može implementirati bilo koji podskup sljedećih metoda. Samo su metode prisutne na objektu povezane s C protokolnim slojem; nedostajuće metode ostavljaju odgovarajuću sposobnost onemogućenom.
- class protocol.backend¶
Backend objekt kanala proslijeđen funkciji
protocol.register. Metode u nastavku opisuju neobavezno sučelje koje Python backend može implementirati.- init() object¶
Poziva se jednom kada se kanal inicijalizira. Vraća bilo koju vrijednost različitu od
Noneu slučaju uspjeha; iznimka ili nedostajuća povratna vrijednost tretira se kao pogreška.
- shape() tuple¶
Vraća n-torku do četiri cijela broja koji opisuju oblik podataka (npr. dimenzije slike). Protokolni sloj koristi do četiri elementa.
- flush() object¶
Prazni sve podatke na čekanju. Vraća bilo koju vrijednost različitu od
Noneu slučaju uspjeha.
- read(offset: int, size: int) bytes¶
Vraća do
sizebajtova počevši odoffsetkaobytes-sličan objekt koji podržava protokol međuspremnika.
- readp(offset: int, size: int) bytes¶
Varijanta
readbez kopiranja. Vraća međuspremnik čiju temeljnu memoriju protokolni sloj izravno čita; međuspremnik mora ostati valjan tijekom trajanja prijenosa.
- write(offset: int, data: bytearray) int¶
Zapisuje
datanaoffset.datajebytearraykoji izravno referencira C međuspremnik. Vraća broj zapisanih bajtova ili0pri zadanom uspjehu.
- class protocol.CBORChannel(on_read: Callable | None = None, on_write: Callable | None = None)¶
Python backend više razine (koji pruža ugrađeni
protocolpaket) koji serijalizira imenovana polja u CBOR pomoću cjelobrojnih ključeva kompatibilnih sa SenML-om. Podržava prikazne widgete (label,depth) i interaktivne kontrole (toggle,slider,select) son_read/on_writepovratnim pozivima.on_readje neobavezni pozivni objekton_read(channel)koji se poziva prije serijalizacije kanala za host. Koristite ga za osvježavanje vrijednosti polja.on_writeje neobavezni pozivni objekton_write(channel, name, value)koji se poziva kada host upiše novu vrijednost za imenovano polje.- add(name: str, type: str, value: Any = None, unit: str | None = None, min: int | float | None = None, max: int | float | None = None, step: int | float | None = None, options: list | None = None, width: int | None = None, height: int | None = None) None¶
Dodaje imenovano polje u kanal.
nameje prikazni naziv; mora biti jedinstven unutar ovog kanala.typeje tip widgeta:"label","toggle","slider","select"ili"depth".valueje početna vrijednost. Zadana vrijednost ovisi otype.unitje niz jedinice zalabel/slider(npr."Cel","%RH").minje minimalna vrijednost (raspon klizača ili raspon dubine).maxje maksimalna vrijednost (raspon klizača ili raspon dubine).stepje veličina koraka (klizač).optionsje popis nizova opcija (select).widthje širina u pikselima (depth).heightje visina u pikselima (depth).
- __getitem__(name: str) object¶
Vraća trenutnu vrijednost imenovanog polja. Za
depthpolja vraća se binarni podatkovni međuspremnik, inače skalarna vrijednost.
- __setitem__(name: str, value: Any) None¶
Postavlja vrijednost imenovanog polja. Za
sliderpolja, n-torka(min, max, value)istovremeno ažurira raspon i trenutnu vrijednost. Zadepthpolja,valueje binarni podatkovni međuspremnik.
- size() int¶
Metoda backend sučelja. Poziva
on_read(ako je postavljen) i vraća veličinu serijaliziranog međuspremnika.
Konstante¶
Bitovi zastavica kanala (kombiniraju se bitovno; prosljeđuju se funkciji protocol.register putem flags ili se postavljaju automatski na temelju metoda backenda).
- protocol.CHANNEL_FLAG_PHYSICAL: int¶
Kanal predstavlja fizički transport (za razliku od logičkog podatkovnog kanala).
Ugrađeni identifikatori kanala.