13.3.1.6. API-referentie¶
Het publieke oppervlak van het openmv-pakket bestaat uit de Camera-klasse om met een cam te communiceren en de OMVException-hiërarchie voor protocolfouten. Beide worden op deze pagina gedocumenteerd.
13.3.1.6.1. De Camera-klasse¶
- class openmv.Camera(port: str, *, baudrate: int = 921600, crc: bool = True, seq: bool = True, ack: bool = True, events: bool = True, timeout: float = 1.0, max_retry: int = 3, max_payload: int = 4096, drop_rate: float = 0.0)¶
De host-side proxy voor een OpenMV cam die via USB-serieel wordt bereikt.
- Parameters:
port – Pad naar het seriële apparaat. Op Linux
/dev/ttyACMxvoor USB CDC en/dev/ttyUSBxvoor een USB-naar-UART-brug. Op macOS/dev/tty.usbmodem...of/dev/cu.usbmodem.... Op WindowsCOMx.baudrate – Seriële baudrate. Via USB is
921600de magische waarde die de cam van de MicroPython REPL naar het OpenMV-protocol omschakelt – elke andere waarde op een USB-verbinding laat de cam in REPL-modus staan, dus de standaardwaarde moet worden gebruikt. Via een UART-verbinding is de waarde de werkelijke lijnbaudrate en kan deze aan beide zijden vrij worden ingesteld.crc – CRC-validatie op elk pakket inschakelen.
seq – Volgnummers per pakket inschakelen.
ack – Pakketbevestiging vereisen.
events – Gebeurtenismeldingen van de cam inschakelen.
timeout – Time-out per bewerking in seconden.
max_retry – Aantal nieuwe pogingen voordat er bij een mislukt pakket een fout wordt opgeworpen.
max_payload – Maximaal onderhandelde payloadgrootte in bytes. De cam kan naar beneden onderhandelen.
drop_rate – Alleen voor tests bedoelde kans op het laten vallen van een pakket, in
[0.0, 1.0]. Laat in productie op0.0staan.
De klasse ondersteunt het context-managerprotocol;
with Camera(port) as cam:roeptconnect()aan bij binnenkomst endisconnect()bij vertrek.
13.3.1.6.2. Verbinding¶
- Camera.connect() None¶
Open de seriële poort en voer de protocol-handshake uit. Gecachte status (kanaallijst, systeeminformatie, versie-informatie) wordt als neveneffect gevuld. Wordt automatisch aangeroepen door de context manager.
- Camera.disconnect() None¶
Sluit de seriële poort en geef het transport vrij. Wordt automatisch aangeroepen wanneer de context manager wordt afgesloten.
- Camera.boot() None¶
Laat de cam in zijn bootloader springen. De verbinding wordt verbroken omdat de cam opnieuw opstart.
- Camera.update_capabilities() None¶
Heronderhandel de protocolmogelijkheden (CRC, volgordecontrole, ACK’s, gebeurtenissen, maximale payload) met de cam. De cam meldt de maximale payload die hij aankan; het verzoek van de host wordt daarop afgekapt en de overeengekomen instellingen worden teruggestuurd. Wordt automatisch aangeroepen door
connect()– er is geen reden om dit vanuit gebruikerscode aan te roepen, tenzij de constructor-flags op een bestaande verbinding opnieuw onderhandeld moeten worden.
- Camera.poll_events() None¶
Voer het ontvangstpad van het transport eenmaal uit om eventuele in afwachting zijnde gebeurtenissen van de cam te verwerken zonder een commando te versturen. Nuttig in langlopende programma’s die minutenlang geen andere I/O hebben en kanaalregistratie-gebeurtenissen snel naar boven willen brengen.
13.3.1.6.3. Script-uitvoering¶
13.3.1.6.4. Streaming¶
- Camera.streaming(enable: bool, raw: bool = False, resolution: tuple[int, int] | None = None) None¶
Schakel de frame-stream aan of uit en kies het formaat op de draad.
- Parameters:
enable –
Trueschakelt streaming in,Falseschakelt het uit.raw – Wanneer
False(standaard), comprimeert de cam elk frame als JPEG voordat het in het streamkanaal wordt geplaatst en decomprimeertread_frame()op de host. WanneerTrue, verstuurt de cam de vastgelegde pixelbuffer ongecomprimeerd – de juiste keuze op cams zonder hardware-JPEG-ondersteuning, waar softwarecompressie de traagste stap in de lus is.resolution –
(width, height)doel waarnaar de cam elk ruw frame verkleint voordat het wordt verzonden, aangezien ongecomprimeerde frames veel groter zijn dan JPEG-gecomprimeerde. Vereist wanneerraw=True; anders genegeerd.
- Camera.read_frame() dict | None¶
Lees het nieuwste frame uit het streamkanaal.
- Retourneert:
Noneals er geen frame wacht, of een dict met de sleutelswidth(int, pixels),height(int, pixels),format(int, de pixelformaat-identifier die de cam declareerde),depth(int, de gecomprimeerde afbeeldingsgrootte in bytes voor JPEG-/PNG-frames; ongebruikt voor ongecomprimeerde formaten),data(bytes, RGB888 van lengtewidth * height * 3) enraw_size(int, bytes die de cam via USB verstuurde voor het decoderen).
13.3.1.6.5. Aangepaste kanalen¶
- Camera.has_channel(name: str) bool¶
- Retourneert:
Trueals er een kanaal geregistreerd metnameop de cam bestaat.
- Camera.channel_size(name: str) int¶
- Retourneert:
Aantal bytes dat het genoemde kanaal momenteel beschikbaar heeft, of
0wanneer het kanaal leeg is of niet bestaat.
- Camera.channel_read(name: str, size: int | None = None) bytes | None¶
Lees uit een aangepast kanaal.
- Camera.channel_write(name: str, data: bytes) bool¶
Schrijf
datanaar een aangepast kanaal. Schrijfacties groter dan de payload worden automatisch over meerdere pakketten gesplitst.- Parameters:
name – Kanaalnaam geregistreerd door het script aan de cam-zijde.
data – Bytes-achtige payload om te versturen.
- Retourneert:
Trueals het kanaal bestaat en de schrijfactie is verstuurd, andersFalse.
- Camera.read_status() dict[str, bool]¶
Peil elk geregistreerd kanaal.
- Retourneert:
Dict die de kanaalnaam toewijst aan een boolean van “data is klaar om te lezen”.
- Camera.update_channels() None¶
Ververs de gecachte kanaallijst vanaf de cam. Wordt automatisch uitgevoerd de volgende keer dat een kanaalopzoeking op naam wordt uitgevoerd nadat er een kanaalregistratie-gebeurtenis is binnengekomen; een applicatie die onmiddellijk een nieuw geregistreerd kanaal wil leren kennen, kan dit direct aanroepen.
- Camera.get_channel(name: str | None = None, channel_id: int | None = None) int | str | None¶
Zoek een kanaal op, ofwel op naam (waarbij de numerieke ID wordt geretourneerd) of op ID (waarbij de naam wordt geretourneerd). Ververst eerst de kanaalcache via
update_channels()als er kanaalregistratie-gebeurtenissen in behandeling zijn.- Parameters:
name – Kanaalnaam om naar een ID te herleiden.
channel_id – Kanaal-ID om naar een naam te herleiden.
- Retourneert:
Het overeenkomstige ID of de naam, of
Nonewanneer het kanaal niet bestaat. Eén vannameofchannel_idmoet worden opgegeven.
13.3.1.6.6. Apparaat-introspectie¶
- Camera.version() dict¶
Retourneer de protocol-, bootloader- en firmwareversie-triples van de cam. Gecacht na
connect(). Elke triple is een(major, minor, patch)-tuple vanint:protocol_version– de versie van het OpenMV-draadprotocol die de cam implementeert.bootloader_version– de bootloader-image die in het flashgeheugen aanwezig is.firmware_version– de MicroPython-firmware die momenteel draait.
- Camera.system_info() dict¶
Retourneer de hardwaremogelijkheden- en geheugeninformatie van de cam. Gecacht na
connect(). De sleutels van de geretourneerde dict vallen in vier groepen.Identiteit
cpu_id– 32-bits CPU-identifier.device_id– 3-tuple van 32-bits woorden, het unieke apparaat-serienummer dat in het silicium is ingebakken.chip_id– 3-tuple van 32-bits woorden, één vermelding per beeldsensor die met de cam is verbonden.usb_vid– USB-leverancier-ID.usb_pid– USB-product-ID.
Geheugengroottes (allemaal in kilobytes)
flash_size_kb– totaal intern flashgeheugen.ram_size_kb– totaal RAM.framebuffer_size_kb– RAM gereserveerd voor het vastleggen van afbeeldingen.stream_buffer_size_kb– RAM gereserveerd voor het streamkanaal dat frames naar de host verzendt.
Mogelijkheidsvlaggen (één boolean per kenmerk, allemaal genaamd
<feature>_present)gpu_present– grafische verwerkingseenheid.npu_present– neurale verwerkingseenheid.isp_present– beeldsignaalprocessor.venc_present– video-encoder.jpeg_present– JPEG-hardware-encoder.dram_present– externe DRAM.crc_present– CRC-versneller.pmu_present– prestatiebewakingseenheid.wifi_present– Wi-Fi-radio.bt_present– Bluetooth-radio.sd_present– SD-kaartsleuf.eth_present– Ethernet-PHY.multicore_present– meerdere CPU-cores.
Overig
usb_highspeed– boolean,Truewanneer USB in high-speed-modus (USB 2.0 HS, 480 Mbps) is geënumereerd.pmu_eventcnt– aantal beschikbare PMU-gebeurtenistellers;0wanneer er geen PMU is.
13.3.1.6.7. Diagnostiek¶
13.3.1.6.8. Profiler¶
De profiler rapporteert aanroeptellingen per functie en min-/max-/totale uitvoeringstijden voor de geïnstrumenteerde firmwaremodules – momenteel image, ml en ulab. De ingang en uitgang van functies worden tijdens het compileren onderschept; de runtime bemonstert bij elk een monotone microsecondenteller, accumuleert het resultaat per functie en stelt de tabel via het profile-kanaal beschikbaar aan de host.
De profiler wordt alleen in de firmware ingebouwd wanneer PROFILE_ENABLE=1 aan make wordt doorgegeven. Standaard firmware-images bevatten hem niet – de -finstrument-functions-vlag die de build aan de bijgehouden modules toevoegt, heeft een niet-triviale runtime-overhead, dus profileringsbuilds worden vanuit de broncode geproduceerd voor de specifieke debugsessie die ze nodig heeft. Wanneer de firmware niet met de vlag is gebouwd, wordt het profile-kanaal niet geregistreerd en keert elke profilermethode op deze pagina stilzwijgend terug zonder iets te doen.
De Arm Performance Monitoring Unit (PMU) is het hardwaretellerblok van de Cortex-M55 – een kleine set configureerbare tellers die cyclustellingen, cache-hits en -misses, vertakkingsgedrag en andere architectuurgedefinieerde gebeurtenissen bijhoudt zonder de gemeten code te vertragen. Op cams die er een hebben – de AE3 en de N6, de twee cams in het OpenMV-assortiment die rond de M55 zijn gebouwd – bemonstert de profiler deze tellers naast de timinggegevens en verschijnen de gebeurtenistotalen in elk record per functie. Cams zonder PMU produceren nog steeds timingrecords; de gebeurtenisvelden komen terug als nul, en profiler_event() doet niets.
- Camera.profiler_mode(exclusive: bool = False) None¶
Schakel tussen inclusieve en exclusieve timing. Bij inclusieve timing wordt de tijd van aangeroepen functies aan de aanroeper toegerekend; bij exclusieve timing niet.
- Parameters:
exclusive –
Trueselecteert exclusieve timing,Falseselecteert inclusieve.
- Camera.profiler_reset(config: list | None = None) None¶
Wis alle profieltellers.
config=Noneherstelt ook de standaard PMU-gebeurtenistoewijzing.- Parameters:
config – Gereserveerd voor toekomstige configuratie-overrides per teller. Geef
Nonedoor om de standaardwaarden te behouden.
- Camera.profiler_event(counter_num: int, event_id: int) None¶
Koppel een van de PMU-tellerslots aan een specifieke hardwaregebeurtenis.
- Parameters:
counter_num – Tellerindex.
event_id – Architectuurgedefinieerde gebeurtenis-identifier.
- Camera.read_profile() list[dict] | None¶
Retourneer de profielrecords per functie die sinds de laatste reset zijn verzameld. Elk record is een dict met
address,caller,call_count,min_ticks,max_ticks,total_ticks,total_cyclesen eenevents-tuple met een grootte die overeenkomt met depmu_eventcntvan de cam.- Retourneert:
Lijst van record-dicts, of
Noneals het profielkanaal niet beschikbaar is of er geen data is verzameld.
13.3.1.6.9. Subclassing en kanaalinternals¶
De hierboven gedocumenteerde methoden dekken elk algemeen gebruik van het pakket. Een paar patronen – het afhandelen van cam-side gebeurtenissen waarop de host wil reageren, het vergrendelen van een kanaal voor een meerstapsuitwisseling, het communiceren met kanalen die gevormde data dragen in plaats van bytestromen, of het aansturen van kanaalspecifieke controlecommando’s – hebben methoden nodig die Camera met een underscore vooraf laat gaan. Deze namen zijn per conventie privé (Python past er geen name-mangling op toe), en van applicaties die ze nodig hebben wordt verwacht dat ze ofwel Camera subclassen of de methoden direct aanroepen.
Subclassen om op gebeurtenissen te reageren. Elke gebeurtenis die de cam uitstoot, komt binnen via Camera._handle_event(). Het subclassen van Camera en het overschrijven van de methode is de manier waarop een applicatie reageert op gebeurtenissen die het script aan de cam-zijde opwerpt; de pagina Gebeurtenissen doorloopt het volledige patroon.
- Camera._handle_event(channel_id: int, event: int) None¶
Verzend één gebeurtenis van de cam. Wordt aangeroepen door de transportlaag telkens wanneer er een gebeurtenispakket binnenkomt. Overschrijf in een subklasse om applicatiespecifieke afhandeling toe te voegen; roep
super()._handle_event(...)aan om het standaardgedrag te behouden (verversen van de kanaallijst bijCHANNEL_REGISTERED, frame-gereed-tracking op hetstream-kanaal, start-/stoplogging van hetstdin-kanaal).- Parameters:
channel_id –
0voor systeemgebeurtenissen, anders het geregistreerde kanaal-ID.event – Gebeurtenis-identifier; de waarden komen uit de
EventType-enum voor systeemgebeurtenissen en uit wat de kanaalbackend aan de cam-zijde voor kanaalgebeurtenissen heeft gekozen.
Een subklasse die zijn eigen protocolcommuniceren-methoden toevoegt, moet deze decoreren met retry_if_failed() zodat ze hetzelfde resync-en-retry-gedrag erven dat elke verzonden methode op deze pagina heeft.
- static Camera.retry_if_failed(func)¶
Decorator. Wikkelt een instantiemethode zodanig in dat deze één keer opnieuw probeert wanneer het transport een
ResyncExceptionopwerpt. Elke methode die_send_cmd_wait_resp()aanroept (direct of via een van de_channel_*-wrappers) moet deze decorator dragen:class MyCamera(Camera): @Camera.retry_if_failed def my_custom_command(self, payload): return self._send_cmd_wait_resp(Opcode.MY_CMD, 0, payload)
Kanaalvergrendeling zorgt ervoor dat de status van het kanaal niet verandert tussen twee gerelateerde bewerkingen (bijvoorbeeld een _channel_size() gevolgd door een _channel_read() op een kanaal dat blijft data toevoegen). read_frame() en read_profile() gebruiken dit intern; een applicatie die een aangepast kanaal met meerstapstoegang aanstuurt, doet hetzelfde.
- Camera._channel_lock(channel_id: int) bool¶
Verkrijg een exclusieve vergrendeling op een kanaal. Andere host-bewerkingen op hetzelfde kanaal blokkeren totdat de vergrendeling wordt vrijgegeven.
- Parameters:
channel_id – Numeriek kanaal-ID, doorgaans herleid met
get_channel().- Retourneert:
Truewanneer de vergrendeling is verleend.
- Camera._channel_unlock(channel_id: int) bool¶
Geef een vergrendeling vrij die eerder met
_channel_lock()is genomen. Altijd gepaard met een vergrendelingsaanroep; gebruiktry/finallyom ervoor te zorgen dat de ontgrendeling plaatsvindt, zelfs wanneer de leesactie ertussen een fout opwerpt.- Parameters:
channel_id – Numeriek kanaal-ID, doorgaans herleid met
get_channel().
Gevormde kanalen dragen gestructureerde records in plaats van een platte bytestroom. Het profilerkanaal is het meegeleverde voorbeeld: zijn vorm is (record_count, record_size) en een host die wil weten hoeveel records er wachten, leest de vorm in plaats van de bytegrootte.
- Camera._channel_shape(channel_id: int) tuple[int, ...]¶
Lees de vormdescriptor van een kanaal.
- Parameters:
channel_id – Numeriek kanaal-ID, doorgaans herleid met
get_channel().- Retourneert:
Tuple van niet-getekende 32-bits gehele getallen die de lay-out van het kanaal beschrijven. De betekenis is kanaalspecifiek.
Kanaalspecifieke controlecommando’s – start, stop, reset, configure – rijden mee op één opcode (CHANNEL_IOCTL) met een kanaalspecifiek commandonummer en een optionele struct.pack-payload. De meegeleverde methoden zoals stop(), exec() en streaming() zijn dunne wrappers rond _channel_ioctl()-aanroepen tegen de stdin- en stream-kanalen; een aangepast kanaal aan de cam-zijde dat zijn eigen ioctl-menu definieert, wordt op dezelfde manier aangestuurd.
- Camera._channel_ioctl(channel_id: int, cmd: int, fmt: str | None = None, *args) bytes | None¶
Geef een ioctl-commando uit op een kanaal.
- Parameters:
channel_id – Numeriek kanaal-ID, doorgaans herleid met
get_channel().cmd – Commandonummer gedefinieerd door de kanaalbackend aan de cam-zijde.
fmt – Optionele
struct-formaatstring voor de argumenttuple. GeefNonedoor voor ioctls die geen argumenten aannemen.args – Waarden die overeenkomen met
fmt.
- Retourneert:
Welke payload het kanaal ook retourneerde, of
None.
Op-ID-bytestroomvarianten van de publieke kanaalmethoden slaan de naam-naar-ID-opzoeking over en accepteren een expliciete byte-offset – nuttig voor het lezen van een deel uit het midden van een grote buffer (bijvoorbeeld de records van het profile-kanaal).
- Camera._channel_size(channel_id: int) int¶
- Parameters:
channel_id – Numeriek kanaal-ID, doorgaans herleid met
get_channel().- Retourneert:
Bytes die momenteel beschikbaar zijn op het kanaal.
- Camera._channel_read(channel_id: int, offset: int, length: int) bytes¶
Lees
lengthbytes vanafoffset. Meerdere-pakketten-leesacties worden automatisch weer samengevoegd.- Parameters:
channel_id – Numeriek kanaal-ID, doorgaans herleid met
get_channel().offset – Byte-offset om vanaf te beginnen lezen.
length – Aantal te lezen bytes.
- Camera._channel_write(channel_id: int, data: bytes, offset: int = 0) None¶
Schrijf
dataop de opgegevenoffset. Meerdere-pakketten-schrijfacties worden automatisch over pakketten gesplitst.- Parameters:
channel_id – Numeriek kanaal-ID, doorgaans herleid met
get_channel().data – Bytes-achtige payload om te schrijven.
offset – Byte-offset om vanaf te beginnen schrijven.
Protocolprimitieven zijn het laagste niveau dat de klasse blootlegt – de ruwe verstuur-een-commando-, haal-de-ruwe-kanaallijst-op- en handmatige-resync-vermeldingen waarop alles hierboven uiteindelijk is gebouwd. Een applicatie grijpt ernaar bij het versturen van een opcode die de klasse nog niet wrapt, of bij het implementeren van aangepaste herstelacties in een subklasse.
- Camera._send_cmd_wait_resp(opcode: int, channel: int = 0, data: bytes = b'') bytes | None¶
Verstuur een protocolcommando en wacht op het antwoord van de cam. De primitief waarop elke andere methode in deze sectie is gebouwd.
- Parameters:
opcode – Commandonummer. De meegeleverde
Opcode-enum somt de codes op waarmee de firmware wordt geleverd, maar de parameter is gewoon een geheel getal – een aangepaste firmwarebuild kan zijn eigen codes definiëren en erop reageren.channel – Kanaal-ID, of
0voor systeemcommando’s.data – Commandospecifieke payload.
- Retourneert:
Antwoordpayload, of
Nonevoor commando’s zoalsOpcode.SYS_RESETenOpcode.SYS_BOOTdie de verbinding verbreken.
- Camera._channel_list() dict¶
Haal de huidige kanaallijst op van de cam zonder de gecachte
channels_by_id- enchannels_by_name-dictionaries aan te raken dieupdate_channels()vult. Nuttig voor een subklasse die de kanaalstatus van de cam direct wil inspecteren.- Retourneert:
Dict die kanaal-ID toewijst aan
{'name': str, 'flags': int}.
- Camera._resync() None¶
Voer de protocol-handshake helemaal opnieuw uit. Wordt automatisch aangeroepen door
connect()bij de initiële verbinding en door elke publieke methode die eenOMVExceptionvan het transport opvangt. Een applicatie die zijn eigen herstellus in een subklasse implementeert, mag dit direct aanroepen na het afhandelen van de onderliggende fout.
13.3.1.6.10. Uitzonderingen¶
- exception openmv.OMVException¶
Basisklasse voor elke fout op protocolniveau. De drie onderstaande subklassen erven er allemaal van, dus één enkele
except OMVExceptiondekt het volledige foutoppervlak.
- exception openmv.TimeoutException¶
De cam heeft niet binnen de geconfigureerde time-out gereageerd. Subklasse van
OMVException.
- exception openmv.ChecksumException¶
De CRC van een pakket kwam niet overeen. Wordt opgeworpen nadat het protocol zijn budget aan nieuwe pogingen heeft uitgeput. Subklasse van
OMVException.
- exception openmv.SequenceException¶
Er kwam een pakket binnen met een onverwacht volgnummer na nieuwe pogingen. Subklasse van
OMVException.