protocol — OpenMV-protokollakanavat¶
protocol-moduuli tuo OpenMV-isäntäprotokollan Pythonin käyttöön. Sen avulla laiteohjelmiston puoleinen protokollapino voidaan alustaa ja konfiguroida, ja käyttäjän koodi voi rekisteröidä omia loogisia kanavia, joiden taustalla on Python-olio, joka toteuttaa kanavarajapinnan (read, write, size, poll jne.). Tähän työpöydän kumppanityökalut ottavat yhteyden, kun ne suoratoistavat kuvadataa tai tarjoavat interaktiivisia komponentteja yhdistetylle kameralle.
Esimerkkejä¶
Suoratoista RGB565-kuva isäntätyökalulle käyttäen omaa taustajärjestelmää, joka toteuttaa raakakanavarajapinnan (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
Vastaava isäntäpuolen skripti, joka käyttää openmv-Python-pakettia (pip install openmv) yhteyden muodostamiseen, kameralla ajettavan skriptin lähettämiseen ja kunkin kehyksen hakemiseen:
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()
Korvaa /dev/ttyACM0 kameran sarjaportilla (esim. COM3 Windowsissa). openmv.camera.Camera-konstruktori hyväksyy samat protokollaparametrit kuin init (crc / seq / ack / events / max_payload / max_retry / timeout), kun kameran puoleinen pino on konfiguroitu vastaamaan niitä.
Funktiot¶
- 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¶
Alustaa (tai konfiguroi uudelleen) protokollapinon ja rekisteröi oletusarvoiset loogiset datakanavat (
stdin,stdout,streamja, jos käännetty mukaan,profile). Nostaa poikkeuksenRuntimeError, jos alustus epäonnistuu. Laiteohjelmisto käynnistyy oletusarvoisen USB-protokollapinon ollessa jo käynnissä, joten tämän kutsuminen tarvitaan vain siirtotien vaihtamiseen tai oletusarvoisten kehystysparametrien korvaamiseen.crcottaa käyttöön CRC-tarkistuksen protokollakehyksille.seqottaa käyttöön järjestysnumeroiden seurannan.ackottaa käyttöön kehyskohtaiset kuittaukset.eventsottaa käyttöön kanavatapahtumien ilmoitukset.max_payloadon suurin hyötykuorman koko tavuina. Jos se jätetään pois, käytetään alla olevaa kamerakohtaista oletusarvoa; se johdetaan kunkin kortin protokollapuskurin koosta kaavallabuffer - 10 (header) - 4 (CRC).Kamera
Puskurin koko
Suurin hyötykuorma
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_retrieson uudelleenlähetysyritysten määrä. Oletus3.rtx_timeout_mson uudelleenlähetyksen aikakatkaisu millisekunteina (kaksinkertaistetaan jokaisen aikakatkaisun jälkeen). Oletus500.lock_interval_mson pienin lukitusväli millisekunteina. Oletus10.poll_mson pollausväli millisekunteina.0(oletus) poistaa ajastinpollauksen käytöstä.
- protocol.is_active() bool¶
Palauttaa
True, jos isäntä on tällä hetkellä yhdistetty ja protokollapino on aktiivinen, muutenFalse.
- protocol.register(name: str, *, backend: object, flags: int = 0) ProtocolChannel¶
Rekisteröi Python-olion
backenduudeksi loogiseksi kanavaksi ja palauttaaProtocolChannel-kahvan.backend-olion käytettävissä olevat metodit (katso Taustajärjestelmän rajapinta alla) määrittävät kanavan ominaisuudet;protocol.CHANNEL_FLAG_READ,protocol.CHANNEL_FLAG_WRITEjaprotocol.CHANNEL_FLAG_LOCKlisätäänflags-arvoon automaattisesti, kun vastaavat metodit on toteutettu.nameon kanavan nimi merkkijonona. Lyhennetään laiteohjelmiston kanavanimipuskurin kokoon. Pakollinen.backendon Python-olio, joka toteuttaa taustajärjestelmän rajapinnan. Pakollinen. Tyypillisesti välitetään avainsanalla (backend=...).flagson lisäkanavalippubittejä (katsoCHANNEL_FLAG_*-vakiot). Valinnainen; oletusarvo0.Nostaa poikkeuksen
RuntimeError, jos kanavaa ei voida rekisteröidä (esim. ei vapaita kanavapaikkoja).
Luokat¶
- class protocol.ProtocolChannel¶
Kahva, jonka
protocol.registerpalauttaa. Ilmentymiä ei muodosteta suoraan.
Taustajärjestelmän rajapinta¶
Funktiolle protocol.register välitetty taustajärjestelmäolio voi toteuttaa minkä tahansa osajoukon seuraavista metodeista. Vain oliossa läsnä olevat metodit kytketään C-protokollakerrokseen; puuttuvat metodit jättävät vastaavan ominaisuuden pois käytöstä.
- class protocol.backend¶
Funktiolle
protocol.registervälitetty kanavan taustajärjestelmäolio. Alla olevat metodit kuvaavat valinnaisen rajapinnan, jonka Python-taustajärjestelmä voi toteuttaa.- init() object¶
Kutsutaan kerran, kun kanava alustetaan. Palauta mikä tahansa arvo, joka ei ole
None, onnistumisen merkiksi; poikkeus tai puuttuva paluuarvo tulkitaan virheeksi.
- shape() tuple¶
Palauttaa enintään neljän kokonaisluvun monikon, joka kuvaa datan muotoa (esim. kuvan mitat). Protokollakerros käyttää enintään neljä elementtiä.
- flush() object¶
Tyhjentää mahdollisen odottavan datan. Palauta mikä tahansa arvo, joka ei ole
None, onnistumisen merkiksi.
- read(offset: int, size: int) bytes¶
Palauttaa enintään
sizetavua alkaen kohdastaoffsetbytes-tyyppisenä oliona, joka tukee puskuriprotokollaa.
- readp(offset: int, size: int) bytes¶
Zero-copy-muunnelma metodista
read. Palauttaa puskurin, jonka taustalla oleva muisti luetaan suoraan protokollakerroksesta; puskurin on pysyttävä voimassa koko siirron ajan.
- write(offset: int, data: bytearray) int¶
Kirjoittaa
datakohtaanoffset.dataonbytearray, joka viittaa suoraan C-puskuriin. Palauta kirjoitettujen tavujen määrä tai0oletusarvoisen onnistumisen merkiksi.
- class protocol.CBORChannel(on_read: Callable | None = None, on_write: Callable | None = None)¶
Korkeamman tason Python-taustajärjestelmä (jonka tarjoaa jäädytetty
protocol-paketti), joka sarjallistaa nimetyt kentät CBOR-muotoon käyttäen SenML-yhteensopivia kokonaislukuavaimia. Tukee näyttökomponentteja (label,depth) ja interaktiivisia ohjaimia (toggle,slider,select)on_read/on_write-takaisinkutsuilla.on_readon valinnainen kutsuttavaon_read(channel), joka kutsutaan ennen kuin kanava sarjallistetaan isännälle. Käytä sitä kenttäarvojen päivittämiseen.on_writeon valinnainen kutsuttavaon_write(channel, name, value), joka kutsutaan, kun isäntä kirjoittaa uuden arvon nimetylle kentälle.- 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¶
Lisää kanavalle nimetyn kentän.
nameon näyttönimi; sen on oltava yksilöllinen tämän kanavan sisällä.typeon komponentin tyyppi:"label","toggle","slider","select"tai"depth".valueon alkuarvo. Oletusarvo riippuu tyypistätype.uniton yksikkömerkkijono tyypeillelabel/slider(esim."Cel","%RH").minon pienin arvo (liukusäätimen tai syvyyden alue).maxon suurin arvo (liukusäätimen tai syvyyden alue).stepon askelkoko (liukusäädin).optionson vaihtoehtomerkkijonojen lista (select).widthon pikselileveys (depth).heighton pikselikorkeus (depth).
- __getitem__(name: str) object¶
Palauttaa nimetyn kentän nykyisen arvon.
depth-kentille palautetaan binääridatapuskuri, muuten skalaariarvo.
- __setitem__(name: str, value: Any) None¶
Asettaa nimetyn kentän arvon.
slider-kentille(min, max, value)-monikko päivittää alueen ja nykyisen arvon samanaikaisesti.depth-kentillevalueon binääridatapuskuri.
- poll() bool¶
Taustajärjestelmän rajapintametodi. Palauttaa
True, kun sarjallistettua dataa on saatavilla isännälle.
- size() int¶
Taustajärjestelmän rajapintametodi. Kutsuu
on_read(jos asetettu) ja palauttaa sarjallistetun puskurin koon.
Vakiot¶
Kanavalippubitit (yhdistetään bittioperaatioin; välitetään funktiolle protocol.register parametrilla flags tai asetetaan automaattisesti taustajärjestelmän metodien perusteella).
- protocol.CHANNEL_FLAG_PHYSICAL: int¶
Kanava edustaa fyysistä siirtotietä (toisin kuin loogista datakanavaa).
Sisäänrakennettujen kanavien tunnisteet.