13.3.1.6. API-Referenz¶
Die öffentliche Schnittstelle des openmv-Pakets besteht aus der Klasse Camera für die Kommunikation mit einer Kamera und der OMVException-Hierarchie für Protokollfehler. Beide sind auf dieser Seite dokumentiert.
13.3.1.6.1. Die 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)¶
Der host-seitige Proxy für eine OpenMV Cam, der über USB-Serial erreicht wird.
- Parameter:
port – Pfad zum seriellen Gerät. Unter Linux
/dev/ttyACMxfür USB CDC und/dev/ttyUSBxfür eine USB-zu-UART-Bridge. Unter macOS/dev/tty.usbmodem...oder/dev/cu.usbmodem.... Unter WindowsCOMx.baudrate – Serielle Baudrate. Über USB ist
921600der magische Wert, der die Kamera vom MicroPython REPL auf das OpenMV-Protokoll umschaltet – jeder andere Wert auf einer USB-Verbindung belässt die Kamera im REPL-Modus, daher muss der Standardwert verwendet werden. Über eine UART-Verbindung ist der Wert die tatsächliche Leitungs-Baudrate und kann auf beiden Seiten frei festgelegt werden.crc – Aktiviert die CRC-Validierung für jedes Paket.
seq – Aktiviert Sequenznummern pro Paket.
ack – Erfordert eine Paketbestätigung.
events – Aktiviert Ereignisbenachrichtigungen von der Kamera.
timeout – Zeitüberschreitung pro Operation in Sekunden.
max_retry – Anzahl der Wiederholungsversuche, bevor bei einem fehlgeschlagenen Paket eine Ausnahme ausgelöst wird.
max_payload – Maximale ausgehandelte Nutzlastgröße in Bytes. Die Kamera kann einen niedrigeren Wert aushandeln.
drop_rate – Nur zu Testzwecken: Wahrscheinlichkeit, ein Paket zu verwerfen, im Bereich
[0.0, 1.0]. Im Produktivbetrieb auf0.0belassen.
Die Klasse unterstützt das Context-Manager-Protokoll;
with Camera(port) as cam:ruft beim Eintrittconnect()und beim Austrittdisconnect()auf.
13.3.1.6.2. Verbindung¶
- Camera.connect() None¶
Öffnet den seriellen Port und führt den Protokoll-Handshake durch. Zwischengespeicherter Zustand (Kanalliste, Systeminformationen, Versionsinformationen) wird als Nebeneffekt gefüllt. Wird vom Context Manager automatisch aufgerufen.
- Camera.disconnect() None¶
Schließt den seriellen Port und gibt den Transport frei. Wird beim Beenden des Context Managers automatisch aufgerufen.
- Camera.reset() None¶
Setzt die Kamera zurück. Die Verbindung wird getrennt, da die Kamera neu startet.
- Camera.boot() None¶
Versetzt die Kamera in ihren Bootloader. Die Verbindung wird getrennt, da die Kamera neu startet.
- Camera.update_capabilities() None¶
Handelt die Protokollfähigkeiten (CRC, Sequenzprüfung, ACKs, Ereignisse, maximale Nutzlast) mit der Kamera neu aus. Die Kamera meldet die maximale Nutzlast, die sie verarbeiten kann; die Anforderung des Hosts wird darauf beschränkt und die vereinbarten Einstellungen werden zurückgesendet. Wird von
connect()automatisch aufgerufen – es gibt keinen Grund, sie aus dem Benutzercode aufzurufen, es sei denn, die Konstruktor-Flags müssen auf einer bestehenden Verbindung neu ausgehandelt werden.
- Camera.poll_events() None¶
Führt den Empfangspfad des Transports einmal aus, um ausstehende Ereignisse von der Kamera zu verarbeiten, ohne einen Befehl zu senden. Nützlich in lang laufenden Programmen, die minutenlang ohne sonstige I/O auskommen und Kanalregistrierungsereignisse zeitnah erfassen möchten.
13.3.1.6.3. Skriptausführung¶
13.3.1.6.4. Streaming¶
- Camera.streaming(enable: bool, raw: bool = False, resolution: tuple[int, int] | None = None) None¶
Schaltet den Einzelbild-Stream ein oder aus und wählt das Übertragungsformat.
- Parameter:
enable –
Trueaktiviert das Streaming,Falsedeaktiviert es.raw – Bei
False(Standard) komprimiert die Kamera jedes Einzelbild als JPEG, bevor sie es in den Stream-Kanal stellt, undread_frame()dekomprimiert es auf dem Host. BeiTruesendet die Kamera den erfassten Pixelpuffer unkomprimiert – die richtige Wahl bei Kameras ohne Hardware-JPEG-Unterstützung, bei denen die Software-Komprimierung der langsamste Schritt in der Schleife ist.resolution –
(width, height): Zielgröße, auf die die Kamera jedes Roh-Einzelbild vor dem Senden herunterskaliert, da unkomprimierte Einzelbilder viel größer sind als JPEG-komprimierte. Erforderlich beiraw=True; andernfalls ignoriert.
- Camera.read_frame() dict | None¶
Liest das neueste Einzelbild aus dem Stream-Kanal.
- Rückgabe:
None, wenn kein Einzelbild ansteht, oder ein Dict mit den Schlüsselnwidth(int, Pixel),height(int, Pixel),format(int, der von der Kamera deklarierte Pixelformat-Bezeichner),depth(int, die komprimierte Bildgröße in Bytes für JPEG-/PNG-Einzelbilder; bei unkomprimierten Formaten ungenutzt),data(bytes, RGB888 der Längewidth * height * 3) undraw_size(int, Bytes, die die Kamera vor dem Dekodieren über USB gesendet hat).
13.3.1.6.5. Benutzerdefinierte Kanäle¶
- Camera.has_channel(name: str) bool¶
- Rückgabe:
True, wenn auf der Kamera ein mitnameregistrierter Kanal existiert.
- Camera.channel_size(name: str) int¶
- Rückgabe:
Anzahl der Bytes, die der benannte Kanal derzeit verfügbar hat, oder
0, wenn der Kanal leer ist oder nicht existiert.
- Camera.channel_read(name: str, size: int | None = None) bytes | None¶
Liest von einem benutzerdefinierten Kanal.
- Camera.channel_write(name: str, data: bytes) bool¶
Schreibt
datain einen benutzerdefinierten Kanal. Schreibvorgänge, die größer als die Nutzlast sind, werden automatisch auf mehrere Pakete aufgeteilt.- Parameter:
name – Kanalname, der vom kamera-seitigen Skript registriert wurde.
data – Zu sendende Bytes-artige Nutzlast.
- Rückgabe:
True, wenn der Kanal existiert und der Schreibvorgang gesendet wurde, andernfallsFalse.
- Camera.read_status() dict[str, bool]¶
Fragt jeden registrierten Kanal ab.
- Rückgabe:
Dict, das den Kanalnamen auf einen booleschen Wert für „Daten sind zum Lesen bereit“ abbildet.
- Camera.update_channels() None¶
Aktualisiert die zwischengespeicherte Kanalliste von der Kamera. Wird automatisch beim nächsten Mal ausgeführt, wenn eine Kanalsuche per Name durchgeführt wird, nachdem ein Kanalregistrierungsereignis eingetroffen ist; eine Anwendung, die einen neu registrierten Kanal sofort kennenlernen möchte, kann diese Methode direkt aufrufen.
- Camera.get_channel(name: str | None = None, channel_id: int | None = None) int | str | None¶
Schlägt einen Kanal entweder per Name (mit Rückgabe seiner numerischen ID) oder per ID (mit Rückgabe seines Namens) nach. Aktualisiert zuvor den Kanal-Cache über
update_channels(), falls Kanalregistrierungsereignisse ausstehen.- Parameter:
name – Kanalname, der zu einer ID aufgelöst werden soll.
channel_id – Kanal-ID, die zu einem Namen aufgelöst werden soll.
- Rückgabe:
Die entsprechende ID oder der Name oder
None, wenn der Kanal nicht existiert. Eines vonnameoderchannel_idmuss angegeben werden.
13.3.1.6.6. Geräte-Introspektion¶
- Camera.version() dict¶
Gibt die Protokoll-, Bootloader- und Firmware-Versionstripel der Kamera zurück. Nach
connect()zwischengespeichert. Jedes Tripel ist ein(major, minor, patch)-Tupel ausint:protocol_version– die Version des OpenMV-Wire-Protokolls, die die Kamera implementiert.bootloader_version– das im Flash residente Bootloader-Image.firmware_version– die derzeit laufende MicroPython-Firmware.
- Camera.system_info() dict¶
Gibt die Hardware-Fähigkeits- und Speicherinformationen der Kamera zurück. Nach
connect()zwischengespeichert. Die Schlüssel des zurückgegebenen Dicts gliedern sich in vier Gruppen.Identität
cpu_id– 32-Bit-CPU-Bezeichner.device_id– 3-Tupel aus 32-Bit-Wörtern, die im Silizium fest eingebrannte eindeutige Geräteseriennummer.chip_id– 3-Tupel aus 32-Bit-Wörtern, ein Eintrag pro an die Kamera angeschlossenem Bildsensor.usb_vid– USB-Hersteller-ID.usb_pid– USB-Produkt-ID.
Speichergrößen (alle in Kilobytes)
flash_size_kb– gesamter interner Flash.ram_size_kb– gesamter RAM.framebuffer_size_kb– für die Bilderfassung reservierter RAM.stream_buffer_size_kb– RAM, der für den Stream-Kanal reserviert ist, der Einzelbilder an den Host sendet.
Fähigkeits-Flags (ein boolescher Wert pro Merkmal, alle benannt
<feature>_present)gpu_present– Grafikprozessor.npu_present– neuronale Verarbeitungseinheit.isp_present– Bildsignalprozessor.venc_present– Video-Encoder.jpeg_present– JPEG-Hardware-Encoder.dram_present– externes DRAM.crc_present– CRC-Beschleuniger.pmu_present– Performance-Monitoring-Einheit.wifi_present– Wi-Fi-Funkmodul.bt_present– Bluetooth-Funkmodul.sd_present– SD-Kartensteckplatz.eth_present– Ethernet-PHY.multicore_present– mehrere CPU-Kerne.
Sonstiges
usb_highspeed– boolesch,True, wenn USB im High-Speed-Modus (USB 2.0 HS, 480 Mbps) aufgezählt wurde.pmu_eventcnt– Anzahl der verfügbaren PMU-Ereigniszähler;0, wenn keine PMU vorhanden ist.
13.3.1.6.7. Diagnose¶
13.3.1.6.8. Profiler¶
Der Profiler meldet pro Funktion die Aufrufanzahl sowie minimale/maximale/gesamte Ausführungszeiten für die instrumentierten Firmware-Module – derzeit image, ml und ulab. Funktionseintritt und -austritt werden zur Kompilierzeit abgefangen; die Laufzeit erfasst bei jedem davon einen monotonen Mikrosekundenzähler, akkumuliert das Ergebnis pro Funktion und stellt die Tabelle dem Host über den profile-Kanal zur Verfügung.
Der Profiler wird nur in die Firmware eingebaut, wenn PROFILE_ENABLE=1 an make übergeben wird. Standard-Firmware-Images enthalten ihn nicht – das Flag -finstrument-functions, das der Build den verfolgten Modulen hinzufügt, hat einen nicht unerheblichen Laufzeit-Overhead, daher werden Profiling-Builds aus dem Quellcode für die spezifische Debugging-Sitzung erstellt, die sie benötigt. Wenn die Firmware nicht mit dem Flag erstellt wurde, wird der profile-Kanal nicht registriert und jede Profiler-Methode auf dieser Seite kehrt stillschweigend zurück, ohne etwas zu tun.
Die Arm Performance Monitoring Unit (PMU) ist der Hardware-Zählerblock des Cortex-M55 – ein kleiner Satz konfigurierbarer Zähler, die Zyklenzahlen, Cache-Treffer und -Fehler, Sprungverhalten und andere architekturdefinierte Ereignisse erfassen, ohne den gemessenen Code zu verlangsamen. Auf Kameras, die eine besitzen – der AE3 und der N6, den beiden Kameras im OpenMV-Sortiment, die um den M55 herum aufgebaut sind –, erfasst der Profiler diese Zähler zusammen mit den Zeitdaten, und die Ereignissummen erscheinen in jedem Datensatz pro Funktion. Kameras ohne PMU erzeugen weiterhin Zeitdatensätze; die Ereignisfelder kommen als Null zurück und profiler_event() ist eine No-Op.
- Camera.profiler_mode(exclusive: bool = False) None¶
Wechselt zwischen inklusiver und exklusiver Zeitmessung. Inklusive Zeitmessung rechnet die Zeit der aufgerufenen Funktionen dem Aufrufer zu; exklusive Zeitmessung tut dies nicht.
- Parameter:
exclusive –
Truewählt exklusive Zeitmessung,Falsewählt inklusive.
- Camera.profiler_reset(config: list | None = None) None¶
Setzt alle Profilzähler zurück.
config=Nonestellt außerdem die standardmäßige PMU-Ereigniszuweisung wieder her.- Parameter:
config – Reserviert für zukünftige Konfigurationsüberschreibungen pro Zähler. Übergeben Sie
None, um die Standardwerte beizubehalten.
- Camera.profiler_event(counter_num: int, event_id: int) None¶
Bindet einen der PMU-Zählerslots an ein bestimmtes Hardware-Ereignis.
- Parameter:
counter_num – Zählerindex.
event_id – Architekturdefinierter Ereignisbezeichner.
- Camera.read_profile() list[dict] | None¶
Gibt die Profildatensätze pro Funktion zurück, die seit dem letzten Zurücksetzen gesammelt wurden. Jeder Datensatz ist ein Dict mit
address,caller,call_count,min_ticks,max_ticks,total_ticks,total_cyclesund einemevents-Tupel der Größe vonpmu_eventcntder Kamera.- Rückgabe:
Liste von Datensatz-Dicts oder
None, wenn der Profilkanal nicht verfügbar ist oder keine Daten gesammelt wurden.
13.3.1.6.9. Unterklassenbildung und Kanal-Interna¶
Die oben dokumentierten Methoden decken jede gängige Verwendung des Pakets ab. Einige Muster – das Behandeln kamera-seitiger Ereignisse, auf die der Host reagieren möchte, das Sperren eines Kanals für einen mehrstufigen Austausch, die Kommunikation mit Kanälen, die strukturierte Daten anstelle von Byte-Streams übertragen, oder das Ansteuern kanalspezifischer Steuerbefehle – benötigen Methoden, die Camera mit einem Unterstrich-Präfix versieht. Diese Namen sind privat per Konvention (Python führt kein Name-Mangling durch), und von Anwendungen, die sie benötigen, wird erwartet, dass sie entweder von Camera ableiten oder die Methoden direkt aufrufen.
Unterklassenbildung zur Reaktion auf Ereignisse. Jedes von der Kamera ausgegebene Ereignis kommt über Camera._handle_event() an. Das Ableiten von Camera und Überschreiben der Methode ist der Weg, auf dem eine Anwendung auf Ereignisse reagiert, die ihr kamera-seitiges Skript auslöst; die Seite Ereignisse beschreibt das vollständige Muster.
- Camera._handle_event(channel_id: int, event: int) None¶
Versendet ein Ereignis von der Kamera. Wird von der Transportschicht aufgerufen, sobald ein Ereignispaket eintrifft. In einer Unterklasse überschreiben, um anwendungsspezifische Behandlung hinzuzufügen; rufen Sie
super()._handle_event(...)auf, um das Standardverhalten beizubehalten (Kanallisten-Aktualisierung beiCHANNEL_REGISTERED, Frame-Ready-Verfolgung auf demstream-Kanal,stdin-Kanal-Start-/Stopp-Protokollierung).- Parameter:
channel_id –
0für Systemereignisse, andernfalls die registrierte Kanal-ID.event – Ereignisbezeichner; die Werte stammen für Systemereignisse aus der
EventType-Enumeration und für Kanalereignisse aus dem, was das kamera-seitige Kanal-Backend gewählt hat.
Eine Unterklasse, die ihre eigenen protokollsprechenden Methoden hinzufügt, sollte sie mit retry_if_failed() dekorieren, damit sie dasselbe Resync-und-Wiederholungs-Verhalten erben, das jede ausgelieferte Methode auf dieser Seite besitzt.
- static Camera.retry_if_failed(func)¶
Dekorator. Umschließt eine Instanzmethode, sodass sie einmal wiederholt wird, wenn der Transport eine
ResyncExceptionauslöst. Jede Methode, die_send_cmd_wait_resp()aufruft (direkt oder über einen der_channel_*-Wrapper), sollte diesen Dekorator tragen:class MyCamera(Camera): @Camera.retry_if_failed def my_custom_command(self, payload): return self._send_cmd_wait_resp(Opcode.MY_CMD, 0, payload)
Kanalsperrung stellt sicher, dass sich der Zustand des Kanals zwischen zwei zusammengehörigen Operationen nicht ändert (zum Beispiel ein _channel_size() gefolgt von einem _channel_read() auf einem Kanal, der ständig Daten anhängt). read_frame() und read_profile() verwenden dies intern; eine Anwendung, die einen benutzerdefinierten Kanal mit mehrstufigem Zugriff ansteuert, tut dasselbe.
- Camera._channel_lock(channel_id: int) bool¶
Erwirbt eine exklusive Sperre auf einem Kanal. Andere Host-Operationen auf demselben Kanal blockieren, bis die Sperre freigegeben wird.
- Parameter:
channel_id – Numerische Kanal-ID, typischerweise mit
get_channel()aufgelöst.- Rückgabe:
True, wenn die Sperre gewährt wurde.
- Camera._channel_unlock(channel_id: int) bool¶
Gibt eine zuvor mit
_channel_lock()erworbene Sperre frei. Immer mit einem Sperraufruf gepaart; verwenden Sietry/finally, um sicherzustellen, dass die Entsperrung auch dann erfolgt, wenn das dazwischenliegende Lesen eine Ausnahme auslöst.- Parameter:
channel_id – Numerische Kanal-ID, typischerweise mit
get_channel()aufgelöst.
Geformte Kanäle übertragen strukturierte Datensätze anstelle eines flachen Byte-Streams. Der Profilerkanal ist das ausgelieferte Beispiel: seine Form ist (record_count, record_size) und ein Host, der wissen möchte, wie viele Datensätze anstehen, liest die Form anstelle der Byte-Größe.
- Camera._channel_shape(channel_id: int) tuple[int, ...]¶
Liest den Form-Deskriptor eines Kanals.
- Parameter:
channel_id – Numerische Kanal-ID, typischerweise mit
get_channel()aufgelöst.- Rückgabe:
Tupel aus vorzeichenlosen 32-Bit-Ganzzahlen, das das Layout des Kanals beschreibt. Die Bedeutung ist kanalspezifisch.
Kanalspezifische Steuerbefehle – Start, Stopp, Reset, Konfiguration – nutzen einen einzigen Opcode (CHANNEL_IOCTL) mit einer kanalspezifischen Befehlsnummer und einer optionalen struct.pack-Nutzlast. Die ausgelieferten Methoden wie stop(), exec() und streaming() sind dünne Wrapper um _channel_ioctl()-Aufrufe gegen die Kanäle stdin und stream; ein benutzerdefinierter kamera-seitiger Kanal, der sein eigenes ioctl-Menü definiert, wird auf dieselbe Weise angesteuert.
- Camera._channel_ioctl(channel_id: int, cmd: int, fmt: str | None = None, *args) bytes | None¶
Setzt einen ioctl-Befehl auf einem Kanal ab.
- Parameter:
channel_id – Numerische Kanal-ID, typischerweise mit
get_channel()aufgelöst.cmd – Vom kamera-seitigen Kanal-Backend definierte Befehlsnummer.
fmt – Optionaler
struct-Formatstring für das Argument-Tupel. Übergeben SieNonefür ioctls, die keine Argumente annehmen.args – Werte, die zu
fmtpassen.
- Rückgabe:
Die vom Kanal zurückgegebene Nutzlast oder
None.
By-ID-Byte-Stream-Varianten der öffentlichen Kanalmethoden überspringen die Name-zu-ID-Suche und akzeptieren einen expliziten Byte-offset – nützlich, um einen Abschnitt aus der Mitte eines großen Puffers zu lesen (zum Beispiel die Datensätze des profile-Kanals).
- Camera._channel_size(channel_id: int) int¶
- Parameter:
channel_id – Numerische Kanal-ID, typischerweise mit
get_channel()aufgelöst.- Rückgabe:
Aktuell auf dem Kanal verfügbare Bytes.
- Camera._channel_read(channel_id: int, offset: int, length: int) bytes¶
Liest
lengthBytes aboffset. Mehr-Paket-Lesevorgänge werden automatisch wieder zusammengesetzt.- Parameter:
channel_id – Numerische Kanal-ID, typischerweise mit
get_channel()aufgelöst.offset – Byte-Offset, ab dem das Lesen beginnt.
length – Anzahl der zu lesenden Bytes.
- Camera._channel_write(channel_id: int, data: bytes, offset: int = 0) None¶
Schreibt
dataan den angegebenenoffset. Mehr-Paket-Schreibvorgänge werden automatisch auf mehrere Pakete aufgeteilt.- Parameter:
channel_id – Numerische Kanal-ID, typischerweise mit
get_channel()aufgelöst.data – Zu schreibende Bytes-artige Nutzlast.
offset – Byte-Offset, ab dem das Schreiben beginnt.
Protokoll-Primitive sind die unterste Ebene, die die Klasse offenlegt – die rohen Einträge zum Senden eines Befehls, zum Abrufen der rohen Kanalliste und zum manuellen Resync, auf denen alles Obige letztlich aufbaut. Eine Anwendung greift darauf zurück, wenn sie einen Opcode sendet, den die Klasse noch nicht umschließt, oder wenn sie in einer Unterklasse eine benutzerdefinierte Wiederherstellung implementiert.
- Camera._send_cmd_wait_resp(opcode: int, channel: int = 0, data: bytes = b'') bytes | None¶
Sendet einen Protokollbefehl und wartet auf die Antwort der Kamera. Das Primitiv, auf dem jede andere Methode in diesem Abschnitt aufbaut.
- Parameter:
opcode – Befehlsnummer. Die ausgelieferte
Opcode-Enumeration listet die Codes auf, mit denen die Firmware geliefert wird, aber der Parameter ist lediglich eine Ganzzahl – ein benutzerdefinierter Firmware-Build kann seine eigenen definieren und darauf antworten.channel – Kanal-ID oder
0für Systembefehle.data – Befehlsspezifische Nutzlast.
- Rückgabe:
Antwort-Nutzlast oder
Nonefür Befehle wieOpcode.SYS_RESETundOpcode.SYS_BOOT, die die Verbindung trennen.
- Camera._channel_list() dict¶
Ruft die aktuelle Kanalliste von der Kamera ab, ohne die zwischengespeicherten Dictionaries
channels_by_idundchannels_by_namezu berühren, dieupdate_channels()füllt. Nützlich für eine Unterklasse, die den Kanalzustand der Kamera direkt inspizieren möchte.- Rückgabe:
Dict, das die Kanal-ID auf
{'name': str, 'flags': int}abbildet.
- Camera._resync() None¶
Führt den Protokoll-Handshake von Grund auf neu aus. Wird von
connect()bei der ersten Verbindung automatisch aufgerufen sowie von jeder öffentlichen Methode, die eineOMVExceptionvom Transport abfängt. Eine Anwendung, die in einer Unterklasse ihre eigene Wiederherstellungsschleife implementiert, kann diese Methode direkt nach der Behandlung des zugrunde liegenden Fehlers aufrufen.
13.3.1.6.10. Ausnahmen¶
- exception openmv.OMVException¶
Basisklasse für jeden Fehler auf Protokollebene. Die drei untenstehenden Unterklassen erben alle von ihr, sodass ein einziges
except OMVExceptiondie gesamte Fehleroberfläche abdeckt.
- exception openmv.TimeoutException¶
Die Kamera hat nicht innerhalb der konfigurierten Zeitüberschreitung geantwortet. Unterklasse von
OMVException.
- exception openmv.ChecksumException¶
Die CRC eines Pakets stimmte nicht überein. Wird ausgelöst, nachdem das Protokoll sein Wiederholungsbudget erschöpft hat. Unterklasse von
OMVException.
- exception openmv.SequenceException¶
Ein Paket traf nach Wiederholungen mit einer unerwarteten Sequenznummer ein. Unterklasse von
OMVException.