Die IDE liefert OpenMVs eigene Boards, Firmware, Beispiele, Machine-Learning-Modelle und Editor-Stubs, kann aber auch die gleichen Arten von Inhalten von anderen Unternehmen laden – ein von einem Partner erstelltes Board, die darauf laufende Firmware, darauf abgestimmte Beispiele und Modelle sowie Code-Vervollständigung für die APIs, die die Firmware hinzufügt. Diese kommen als third-party repositories an: Ordner mit Inhalten, die die IDE mit ihren eigenen zusammenführt und auf dem neuesten Stand hält.
Diese Seite hat zwei Zielgruppen. Das meiste davon ist für die Person bestimmt, die ein Repository installiert und verwaltet, das jemand anderes veröffentlicht hat. Der letzte Abschnitt, authoring a repository, ist für den Anbieter, der einen baut.
13.1.14.1. Die Seite „Drittanbieter-Repositorys“.
Alles wird über Bearbeiten → Einstellungen → OpenMV → Drittanbieter-Repositorys verwaltet. Die Tabelle listet jedes installierte Repository und für jedes seinen Anzeigenamen, seine Kurz-ID, ob Built-in oder User, die installierte Version jeder Art von Inhalten auf, die es bereitstellt – Firmware, Beispiele, Modelle, Stubs – und die URL, von der aus es aktualisiert.
Built-in bedeutet, dass das Repository von einem vom Hersteller gelieferten Installationsprogramm im eigenen Verzeichnis der Anwendung abgelegt wurde, so wie ein Treiberpaket Dateien zu einem Programm hinzufügt. User bedeutet, dass Sie es selbst über eine URL installiert haben. Der einzige praktische Unterschied besteht darin, dass Sie ein integriertes Repository nicht aus der IDE entfernen können – es wird durch die Deinstallation dessen entfernt, was es dort abgelegt hat – daher ist die Schaltfläche „Entfernen“ dafür deaktiviert.
13.1.14.2. Installieren eines Repositorys
Install from URL fragt nach der Adresse von config.json eines Repositorys – der kleinen Manifestdatei, die der Anbieter veröffentlicht – und installiert alles, auf das es verweist. Fügen Sie die URL ein, die Sie vom Anbieter erhalten haben. Die IDE lädt das Manifest herunter, ruft die darin aufgelistete Firmware, Beispiele, Modelle und Stubs ab und überprüft jeden Download. Das Installieren, Entfernen und Aktualisieren eines Repositorys wird nach einem Neustart wirksam, sodass die IDE nach Abschluss der Installation einen Neustart anbietet.
Ein Anbieter kann ein Repository auch als Installationsprogramm verteilen, das es direkt im Anwendungsverzeichnis ablegt. In diesem Fall ist es beim ersten Öffnen der Seite einfach als Built-in-Zeile vorhanden – es muss nichts installiert werden.
13.1.14.4. Priorität und Überschreibungen
Repositorys sind eine geordnete Liste mit der höchsten Priorität an der Spitze. Mit „Nach oben“ und „Nach unten“ wird das ausgewählte Repository neu angeordnet. Die Reihenfolge ist nur dann von Bedeutung, wenn zwei Quellen das same-Ding bereitstellen: eine Karte mit derselben USB-Kennung oder ein Beispiel, Modell oder Stub mit demselben Namen. Wenn das passiert, gewinnt der höhere Eintrag, und jedes Repository gewinnt gegenüber dem integrierten Inhalt von OpenMV. Dies ist Absicht – auf diese Weise liefert ein Anbieter seine eigene Firmware für ein Board, das die USB-Kennung eines OpenMV-Boards teilt, und ersetzt damit die Standard-Firmware, die die IDE sonst dafür anbieten würde, oder ersetzt ein Standard-Beispiel durch ein für seine Hardware geschriebenes.
Da eine Überschreibung stillschweigend die Wirkung eines bekannten Namens ändert, wird dieser niemals auf der Seite ausgeblendet. Das Bedienfeld „Überschreibungswarnungen“ listet jede wirksame Überschreibung auf – welches Board, Beispiel, Modell oder Stub des Repositorys welches überschreibt – und dieselbe Liste erscheint einmal als Meldung, wenn ein Repository zum ersten Mal angezeigt wird. Wenn sich ein Board, ein Beispiel oder ein Modell nicht so verhält, wie es in der OpenMV-Dokumentation beschrieben wird, ist dieses Panel die erste Anlaufstelle.
13.1.14.6. Erstellen eines Repositorys
Ein Repository ist ein nach dem Anbieter benannter Ordner, der ein config.json-Manifest und einen Unterordner für jede Art von Inhalt enthält, den es bereitstellt:
acme/
config.json
firmware/
settings.json board descriptions
ACME_CAM1/ one folder per board, named by boardFirmwareFolder
firmware.bin
romfs0.img
firmware.version
examples/
index.csv which examples show for which board / sensor
01-Getting-Started/ numbered category folders, same as OpenMV's
hello_acme.py
read_sensor.py
02-Acme-Widgets/
spin_widget.py
examples.version
models/
index.csv which models show for which board
acme/ a group; its index.html + image describe it
index.html
image.jpg
person_detector/ one folder per model
person_detector.tflite
person_detector.txt class labels
models.version
stubs/
acme_hal.pyi a module the firmware adds
csi.pyi overrides OpenMV's to add methods
stubs.version
Der Ordnername ist die Repository-ID: Kleinbuchstaben, Ziffern, - und _, beginnend mit einem Buchstaben. Jeder Teileordner ist optional; Versenden Sie nur das, was Sie haben. Neben jedem Teilordner befindet sich eine <part>.version-Datei mit einer einzelnen Versionszeichenfolge (1.2.0), anhand derer die IDE entscheidet, wann ein Update neuer ist.
13.1.14.6.1. Das Manifest
config.json benennt das Repository und verweist für jeden Teil auf ein herunterladbares Archiv:
{
"name": "acme",
"displayName": "Acme Robotics",
"homepage": "https://acme.example",
"configUrl": "https://acme.example/openmv/config.json",
"firmware": {
"release": { "version": "1.2.0", "url": "https://acme.example/acme-fw-1.2.0.zip", "sha256": "..." },
"development": { "version": "dev-20260701", "url": "https://acme.example/acme-fw-dev.zip", "sha256": "..." }
},
"examples": { "release": { "version": "1.1.0", "url": "https://acme.example/acme-examples-1.1.0.zip", "sha256": "..." } },
"models": { "release": { "version": "1.0.0", "url": "https://acme.example/acme-models-1.0.0.zip", "sha256": "..." } },
"stubs": { "release": { "version": "1.0.0", "url": "https://acme.example/acme-stubs-1.0.0.zip", "sha256": "..." } }
}
name muss mit dem Ordnernamen übereinstimmen. configUrl ist die Adresse, unter der dieselbe Datei gehostet wird; Die IDE ruft es erneut ab, um nach Updates zu suchen. Lassen Sie es also nur für ein Repository weg, das nie aktualisiert wird. Jeder Teil verfügt über einen release-Kanal, und die Firmware verfügt möglicherweise auch über einen development-Kanal, der von der Installation der neuesten Entwicklungsversion verwendet wird. Release version-Werte werden als Zahlen verglichen, sodass ein höherer Wert als Update angeboten wird; Entwicklungsversionen werden nur im Hinblick auf Änderungen verglichen. sha256 ist optional, wird jedoch überprüft, sofern vorhanden.
Jeder url zeigt auf einen .zip (nur Zip). Ein Archiv enthält genau one top-level folder, und die IDE installiert die contents dieses Ordners als Teil – das Firmware-Archiv wird also wie folgt gepackt:
acme-fw-1.2.0.zip
acme-firmware/ one wrapping folder; its name does not matter
settings.json
ACME_CAM1/
firmware.bin
romfs0.img
und entpackt es in den zuvor gezeigten Ordner firmware/. Die Beispiele-, Modell- und Stub-Archive werden auf die gleiche Weise gepackt – ein Verpackungsordner mit dem, was sich in examples/, models/ oder stubs/ befinden würde. Der Name des Wrapping-Ordners wird ignoriert; Entscheidend ist, dass es genau einen gibt. Das Komprimieren der Dateien im Stammverzeichnis des Archivs ohne umschließenden Ordner oder das Umschließen in mehr als einen Ordner führt nicht zur Installation. Der einfachste Weg, es richtig zu machen, besteht darin, den Ordner selbst zu komprimieren – wählen Sie acme-firmware aus und komprimieren Sie ihn, anstatt seinen Inhalt auszuwählen.
13.1.14.6.2. Boards, Beispiele, Modelle und Stubs
firmware/settings.json verwendet dasselbe Board-Beschreibungsformat wie die Firmware, die die IDE ausliefert; Fügen Sie für jedes Ihrer Boards einen boards-Eintrag hinzu. Einige Regeln gelten speziell für Boards von Drittanbietern: boardFirmwareFolder muss eindeutig sein (es wird noch nicht von OpenMV oder einem anderen Anbieter verwendet, da es den Ordner benennt, in dem sich Ihre Binärdateien befinden), jedes Board muss sein eigenes firmware_version haben (dies ist der Grund für die Eingabeaufforderung zum Aktualisieren bei Verbindung), und ein Board kann boardFirmwareFolderAlias auf den Firmware-Ordnernamen eines OpenMV-Boards setzen, um die Standardbeispiele und Modelle dieses Boards zu erben – das Escape Luke für ein Board, das Firmware-kompatibel mit einem OpenMV-Board ist. Es wird erwartet, dass OpenMV-Bootloader-IDs wiederverwendet werden (sie enthalten die signierten Windows-Treiber). Eine App-ID, die mit einem integrierten Board kollidiert, überschreibt dieses Board, was im Bereich „Warnungen überschreiben“ gemeldet wird.
Beispiele befinden sich in nummerierten Kategorieordnern wie OpenMVs (01-Getting-Started); Eine Kategorie, die Sie genauso benennen wie eine OpenMV-Kategorie, wird darin verschachtelt, und ein neuer Name wird zu einem eigenen Menüabschnitt. Ein Modell ist ein Ordner mit seinem .tflite und einem passenden .txt an Klassenbezeichnungen, gruppiert unter einem Ordner, dessen index.html (und ein optionales Bild) die daneben im Modellzoo angezeigte Beschreibung ist. examples/index.csv und models/index.csv sind die gleichen Board- und Sensorfilterdateien, die OpenMVs eigene Beispiele und Modelle verwenden. Sie werden mit Ihren Beispiel- und Modellpfaden abgeglichen und entscheiden, welche Ihrer Dateien für welches Board angezeigt werden. Stubs sind gewöhnliche .pyi-Dateien; Die IDE übergibt ihren Ordner an den Sprachserver, damit er zusammen mit OpenMVs aufgelöst wird, und ein Stub mit dem Namen für ein vorhandenes Modul (csi.pyi) überschreibt die Fertigstellung dieses Moduls.
13.1.14.6.3. Veröffentlichung und Aktualisierung
Hosten Sie zum Veröffentlichen config.json und die Archive, auf die es verweist, unter stabilen URLs und geben Sie Benutzern die config.json-URL für die Installation. Überall dort, wo einfache Dateien über HTTPS bereitgestellt werden, funktioniert es – ein Webserver, ein Objektspeicher oder ein Code-Host. Um ein Update zu versenden, laden Sie neue Archive hoch, erhöhen Sie die betroffenen version-Werte im gehosteten config.json und bieten Sie beim nächsten Start der IDE jedes Benutzers das Update an. Benutzer, die das Repository über ein Installationsprogramm installiert haben, erhalten Updates stattdessen auf die gleiche Weise, solange das installierte config.json ein configUrl enthält.
13.1.14.6.4. Hosting auf GitHub
GitHub ist ein praktischer Host, und die IDE ruft von ihm auf die gleiche Weise ab, wie sie ihre eigenen Ressourcen abruft. Es müssen zwei Teile platziert werden: das Manifest und die Archive.
Behalten Sie config.json in einem Repository und geben Sie Benutzern seine raw-URL – die Adresse, unter der die Datei direkt bereitgestellt wird, nicht die GitHub-Seite, auf der sie angezeigt wird. Die Raw-Schaltfläche in der Datei zeigt es an; es hat die Form
https://raw.githubusercontent.com/<user>/<repo>/<branch>/config.json
Diese Roh-URL ist das, was ein Benutzer in „Von URL installieren“ einfügt, und das, was Sie in die eigene configUrl des Manifests einfügen, damit die IDE sie erneut abruft, um nach Updates zu suchen. Wenn Sie es auf einen Zweig verweisen (main), bedeutet dies, dass durch das Pushen eines neuen Commits die Änderung veröffentlicht wird. Wenn Sie auf ein Tag verweisen, werden Benutzer stattdessen an eine feste Version weitergeleitet.
Hosten Sie die .zip-Archive als release assets, anstatt sie festzuschreiben – Releases werden für binäre Downloads erstellt, daher gehört ein Multi-Megabyte-Firmware-Bundle dorthin und nicht in den Verlauf des Repositorys. Hängen Sie jedes Archiv an eine GitHub-Version an und verwenden Sie dessen Download-URL, die das Formular hat
https://github.com/<user>/<repo>/releases/download/<tag>/acme-fw-1.2.0.zip
in den url-Feldern des Manifests, jedes mit dem sha256 des Archivs. Das Versenden eines Updates erfolgt dann wie folgt: Hängen Sie die neuen Archive an eine Version an, bearbeiten Sie config.json, um auf sie zu verweisen, und erhöhen Sie die Versionen, und übernehmen Sie es. Die IDE übernimmt die Änderung beim nächsten Start (die Rohdatei wird über einen Cache bereitgestellt, der innerhalb weniger Minuten nach dem Push aktualisiert wird).